@@ -186,32 +186,42 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
186186 }
187187
188188 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 " )
199197 }
200198
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)
202201
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)
213221 }
214222 }
223+
224+ doLongPoll ( reqPolling)
215225 }
216226
217227 private func createURLs( ) -> ( NSURL , NSURL ) {
@@ -277,6 +287,35 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
277287 client? . engineDidError ( error)
278288 close ( error)
279289 }
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+ }
280319
281320 public func doFastUpgrade( ) {
282321 if waitingForPoll {
@@ -383,37 +422,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
383422 }
384423
385424 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 ( )
417426 }
418427
419428 public func parseEngineData( data: NSData) {
@@ -457,6 +466,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
457466 }
458467 }
459468
469+ // Puts the engine back in its default state
460470 private func resetEngine( ) {
461471 closed = false
462472 connected = false
@@ -485,19 +495,19 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
485495 write ( " " , withType: . Ping, withData: [ ] )
486496 }
487497
488- // Starts the ping timer
489498 private func startPingTimer( ) {
490499 if let pingInterval = pingInterval {
491500 pingTimer? . invalidate ( )
492501 pingTimer = nil
493-
502+
494503 dispatch_async ( dispatch_get_main_queue ( ) ) {
495504 self . pingTimer = NSTimer . scheduledTimerWithTimeInterval ( pingInterval, target: self ,
496505 selector: Selector ( " sendPing " ) , userInfo: nil , repeats: true )
497506 }
498507 }
499508 }
500509
510+ // Moves from long-polling to websockets
501511 private func upgradeTransport( ) {
502512 if ws? . isConnected ?? false {
503513 DefaultSocketLogger . Logger. log ( " Upgrading transport to WebSockets " , type: logType)
@@ -508,9 +518,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
508518 }
509519 }
510520
511- /**
512- Write a message, independent of transport.
513- */
521+ /// Write a message, independent of transport.
514522 public func write( msg: String, withType type: SocketEnginePacketType, withData data: [ NSData] ) {
515523 dispatch_async ( emitQueue) {
516524 guard self . connected else { return }
0 commit comments