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

View File

@ -24,7 +24,7 @@
import Foundation
class SocketIOClient: NSObject {
class SocketIOClient {
let engine:SocketEngine!
let socketURL:NSMutableString!
let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
@ -84,8 +84,6 @@ class SocketIOClient: NSObject {
}
}
super.init()
self.engine = SocketEngine(client: self)
}
@ -120,6 +118,7 @@ class SocketIOClient: NSObject {
}
func didConnect() {
self.closed = false
self.connected = true
self.connecting = false
self.reconnecting = false
@ -485,10 +484,7 @@ class SocketIOClient: NSObject {
if stringMessage == "0" {
// connected
self.closed = false
self.connecting = false
self.reconnecting = false
self.connected = true
self.didConnect()
if self.nsp != nil {
// 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
func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) {
func webSocketDidCloseWithCode(code:Int, reason:String!, wasClean:Bool) {
self.connected = false
self.connecting = false
if self.closed || !self.reconnects {
@ -837,7 +815,7 @@ class SocketIOClient: NSObject {
}
// Called when an error occurs.
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) {
func webSocketDidFailWithError(error:NSError!) {
self.connected = false
self.connecting = false
self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true)