clean up engineclient

This commit is contained in:
Erik 2015-04-24 11:54:50 -04:00
parent 21b295f8fa
commit 0416ecbaac
5 changed files with 42 additions and 66 deletions

View File

@ -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,8 @@ 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!)
self.client?.didError(error?.localizedDescription ?? "Socket Disconnected")
self.client?.engineDidClose(error?.localizedDescription ?? "Socket Disconnected")
} else {
self.flushProbeWait()
}

View File

@ -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)
}

View File

@ -249,9 +249,28 @@ 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 +375,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 +473,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 +510,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()
}
}
}

View File

@ -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

View File

@ -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!)
}