Skip to content

Commit 0ebdc27

Browse files
committed
Fix race condition in WebSocketClient connection handling
1 parent 2d0bf37 commit 0ebdc27

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

Sources/StreamVideo/StreamVideo.swift

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -488,25 +488,34 @@ public class StreamVideo: ObservableObject, @unchecked Sendable {
488488
} else {
489489
throw ClientError.Unknown()
490490
}
491-
var connected = false
492-
var timeout = false
493-
let control = DefaultTimer.schedule(timeInterval: 30, queue: .sdk) {
494-
timeout = true
495-
}
496-
log.debug("Listening for WS connection")
497-
webSocketClient?.onConnected = {
498-
control.cancel()
499-
connected = true
500-
log.debug("WS connected")
501-
}
502491

503-
while (!connected && !timeout) {
504-
try await Task.sleep(nanoseconds: 100_000)
505-
}
506-
507-
if timeout {
508-
log.debug("Timeout while waiting for WS connection opening")
509-
throw ClientError.NetworkError()
492+
log.debug("Listening for WS connection")
493+
var continuationHandler: (() -> Void)? = nil
494+
try await withThrowingTaskGroup(of: Void.self) { group in
495+
group.addTask {
496+
try await Task.sleep(nanoseconds: 30 * 1_000_000_000)
497+
log.debug("Timeout while waiting for WS connection opening")
498+
continuationHandler = nil
499+
throw ClientError.NetworkError()
500+
}
501+
group.addTask {
502+
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
503+
continuationHandler = {
504+
continuation.resume(returning: ())
505+
}
506+
webSocketClient?.onConnected = { [weak self] in
507+
self?.log.debug("WS connected")
508+
// Only resume if the handler still exists
509+
if let continuationHandler {
510+
continuationHandler()
511+
continuationHandler = nil
512+
}
513+
}
514+
}
515+
}
516+
// race between “onConnected” and 30s timeout: whichever finishes first “wins”
517+
try await group.next()
518+
group.cancelAll()
510519
}
511520
}
512521

0 commit comments

Comments
 (0)