fix nuclearace/Socket.IO-Client-Swift#12 better closing
This commit is contained in:
parent
5b897ddfea
commit
182ba0017b
@ -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
|
||||||
------
|
------
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
@ -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()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user