better handle closes

This commit is contained in:
Erik 2015-03-05 11:06:11 -05:00
parent 829992fcef
commit 296802fddb
2 changed files with 47 additions and 23 deletions

View File

@ -76,11 +76,15 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.forcePolling = forcePolling self.forcePolling = forcePolling
} }
func close() { func close(forced:Bool = false) {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
if !forced {
self.send(PacketType.CLOSE.rawValue) self.send(PacketType.CLOSE.rawValue)
self.ws?.close() self.ws?.close()
} else {
self.client.didForceClose()
}
if self.polling { if self.polling {
self.client.handleEvent("disconnect", data: "close", isInternalMessage: true) self.client.handleEvent("disconnect", data: "close", isInternalMessage: true)
@ -343,6 +347,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
return return
} }
if messageString == PacketType.CLOSE.rawValue {
self?.close(forced: true)
return
}
// println("Got something idk what to do with") // println("Got something idk what to do with")
// println(messageString) // println(messageString)
} }
@ -353,27 +361,21 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
} }
func probeWebSocket() { private func probeWebSocket() {
if self.websocketConnected { if self.websocketConnected {
self.ws?.send("2probe") self.ws?.send("2probe")
} }
} }
func send(msg:AnyObject, datas:[NSData]? = nil) { func send(msg:String, datas:[NSData]? = nil) {
let _send = {[weak self] (msg:AnyObject, datas:[NSData]?) -> () -> Void in let _send = {[weak self] (msg:String, datas:[NSData]?) -> () -> Void in
return { return {
if self == nil { if self == nil {
return return
} }
if self!.websocket { if self!.websocket {
self?.ws?.send("\(PacketType.MESSAGE.rawValue)\(msg)") self?.sendWebSocketMessage(msg, datas: datas)
if datas != nil {
for data in datas! {
let (data, nilString) = self!.createBinaryDataForSend(data)
self?.ws?.send(data!)
}
}
} else { } else {
self?.sendPollMessage(msg, datas: datas) self?.sendPollMessage(msg, datas: datas)
} }
@ -393,7 +395,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} else { } else {
let time = Int(NSDate().timeIntervalSince1970) let time = Int(NSDate().timeIntervalSince1970)
var req = NSMutableURLRequest(URL: NSURL(string: var req = NSMutableURLRequest(URL: NSURL(string:
self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!) self.urlPolling! + "&sid=\(self.sid)")!)
let postStr = "1:\(PacketType.PING.rawValue)" let postStr = "1:\(PacketType.PING.rawValue)"
let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
let postLength = "\(postData.length)" let postLength = "\(postData.length)"
@ -418,13 +420,12 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
} }
func sendPollMessage(msg:AnyObject, datas:[NSData]?) { func sendPollMessage(msg:String, datas:[NSData]?) {
// println("Sending: \(msg)") // println("Sending: \(msg)")
var postData:NSData var postData:NSData
var bDatas:[String]? var bDatas:[String]?
let time = Int(NSDate().timeIntervalSince1970)
var req = NSMutableURLRequest(URL: var req = NSMutableURLRequest(URL:
NSURL(string:self.urlPolling! + "&t=\(time)&b64=1" + "&sid=\(self.sid)")!) NSURL(string:self.urlPolling! + "&sid=\(self.sid)")!)
req.HTTPMethod = "POST" req.HTTPMethod = "POST"
req.setValue("application/html-text", forHTTPHeaderField: "Content-Type") req.setValue("application/html-text", forHTTPHeaderField: "Content-Type")
@ -439,7 +440,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
} }
let strMsg = "\(PacketType.MESSAGE.rawValue)\(msg as String)" let strMsg = "\(PacketType.MESSAGE.rawValue)\(msg)"
let postCount = countElements(strMsg) let postCount = countElements(strMsg)
var postStr = "\(postCount):\(strMsg)" var postStr = "\(postCount):\(strMsg)"
@ -459,12 +460,26 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
NSURLConnection.sendAsynchronousRequest(req, queue: self.workQueue) {[weak self] res, data, err in NSURLConnection.sendAsynchronousRequest(req, queue: self.workQueue) {[weak self] res, data, err in
if err != nil { if err != nil {
println(err) // println(err)
self?.handlePollingFailed()
return return
} }
} }
} }
func sendWebSocketMessage(str:String, datas:[NSData]?) {
self.ws?.send("\(PacketType.MESSAGE.rawValue)\(str)")
if datas != nil {
for data in datas! {
let (data, nilString) = self.createBinaryDataForSend(data)
if data != nil {
self.ws?.send(data!)
}
}
}
}
// Starts the ping timer // Starts the ping timer
private func startPingTimer() { private func startPingTimer() {
if self.pingInterval == nil { if self.pingInterval == nil {
@ -491,7 +506,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// Called when a message is recieved // Called when a message is recieved
func webSocket(webSocket:SRWebSocket!, didReceiveMessage message:AnyObject?) { func webSocket(webSocket:SRWebSocket!, didReceiveMessage message:AnyObject?) {
// println(message) // println(message)
self.parseEngineMessage(message) self.parseEngineMessage(message)
} }
@ -506,12 +520,14 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) { func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) {
self.websocketConnected = false self.websocketConnected = false
self.probing = false self.probing = false
self._websocket = false
self._polling = true
self.flushProbeWait() self.flushProbeWait()
if self.websocket {
self._websocket = false
self._polling = true
self.client.webSocketDidCloseWithCode(code, reason: reason, wasClean: wasClean) self.client.webSocketDidCloseWithCode(code, reason: reason, wasClean: wasClean)
} }
}
// Called when an error occurs. // Called when an error occurs.
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) { func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) {

View File

@ -121,6 +121,14 @@ class SocketIOClient {
self.reconnecting = false self.reconnecting = false
} }
// Server wants us to die
func didForceClose() {
self.closed = true
self.connecting = false
self.connected = false
self.reconnecting = false
}
// Sends a message with multiple args // Sends a message with multiple args
// If a message contains binary we have to send those // If a message contains binary we have to send those
// seperately. // seperately.