@@ -217,6 +217,18 @@ extension ParseLiveQuery: LiveQuerySocketDelegate {
217217
218218 func received( _ data: Data ) {
219219
220+ if let redirect = try ? ParseCoding . jsonDecoder ( ) . decode ( RedirectResponse . self, from: data) {
221+ if redirect. op == . redirect {
222+ url = redirect. url
223+ if isConnected {
224+ try ? self . close ( false )
225+ //Try to reconnect
226+ self . createTask ( )
227+ }
228+ }
229+ return
230+ }
231+
220232 if !self . isConnected {
221233 //Check if this is a connected response
222234 guard let response = try ? ParseCoding . jsonDecoder ( ) . decode ( ConnectionResponse . self, from: data) ,
@@ -261,11 +273,22 @@ extension ParseLiveQuery: LiveQuerySocketDelegate {
261273
262274 switch preliminaryMessage. op {
263275 case . subscribed:
276+
264277 if let subscribed = pendingQueue
265278 . first ( where: { $0. 0 . value == preliminaryMessage. requestId } ) {
279+ let requestId = RequestId ( value: preliminaryMessage. requestId)
280+ let isNew : Bool !
281+ if subscriptions [ requestId] != nil {
282+ isNew = false
283+ /*pendingQueue.removeAll(where: { $0.0.value == preliminaryMessage.requestId })
284+ subscriptions[subscribed.0] = subscribed.1
285+ subscribed.1.subscribeHandlerClosure?(false)*/
286+ } else {
287+ isNew = true
288+ }
266289 removePendingSubscription ( subscribed. 0 . value)
267290 subscriptions [ subscribed. 0 ] = subscribed. 1
268- subscribed. 1 . subscribeHandlerClosure ? ( )
291+ subscribed. 1 . subscribeHandlerClosure ? ( isNew )
269292 }
270293 case . unsubscribed:
271294 let requestId = RequestId ( value: preliminaryMessage. requestId)
@@ -347,10 +370,12 @@ extension ParseLiveQuery {
347370 }
348371
349372 ///Manually disconnect from the `ParseLiveQuery` server.
350- public func close( ) throws {
373+ public func close( _ isUser : Bool = true ) throws {
351374 if isConnected {
352375 task. cancel ( )
353- isDisconnectedByUser = true
376+ if isUser {
377+ isDisconnectedByUser = true
378+ }
354379 }
355380 URLSession . liveQuery. delegates. removeValue ( forKey: task)
356381 }
@@ -372,7 +397,7 @@ extension ParseLiveQuery {
372397 var queryData : Data
373398 var subscriptionHandler : AnyObject
374399 var eventHandlerClosure : ( ( Data ) -> Void ) ?
375- var subscribeHandlerClosure : ( ( ) -> Void ) ?
400+ var subscribeHandlerClosure : ( ( Bool ) -> Void ) ?
376401 var unsubscribeHandlerClosure : ( ( ) -> Void ) ?
377402
378403 init ? < T: SubscriptionHandlable > ( query: Query < T . Object > , message: SubscribeMessage < T . Object > , handler: T ) {
@@ -392,11 +417,11 @@ extension ParseLiveQuery {
392417 try ? handler. didReceive ( event)
393418 }
394419
395- subscribeHandlerClosure = { ( ) in
420+ subscribeHandlerClosure = { ( new ) in
396421 guard let handler = self . subscriptionHandler as? T else {
397422 return
398423 }
399- handler. didSubscribe ( )
424+ handler. didSubscribe ( new )
400425 }
401426
402427 unsubscribeHandlerClosure = { ( ) in
@@ -458,7 +483,6 @@ extension ParseLiveQuery {
458483 }
459484
460485 func unsubscribe( matching matcher: @escaping ( SubscriptionRecord ) -> Bool ) throws {
461- var temp = [ RequestId: SubscriptionRecord] ( )
462486 try subscriptions. forEach { ( key, value) -> Void in
463487 if matcher ( value) {
464488 let encoded = try ParseCoding
@@ -469,10 +493,11 @@ extension ParseLiveQuery {
469493 updatedRecord. messageData = encoded
470494 self . send ( record: updatedRecord, requestId: key) { _ in }
471495 } else {
472- temp [ key] = value
496+ let error = ParseError ( code: . unknownError,
497+ message: " ParseLiveQuery Error: Not subscribed to this query " )
498+ throw error
473499 }
474500 }
475- subscriptions = temp
476501 }
477502}
478503
@@ -483,10 +508,9 @@ extension ParseLiveQuery {
483508 func update< T> ( _ handler: T ) throws where T: SubscriptionHandlable {
484509 try subscriptions. forEach { ( key, value) -> Void in
485510 if value. subscriptionHandler === handler {
486- let message = SubscribeMessage < T . Object > ( operation: . subscribe , requestId: key, query: handler. query)
511+ let message = SubscribeMessage < T . Object > ( operation: . update , requestId: key, query: handler. query)
487512 let updatedRecord = value
488513 try updatedRecord. update ( query: handler. query, message: message)
489- subscriptions. removeValue ( forKey: key)
490514 self . send ( record: updatedRecord, requestId: key) { _ in }
491515 }
492516 }
0 commit comments