Skip to content

Commit bc4a793

Browse files
authored
LiveQuery socket changes received on queue (#195)
* LiveQuery socket changes received on queue * Update .codecov.yml
1 parent f395990 commit bc4a793

File tree

2 files changed

+114
-109
lines changed

2 files changed

+114
-109
lines changed

.codecov.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ coverage:
44
status:
55
patch:
66
default:
7-
target: auto
7+
target: 71
88
changes: false
99
project:
1010
default:

Sources/ParseSwift/LiveQuery/ParseLiveQuery.swift

Lines changed: 113 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -310,157 +310,162 @@ extension ParseLiveQuery: LiveQuerySocketDelegate {
310310
func status(_ status: LiveQuerySocket.Status,
311311
closeCode: URLSessionWebSocketTask.CloseCode? = nil,
312312
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 {
329315

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 {
336325
//Try to reconnect
337326
self.resumeTask()
338327
}
339328
}
340-
return
341329
}
330+
}
342331

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+
}
356342
}
357343
return
358344
}
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)")
374357
self.notificationQueue.async {
375-
self.receiveDelegate?.received(error)
358+
self.receiveDelegate?.received(parseError)
376359
}
377360
return
378361
}
379-
let error = ParseError(code: .unknownError,
380-
// swiftlint:disable:next line_length
381-
message: "ParseLiveQuery Error: Received message out of order: \(outOfOrderMessage)")
382362
self.notificationQueue.async {
383-
self.receiveDelegate?.received(error)
363+
self.receiveDelegate?.received(parseError)
384364
}
385365
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+
}
396382
let error = ParseError(code: .unknownError,
397383
// 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)")
399385
self.notificationQueue.async {
400386
self.receiveDelegate?.received(error)
401387
}
388+
return
402389
}
390+
self.clientId = response.clientId
391+
self.isConnected = true
392+
} else {
403393

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 {
406399
let error = ParseError(code: .unknownError,
407400
// 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...")
409402
self.notificationQueue.async {
410403
self.receiveDelegate?.received(error)
411404
}
412405
}
413-
}
414406

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+
}
417417

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:
420437
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
426440
}
427-
self.subscriptions[subscribed.0] = subscribed.1
428-
self.removePendingSubscription(subscribed.0.value)
441+
self.subscriptions.removeValue(forKey: requestId)
442+
self.removePendingSubscription(preliminaryMessage.requestId)
429443
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)
431459
}
432460
}
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 {
452463
let error = ParseError(code: .unknownError,
453464
message: "ParseLiveQuery Error: Hit an undefined state.")
454465
self.notificationQueue.async {
455466
self.receiveDelegate?.received(error)
456467
}
457468
}
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-
}
464469
}
465470
}
466471
}

0 commit comments

Comments
 (0)