diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 4a26145..b0afd41 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -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(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) } } \ No newline at end of file diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 3e54dcb..3e18d75 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -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)