@@ -59,10 +59,13 @@ func register(req *http.Request, socket *websocket.Conn) string {
5959 clientsMutex .Lock ()
6060 clients [clientID ] = socket
6161 clientsMutex .Unlock ()
62+
6263 waitersMutex .Lock ()
6364 if ch , ok := waiters [clientID ]; ok {
64- ch <- socket
65-
65+ select {
66+ case ch <- socket :
67+ default :
68+ }
6669 close (ch )
6770 delete (waiters , clientID )
6871 }
@@ -72,24 +75,30 @@ func register(req *http.Request, socket *websocket.Conn) string {
7275}
7376
7477func waitForClient (clientID string , timeout time.Duration ) (* websocket.Conn , error ) {
75- waitCh := make (chan * websocket.Conn , 1 )
76-
77- waitersMutex .Lock ()
78- waiters [clientID ] = waitCh
79- waitersMutex .Unlock ()
80-
81- select {
82- case conn := <- waitCh :
83- return conn , nil
84- case <- time .After (timeout ):
85- waitersMutex .Lock ()
86- delete (waiters , clientID )
87- waitersMutex .Unlock ()
88- return nil , errors .New ("Timed out waiting for client" )
89- }
78+ clientsMutex .Lock ()
79+ if conn , ok := clients [clientID ]; ok {
80+ clientsMutex .Unlock ()
81+ return conn , nil
82+ }
83+ clientsMutex .Unlock ()
84+
85+ waitCh := make (chan * websocket.Conn , 1 )
86+
87+ waitersMutex .Lock ()
88+ waiters [clientID ] = waitCh
89+ waitersMutex .Unlock ()
90+
91+ select {
92+ case conn := <- waitCh :
93+ return conn , nil
94+ case <- time .After (timeout ):
95+ waitersMutex .Lock ()
96+ delete (waiters , clientID )
97+ waitersMutex .Unlock ()
98+ return nil , errors .New ("Timed out waiting for client" )
99+ }
90100}
91101
92-
93102func sendToClient (client * websocket.Conn , data map [string ]any ) error {
94103 return client .WriteJSON (data )
95104}
0 commit comments