@@ -310,157 +310,162 @@ extension ParseLiveQuery: LiveQuerySocketDelegate {
310
310
func status( _ status: LiveQuerySocket . Status ,
311
311
closeCode: URLSessionWebSocketTask . CloseCode ? = nil ,
312
312
reason: Data ? = nil ) {
313
- switch status {
314
-
315
- case . open:
316
- self . isSocketEstablished = true
317
- self . open ( isUserWantsToConnect: false ) { _ in }
318
- case . closed:
319
- self . notificationQueue. async {
320
- self . receiveDelegate? . closedSocket ( closeCode, reason: reason)
321
- }
322
- self . isSocketEstablished = false
323
- if !self . isDisconnectedByUser {
324
- //Try to reconnect
325
- self . resumeTask ( )
326
- }
327
- }
328
- }
313
+ synchronizationQueue. sync {
314
+ switch status {
329
315
330
- func received( _ data: Data ) {
331
- if let redirect = try ? ParseCoding . jsonDecoder ( ) . decode ( RedirectResponse . self, from: data) {
332
- if redirect. op == . redirect {
333
- self . url = redirect. url
334
- if self . isConnected {
335
- self . close ( useDedicatedQueue: true )
316
+ case . open:
317
+ self . isSocketEstablished = true
318
+ self . open ( isUserWantsToConnect: false ) { _ in }
319
+ case . closed:
320
+ self . notificationQueue. async {
321
+ self . receiveDelegate? . closedSocket ( closeCode, reason: reason)
322
+ }
323
+ self . isSocketEstablished = false
324
+ if !self . isDisconnectedByUser {
336
325
//Try to reconnect
337
326
self . resumeTask ( )
338
327
}
339
328
}
340
- return
341
329
}
330
+ }
342
331
343
- //Check if this is an error response
344
- if let error = try ? ParseCoding . jsonDecoder ( ) . decode ( ErrorResponse . self, from: data) {
345
- if !error. reconnect {
346
- //Treat this as a user disconnect because the server doesn't want to hear from us anymore
347
- self . close ( )
348
- }
349
- guard let parseError = try ? ParseCoding . jsonDecoder ( ) . decode ( ParseError . self, from: data) else {
350
- //Turn LiveQuery error into ParseError
351
- let parseError = ParseError ( code: . unknownError,
352
- // swiftlint:disable:next line_length
353
- message: " ParseLiveQuery Error: code: \( error. code) , message: \( error. message) " )
354
- self . notificationQueue. async {
355
- self . receiveDelegate? . received ( parseError)
332
+ func received( _ data: Data ) {
333
+ synchronizationQueue. sync {
334
+ if let redirect = try ? ParseCoding . jsonDecoder ( ) . decode ( RedirectResponse . self, from: data) {
335
+ if redirect. op == . redirect {
336
+ self . url = redirect. url
337
+ if self . isConnected {
338
+ self . close ( useDedicatedQueue: true )
339
+ //Try to reconnect
340
+ self . resumeTask ( )
341
+ }
356
342
}
357
343
return
358
344
}
359
- self . notificationQueue. async {
360
- self . receiveDelegate? . received ( parseError)
361
- }
362
- return
363
- } else if !self . isConnected {
364
- //Check if this is a connected response
365
- guard let response = try ? ParseCoding . jsonDecoder ( ) . decode ( ConnectionResponse . self, from: data) ,
366
- response. op == . connected else {
367
- //If not connected, shouldn't receive anything other than a connection response
368
- guard let outOfOrderMessage = try ? ParseCoding
369
- . jsonDecoder ( )
370
- . decode ( AnyCodable . self, from: data) else {
371
- let error = ParseError ( code: . unknownError,
372
- // swiftlint:disable:next line_length
373
- message: " ParseLiveQuery Error: Received message out of order, but couldn't decode it " )
345
+
346
+ //Check if this is an error response
347
+ if let error = try ? ParseCoding . jsonDecoder ( ) . decode ( ErrorResponse . self, from: data) {
348
+ if !error. reconnect {
349
+ //Treat this as a user disconnect because the server doesn't want to hear from us anymore
350
+ self . close ( )
351
+ }
352
+ guard let parseError = try ? ParseCoding . jsonDecoder ( ) . decode ( ParseError . self, from: data) else {
353
+ //Turn LiveQuery error into ParseError
354
+ let parseError = ParseError ( code: . unknownError,
355
+ // swiftlint:disable:next line_length
356
+ message: " ParseLiveQuery Error: code: \( error. code) , message: \( error. message) " )
374
357
self . notificationQueue. async {
375
- self . receiveDelegate? . received ( error )
358
+ self . receiveDelegate? . received ( parseError )
376
359
}
377
360
return
378
361
}
379
- let error = ParseError ( code: . unknownError,
380
- // swiftlint:disable:next line_length
381
- message: " ParseLiveQuery Error: Received message out of order: \( outOfOrderMessage) " )
382
362
self . notificationQueue. async {
383
- self . receiveDelegate? . received ( error )
363
+ self . receiveDelegate? . received ( parseError )
384
364
}
385
365
return
386
- }
387
- self . clientId = response. clientId
388
- self . isConnected = true
389
- } else {
390
-
391
- if let preliminaryMessage = try ? ParseCoding . jsonDecoder ( )
392
- . decode ( PreliminaryMessageResponse . self,
393
- from: data) {
394
-
395
- if preliminaryMessage. clientId != self . clientId {
366
+ } else if !self . isConnected {
367
+ //Check if this is a connected response
368
+ guard let response = try ? ParseCoding . jsonDecoder ( ) . decode ( ConnectionResponse . self, from: data) ,
369
+ response. op == . connected else {
370
+ //If not connected, shouldn't receive anything other than a connection response
371
+ guard let outOfOrderMessage = try ? ParseCoding
372
+ . jsonDecoder ( )
373
+ . decode ( AnyCodable . self, from: data) else {
374
+ let error = ParseError ( code: . unknownError,
375
+ // swiftlint:disable:next line_length
376
+ message: " ParseLiveQuery Error: Received message out of order, but couldn't decode it " )
377
+ self . notificationQueue. async {
378
+ self . receiveDelegate? . received ( error)
379
+ }
380
+ return
381
+ }
396
382
let error = ParseError ( code: . unknownError,
397
383
// swiftlint:disable:next line_length
398
- message: " ParseLiveQuery Error: Received a message from a server who sent clientId \( preliminaryMessage . clientId ) while it should be \( String ( describing : self . clientId ) ) . Not accepting message... " )
384
+ message: " ParseLiveQuery Error: Received message out of order: \( outOfOrderMessage ) " )
399
385
self . notificationQueue. async {
400
386
self . receiveDelegate? . received ( error)
401
387
}
388
+ return
402
389
}
390
+ self . clientId = response. clientId
391
+ self . isConnected = true
392
+ } else {
403
393
404
- if let installationId = BaseParseInstallation . currentInstallationContainer. installationId {
405
- if installationId != preliminaryMessage. installationId {
394
+ if let preliminaryMessage = try ? ParseCoding . jsonDecoder ( )
395
+ . decode ( PreliminaryMessageResponse . self,
396
+ from: data) {
397
+
398
+ if preliminaryMessage. clientId != self . clientId {
406
399
let error = ParseError ( code: . unknownError,
407
400
// swiftlint:disable:next line_length
408
- message: " ParseLiveQuery Error: Received a message from a server who sent an installationId of \( String ( describing : preliminaryMessage. installationId ) ) while it should be \( installationId ) . Not accepting message... " )
401
+ message: " ParseLiveQuery Error: Received a message from a server who sent clientId \( preliminaryMessage. clientId ) while it should be \( String ( describing : self . clientId ) ) . Not accepting message... " )
409
402
self . notificationQueue. async {
410
403
self . receiveDelegate? . received ( error)
411
404
}
412
405
}
413
- }
414
406
415
- switch preliminaryMessage. op {
416
- case . subscribed:
407
+ if let installationId = BaseParseInstallation . currentInstallationContainer. installationId {
408
+ if installationId != preliminaryMessage. installationId {
409
+ let error = ParseError ( code: . unknownError,
410
+ // swiftlint:disable:next line_length
411
+ message: " ParseLiveQuery Error: Received a message from a server who sent an installationId of \( String ( describing: preliminaryMessage. installationId) ) while it should be \( installationId) . Not accepting message... " )
412
+ self . notificationQueue. async {
413
+ self . receiveDelegate? . received ( error)
414
+ }
415
+ }
416
+ }
417
417
418
- if let subscribed = self . pendingSubscriptions
419
- . first ( where: { $0. 0 . value == preliminaryMessage. requestId } ) {
418
+ switch preliminaryMessage. op {
419
+ case . subscribed:
420
+
421
+ if let subscribed = self . pendingSubscriptions
422
+ . first ( where: { $0. 0 . value == preliminaryMessage. requestId } ) {
423
+ let requestId = RequestId ( value: preliminaryMessage. requestId)
424
+ let isNew : Bool !
425
+ if self . subscriptions [ requestId] != nil {
426
+ isNew = false
427
+ } else {
428
+ isNew = true
429
+ }
430
+ self . subscriptions [ subscribed. 0 ] = subscribed. 1
431
+ self . removePendingSubscription ( subscribed. 0 . value)
432
+ self . notificationQueue. async {
433
+ subscribed. 1 . subscribeHandlerClosure ? ( isNew)
434
+ }
435
+ }
436
+ case . unsubscribed:
420
437
let requestId = RequestId ( value: preliminaryMessage. requestId)
421
- let isNew : Bool !
422
- if self . subscriptions [ requestId] != nil {
423
- isNew = false
424
- } else {
425
- isNew = true
438
+ guard let subscription = self . subscriptions [ requestId] else {
439
+ return
426
440
}
427
- self . subscriptions [ subscribed . 0 ] = subscribed . 1
428
- self . removePendingSubscription ( subscribed . 0 . value )
441
+ self . subscriptions. removeValue ( forKey : requestId )
442
+ self . removePendingSubscription ( preliminaryMessage . requestId )
429
443
self . notificationQueue. async {
430
- subscribed. 1 . subscribeHandlerClosure ? ( isNew)
444
+ subscription. unsubscribeHandlerClosure ? ( )
445
+ }
446
+ case . create, . update, . delete, . enter, . leave:
447
+ let requestId = RequestId ( value: preliminaryMessage. requestId)
448
+ guard let subscription = self . subscriptions [ requestId] else {
449
+ return
450
+ }
451
+ self . notificationQueue. async {
452
+ subscription. eventHandlerClosure ? ( data)
453
+ }
454
+ default :
455
+ let error = ParseError ( code: . unknownError,
456
+ message: " ParseLiveQuery Error: Hit an undefined state. " )
457
+ self . notificationQueue. async {
458
+ self . receiveDelegate? . received ( error)
431
459
}
432
460
}
433
- case . unsubscribed:
434
- let requestId = RequestId ( value: preliminaryMessage. requestId)
435
- guard let subscription = self . subscriptions [ requestId] else {
436
- return
437
- }
438
- self . subscriptions. removeValue ( forKey: requestId)
439
- self . removePendingSubscription ( preliminaryMessage. requestId)
440
- self . notificationQueue. async {
441
- subscription. unsubscribeHandlerClosure ? ( )
442
- }
443
- case . create, . update, . delete, . enter, . leave:
444
- let requestId = RequestId ( value: preliminaryMessage. requestId)
445
- guard let subscription = self . subscriptions [ requestId] else {
446
- return
447
- }
448
- self . notificationQueue. async {
449
- subscription. eventHandlerClosure ? ( data)
450
- }
451
- default :
461
+
462
+ } else {
452
463
let error = ParseError ( code: . unknownError,
453
464
message: " ParseLiveQuery Error: Hit an undefined state. " )
454
465
self . notificationQueue. async {
455
466
self . receiveDelegate? . received ( error)
456
467
}
457
468
}
458
-
459
- } else {
460
- let error = ParseError ( code: . unknownError, message: " ParseLiveQuery Error: Hit an undefined state. " )
461
- self . notificationQueue. async {
462
- self . receiveDelegate? . received ( error)
463
- }
464
469
}
465
470
}
466
471
}
0 commit comments