Fixes. Sending doesn't work on polling, namespaces broken

This commit is contained in:
Erik 2015-03-04 15:13:41 -05:00
parent 3088bd88e6
commit 2e80b9405d
2 changed files with 53 additions and 72 deletions

View File

@ -44,7 +44,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
unowned let client:SocketIOClient unowned let client:SocketIOClient
private let pollingQueue = NSOperationQueue() private let pollingQueue = NSOperationQueue()
private var pingTimer:NSTimer? private var pingTimer:NSTimer?
private var pollingTimer:NSTimer?
private var _polling = true private var _polling = true
private var wait = false private var wait = false
private var _websocket = false private var _websocket = false
@ -67,7 +66,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
func close() { func close() {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.pollingTimer?.invalidate()
if self.websocket { if self.websocket {
self.ws?.send(PacketType.MESSAGE.rawValue + PacketType.CLOSE.rawValue) self.ws?.send(PacketType.MESSAGE.rawValue + PacketType.CLOSE.rawValue)
@ -165,10 +163,12 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) { if let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) {
var mutString = RegexMutable(dataString) var mutString = RegexMutable(dataString)
let parsed = mutString["(\\d*):(\\d)(\\{.*\\})?"].groups() let parsed = mutString["(\\d*):(\\d)(\\{.*\\})?"].groups()
if parsed.count == 4 { if parsed.count != 4 {
return
}
let length = parsed[1] let length = parsed[1]
let type = parsed[2] let type = parsed[2]
let jsonData = parsed[3].dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) let jsonData = parsed[3].dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
@ -181,13 +181,19 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if let json = NSJSONSerialization.JSONObjectWithData(jsonData!, if let json = NSJSONSerialization.JSONObjectWithData(jsonData!,
options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary { options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary {
if let sid = json["sid"] as? String { if let sid = json["sid"] as? String {
// println(json)
self?.sid = sid self?.sid = sid
self?.client.didConnect()
self?.client.handleEvent("connect", data: nil, isInternalMessage: false)
self?.ws = SRWebSocket(URL: NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!) if let up = json["upgrades"] as? [String] {
for available in up {
if available == "websocket" {
self?.ws = SRWebSocket(URL:
NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
self?.ws?.delegate = self self?.ws?.delegate = self
//self?.ws?.open() self?.ws?.open()
}
}
}
} else { } else {
NSLog("Error handshaking") NSLog("Error handshaking")
@ -198,7 +204,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self?.pingInterval = pingInterval / 1000 self?.pingInterval = pingInterval / 1000
} }
} }
}
self?.doPoll() self?.doPoll()
self?.startPingTimer() self?.startPingTimer()
@ -293,12 +298,17 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// binary in base64 string // binary in base64 string
message.removeRange(Range<String.Index>(start: message.startIndex, message.removeRange(Range<String.Index>(start: message.startIndex,
end: advance(message.startIndex, 2))) end: advance(message.startIndex, 2)))
}
if let data = NSData(base64EncodedString: message, if let data = NSData(base64EncodedString: message,
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) {
self.client.parseSocketMessage(data) self.client.parseSocketMessage(data)
} }
return
}
println("Got something idk what to do with")
println(message)
return return
} }
@ -314,7 +324,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
func send(msg:AnyObject) { func send(msg:AnyObject) {
if self.websocketConnected { if self.websocket {
if !(msg is NSData) { if !(msg is NSData) {
self.ws?.send("\(PacketType.MESSAGE.rawValue)\(msg)") self.ws?.send("\(PacketType.MESSAGE.rawValue)\(msg)")
} else { } else {
@ -377,7 +387,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if self.websocketConnected { if self.websocketConnected {
self._websocket = true self._websocket = true
self._polling = false self._polling = false
self.pollingTimer?.invalidate()
self.ws?.send(PacketType.UPGRADE.rawValue) self.ws?.send(PacketType.UPGRADE.rawValue)
} }
} }
@ -391,31 +400,25 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// Called when the socket is opened // Called when the socket is opened
func webSocketDidOpen(webSocket:SRWebSocket!) { func webSocketDidOpen(webSocket:SRWebSocket!) {
println("socket opened")
self.websocketConnected = true self.websocketConnected = true
self.probeWebSocket() self.probeWebSocket()
} }
// Called when the socket is closed // Called when the socket is closed
func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) { func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) {
println("socket closed")
self.pingTimer?.invalidate()
self.websocketConnected = false self.websocketConnected = false
self._websocket = false self._websocket = false
self._polling = true self._polling = true
// Temp self.client.webSocketDidCloseWithCode(code, reason: reason, wasClean: wasClean)
self.client.webSocket(webSocket, didCloseWithCode: 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!) {
self.pingTimer?.invalidate()
self.websocketConnected = false self.websocketConnected = false
self._websocket = false self._websocket = false
self._polling = true self._polling = true
// Temp self.client.webSocketDidFailWithError(error)
self.client.webSocket(webSocket, didFailWithError: error)
} }
} }

View File

@ -24,7 +24,7 @@
import Foundation import Foundation
class SocketIOClient: NSObject { class SocketIOClient {
let engine:SocketEngine! let engine:SocketEngine!
let socketURL:NSMutableString! let socketURL:NSMutableString!
let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding), let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
@ -84,8 +84,6 @@ class SocketIOClient: NSObject {
} }
} }
super.init()
self.engine = SocketEngine(client: self) self.engine = SocketEngine(client: self)
} }
@ -120,6 +118,7 @@ class SocketIOClient: NSObject {
} }
func didConnect() { func didConnect() {
self.closed = false
self.connected = true self.connected = true
self.connecting = false self.connecting = false
self.reconnecting = false self.reconnecting = false
@ -485,10 +484,7 @@ class SocketIOClient: NSObject {
if stringMessage == "0" { if stringMessage == "0" {
// connected // connected
self.closed = false self.didConnect()
self.connecting = false
self.reconnecting = false
self.connected = true
if self.nsp != nil { if self.nsp != nil {
// Join namespace // Join namespace
@ -805,26 +801,8 @@ class SocketIOClient: NSObject {
} }
} }
// Called when the socket is opened
func webSocketDidOpen(webSocket:SRWebSocket!) {
self.closed = false
self.connecting = false
self.reconnecting = false
self.connected = true
if self.nsp != nil {
// Join namespace
self.joinNamespace()
return
}
// Don't handle as internal because something crazy could happen where
// we disconnect before it's handled
self.handleEvent("connect", data: nil)
}
// Called when the socket is closed // Called when the socket is closed
func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) { func webSocketDidCloseWithCode(code:Int, reason:String!, wasClean:Bool) {
self.connected = false self.connected = false
self.connecting = false self.connecting = false
if self.closed || !self.reconnects { if self.closed || !self.reconnects {
@ -837,7 +815,7 @@ class SocketIOClient: NSObject {
} }
// Called when an error occurs. // Called when an error occurs.
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) { func webSocketDidFailWithError(error:NSError!) {
self.connected = false self.connected = false
self.connecting = false self.connecting = false
self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true) self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true)