diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index f0b06b0..331bcab 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -186,32 +186,42 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } public func close(reason: String) { - func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) { - sid = "" - closed = true - invalidated = true - connected = false - - pingTimer?.invalidate() - ws?.disconnect() - stopPolling() - client?.engineDidClose(reason) + disconnect(reason) + } + + /// Starts the connection to the server + public func connect() { + if connected { + DefaultSocketLogger.Logger.error("Engine tried opening while connected. Assuming this was a reconnect", type: logType) + close("reconnect") } - DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) + DefaultSocketLogger.Logger.log("Starting engine", type: logType) + DefaultSocketLogger.Logger.log("Handshaking", type: logType) - if websocket { - sendWebSocketMessage("", withType: .Close, withData: []) - postSendClose(nil, nil, nil) - } else { - // We need to take special care when we're polling that we send it ASAP - // Also make sure we're on the emitQueue since we're touching postWait - dispatch_sync(emitQueue) { - self.postWait.append(String(SocketEnginePacketType.Close.rawValue)) - let req = self.createRequestForPostWithPostWait() - self.doRequest(req, withCallback: postSendClose) + resetEngine() + + if forceWebsockets { + polling = false + websocket = true + createWebsocketAndConnect() + return + } + + let reqPolling = NSMutableURLRequest(URL: urlPolling) + + if cookies != nil { + let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!) + reqPolling.allHTTPHeaderFields = headers + } + + if let extraHeaders = extraHeaders { + for (headerName, value) in extraHeaders { + reqPolling.setValue(value, forHTTPHeaderField: headerName) } } + + doLongPoll(reqPolling) } private func createURLs() -> (NSURL, NSURL) { @@ -277,6 +287,35 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb client?.engineDidError(error) close(error) } + + public func disconnect(reason: String) { + func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) { + sid = "" + closed = true + invalidated = true + connected = false + + pingTimer?.invalidate() + ws?.disconnect() + stopPolling() + client?.engineDidClose(reason) + } + + DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) + + if websocket { + sendWebSocketMessage("", withType: .Close, withData: []) + postSendClose(nil, nil, nil) + } else { + // We need to take special care when we're polling that we send it ASAP + // Also make sure we're on the emitQueue since we're touching postWait + dispatch_sync(emitQueue) { + self.postWait.append(String(SocketEnginePacketType.Close.rawValue)) + let req = self.createRequestForPostWithPostWait() + self.doRequest(req, withCallback: postSendClose) + } + } + } public func doFastUpgrade() { if waitingForPoll { @@ -383,37 +422,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } public func open() { - if connected { - DefaultSocketLogger.Logger.error("Engine tried opening while connected. Assuming this was a reconnect", type: logType) - close("reconnect") - } - - DefaultSocketLogger.Logger.log("Starting engine", type: logType) - DefaultSocketLogger.Logger.log("Handshaking", type: logType) - - resetEngine() - - if forceWebsockets { - polling = false - websocket = true - createWebsocketAndConnect() - return - } - - let reqPolling = NSMutableURLRequest(URL: urlPolling) - - if cookies != nil { - let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!) - reqPolling.allHTTPHeaderFields = headers - } - - if let extraHeaders = extraHeaders { - for (headerName, value) in extraHeaders { - reqPolling.setValue(value, forHTTPHeaderField: headerName) - } - } - - doLongPoll(reqPolling) + connect() } public func parseEngineData(data: NSData) { @@ -457,6 +466,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } + // Puts the engine back in its default state private func resetEngine() { closed = false connected = false @@ -485,12 +495,11 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb write("", withType: .Ping, withData: []) } - // Starts the ping timer private func startPingTimer() { if let pingInterval = pingInterval { pingTimer?.invalidate() pingTimer = nil - + dispatch_async(dispatch_get_main_queue()) { self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self, selector: Selector("sendPing"), userInfo: nil, repeats: true) @@ -498,6 +507,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } + // Moves from long-polling to websockets private func upgradeTransport() { if ws?.isConnected ?? false { DefaultSocketLogger.Logger.log("Upgrading transport to WebSockets", type: logType) @@ -508,9 +518,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - /** - Write a message, independent of transport. - */ + /// Write a message, independent of transport. public func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) { dispatch_async(emitQueue) { guard self.connected else { return } diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index cc8c4c4..5846ac8 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -50,11 +50,13 @@ import Foundation init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) - func close(reason: String) + @available(*, deprecated=5.5, message="Please use disconnect") func close(reason: String) + func connect() func didError(error: String) + func disconnect(reason: String) func doFastUpgrade() func flushWaitingForPostToWebSocket() - func open() + @available(*, deprecated=5.5, message="Please use connect") func open() func parseEngineData(data: NSData) func parseEngineMessage(message: String, fromPolling: Bool) func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index a51b938..8da6690 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -116,7 +116,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable deinit { DefaultSocketLogger.Logger.log("Client is being released", type: logType) - engine?.close("Client Deinit") + engine?.disconnect("Client Deinit") } private func addEngine() -> SocketEngineSpec { @@ -159,9 +159,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable status = .Connecting if engine == nil || forceNew { - addEngine().open() + addEngine().connect() } else { - engine?.open() + engine?.connect() } guard timeoutAfter != 0 else { return } @@ -171,7 +171,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable dispatch_after(time, handleQueue) {[weak self] in if let this = self where this.status != .Connected || this.status != .Closed { this.status = .Closed - this.engine?.close("Connect timeout") + this.engine?.disconnect("Connect timeout") handler?() } @@ -220,7 +220,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable reconnects = false // Make sure the engine is actually dead. - engine?.close(reason) + engine?.disconnect(reason) handleEvent("disconnect", data: [reason], isInternalMessage: true) }