@@ -198,9 +198,9 @@ open class SocketEngine:
198
198
2: Bad handshake request
199
199
3: Bad request
200
200
*/
201
- didError ( reason : error)
201
+ didError ( error : . engineErrorMessage ( error) )
202
202
} catch {
203
- client? . engineDidError ( reason : " Got unknown error from server \ ( msg) " )
203
+ client? . engineDidError ( error : . engineUnknownMessage ( msg) )
204
204
}
205
205
}
206
206
@@ -214,12 +214,13 @@ open class SocketEngine:
214
214
}
215
215
}
216
216
217
- private func closeOutEngine( reason: String ) {
217
+ private func closeOutEngine( reason: SocketConnectionChangeReason ) {
218
218
sid = " "
219
219
closed = true
220
220
invalidated = true
221
221
connected = false
222
-
222
+ // nil out the delegate here; we're getting callbacks from the old socket when closing and recreating the WS
223
+ ws? . delegate = nil
223
224
ws? . disconnect ( )
224
225
stopPolling ( )
225
226
client? . engineDidClose ( reason: reason)
@@ -236,7 +237,7 @@ open class SocketEngine:
236
237
if connected {
237
238
DefaultSocketLogger . Logger. error ( " Engine tried opening while connected. Assuming this was a reconnect " ,
238
239
type: SocketEngine . logType)
239
- _disconnect ( reason: " reconnect " )
240
+ _disconnect ( reason: . socketError ( . triedOpeningWhileConnected ) )
240
241
}
241
242
242
243
DefaultSocketLogger . Logger. log ( " Starting engine. Server: \( url) " , type: SocketEngine . logType)
@@ -315,25 +316,25 @@ open class SocketEngine:
315
316
}
316
317
317
318
/// Called when an error happens during execution. Causes a disconnection.
318
- open func didError( reason : String ) {
319
- DefaultSocketLogger . Logger. error ( " \( reason ) " , type: SocketEngine . logType)
320
- client? . engineDidError ( reason : reason )
321
- disconnect ( reason: reason )
319
+ open func didError( error : SocketError ) {
320
+ DefaultSocketLogger . Logger. error ( " \( error ) " , type: SocketEngine . logType)
321
+ client? . engineDidError ( error : error )
322
+ disconnect ( reason: . socketError ( error ) )
322
323
}
323
324
324
325
/// Disconnects from the server.
325
326
///
326
327
/// - parameter reason: The reason for the disconnection. This is communicated up to the client.
327
- open func disconnect( reason: String ) {
328
+ open func disconnect( reason: SocketConnectionChangeReason ) {
328
329
engineQueue. async {
329
330
self . _disconnect ( reason: reason)
330
331
}
331
332
}
332
333
333
- private func _disconnect( reason: String ) {
334
+ private func _disconnect( reason: SocketConnectionChangeReason ) {
334
335
guard connected && !closed else { return closeOutEngine ( reason: reason) }
335
336
336
- DefaultSocketLogger . Logger. log ( " Engine is being closed. " , type: SocketEngine . logType)
337
+ DefaultSocketLogger . Logger. log ( " Engine is being closed. \( reason ) " , type: SocketEngine . logType)
337
338
338
339
if polling {
339
340
disconnectPolling ( reason: reason)
@@ -345,7 +346,7 @@ open class SocketEngine:
345
346
346
347
// We need to take special care when we're polling that we send it ASAP
347
348
// Also make sure we're on the emitQueue since we're touching postWait
348
- private func disconnectPolling( reason: String ) {
349
+ private func disconnectPolling( reason: SocketConnectionChangeReason ) {
349
350
postWait. append ( ( String ( SocketEnginePacketType . close. rawValue) , { } ) )
350
351
351
352
doRequest ( for: createRequestForPostWithPostWait ( ) ) { _, _, _ in }
@@ -402,7 +403,7 @@ open class SocketEngine:
402
403
postWait. removeAll ( keepingCapacity: false )
403
404
}
404
405
405
- private func handleClose( _ reason: String ) {
406
+ private func handleClose( _ reason: SocketConnectionChangeReason ) {
406
407
client? . engineDidClose ( reason: reason)
407
408
}
408
409
@@ -416,13 +417,13 @@ open class SocketEngine:
416
417
417
418
private func handleOpen( openData: String ) {
418
419
guard let json = try ? openData. toDictionary ( ) else {
419
- didError ( reason : " Error parsing open packet " )
420
+ didError ( error : . openPacketUnparseable )
420
421
421
422
return
422
423
}
423
424
424
425
guard let sid = json [ " sid " ] as? String else {
425
- didError ( reason : " Open packet contained no sid " )
426
+ didError ( error : . openPacketMissingSID )
426
427
427
428
return
428
429
}
@@ -458,7 +459,7 @@ open class SocketEngine:
458
459
doPoll ( )
459
460
}
460
461
461
- client? . engineDidOpen ( reason: " Connect " )
462
+ client? . engineDidOpen ( reason: . engineOpen )
462
463
}
463
464
464
465
private func handlePong( with message: String ) {
@@ -492,8 +493,9 @@ open class SocketEngine:
492
493
// Make sure not to ping old connections
493
494
guard let this = self , this. sid == id else { return }
494
495
495
- if abs ( this. lastCommunication? . timeIntervalSinceNow ?? deadlineMs) >= deadlineMs {
496
- this. closeOutEngine ( reason: " Ping timeout " )
496
+ let actualTime = this. lastCommunication? . timeIntervalSinceNow ?? deadlineMs
497
+ if abs ( actualTime) >= deadlineMs {
498
+ this. closeOutEngine ( reason: . socketError( . pingTimeout( actualTime) ) )
497
499
} else {
498
500
this. checkPings ( )
499
501
}
@@ -541,7 +543,7 @@ open class SocketEngine:
541
543
case . open:
542
544
handleOpen ( openData: String ( message. dropFirst ( ) ) )
543
545
case . close:
544
- handleClose ( message)
546
+ handleClose ( . engineCloseMessage ( message) )
545
547
default :
546
548
DefaultSocketLogger . Logger. log ( " Got unknown packet type " , type: SocketEngine . logType)
547
549
}
@@ -571,7 +573,7 @@ open class SocketEngine:
571
573
572
574
// Server is not responding
573
575
if pongsMissed > pongsMissedMax {
574
- closeOutEngine ( reason: " Ping timeout " )
576
+ closeOutEngine ( reason: . socketError ( . pongsMissed ( pongsMissed ) ) )
575
577
return
576
578
}
577
579
@@ -687,12 +689,11 @@ open class SocketEngine:
687
689
}
688
690
}
689
691
690
- private func websocketDidDisconnect( error : Error ? ) {
692
+ private func websocketDidDisconnect( reason : SocketConnectionChangeReason ) {
691
693
probing = false
692
694
693
695
if closed {
694
- client? . engineDidClose ( reason: " Disconnect " )
695
-
696
+ client? . engineDidClose ( reason: reason)
696
697
return
697
698
}
698
699
@@ -705,12 +706,13 @@ open class SocketEngine:
705
706
connected = false
706
707
polling = true
707
708
708
- if let error = error as? WSError {
709
- didError ( reason: " \( error. message) . code= \( error. code) , type= \( error. type) " )
710
- } else if let reason = error? . localizedDescription {
711
- didError ( reason: reason)
712
- } else {
713
- client? . engineDidClose ( reason: " Socket Disconnected " )
709
+ //following existing patterns for these, just cleaning up a bit
710
+ switch ( reason) {
711
+ case . socketError( let error) :
712
+ didError ( error: error)
713
+ default :
714
+ //following existing pattern, we close ourselves out here
715
+ client? . engineDidClose ( reason: reason)
714
716
}
715
717
}
716
718
@@ -728,37 +730,47 @@ extension SocketEngine {
728
730
public func URLSession( session: URLSession , didBecomeInvalidWithError error: NSError ? ) {
729
731
DefaultSocketLogger . Logger. error ( " Engine URLSession became invalid " , type: " SocketEngine " )
730
732
731
- didError ( reason : " Engine URLSession became invalid " )
733
+ didError ( error : . urlSessionBecameInvalid ( error ) )
732
734
}
733
735
}
734
736
735
- enum EngineError : Error {
736
- case canceled
737
- }
737
+ // enum EngineError: Error {
738
+ // case canceled
739
+ // }
738
740
739
741
extension SocketEngine {
740
742
/// Delegate method for WebSocketDelegate.
741
743
///
742
744
/// - Parameters:
743
745
/// - event: WS Event
744
746
/// - _:
745
- public func didReceive( event: WebSocketEvent , client _: WebSocket ) {
747
+ public func didReceive( event: WebSocketEvent , client websocket: WebSocket ) {
748
+ guard websocket === self . ws else {
749
+ DefaultSocketLogger . Logger. log ( " Ignoring websocket event from wrong client: \( event) " , type: SocketEngine . logType)
750
+ return
751
+ }
746
752
switch event {
747
753
case let . connected( headers) :
748
754
wsConnected = true
749
755
client? . engineDidWebsocketUpgrade ( headers: headers)
750
756
websocketDidConnect ( )
751
757
case . cancelled:
752
758
wsConnected = false
753
- websocketDidDisconnect ( error : EngineError . canceled )
759
+ websocketDidDisconnect ( reason : . websocketEngineCanceled )
754
760
case let . disconnected( reason, code) :
755
761
wsConnected = false
756
- websocketDidDisconnect ( error : nil )
762
+ websocketDidDisconnect ( reason : . socketError ( . websocketEngineDisconnected ( reason , Int ( code ) ) ) )
757
763
case let . text( msg) :
758
764
parseEngineMessage ( msg)
759
765
case let . binary( data) :
760
766
parseEngineData ( data)
767
+ case let . error( error) :
768
+ DefaultSocketLogger . Logger. error ( " didReceive WebSocket error \( error as Any ) " , type: " SocketEngine " )
769
+ //share the error with the clients.
770
+ client? . engineDidError ( error: . websocketEngineError( error) )
771
+
761
772
case _:
773
+ //TODO: Handle or log other cases?
762
774
break
763
775
}
764
776
}
0 commit comments