Merge pull request #63 from socketio/engineclientcleanup

clean up engineclient
This commit is contained in:
Erik Little 2015-04-25 11:16:13 -04:00
commit ef39651bfa
5 changed files with 46 additions and 66 deletions

View File

@ -110,6 +110,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
public func close(#fast:Bool) { public func close(#fast:Bool) {
SocketLogger.log("Engine is being closed. Fast: \(fast)", client: self)
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.closed = true self.closed = true
@ -117,7 +119,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
self.ws?.disconnect() self.ws?.disconnect()
if fast || self.polling { 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 // A poll failed, tell the client about it
private func handlePollingFailed(reason:String) { private func handlePollingFailed(reason:String) {
self._connected = false self._connected = false
self.ws?.disconnect() self.ws?.disconnect()
@ -361,10 +362,9 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
return return
} }
if !self.closed && !self.client!.reconnecting { if !self.closed {
self.client?.pollingDidFail(reason) self.client?.didError(reason)
} else if !self.client!.reconnecting { self.client?.engineDidClose(reason)
self.client?.engineDidForceClose(reason)
} }
} }
@ -536,7 +536,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
if self.polling { if self.polling {
self.client!.engineDidForceClose("Disconnect") self.client!.engineDidClose("Disconnect")
} }
return return
@ -699,7 +699,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
self.probing = false self.probing = false
if self.closed { if self.closed {
self.client?.engineDidForceClose("Disconnect") self.client?.engineDidClose("Disconnect")
return return
} }
@ -708,9 +708,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
self._connected = false self._connected = false
self._websocket = false self._websocket = false
let reason = error?.localizedDescription let reason = error?.localizedDescription ?? "Socket Disconnected"
self.client?.webSocketDidCloseWithCode(1,
reason: reason == nil ? "Socket Disconnected" : reason!) if error != nil {
self.client?.didError(reason)
}
self.client?.engineDidClose(reason)
} else { } else {
self.flushProbeWait() self.flushProbeWait()
} }

View File

@ -28,15 +28,11 @@ import Foundation
@objc public protocol SocketEngineClient { @objc public protocol SocketEngineClient {
var handleQueue:dispatch_queue_attr_t! {get} var handleQueue:dispatch_queue_attr_t! {get}
var emitQueue:dispatch_queue_attr_t! {get} var emitQueue:dispatch_queue_attr_t! {get}
var reconnecting:Bool {get}
var socketURL:String {get} var socketURL:String {get}
var secure:Bool {get} var secure:Bool {get}
func didError(reason:AnyObject) func didError(reason:AnyObject)
func engineDidForceClose(reason:String) func engineDidClose(reason:String)
func parseSocketMessage(msg:String) func parseSocketMessage(msg:String)
func parseBinaryData(data:NSData) func parseBinaryData(data:NSData)
func pollingDidFail(err:String)
func webSocketDidCloseWithCode(code:Int, reason:String)
func webSocketDidFailWithError(error:NSError)
} }

View File

@ -249,9 +249,27 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
self.handleEvent("connect", data: nil, isInternalMessage: false) 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 /// error
public func didError(reason:AnyObject) { public func didError(reason:AnyObject) {
SocketLogger.err("Error", client: self) SocketLogger.err("Error: \(reason)", client: self)
self.handleEvent("error", data: reason as? [AnyObject] ?? [reason], self.handleEvent("error", data: reason as? [AnyObject] ?? [reason],
isInternalMessage: true) isInternalMessage: true)
@ -356,20 +374,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
} }
/// Server wants us to die public func engineDidClose(reason:String) {
public func engineDidForceClose(reason:String) {
if self.closed {
return
}
SocketLogger.log("Engine closed", client: self)
self._closed = true
self._connected = false self._connected = false
self.reconnects = false
self._connecting = 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 // 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) 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 // We lost connection and should attempt to reestablish
func tryReconnect() { func tryReconnect() {
if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
self.engineDidForceClose("Reconnect Failed") self.didDisconnect("Reconnect Failed")
return return
} else if self.connected { } else if self.connected {
self._connecting = false self._connecting = false
@ -504,29 +509,4 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
self.connect() 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()
}
}
} }

View File

@ -55,7 +55,7 @@ final class SocketPacket: Printable {
case BINARY_ACK = 6 case BINARY_ACK = 6
init?(str:String) { init?(str:String) {
if let int = str.toInt(), let raw = PacketType(rawValue: int) { if let int = str.toInt(), raw = PacketType(rawValue: int) {
self = raw self = raw
} else { } else {
return nil return nil

View File

@ -236,7 +236,7 @@ class SocketParser {
socket.didConnect() socket.didConnect()
} }
} else if p.type == SocketPacket.PacketType.DISCONNECT { } else if p.type == SocketPacket.PacketType.DISCONNECT {
socket.engineDidForceClose("Got Disconnect") socket.didDisconnect("Got Disconnect")
} else if p.type == SocketPacket.PacketType.ERROR { } else if p.type == SocketPacket.PacketType.ERROR {
socket.didError(p.data == nil ? "Error" : p.data!) socket.didError(p.data == nil ? "Error" : p.data!)
} }