From 18b8f992d9d713d4a8d760c99815053826972a7f Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 15:23:38 -0400 Subject: [PATCH 1/6] Tweaks for performance --- SwiftIO/SocketEngine.swift | 24 +++++------ SwiftIO/SocketEvent.swift | 48 ++++++++------------- SwiftIO/SocketIOClient.swift | 52 ++++++++--------------- SwiftIO/SocketParser.swift | 81 ++++++++++++++---------------------- 4 files changed, 78 insertions(+), 127 deletions(-) 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 } } From cf65f56a1d1e605b3e07444a086c9de33a5bce02 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 16:05:51 -0400 Subject: [PATCH 2/6] fix namespaces --- SwiftIO/SocketParser.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index 9c58276..a0654d6 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -231,13 +231,11 @@ class SocketParser { } 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!)" { + if socket.nsp != nil && stringMessage == "/\(socket.nsp!)" { socket.didConnect() return + } else if socket.nsp != nil { + socket.joinNamespace() } else { socket.didConnect() return From 48bcada835f02262258a092f1771691f543a42f8 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Fri, 20 Mar 2015 20:22:31 -0400 Subject: [PATCH 3/6] Update SocketEngineClient.swift --- SwiftIO/SocketEngineClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SwiftIO/SocketEngineClient.swift b/SwiftIO/SocketEngineClient.swift index 22e2aab..8e984c7 100644 --- a/SwiftIO/SocketEngineClient.swift +++ b/SwiftIO/SocketEngineClient.swift @@ -35,7 +35,7 @@ import Foundation func parseSocketMessage(msg:String) func parseBinaryData(data:NSData) - func pollingDidFail(err:NSError?) + func pollingDidFail(err:NSError) func webSocketDidCloseWithCode(code:Int, reason:String, wasClean:Bool) func webSocketDidFailWithError(error:NSError) -} \ No newline at end of file +} From 5388084c79a15be9f1755b53c9d6c1bf6bec4f0b Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 20:24:59 -0400 Subject: [PATCH 4/6] seems to be on par with the native js-client most of the time --- SwiftIO/SocketEngine.swift | 1 + SwiftIO/SocketEngineClient.swift | 2 +- SwiftIO/SocketIOClient.swift | 22 +- .../{SocketEvent.swift => SocketPacket.swift} | 100 ++++--- SwiftIO/SocketParser.swift | 274 +++++++++--------- 5 files changed, 205 insertions(+), 194 deletions(-) rename SwiftIO/{SocketEvent.swift => SocketPacket.swift} (76%) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 911c12b..3dc183c 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -587,6 +587,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { self.probing = false if self.websocket { + println(error) self.pingTimer?.invalidate() self._connected = false self._websocket = false diff --git a/SwiftIO/SocketEngineClient.swift b/SwiftIO/SocketEngineClient.swift index 22e2aab..b6fd2e3 100644 --- a/SwiftIO/SocketEngineClient.swift +++ b/SwiftIO/SocketEngineClient.swift @@ -35,7 +35,7 @@ import Foundation func parseSocketMessage(msg:String) func parseBinaryData(data:NSData) - func pollingDidFail(err:NSError?) + func pollingDidFail(err:NSError) func webSocketDidCloseWithCode(code:Int, reason:String, wasClean:Bool) func webSocketDidFailWithError(error:NSError) } \ No newline at end of file diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 3a61d51..425d949 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -42,7 +42,7 @@ public class SocketIOClient: NSObject, SocketEngineClient { private var reconnectTimer:NSTimer? internal var currentAck = -1 - internal var waitingData = [SocketEvent]() + internal var waitingData = [SocketPacket]() public let socketURL:String public let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding), @@ -244,7 +244,7 @@ public class SocketIOClient: NSObject, SocketEngineClient { } private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { - var frame:SocketEvent + var frame:SocketPacket var str:String let (items, hasBinary, emitDatas) = SocketParser.parseEmitArgs(args) @@ -255,20 +255,20 @@ public class SocketIOClient: NSObject, SocketEngineClient { if hasBinary { if ack == nil { - str = SocketEvent.createMessageForEvent(event, withArgs: items, + str = SocketPacket.createMessageForEvent(event, withArgs: items, hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp) } else { - str = SocketEvent.createMessageForEvent(event, withArgs: items, + str = SocketPacket.createMessageForEvent(event, withArgs: items, hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: ack) } self.engine?.send(str, withData: emitDatas) } else { if ack == nil { - str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, + str = SocketPacket.createMessageForEvent(event, withArgs: items, hasBinary: false, withDatas: 0, toNamespace: self.nsp) } else { - str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, + str = SocketPacket.createMessageForEvent(event, withArgs: items, hasBinary: false, withDatas: 0, toNamespace: self.nsp, wantsAck: ack) } @@ -289,20 +289,20 @@ public class SocketIOClient: NSObject, SocketEngineClient { if !hasBinary { if self?.nsp == nil { - str = SocketEvent.createAck(ack, withArgs: items, + str = SocketPacket.createAck(ack, withArgs: items, withAckType: 3, withNsp: "/") } else { - str = SocketEvent.createAck(ack, withArgs: items, + str = SocketPacket.createAck(ack, withArgs: items, withAckType: 3, withNsp: self!.nsp!) } self?.engine?.send(str, withData: nil) } else { if self?.nsp == nil { - str = SocketEvent.createAck(ack, withArgs: items, + str = SocketPacket.createAck(ack, withArgs: items, withAckType: 6, withNsp: "/", withBinary: emitDatas.count) } else { - str = SocketEvent.createAck(ack, withArgs: items, + str = SocketPacket.createAck(ack, withArgs: items, withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count) } @@ -333,7 +333,7 @@ public class SocketIOClient: NSObject, SocketEngineClient { /** Causes an event to be handled. Only use if you know what you're doing. */ - public func handleEvent(event:String, data:NSArray?, isInternalMessage:Bool = false, + public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil, withAckType ackType:Int = 3) { // println("Should do event: \(event) with data: \(data)") if !self.connected && !isInternalMessage { diff --git a/SwiftIO/SocketEvent.swift b/SwiftIO/SocketPacket.swift similarity index 76% rename from SwiftIO/SocketEvent.swift rename to SwiftIO/SocketPacket.swift index bd15dd6..7d7c063 100644 --- a/SwiftIO/SocketEvent.swift +++ b/SwiftIO/SocketPacket.swift @@ -1,5 +1,5 @@ // -// Event.swift +// SocketPacket.swift // Socket.IO-Swift // // Created by Erik Little on 1/18/15. @@ -24,21 +24,51 @@ import Foundation -class SocketEvent { - let justAck:Bool! - var ack:Int? - var args:AnyObject! - lazy var currentPlace = 0 - lazy var datas = [NSData]() - var event:String! - var placeholders:Int! +enum SocketPacketType: Int { + case CONNECT = 0 + case DISCONNECT = 1 + case EVENT = 2 + case ACK = 3 + case ERROR = 4 + case BINARY_EVENT = 5 + case BINARY_ACK = 6 - init(event:String, args:AnyObject?, placeholders:Int = 0, ackNum:Int? = nil, justAck:Bool = false) { - self.event = event - self.args = args - self.placeholders = placeholders - self.ack = ackNum - self.justAck = justAck + init(str:String) { + if let int = str.toInt() { + self = SocketPacketType(rawValue: int)! + } else { + self = SocketPacketType(rawValue: 4)! + } + } +} + +class SocketPacket { + let type:SocketPacketType + var binary = [NSData]() + var currentPlace = 0 + var data:[AnyObject]? + var id:Int? + var justAck = false + var nsp = "" + var placeholders:Int? + + init(type:SocketPacketType, data:[AnyObject]? = nil, nsp:String = "", + placeholders:Int? = nil, id:Int? = nil) { + self.type = type + self.data = data + self.nsp = nsp + self.placeholders = placeholders + self.id = id + } + + /// Only call if you know data is not nil + func createBinaryPlaceHolders() { + var strData = "\(self.data!)" + println(strData) + } + + func getEvent() -> String { + return data?.removeAtIndex(0) as String } func addData(data:NSData) -> Bool { @@ -54,7 +84,7 @@ class SocketEvent { return true } - self.datas.append(data) + self.binary.append(data) self.currentPlace++ if checkDoEvent() { @@ -174,7 +204,7 @@ class SocketEvent { newArr[i] = self.fillInDict(dict) } else if let str = arr[i] as? String { if let num = str["~~(\\d)"].groups() { - newArr[i] = self.datas[num[1].toInt()!] + newArr[i] = self.binary[num[1].toInt()!] } else { newArr[i] = arr[i] } @@ -196,7 +226,7 @@ class SocketEvent { // if it is a placeholder for data if let str = value as? String { if let num = str["~~(\\d)"].groups() { - newDict[key as String] = self.datas[num[1].toInt()!] + newDict[key as String] = self.binary[num[1].toInt()!] } else { newDict[key as String] = str } @@ -210,29 +240,25 @@ class SocketEvent { return newDict } - func fillInPlaceholders() -> NSArray? { - let argsAsArray = "[\(self.args)]" - if let parsedArr:AnyObject = SocketParser.parseData(argsAsArray) { - var returnArr = [AnyObject](count: parsedArr.count, repeatedValue: 0) - - for i in 0.. SocketPacket? { + let arr = Array(str) + let type = String(arr[0]) + + if arr.count == 1 { + return SocketPacket(type: SocketPacketType(str: type)) + } + + var id = nil as Int? + var nsp = "" + var i = 0 + var placeholders = -1 + + if type == "5" || type == "6" { + var buf = "" + + while arr[++i] != "-" { + buf += String(arr[i]) + if i == arr.count { + break + } + } + + if buf.toInt() == nil || arr[i] != "-" { + println(buf) + NSLog("Error parsing \(str)") + return nil + } else { + placeholders = buf.toInt()! + } + } + + if arr[i + 1] == "/" { + while ++i < arr.count { + let c = arr[i] + + if c == "," { + break + } + + nsp += String(c) + } + } + + if i + 1 >= arr.count { + return SocketPacket(type: SocketPacketType(str: type), + nsp: nsp, placeholders: placeholders, id: id) + } + + let next = String(arr[i + 1]) + + if next.toInt() != nil { + var c = "" + while ++i < arr.count { + if let int = String(arr[i]).toInt() { + c += String(arr[i]) + } else { + --i + break + } + } + + id = c.toInt() + } + + if i + 1 < arr.count { + let d = String(arr[++i...arr.count-1]) + let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" + + let data = SocketParser.parseData(noPlaceholders) as [AnyObject] + + return SocketPacket(type: SocketPacketType(str: type), data: data, + nsp: nsp, placeholders: placeholders, id: id) + } + + return nil + } + // Parse an NSArray looking for binary data class func parseArray(arr:NSArray, var currentPlaceholder:Int) -> (NSArray, Bool, [NSData]) { var replacementArr = [AnyObject](count: arr.count, repeatedValue: 1) @@ -186,64 +265,51 @@ class SocketParser { return } - // NSLog(stringMessage) - - let type = stringMessage.removeAtIndex(stringMessage.startIndex) - - if type == "2" { - if let groups = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - let namespace = groups[2] - let ackNum = groups[3] - let event = groups[4] - let data = "[\(groups[5])]" - - if namespace == "" && socket.nsp != nil { - return - } - - if let parsed:AnyObject? = self.parseData(data) { - if ackNum == "" { - socket.handleEvent(event, data: parsed as? NSArray) - } else { - socket.currentAck = ackNum.toInt()! - socket.handleEvent(event, data: parsed as? NSArray, wantsAck: ackNum.toInt(), withAckType: 3) - } - } + func checkNSP(nsp:String) -> Bool { + if nsp == "" && socket.nsp != nil { + return true + } else { + return false } - } else if type == "3" { - if let ackGroup = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - let nsp = ackGroup[2] - let ackNum = ackGroup[3] - let ackData:AnyObject? = self.parseData("[\(ackGroup[4])]") - - if nsp == "" && socket.nsp != nil { - return - } - - 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 && stringMessage == "/\(socket.nsp!)" { - socket.didConnect() + } + + var p = parseString(stringMessage) as SocketPacket! + + + if p.type == SocketPacketType.EVENT { + if checkNSP(p.nsp) { return - } else if socket.nsp != nil { + } + + socket.handleEvent(p.getEvent(), data: p.data, isInternalMessage: false, wantsAck: p.id, withAckType: 3) + } else if p.type == SocketPacketType.ACK { + if checkNSP(p.nsp) { + return + } + + socket.handleAck(p.id!, data: p.data) + } else if p.type == SocketPacketType.BINARY_EVENT { + if checkNSP(p.nsp) { + return + } + + socket.waitingData.append(p) + } else if p.type == SocketPacketType.BINARY_ACK { + if checkNSP(p.nsp) { + return + } + + socket.waitingData.append(p) + } else if p.type == SocketPacketType.CONNECT { + if p.nsp == "" && socket.nsp != nil { socket.joinNamespace() + } else if p.nsp != "" && socket.nsp == nil { + socket.didConnect() } else { socket.didConnect() - return } - } else if type == "1" { - socket.didForceClose(message: "Got disconnect") - } else { - NSLog("Error in parsing message: %s", stringMessage) + } else if p.type == SocketPacketType.DISCONNECT { + socket.didForceClose(message: "Got Disconnect") } } @@ -258,100 +324,18 @@ class SocketParser { let shouldExecute = socket.waitingData[0].addData(data) - if shouldExecute { - let socketEvent = socket.waitingData.removeAtIndex(0) - var event = socketEvent.event - - if let args:AnyObject = self.parseData(socketEvent.args as String) { - let filledInArgs = socketEvent.fillInPlaceholders() - - if socketEvent.justAck! { - // Should handle ack - socket.handleAck(socketEvent.ack!, data: filledInArgs) - return - } - - // Should do event - if socketEvent.ack != nil { - socket.handleEvent(event, data: filledInArgs, isInternalMessage: false, - wantsAck: socketEvent.ack!, withAckType: 6) - } else { - socket.handleEvent(event, data: filledInArgs) - } - } else { - let filledInArgs = socketEvent.fillInPlaceholders() - - // Should handle ack - if socketEvent.justAck! { - socket.handleAck(socketEvent.ack!, data: filledInArgs) - return - } - - // Should handle ack - if socketEvent.ack != nil { - socket.handleEvent(event, data: filledInArgs, isInternalMessage: false, - wantsAck: socketEvent.ack!, withAckType: 6) - } else { - socket.handleEvent(event, data: filledInArgs) - } - } - } - } - - // Tries to parse a message that contains binary - class func parseBinaryMessage(stringMessage:String, socket:SocketIOClient, type:String) { - // NSLog(message) - - if type == "5" { - if let groups = stringMessage["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - let numberOfPlaceholders = groups[1] - let namespace = groups[3] - let ackNum = groups[4] - let event = groups[5] - let mutMessageObject = groups[6] - - if namespace == "" && socket.nsp != nil { - return - } - - let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] - ~= "\"~~$2\"" - - var mes:SocketEvent - if ackNum == "" { - mes = SocketEvent(event: event, args: placeholdersRemoved, - placeholders: numberOfPlaceholders.toInt()!) - } else { - socket.currentAck = ackNum.toInt()! - mes = SocketEvent(event: event, args: placeholdersRemoved, - placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt()) - } - - socket.waitingData.append(mes) - } - } else if type == "6" { - if let groups = stringMessage["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - let numberOfPlaceholders = groups[1] - let namespace = groups[3] - let ackNum = groups[4] - let mutMessageObject = groups[5] - - if namespace == "" && socket.nsp != nil { - return - } - let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] - ~= "\"~~$2\"" - - let event = SocketEvent(event: "", args: placeholdersRemoved, - placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true) - - socket.waitingData.append(event) - } - } else { - NSLog("Error in parsing binary message: %s", stringMessage) + if !shouldExecute { return } + + let packet = socket.waitingData.removeAtIndex(0) + packet.fillInPlaceholders() + + if !packet.justAck { + socket.handleEvent(packet.getEvent(), data: packet.data, + wantsAck: packet.id, withAckType: 6) + } else { + socket.handleAck(packet.id!, data: packet.data) + } } } From 6ac69d1c2d1c29353e7e311cbdf214c5019a743a Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 20:51:06 -0400 Subject: [PATCH 5/6] fix for acks --- SwiftIO/SocketEngine.swift | 1 - SwiftIO/SocketParser.swift | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 3dc183c..911c12b 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -587,7 +587,6 @@ public class SocketEngine: NSObject, WebSocketDelegate { self.probing = false if self.websocket { - println(error) self.pingTimer?.invalidate() self._connected = false self._websocket = false diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index 07ae693..10e6fff 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -287,6 +287,7 @@ class SocketParser { return } + p.justAck = true socket.handleAck(p.id!, data: p.data) } else if p.type == SocketPacketType.BINARY_EVENT { if checkNSP(p.nsp) { @@ -299,6 +300,7 @@ class SocketParser { return } + p.justAck = true socket.waitingData.append(p) } else if p.type == SocketPacketType.CONNECT { if p.nsp == "" && socket.nsp != nil { From 6985efd7fb7dbb8d16b99c255add492a42a5e2e6 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 20:52:34 -0400 Subject: [PATCH 6/6] Regular ack doesn't matter --- SwiftIO/SocketParser.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index 10e6fff..0f24e64 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -287,7 +287,6 @@ class SocketParser { return } - p.justAck = true socket.handleAck(p.id!, data: p.data) } else if p.type == SocketPacketType.BINARY_EVENT { if checkNSP(p.nsp) {