@@ -186,32 +186,42 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
186
186
}
187
187
188
188
public func close( reason: String ) {
189
- func postSendClose( data: NSData ? , _ res: NSURLResponse ? , _ err: NSError ? ) {
190
- sid = " "
191
- closed = true
192
- invalidated = true
193
- connected = false
194
-
195
- pingTimer? . invalidate ( )
196
- ws? . disconnect ( )
197
- stopPolling ( )
198
- client? . engineDidClose ( reason)
189
+ disconnect ( reason)
190
+ }
191
+
192
+ /// Starts the connection to the server
193
+ public func connect( ) {
194
+ if connected {
195
+ DefaultSocketLogger . Logger. error ( " Engine tried opening while connected. Assuming this was a reconnect " , type: logType)
196
+ close ( " reconnect " )
199
197
}
200
198
201
- DefaultSocketLogger . Logger. log ( " Engine is being closed. " , type: logType)
199
+ DefaultSocketLogger . Logger. log ( " Starting engine " , type: logType)
200
+ DefaultSocketLogger . Logger. log ( " Handshaking " , type: logType)
202
201
203
- if websocket {
204
- sendWebSocketMessage ( " " , withType: . Close, withData: [ ] )
205
- postSendClose ( nil , nil , nil )
206
- } else {
207
- // We need to take special care when we're polling that we send it ASAP
208
- // Also make sure we're on the emitQueue since we're touching postWait
209
- dispatch_sync ( emitQueue) {
210
- self . postWait. append ( String ( SocketEnginePacketType . Close. rawValue) )
211
- let req = self . createRequestForPostWithPostWait ( )
212
- self . doRequest ( req, withCallback: postSendClose)
202
+ resetEngine ( )
203
+
204
+ if forceWebsockets {
205
+ polling = false
206
+ websocket = true
207
+ createWebsocketAndConnect ( )
208
+ return
209
+ }
210
+
211
+ let reqPolling = NSMutableURLRequest ( URL: urlPolling)
212
+
213
+ if cookies != nil {
214
+ let headers = NSHTTPCookie . requestHeaderFieldsWithCookies ( cookies!)
215
+ reqPolling. allHTTPHeaderFields = headers
216
+ }
217
+
218
+ if let extraHeaders = extraHeaders {
219
+ for (headerName, value) in extraHeaders {
220
+ reqPolling. setValue ( value, forHTTPHeaderField: headerName)
213
221
}
214
222
}
223
+
224
+ doLongPoll ( reqPolling)
215
225
}
216
226
217
227
private func createURLs( ) -> ( NSURL , NSURL ) {
@@ -277,6 +287,35 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
277
287
client? . engineDidError ( error)
278
288
close ( error)
279
289
}
290
+
291
+ public func disconnect( reason: String ) {
292
+ func postSendClose( data: NSData ? , _ res: NSURLResponse ? , _ err: NSError ? ) {
293
+ sid = " "
294
+ closed = true
295
+ invalidated = true
296
+ connected = false
297
+
298
+ pingTimer? . invalidate ( )
299
+ ws? . disconnect ( )
300
+ stopPolling ( )
301
+ client? . engineDidClose ( reason)
302
+ }
303
+
304
+ DefaultSocketLogger . Logger. log ( " Engine is being closed. " , type: logType)
305
+
306
+ if websocket {
307
+ sendWebSocketMessage ( " " , withType: . Close, withData: [ ] )
308
+ postSendClose ( nil , nil , nil )
309
+ } else {
310
+ // We need to take special care when we're polling that we send it ASAP
311
+ // Also make sure we're on the emitQueue since we're touching postWait
312
+ dispatch_sync ( emitQueue) {
313
+ self . postWait. append ( String ( SocketEnginePacketType . Close. rawValue) )
314
+ let req = self . createRequestForPostWithPostWait ( )
315
+ self . doRequest ( req, withCallback: postSendClose)
316
+ }
317
+ }
318
+ }
280
319
281
320
public func doFastUpgrade( ) {
282
321
if waitingForPoll {
@@ -383,37 +422,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
383
422
}
384
423
385
424
public func open( ) {
386
- if connected {
387
- DefaultSocketLogger . Logger. error ( " Engine tried opening while connected. Assuming this was a reconnect " , type: logType)
388
- close ( " reconnect " )
389
- }
390
-
391
- DefaultSocketLogger . Logger. log ( " Starting engine " , type: logType)
392
- DefaultSocketLogger . Logger. log ( " Handshaking " , type: logType)
393
-
394
- resetEngine ( )
395
-
396
- if forceWebsockets {
397
- polling = false
398
- websocket = true
399
- createWebsocketAndConnect ( )
400
- return
401
- }
402
-
403
- let reqPolling = NSMutableURLRequest ( URL: urlPolling)
404
-
405
- if cookies != nil {
406
- let headers = NSHTTPCookie . requestHeaderFieldsWithCookies ( cookies!)
407
- reqPolling. allHTTPHeaderFields = headers
408
- }
409
-
410
- if let extraHeaders = extraHeaders {
411
- for (headerName, value) in extraHeaders {
412
- reqPolling. setValue ( value, forHTTPHeaderField: headerName)
413
- }
414
- }
415
-
416
- doLongPoll ( reqPolling)
425
+ connect ( )
417
426
}
418
427
419
428
public func parseEngineData( data: NSData) {
@@ -457,6 +466,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
457
466
}
458
467
}
459
468
469
+ // Puts the engine back in its default state
460
470
private func resetEngine( ) {
461
471
closed = false
462
472
connected = false
@@ -485,19 +495,19 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
485
495
write ( " " , withType: . Ping, withData: [ ] )
486
496
}
487
497
488
- // Starts the ping timer
489
498
private func startPingTimer( ) {
490
499
if let pingInterval = pingInterval {
491
500
pingTimer? . invalidate ( )
492
501
pingTimer = nil
493
-
502
+
494
503
dispatch_async ( dispatch_get_main_queue ( ) ) {
495
504
self . pingTimer = NSTimer . scheduledTimerWithTimeInterval ( pingInterval, target: self ,
496
505
selector: Selector ( " sendPing " ) , userInfo: nil , repeats: true )
497
506
}
498
507
}
499
508
}
500
509
510
+ // Moves from long-polling to websockets
501
511
private func upgradeTransport( ) {
502
512
if ws? . isConnected ?? false {
503
513
DefaultSocketLogger . Logger. log ( " Upgrading transport to WebSockets " , type: logType)
@@ -508,9 +518,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
508
518
}
509
519
}
510
520
511
- /**
512
- Write a message, independent of transport.
513
- */
521
+ /// Write a message, independent of transport.
514
522
public func write( msg: String, withType type: SocketEnginePacketType, withData data: [ NSData] ) {
515
523
dispatch_async ( emitQueue) {
516
524
guard self . connected else { return }
0 commit comments