@@ -14,6 +14,9 @@ var upgrader = websocket.Upgrader{
1414 CheckOrigin : func (r * http.Request ) bool { return true },
1515}
1616
17+ var waiters = make (map [string ]chan * websocket.Conn )
18+ var waitersMutex = & sync.Mutex {}
19+
1720var clients = make (map [string ]* websocket.Conn )
1821var clientsMutex = & sync.Mutex {}
1922
@@ -46,7 +49,6 @@ func websocketHandler(w http.ResponseWriter, req *http.Request) {
4649 }
4750}
4851
49-
5052func register (req * http.Request , socket * websocket.Conn ) string {
5153 clientID := req .URL .Query ().Get ("client_id" )
5254 if clientID == "" {
@@ -57,28 +59,37 @@ func register(req *http.Request, socket *websocket.Conn) string {
5759 clientsMutex .Lock ()
5860 clients [clientID ] = socket
5961 clientsMutex .Unlock ()
62+ waitersMutex .Lock ()
63+ if ch , ok := waiters [clientID ]; ok {
64+ ch <- socket
65+
66+ close (ch )
67+ delete (waiters , clientID )
68+ }
69+ waitersMutex .Unlock ()
6070
6171 return clientID
6272}
6373
64- func WaitForClient (clientID string , timeout time.Duration ) (* websocket.Conn , error ) {
65- deadline := time . Now (). Add ( timeout )
66-
67- for time . Now (). Before ( deadline ) {
68- clientsMutex . Lock ()
69- conn , exists := clients [ clientID ]
70- clientsMutex . Unlock ()
71-
72- if exists && conn != nil {
73- return conn , nil
74- }
75-
76- time . Sleep ( 100 * time . Millisecond )
77- }
78-
79- return nil , errors . New ( "Timed out waiting for client" )
74+ func 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+ }
8090}
8191
92+
8293func sendToClient (client * websocket.Conn , data map [string ]any ) error {
8394 return client .WriteJSON (data )
8495}
0 commit comments