This commit is contained in:
Erik 2015-03-25 11:50:25 -04:00
parent 5b897ddfea
commit 182ba0017b
4 changed files with 57 additions and 40 deletions

View File

@ -53,7 +53,7 @@ Methods
6. `socket.emitWithAckObjc(event:String, withItems items:[AnyObject]) -> SocketAckHandler` - `emitWithAck` for Objective-C. 6. `socket.emitWithAckObjc(event:String, withItems items:[AnyObject]) -> SocketAckHandler` - `emitWithAck` for Objective-C.
7. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 7. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection.
8. `socket.connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection. 8. `socket.connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection.
9. `socket.close()` - Closes the socket. Once a socket is closed it should not be reopened. 9. `socket.close(fast:Bool = false)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task.
Events Events
------ ------

View File

@ -53,6 +53,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
private let handleQueue = dispatch_queue_create( private let handleQueue = dispatch_queue_create(
"engineHandleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) "engineHandleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let session:NSURLSession! private let session:NSURLSession!
private var closed = false
private var _connected = false private var _connected = false
private var fastUpgrade = false private var fastUpgrade = false
private var forcePolling = false private var forcePolling = false
@ -81,7 +82,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} }
var ws:WebSocket? var ws:WebSocket?
init(client:SocketEngineClient, forcePolling:Bool, withCookies cookies:[NSHTTPCookie]?) { public init(client:SocketEngineClient, forcePolling:Bool, withCookies cookies:[NSHTTPCookie]?) {
self.client = client self.client = client
self.forcePolling = forcePolling self.forcePolling = forcePolling
self.cookies = cookies self.cookies = cookies
@ -89,9 +90,20 @@ public class SocketEngine: NSObject, WebSocketDelegate {
delegate: nil, delegateQueue: self.workQueue) delegate: nil, delegateQueue: self.workQueue)
} }
func close() { public func close(#fast:Bool) {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.send(PacketType.CLOSE.rawValue, withData: nil) self.closed = true
if self.polling {
self.write("", withType: PacketType.CLOSE, withData: nil)
self.client.didForceClose("Disconnect")
} else {
self.ws?.disconnect()
if fast {
self.client.didForceClose("Fast Disconnect")
}
}
} }
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@ -174,7 +186,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
return return
} else if err != nil { } else if err != nil {
if self!.polling { if self!.polling {
self?.handlePollingFailed(err) self?.handlePollingFailed(err.localizedDescription)
} }
return return
@ -191,7 +203,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
if self!.fastUpgrade { if self!.fastUpgrade {
self?.doFastUpgrade() self?.doFastUpgrade()
return return
} else { } else if !self!.closed {
self?.doPoll() self?.doPoll()
} }
}.resume() }.resume()
@ -247,7 +259,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
if self == nil { if self == nil {
return return
} else if err != nil && self!.polling { } else if err != nil && self!.polling {
self?.handlePollingFailed(err) self?.handlePollingFailed(err.localizedDescription)
return return
} }
@ -270,24 +282,26 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} }
// A poll failed, tell the client about it // A poll failed, tell the client about it
private func handlePollingFailed(reason:NSError) { private func handlePollingFailed(reason:String) {
assert(self.polling, "Polling failed when we're not polling") self._connected = false
self.ws?.disconnect()
self.pingTimer?.invalidate()
self.waitingForPoll = false
self.waitingForPost = false
if !self.client.reconnecting { if !self.closed && !self.client.reconnecting {
self._connected = false
self.ws?.disconnect()
self.pingTimer?.invalidate()
self.waitingForPoll = false
self.waitingForPost = false
self.client.pollingDidFail(reason) self.client.pollingDidFail(reason)
} else if !self.client.reconnecting {
self.client.didForceClose(reason)
} }
} }
func open(opts:[String: AnyObject]? = nil) { public func open(opts:[String: AnyObject]? = nil) {
if self.connected { if self.connected {
assert(false, "We're in a bad state, this shouldn't happen.") fatalError("Engine tried to open while connected")
} }
self.closed = false
let (urlPolling, urlWebSocket) = self.createURLs(opts) let (urlPolling, urlWebSocket) = self.createURLs(opts)
self.urlPolling = urlPolling self.urlPolling = urlPolling
self.urlWebSocket = urlWebSocket self.urlWebSocket = urlWebSocket
@ -304,7 +318,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
if self == nil { if self == nil {
return return
} else if err != nil || data == nil { } else if err != nil || data == nil {
self?.handlePollingFailed(err) self?.handlePollingFailed(err.localizedDescription)
return return
} }
@ -382,7 +396,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
length += chr length += chr
} else { } else {
if length == "" || testLength(length, &n) { if length == "" || testLength(length, &n) {
println("failure in parsePollingMessage") self.handlePollingFailed("Error parsing XHR message")
return return
} }
@ -451,10 +465,11 @@ public class SocketEngine: NSObject, WebSocketDelegate {
self.upgradeTransport() self.upgradeTransport()
return return
} }
} } else if type == PacketType.CLOSE.rawValue {
if self.polling {
self.client.didForceClose("Disconnect")
}
if message == PacketType.CLOSE.rawValue {
// do nothing
return return
} }
// println("Got something idk what to do with") // println("Got something idk what to do with")
@ -554,11 +569,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
public func write(msg:String, withType type:PacketType, withData data:ContiguousArray<NSData>?) { public func write(msg:String, withType type:PacketType, withData data:ContiguousArray<NSData>?) {
dispatch_async(self.emitQueue) {[weak self] in dispatch_async(self.emitQueue) {[weak self] in
if self == nil { if self == nil || !self!.connected {
return
}
if !self!.connected {
return return
} }

View File

@ -32,9 +32,10 @@ import Foundation
var socketURL:String {get} var socketURL:String {get}
var secure:Bool {get} var secure:Bool {get}
func didForceClose(reason:String)
func parseSocketMessage(msg:String) func parseSocketMessage(msg:String)
func parseBinaryData(data:NSData) func parseBinaryData(data:NSData)
func pollingDidFail(err:NSError) func pollingDidFail(err:String)
func webSocketDidCloseWithCode(code:Int, reason:String, wasClean:Bool) func webSocketDidCloseWithCode(code:Int, reason:String, wasClean:Bool)
func webSocketDidFailWithError(error:NSError) func webSocketDidFailWithError(error:NSError)
} }

View File

@ -130,13 +130,15 @@ public class SocketIOClient: NSObject, SocketEngineClient {
/** /**
Closes the socket. Only reopen the same socket if you know what you're doing. Closes the socket. Only reopen the same socket if you know what you're doing.
Will turn off automatic reconnects.
Pass true to fast if you're closing from a background task
*/ */
public func close() { public func close(fast:Bool = false) {
self._closed = true self.reconnects = false
self._connecting = false self._connecting = false
self._connected = false self._connected = false
self._reconnecting = false self._reconnecting = false
self.engine?.close() self.engine?.close(fast: fast)
} }
/** /**
@ -182,13 +184,17 @@ public class SocketIOClient: NSObject, SocketEngineClient {
} }
/// Server wants us to die /// Server wants us to die
func didForceClose(#message:String) { public func didForceClose(reason:String) {
if self.closed {
return
}
self._closed = true self._closed = true
self._connected = false self._connected = false
self.reconnects = false self.reconnects = false
self._connecting = false self._connecting = false
self._reconnecting = false self._reconnecting = false
self.handleEvent("disconnect", data: [message], isInternalMessage: true) self.handleEvent("disconnect", data: [reason], isInternalMessage: true)
} }
/** /**
@ -328,7 +334,6 @@ public class SocketIOClient: NSObject, SocketEngineClient {
} }
} }
// Should be removed and moved to SocketEngine
func joinNamespace() { func joinNamespace() {
if self.nsp != "/" { if self.nsp != "/" {
self.engine?.send("0/\(self.nsp)", withData: nil) self.engine?.send("0/\(self.nsp)", withData: nil)
@ -373,10 +378,10 @@ public class SocketIOClient: NSObject, SocketEngineClient {
} }
// Something happened while polling // Something happened while polling
public func pollingDidFail(err:NSError) { public func pollingDidFail(err:String) {
if !self.reconnecting { if !self.reconnecting {
self._connected = false self._connected = false
self.handleEvent("reconnect", data: [err.localizedDescription], isInternalMessage: true) self.handleEvent("reconnect", data: [err], isInternalMessage: true)
self.tryReconnect() self.tryReconnect()
} }
} }
@ -388,7 +393,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
// 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.didForceClose(message: "Reconnect Failed") self.didForceClose("Reconnect Failed")
return return
} else if self.connected { } else if self.connected {
self._connecting = false self._connecting = false
@ -426,7 +431,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
self._connected = false self._connected = false
self._connecting = false self._connecting = false
if self.closed || !self.reconnects { if self.closed || !self.reconnects {
self.didForceClose(message: "WebSocket closed") self.didForceClose("WebSocket closed")
} else { } else {
self.handleEvent("reconnect", data: [reason], isInternalMessage: true) self.handleEvent("reconnect", data: [reason], isInternalMessage: true)
self.tryReconnect() self.tryReconnect()
@ -439,7 +444,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
self._connecting = false self._connecting = false
self.handleEvent("error", data: [error.localizedDescription], isInternalMessage: true) self.handleEvent("error", data: [error.localizedDescription], isInternalMessage: true)
if self.closed || !self.reconnects { if self.closed || !self.reconnects {
self.didForceClose(message: "WebSocket closed with an error \(error)") self.didForceClose("WebSocket closed with an error \(error)")
} else if !self.reconnecting { } else if !self.reconnecting {
self.handleEvent("reconnect", data: [error.localizedDescription], isInternalMessage: true) self.handleEvent("reconnect", data: [error.localizedDescription], isInternalMessage: true)
self.tryReconnect() self.tryReconnect()