fix: fixing sudden disconnect for multiple connection

This commit is contained in:
2025-10-27 13:09:16 +07:00
parent b71e8121e2
commit 49a30d3b44
5 changed files with 62 additions and 38 deletions

View File

@@ -34,13 +34,14 @@ type Message struct {
}
type SafeWebsocketClientBuilder struct {
baseHost *string `nil_checker:"required"`
basePort *uint16 `nil_checker:"required"`
path *string
rawQuery *string
isDrop *bool
useTLS *bool
channelSize *int64
baseHost *string `nil_checker:"required"`
basePort *uint16 `nil_checker:"required"`
path *string
rawQuery *string
isDrop *bool
useTLS *bool
channelSize *int64
writeChannelSize *int64
}
func NewSafeWebsocketClientBuilder() *SafeWebsocketClientBuilder {
@@ -82,6 +83,11 @@ func (b *SafeWebsocketClientBuilder) ChannelSize(channelSize int64) *SafeWebsock
return b
}
func (b *SafeWebsocketClientBuilder) WriteChannelSize(writeChannelSize int64) *SafeWebsocketClientBuilder {
b.writeChannelSize = &writeChannelSize
return b
}
func (b *SafeWebsocketClientBuilder) Build(ctx context.Context) (*SafeWebsocketClient, error) {
if err := internal.NilChecker(b); err != nil {
return nil, err
@@ -103,6 +109,11 @@ func (b *SafeWebsocketClientBuilder) Build(ctx context.Context) (*SafeWebsocketC
b.channelSize = &channelSize
}
if b.writeChannelSize == nil {
writeChannelSize := int64(1)
b.writeChannelSize = &writeChannelSize
}
wsClient := SafeWebsocketClient{
baseHost: *b.baseHost,
basePort: *b.basePort,
@@ -116,7 +127,7 @@ func (b *SafeWebsocketClientBuilder) Build(ctx context.Context) (*SafeWebsocketC
reconnectCh: make(chan struct{}, 1),
isConnected: false,
doneMap: safemap.NewSafeMap[string, chan struct{}](),
writeChan: make(chan Message, 1),
writeChan: make(chan Message, *b.writeChannelSize),
}
go wsClient.reconnectHandler()
@@ -193,19 +204,19 @@ func (wsClient *SafeWebsocketClient) connect() error {
go wsClient.writePump()
go wsClient.readPump()
conn.SetPingHandler(func(pingData string) error {
wsClient.writeChan <- Message{
MessageType: MessageTypePong,
Data: []byte(pingData),
}
// conn.SetPingHandler(func(pingData string) error {
// wsClient.writeChan <- Message{
// MessageType: MessageTypePong,
// Data: []byte(pingData),
// }
select {
case err := <-wsClient.pongChan:
return err
default:
}
return nil
})
// select {
// case err := <-wsClient.pongChan:
// return err
// default:
// }
// return nil
// })
return nil
}
@@ -374,7 +385,6 @@ func (wsClient *SafeWebsocketClient) reconnectHandler() {
})
wsClient.isConnected = false
// time.Sleep(100 * time.Millisecond)
isInnerLoop := true
for isInnerLoop {

View File

@@ -35,11 +35,11 @@ func main() {
log.Fatal(err)
}
go func() {
for range wsClient.ReconnectChannel() {
fmt.Println("Reconnection Success")
}
}()
// go func() {
// for range wsClient.ReconnectChannel() {
// fmt.Println("Reconnection Success")
// }
// }()
dataChannel := wsClient.DataChannel()