Compare commits

..

2 Commits

Author SHA1 Message Date
d09d389011 fix: initialize write channel 2025-09-30 06:59:01 +07:00
c550701dfa fix: adding lock for cancel function slices 2025-09-29 22:53:29 +07:00

View File

@@ -156,6 +156,7 @@ func (b *SafeWebsocketClientBuilder) Build(ctx context.Context) (*SafeWebsocketC
reconnectCh: make(chan struct{}, 1), reconnectCh: make(chan struct{}, 1),
isConnected: false, isConnected: false,
doneMap: NewSafeMap[string, chan struct{}](), doneMap: NewSafeMap[string, chan struct{}](),
writeChan: make(chan Message),
} }
if b.authenticateFn != nil { if b.authenticateFn != nil {
@@ -235,7 +236,10 @@ func (wsClient *SafeWebsocketClient) connect() error {
pingCtx, pingCancel := context.WithCancel(context.Background()) pingCtx, pingCancel := context.WithCancel(context.Background())
go wsClient.startPingTicker(pingCtx) go wsClient.startPingTicker(pingCtx)
wsClient.mu.WriteHandler(func() error {
wsClient.cancelFuncs = append(wsClient.cancelFuncs, pingCancel) wsClient.cancelFuncs = append(wsClient.cancelFuncs, pingCancel)
return nil
})
if wsClient.conn != nil { if wsClient.conn != nil {
wsClient.conn.Close() wsClient.conn.Close()
@@ -251,7 +255,10 @@ func (wsClient *SafeWebsocketClient) connect() error {
go func() { go func() {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
wsClient.mu.WriteHandler(func() error {
wsClient.cancelFuncs = append(wsClient.cancelFuncs, cancel) wsClient.cancelFuncs = append(wsClient.cancelFuncs, cancel)
return nil
})
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
@@ -285,7 +292,10 @@ func (wsClient *SafeWebsocketClient) connect() error {
go func() { go func() {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
wsClient.mu.WriteHandler(func() error {
wsClient.cancelFuncs = append(wsClient.cancelFuncs, cancel) wsClient.cancelFuncs = append(wsClient.cancelFuncs, cancel)
return nil
})
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
@@ -395,11 +405,15 @@ func (wsClient *SafeWebsocketClient) reconnectHandler() {
case <-wsClient.reconnectCh: case <-wsClient.reconnectCh:
log.Println("Reconnect triggered") log.Println("Reconnect triggered")
wsClient.mu.ReadHandler(func() error {
if wsClient.cancelFuncs != nil { if wsClient.cancelFuncs != nil {
for _, cancel := range wsClient.cancelFuncs { for _, cancel := range wsClient.cancelFuncs {
cancel() cancel()
} }
} }
return nil
})
wsClient.isConnected = false wsClient.isConnected = false
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
@@ -461,11 +475,14 @@ func (wsClient *SafeWebsocketClient) Write(data []byte) error {
} }
func (wsClient *SafeWebsocketClient) Close() error { func (wsClient *SafeWebsocketClient) Close() error {
wsClient.mu.ReadHandler(func() error {
if wsClient.cancelFuncs != nil { if wsClient.cancelFuncs != nil {
for _, cancel := range wsClient.cancelFuncs { for _, cancel := range wsClient.cancelFuncs {
cancel() cancel()
} }
} }
return nil
})
if wsClient.reconnectChans != nil { if wsClient.reconnectChans != nil {
for _, reconnectChan := range wsClient.reconnectChans { for _, reconnectChan := range wsClient.reconnectChans {