Skip to content

Commit c8cb5dc

Browse files
committed
fix waitfor
1 parent 51b8f07 commit c8cb5dc

1 file changed

Lines changed: 28 additions & 17 deletions

File tree

internals/server/websocket.go

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1720
var clients = make(map[string]*websocket.Conn)
1821
var clientsMutex = &sync.Mutex{}
1922

@@ -46,7 +49,6 @@ func websocketHandler(w http.ResponseWriter, req *http.Request) {
4649
}
4750
}
4851

49-
5052
func 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+
8293
func sendToClient(client *websocket.Conn, data map[string]any) error {
8394
return client.WriteJSON(data)
8495
}

0 commit comments

Comments
 (0)