diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 5cda404..e55a5c3 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -110,6 +110,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } public func close(#fast:Bool) { + SocketLogger.log("Engine is being closed. Fast: \(fast)", client: self) + self.pingTimer?.invalidate() self.closed = true @@ -117,7 +119,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { self.ws?.disconnect() if fast || self.polling { - self.client?.engineDidForceClose("Disconnect") + self.client?.engineDidClose("Disconnect") } } @@ -349,7 +351,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // A poll failed, tell the client about it - private func handlePollingFailed(reason:String) { self._connected = false self.ws?.disconnect() @@ -361,10 +362,9 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { return } - if !self.closed && !self.client!.reconnecting { - self.client?.pollingDidFail(reason) - } else if !self.client!.reconnecting { - self.client?.engineDidForceClose(reason) + if !self.closed { + self.client?.didError(reason) + self.client?.engineDidClose(reason) } } @@ -536,7 +536,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } if self.polling { - self.client!.engineDidForceClose("Disconnect") + self.client!.engineDidClose("Disconnect") } return @@ -699,7 +699,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { self.probing = false if self.closed { - self.client?.engineDidForceClose("Disconnect") + self.client?.engineDidClose("Disconnect") return } @@ -708,9 +708,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { self._connected = false self._websocket = false - let reason = error?.localizedDescription - self.client?.webSocketDidCloseWithCode(1, - reason: reason == nil ? "Socket Disconnected" : reason!) + let reason = error?.localizedDescription ?? "Socket Disconnected" + + if error != nil { + self.client?.didError(reason) + } + + self.client?.engineDidClose(reason) } else { self.flushProbeWait() } diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index 3189536..7d87e44 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -28,15 +28,11 @@ import Foundation @objc public protocol SocketEngineClient { var handleQueue:dispatch_queue_attr_t! {get} var emitQueue:dispatch_queue_attr_t! {get} - var reconnecting:Bool {get} var socketURL:String {get} var secure:Bool {get} func didError(reason:AnyObject) - func engineDidForceClose(reason:String) + func engineDidClose(reason:String) func parseSocketMessage(msg:String) func parseBinaryData(data:NSData) - func pollingDidFail(err:String) - func webSocketDidCloseWithCode(code:Int, reason:String) - func webSocketDidFailWithError(error:NSError) } \ No newline at end of file diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index b6a5a2f..733dbcf 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -249,9 +249,27 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.handleEvent("connect", data: nil, isInternalMessage: false) } + func didDisconnect(reason:String) { + if self.closed { + return + } + + SocketLogger.log("Disconnected: \(reason)", client: self) + + self._closed = true + self._connected = false + self.reconnects = false + self._connecting = false + self._reconnecting = false + + // Make sure the engine is actually dead. + self.engine?.close(fast: true) + self.handleEvent("disconnect", data: [reason], isInternalMessage: true) + } + /// error public func didError(reason:AnyObject) { - SocketLogger.err("Error", client: self) + SocketLogger.err("Error: \(reason)", client: self) self.handleEvent("error", data: reason as? [AnyObject] ?? [reason], isInternalMessage: true) @@ -356,20 +374,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - /// Server wants us to die - public func engineDidForceClose(reason:String) { - if self.closed { - return - } - - SocketLogger.log("Engine closed", client: self) - - self._closed = true + public func engineDidClose(reason:String) { self._connected = false - self.reconnects = false self._connecting = false - self._reconnecting = false - self.handleEvent("disconnect", data: [reason], isInternalMessage: true) + + if self.closed || !self.reconnects { + self.didDisconnect("Engine closed") + } else if !self.reconnecting { + self.handleEvent("reconnect", data: [reason], isInternalMessage: true) + self.tryReconnect() + } } // Called when the socket gets an ack for something it sent @@ -458,19 +472,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient SocketParser.parseBinaryData(data, socket: self) } - // Something happened while polling - public func pollingDidFail(err:String) { - if !self.reconnecting { - self._connected = false - self.handleEvent("reconnect", data: [err], isInternalMessage: true) - self.tryReconnect() - } - } - // We lost connection and should attempt to reestablish func tryReconnect() { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { - self.engineDidForceClose("Reconnect Failed") + self.didDisconnect("Reconnect Failed") return } else if self.connected { self._connecting = false @@ -504,29 +509,4 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.connect() } } - - // Called when the socket is closed - public func webSocketDidCloseWithCode(code:Int, reason:String) { - self._connected = false - self._connecting = false - if self.closed || !self.reconnects { - self.engineDidForceClose("WebSocket closed") - } else if !self.reconnecting { - self.handleEvent("reconnect", data: [reason], isInternalMessage: true) - self.tryReconnect() - } - } - - // Called when an error occurs. - public func webSocketDidFailWithError(error:NSError) { - self._connected = false - self._connecting = false - self.handleEvent("error", data: [error.localizedDescription], isInternalMessage: true) - if self.closed || !self.reconnects { - self.engineDidForceClose("WebSocket closed with an error \(error)") - } else if !self.reconnecting { - self.handleEvent("reconnect", data: [error.localizedDescription], isInternalMessage: true) - self.tryReconnect() - } - } } \ No newline at end of file diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 93d80a7..6679d64 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -55,7 +55,7 @@ final class SocketPacket: Printable { case BINARY_ACK = 6 init?(str:String) { - if let int = str.toInt(), let raw = PacketType(rawValue: int) { + if let int = str.toInt(), raw = PacketType(rawValue: int) { self = raw } else { return nil diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 3d62c3b..823806b 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -236,7 +236,7 @@ class SocketParser { socket.didConnect() } } else if p.type == SocketPacket.PacketType.DISCONNECT { - socket.engineDidForceClose("Got Disconnect") + socket.didDisconnect("Got Disconnect") } else if p.type == SocketPacket.PacketType.ERROR { socket.didError(p.data == nil ? "Error" : p.data!) }