@@ -40,19 +40,9 @@ internal class SignalClient: MulticastDelegate<SignalClientDelegate> {
40
40
41
41
// MARK: - Private
42
42
43
- private enum QueueState {
44
- case resumed
45
- case suspended
46
- }
47
-
48
- // queue to store requests while reconnecting
49
- private var requestQueue = [ Livekit_SignalRequest] ( )
50
- private var responseQueue = [ Livekit_SignalResponse] ( )
51
-
52
- private let requestDispatchQueue = DispatchQueue ( label: " LiveKitSDK.signalClient.requestQueue " , qos: . default)
53
- private let responseDispatchQueue = DispatchQueue ( label: " LiveKitSDK.signalClient.responseQueue " , qos: . default)
54
-
55
- private var responseQueueState : QueueState = . resumed
43
+ // Queue to store requests while reconnecting
44
+ private let _requestQueue = AsyncQueueActor < Livekit_SignalRequest > ( )
45
+ private var _responseQueue = AsyncQueueActor < Livekit_SignalResponse > ( )
56
46
57
47
private var _webSocket : WebSocket ?
58
48
private var latestJoinResponse : Livekit_JoinResponse ?
@@ -89,7 +79,7 @@ internal class SignalClient: MulticastDelegate<SignalClientDelegate> {
89
79
reconnectMode: ReconnectMode ? = nil ,
90
80
adaptiveStream: Bool ) async throws {
91
81
92
- cleanUp ( )
82
+ await cleanUp ( )
93
83
94
84
log ( " reconnectMode: \( String ( describing: reconnectMode) ) " )
95
85
@@ -123,14 +113,17 @@ internal class SignalClient: MulticastDelegate<SignalClientDelegate> {
123
113
self . onWebSocketMessage ( message: message)
124
114
}
125
115
} catch {
126
- //
127
- self . cleanUp ( reason: . networkError( error) )
116
+ await self . cleanUp ( reason: . networkError( error) )
128
117
}
129
118
self . log ( " Did exit WebSocket message loop... " )
130
119
}
131
120
} catch let error {
132
121
133
- defer { cleanUp ( reason: . networkError( error) ) }
122
+ defer {
123
+ Task {
124
+ await cleanUp ( reason: . networkError( error) )
125
+ }
126
+ }
134
127
135
128
// Skip validation if reconnect mode
136
129
if reconnectMode != nil { throw error }
@@ -152,7 +145,7 @@ internal class SignalClient: MulticastDelegate<SignalClientDelegate> {
152
145
}
153
146
}
154
147
155
- func cleanUp( reason: DisconnectReason ? = nil ) {
148
+ func cleanUp( reason: DisconnectReason ? = nil ) async {
156
149
157
150
log ( " reason: \( String ( describing: reason) ) " )
158
151
@@ -180,16 +173,8 @@ internal class SignalClient: MulticastDelegate<SignalClientDelegate> {
180
173
$0 = State ( )
181
174
}
182
175
183
- requestDispatchQueue. async { [ weak self] in
184
- guard let self = self else { return }
185
- self . requestQueue = [ ]
186
- }
187
-
188
- responseDispatchQueue. async { [ weak self] in
189
- guard let self = self else { return }
190
- self . responseQueue = [ ]
191
- self . responseQueueState = . resumed
192
- }
176
+ await _requestQueue. clear ( )
177
+ await _responseQueue. clear ( )
193
178
}
194
179
195
180
func resumeCompleter( forAddTrackRequest trackCid: String , trackInfo: Livekit_TrackInfo ) {
@@ -224,12 +209,9 @@ private extension SignalClient {
224
209
// send request or enqueue while reconnecting
225
210
func sendRequest( _ request: Livekit_SignalRequest , enqueueIfReconnecting: Bool = true ) async throws {
226
211
227
- // on: requestDispatchQueue
228
-
229
212
guard !( _state. connectionState. isReconnecting && request. canEnqueue ( ) && enqueueIfReconnecting) else {
230
- log ( " queuing request while reconnecting, request: \( request) " )
231
- requestQueue. append ( request)
232
- // success
213
+ log ( " Queuing request while reconnecting, request: \( request) " )
214
+ await _requestQueue. enqueue ( request)
233
215
return
234
216
}
235
217
@@ -267,17 +249,12 @@ private extension SignalClient {
267
249
return
268
250
}
269
251
270
- responseDispatchQueue. async {
271
- if case . suspended = self . responseQueueState {
272
- self . log ( " Enqueueing response: \( response) " )
273
- self . responseQueue. append ( response)
274
- } else {
275
- self . onSignalResponse ( response)
276
- }
252
+ Task {
253
+ await _responseQueue. enqueue ( response) { await processSignalResponse ( $0) }
277
254
}
278
255
}
279
256
280
- func onSignalResponse ( _ response: Livekit_SignalResponse ) {
257
+ func processSignalResponse ( _ response: Livekit_SignalResponse ) async {
281
258
282
259
guard case . connected = connectionState else {
283
260
log ( " Not connected " , . warning)
@@ -291,7 +268,7 @@ private extension SignalClient {
291
268
292
269
switch message {
293
270
case . join( let joinResponse) :
294
- responseQueueState = . suspended
271
+ await _responseQueue . suspend ( )
295
272
latestJoinResponse = joinResponse
296
273
restartPingTimer ( )
297
274
notify { $0. signalClient ( self , didReceive: joinResponse) }
@@ -370,23 +347,9 @@ internal extension SignalClient {
370
347
371
348
func resumeResponseQueue( ) async throws {
372
349
373
- // on: responseDispatchQueue
374
-
375
- defer { responseQueueState = . resumed }
376
-
377
- // Quickly return if no queued requests
378
- guard !responseQueue. isEmpty else {
379
- self . log ( " No queued response " )
380
- return
350
+ await _responseQueue. resume { response in
351
+ await processSignalResponse ( response)
381
352
}
382
-
383
- // Run responses in sequence
384
- for response in responseQueue {
385
- onSignalResponse ( response)
386
- }
387
-
388
- // Clear the queue
389
- responseQueue = [ ]
390
353
}
391
354
}
392
355
@@ -396,25 +359,13 @@ internal extension SignalClient {
396
359
397
360
func sendQueuedRequests( ) async throws {
398
361
399
- // on: requestDispatchQueue
400
-
401
- // Return if no queued requests
402
- guard !requestQueue. isEmpty else {
403
- log ( " No queued requests " )
404
- return
405
- }
406
-
407
- // Send requests in sequential order
408
- for request in requestQueue {
362
+ await _requestQueue. resume { element in
409
363
do {
410
- try await sendRequest ( request , enqueueIfReconnecting: false )
364
+ try await sendRequest ( element , enqueueIfReconnecting: false )
411
365
} catch let error {
412
- log ( " Failed to send queued request \( request ) with error: \( error) " , . error)
366
+ log ( " Failed to send queued request \( element ) with error: \( error) " , . error)
413
367
}
414
368
}
415
-
416
- // Clear the queue
417
- requestQueue = [ ]
418
369
}
419
370
420
371
func sendOffer( offer: LKRTCSessionDescription ) async throws {
@@ -623,7 +574,9 @@ internal extension SignalClient {
623
574
624
575
defer {
625
576
if shouldDisconnect {
626
- cleanUp ( reason: . networkError( NetworkError . disconnected ( message: " Simulate scenario " ) ) )
577
+ Task {
578
+ await cleanUp ( reason: . networkError( NetworkError . disconnected ( message: " Simulate scenario " ) ) )
579
+ }
627
580
}
628
581
}
629
582
@@ -658,7 +611,9 @@ private extension SignalClient {
658
611
timer. handler = { [ weak self] in
659
612
guard let self = self else { return }
660
613
self . log ( " ping/pong timed out " , . error)
661
- self . cleanUp ( reason: . networkError( SignalClientError . serverPingTimedOut ( ) ) )
614
+ Task {
615
+ await self . cleanUp ( reason: . networkError( SignalClientError . serverPingTimedOut ( ) ) )
616
+ }
662
617
}
663
618
timer. resume ( )
664
619
return timer
0 commit comments