@@ -28,7 +28,17 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
28
28
public let socketURL : NSURL
29
29
30
30
public private( set) var engine : SocketEngineSpec ?
31
- public private( set) var status = SocketIOClientStatus . NotConnected
31
+ public private( set) var status = SocketIOClientStatus . NotConnected {
32
+ didSet {
33
+ switch status {
34
+ case . Connected:
35
+ reconnecting = false
36
+ currentReconnectAttempt = 0
37
+ default :
38
+ break
39
+ }
40
+ }
41
+ }
32
42
33
43
public var forceNew = false
34
44
public var nsp = " / "
@@ -46,18 +56,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
46
56
private var anyHandler : ( ( SocketAnyEvent ) -> Void ) ?
47
57
private var currentReconnectAttempt = 0
48
58
private var handlers = [ SocketEventHandler] ( )
49
- private var reconnectTimer : NSTimer ?
50
59
private var ackHandlers = SocketAckManager ( )
60
+ private var reconnecting = false
51
61
52
62
private( set) var currentAck = - 1
53
63
private( set) var handleQueue = dispatch_get_main_queue ( )
54
64
private( set) var reconnectAttempts = - 1
55
65
56
66
var waitingPackets = [ SocketPacket] ( )
57
67
58
- /**
59
- Type safe way to create a new SocketIOClient. opts can be omitted
60
- */
68
+ /// Type safe way to create a new SocketIOClient. opts can be omitted
61
69
public init ( socketURL: NSURL , options: Set < SocketIOClientOption > = [ ] ) {
62
70
self . options = options
63
71
self . socketURL = socketURL
@@ -94,10 +102,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
94
102
super. init ( )
95
103
}
96
104
97
- /**
98
- Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity.
99
- If using Swift it's recommended to use `init(socketURL: NSURL, options: Set<SocketIOClientOption>)`
100
- */
105
+ /// Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity.
106
+ /// If using Swift it's recommended to use `init(socketURL: NSURL, options: Set<SocketIOClientOption>)`
101
107
public convenience init ( socketURL: NSURL , options: NSDictionary ? ) {
102
108
self . init ( socketURL: socketURL, options: options? . toSocketOptionsSet ( ) ?? [ ] )
103
109
}
@@ -127,26 +133,17 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
127
133
return engine!
128
134
}
129
135
130
- private func clearReconnectTimer( ) {
131
- reconnectTimer? . invalidate ( )
132
- reconnectTimer = nil
133
- }
134
-
135
136
@available ( * , deprecated= 5.3 , message= " Please use disconnect() " )
136
137
public func close( ) {
137
138
disconnect ( )
138
139
}
139
140
140
- /**
141
- Connect to the server.
142
- */
141
+ /// Connect to the server.
143
142
public func connect( ) {
144
143
connect ( timeoutAfter: 0 , withTimeoutHandler: nil )
145
144
}
146
145
147
- /**
148
- Connect to the server. If we aren't connected after timeoutAfter, call handler
149
- */
146
+ /// Connect to the server. If we aren't connected after timeoutAfter, call handler
150
147
public func connect( timeoutAfter timeoutAfter: Int , withTimeoutHandler handler: ( ( ) -> Void ) ? ) {
151
148
assert ( timeoutAfter >= 0 , " Invalid timeout: \( timeoutAfter) " )
152
149
@@ -203,8 +200,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
203
200
func didConnect( ) {
204
201
DefaultSocketLogger . Logger. log ( " Socket connected " , type: logType)
205
202
status = . Connected
206
- currentReconnectAttempt = 0
207
- clearReconnectTimer ( )
208
203
209
204
// Don't handle as internal because something crazy could happen where
210
205
// we disconnect before it's handled
@@ -224,27 +219,21 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
224
219
handleEvent ( " disconnect " , data: [ reason] , isInternalMessage: true )
225
220
}
226
221
227
- /**
228
- Disconnects the socket. Only reconnect the same socket if you know what you're doing.
229
- Will turn off automatic reconnects.
230
- */
222
+ /// Disconnects the socket. Only reconnect the same socket if you know what you're doing.
223
+ /// Will turn off automatic reconnects.
231
224
public func disconnect( ) {
232
225
DefaultSocketLogger . Logger. log ( " Closing socket " , type: logType)
233
226
234
227
reconnects = false
235
228
didDisconnect ( " Disconnect " )
236
229
}
237
230
238
- /**
239
- Send a message to the server
240
- */
231
+ /// Send a message to the server
241
232
public func emit( event: String , _ items: AnyObject ... ) {
242
233
emit ( event, withItems: items)
243
234
}
244
235
245
- /**
246
- Same as emit, but meant for Objective-C
247
- */
236
+ /// Same as emit, but meant for Objective-C
248
237
public func emit( event: String , withItems items: [ AnyObject ] ) {
249
238
guard status == . Connected else {
250
239
handleEvent ( " error " , data: [ " Tried emitting \( event) when not connected " ] , isInternalMessage: true )
@@ -301,10 +290,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
301
290
302
291
public func engineDidClose( reason: String ) {
303
292
waitingPackets. removeAll ( )
293
+
294
+ if status != . Closed {
295
+ status = . NotConnected
296
+ }
304
297
305
298
if status == . Closed || !reconnects {
306
299
didDisconnect ( reason)
307
- } else if status != . Reconnecting {
300
+ } else if !reconnecting {
301
+ reconnecting = true
308
302
tryReconnectWithReason ( reason)
309
303
}
310
304
}
@@ -325,9 +319,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
325
319
ackHandlers. executeAck ( ack, items: data)
326
320
}
327
321
328
- /**
329
- Causes an event to be handled. Only use if you know what you're doing.
330
- */
322
+ /// Causes an event to be handled. Only use if you know what you're doing.
331
323
public func handleEvent( event: String , data: [ AnyObject ] , isInternalMessage: Bool , withAck ack: Int = - 1 ) {
332
324
guard status == . Connected || isInternalMessage else {
333
325
return
@@ -344,19 +336,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
344
336
}
345
337
}
346
338
347
- /**
348
- Leaves nsp and goes back to /
349
- */
339
+ /// Leaves nsp and goes back to /
350
340
public func leaveNamespace( ) {
351
341
if nsp != " / " {
352
342
engine? . send ( " 1 \( nsp) " , withData: [ ] )
353
343
nsp = " / "
354
344
}
355
345
}
356
346
357
- /**
358
- Joins namespace
359
- */
347
+ /// Joins namespace
360
348
public func joinNamespace( namespace: String ) {
361
349
nsp = namespace
362
350
@@ -366,28 +354,22 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
366
354
}
367
355
}
368
356
369
- /**
370
- Removes handler(s)
371
- */
357
+ /// Removes handler(s) based on name
372
358
public func off( event: String ) {
373
359
DefaultSocketLogger . Logger. log ( " Removing handler for event: %@ " , type: logType, args: event)
374
360
375
361
handlers = handlers. filter { $0. event != event }
376
362
}
377
363
378
- /**
379
- Removes a handler with the specified UUID gotten from an `on` or `once`
380
- */
364
+ /// Removes a handler with the specified UUID gotten from an `on` or `once`
381
365
public func off( id id: NSUUID ) {
382
366
DefaultSocketLogger . Logger. log ( " Removing handler with id: %@ " , type: logType, args: id)
383
367
384
368
handlers = handlers. filter { $0. id != id }
385
369
}
386
370
387
- /**
388
- Adds a handler for an event.
389
- Returns: A unique id for the handler
390
- */
371
+ /// Adds a handler for an event.
372
+ /// Returns: A unique id for the handler
391
373
public func on( event: String , callback: NormalCallback ) -> NSUUID {
392
374
DefaultSocketLogger . Logger. log ( " Adding handler for event: %@ " , type: logType, args: event)
393
375
@@ -397,10 +379,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
397
379
return handler. id
398
380
}
399
381
400
- /**
401
- Adds a single-use handler for an event.
402
- Returns: A unique id for the handler
403
- */
382
+ /// Adds a single-use handler for an event.
383
+ /// Returns: A unique id for the handler
404
384
public func once( event: String , callback: NormalCallback ) -> NSUUID {
405
385
DefaultSocketLogger . Logger. log ( " Adding once handler for event: %@ " , type: logType, args: event)
406
386
@@ -417,9 +397,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
417
397
return handler. id
418
398
}
419
399
420
- /**
421
- Adds a handler that will be called on every event.
422
- */
400
+ /// Adds a handler that will be called on every event.
423
401
public func onAny( handler: ( SocketAnyEvent ) -> Void ) {
424
402
anyHandler = handler
425
403
}
@@ -443,44 +421,32 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
443
421
}
444
422
}
445
423
446
- /**
447
- Tries to reconnect to the server.
448
- */
424
+ /// Tries to reconnect to the server.
449
425
public func reconnect( ) {
450
426
tryReconnectWithReason ( " manual reconnect " )
451
427
}
452
428
453
- /**
454
- Removes all handlers.
455
- Can be used after disconnecting to break any potential remaining retain cycles.
456
- */
429
+ /// Removes all handlers.
430
+ /// Can be used after disconnecting to break any potential remaining retain cycles.
457
431
public func removeAllHandlers( ) {
458
432
handlers. removeAll ( keepCapacity: false )
459
433
}
460
434
461
435
private func tryReconnectWithReason( reason: String ) {
462
- if reconnectTimer == nil {
436
+ if reconnecting {
463
437
DefaultSocketLogger . Logger. log ( " Starting reconnect " , type: logType)
464
438
handleEvent ( " reconnect " , data: [ reason] , isInternalMessage: true )
465
-
466
- status = . Reconnecting
467
-
468
- dispatch_async ( dispatch_get_main_queue ( ) ) {
469
- self . reconnectTimer = NSTimer . scheduledTimerWithTimeInterval ( Double ( self . reconnectWait) ,
470
- target: self , selector: " _tryReconnect " , userInfo: nil , repeats: true )
471
- }
439
+
440
+ _tryReconnect ( )
472
441
}
473
442
}
474
443
475
444
@objc private func _tryReconnect( ) {
476
- if status == . Connected {
477
- clearReconnectTimer ( )
478
-
445
+ if !reconnecting {
479
446
return
480
447
}
481
448
482
449
if reconnectAttempts != - 1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects {
483
- clearReconnectTimer ( )
484
450
didDisconnect ( " Reconnect Failed " )
485
451
486
452
return
@@ -492,6 +458,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
492
458
493
459
currentReconnectAttempt += 1
494
460
connect ( )
461
+
462
+ let dispatchAfter = dispatch_time ( DISPATCH_TIME_NOW, Int64 ( UInt64 ( reconnectWait) * NSEC_PER_SEC) )
463
+
464
+ dispatch_after ( dispatchAfter, dispatch_get_main_queue ( ) , _tryReconnect)
495
465
}
496
466
}
497
467
0 commit comments