diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 8e12f6a..911c12b 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -47,11 +47,11 @@ public class SocketEngine: NSObject, WebSocketDelegate { unowned let client:SocketEngineClient private let workQueue = NSOperationQueue() private let emitQueue = dispatch_queue_create( - "emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) + "engineEmitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) private let parseQueue = dispatch_queue_create( - "parseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) + "engineParseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) private let handleQueue = dispatch_queue_create( - "handleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) + "engineHandleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) private let session:NSURLSession! private var _connected = false private var fastUpgrade = false @@ -91,7 +91,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { func close() { self.pingTimer?.invalidate() - self.send(PacketType.CLOSE.rawValue) + self.send(PacketType.CLOSE.rawValue, withData: nil) } private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { @@ -270,7 +270,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { } // A poll failed, tell the client about it - private func handlePollingFailed(reason:NSError?) { + private func handlePollingFailed(reason:NSError) { assert(self.polling, "Polling failed when we're not polling") if !self.client.reconnecting { @@ -422,12 +422,6 @@ public class SocketEngine: NSObject, WebSocketDelegate { fixDoubleUTF8(&message) } - // We should upgrade - if message == "3probe" { - self.upgradeTransport() - return - } - let type = message["^(\\d)"].groups()?[1] if type != PacketType.MESSAGE.rawValue { @@ -452,7 +446,11 @@ public class SocketEngine: NSObject, WebSocketDelegate { self.doPoll() return } else if type == PacketType.PONG.rawValue { - return + // We should upgrade + if message == "3probe" { + self.upgradeTransport() + return + } } if message == PacketType.CLOSE.rawValue { @@ -481,7 +479,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { /* Send a message with type 4 */ - public func send(msg:String, datas:[NSData]? = nil) { + public func send(msg:String, withData datas:[NSData]?) { if self.probing { self.probeWait.append((msg, PacketType.MESSAGE, datas)) } else { diff --git a/SwiftIO/SocketEvent.swift b/SwiftIO/SocketEvent.swift index 1bf5c95..bd15dd6 100644 --- a/SwiftIO/SocketEvent.swift +++ b/SwiftIO/SocketEvent.swift @@ -210,41 +210,29 @@ class SocketEvent { return newDict } - func fillInPlaceholders(_ args:AnyObject = true) -> AnyObject { - if let dict = args as? NSDictionary { - return self.fillInDict(dict) - } else if let arr = args as? NSArray { - return self.fillInArray(args as NSArray) - } else if let string = args as? String { - if string == "~~\(self.currentPlace)" { - return self.datas[0] - } - } else if args is Bool { - // We have multiple items - // Do it live - let argsAsArray = "[\(self.args)]" - if let parsedArr = SocketParser.parseData(argsAsArray) as? NSArray { - var returnArr = [AnyObject](count: parsedArr.count, repeatedValue: 0) - - for i in 0.. NSArray? { + let argsAsArray = "[\(self.args)]" + if let parsedArr:AnyObject = SocketParser.parseData(argsAsArray) { + var returnArr = [AnyObject](count: parsedArr.count, repeatedValue: 0) + + for i in 0.. AnyObject? { - if data == nil { - return nil - } - + class func parseData(data:String) -> AnyObject? { var err:NSError? - let stringData = data!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) + let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.AllowFragments, error: &err) @@ -192,34 +188,6 @@ class SocketParser { // NSLog(stringMessage) - // Check for successful namepsace connect - if socket.nsp != nil { - if stringMessage == "0/\(socket.nsp!)" { - socket.didConnect() - return - } - } - - if stringMessage == "0" { - if socket.nsp != nil { - // Join namespace - socket.joinNamespace() - return - } else { - socket.didConnect() - return - } - } else if stringMessage == "1" { - socket.didForceClose(message: "Got disconnect") - return - } - - if stringMessage.hasPrefix("5") || stringMessage.hasPrefix("6") { - // Check for message with binary placeholders - self.parseBinaryMessage(stringMessage, socket: socket) - return - } - let type = stringMessage.removeAtIndex(stringMessage.startIndex) if type == "2" { @@ -234,13 +202,12 @@ class SocketParser { return } - if let parsed:AnyObject = self.parseData(data) { + if let parsed:AnyObject? = self.parseData(data) { if ackNum == "" { - socket.handleEvent(event, data: parsed) + socket.handleEvent(event, data: parsed as? NSArray) } else { socket.currentAck = ackNum.toInt()! - socket.handleEvent(event, data: parsed, isInternalMessage: false, - wantsAck: ackNum.toInt(), withAckType: 3) + socket.handleEvent(event, data: parsed as? NSArray, wantsAck: ackNum.toInt(), withAckType: 3) } } } @@ -257,9 +224,28 @@ class SocketParser { socket.handleAck(ackNum.toInt()!, data: ackData) } + } else if type == "4" { + NSLog("Got Error packet") + } else if type == "5" { + self.parseBinaryMessage(stringMessage, socket: socket, type: "5") + } else if type == "6" { + self.parseBinaryMessage(stringMessage, socket: socket, type: "6") + } else if type == "0" { + if socket.nsp != nil { + // Join namespace + socket.joinNamespace() + return + } else if socket.nsp != nil && stringMessage == "/\(socket.nsp!)" { + socket.didConnect() + return + } else { + socket.didConnect() + return + } + } else if type == "1" { + socket.didForceClose(message: "Got disconnect") } else { NSLog("Error in parsing message: %s", stringMessage) - return } } @@ -277,10 +263,9 @@ class SocketParser { if shouldExecute { let socketEvent = socket.waitingData.removeAtIndex(0) var event = socketEvent.event - var parsedArgs:AnyObject? = self.parseData(socketEvent.args as? String) - if let args:AnyObject = parsedArgs { - let filledInArgs:AnyObject = socketEvent.fillInPlaceholders(args) + if let args:AnyObject = self.parseData(socketEvent.args as String) { + let filledInArgs = socketEvent.fillInPlaceholders() if socketEvent.justAck! { // Should handle ack @@ -296,7 +281,7 @@ class SocketParser { socket.handleEvent(event, data: filledInArgs) } } else { - let filledInArgs:AnyObject = socketEvent.fillInPlaceholders() + let filledInArgs = socketEvent.fillInPlaceholders() // Should handle ack if socketEvent.justAck! { @@ -316,13 +301,11 @@ class SocketParser { } // Tries to parse a message that contains binary - class func parseBinaryMessage(var message:String, socket:SocketIOClient) { + class func parseBinaryMessage(stringMessage:String, socket:SocketIOClient, type:String) { // NSLog(message) - let type = message.removeAtIndex(message.startIndex) - if type == "5" { - if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$", + if let groups = stringMessage["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { let numberOfPlaceholders = groups[1] let namespace = groups[3] @@ -350,7 +333,7 @@ class SocketParser { socket.waitingData.append(mes) } } else if type == "6" { - if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$", + if let groups = stringMessage["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { let numberOfPlaceholders = groups[1] let namespace = groups[3] @@ -369,7 +352,7 @@ class SocketParser { socket.waitingData.append(event) } } else { - NSLog("Error in parsing binary message: %s", message) + NSLog("Error in parsing binary message: %s", stringMessage) return } }