From 4832be5c8aa6f05eeef52a85ad9685ff153dd289 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 10:51:26 -0400 Subject: [PATCH 1/2] better parsing --- SwiftIO/SocketEngine.swift | 2 +- SwiftIO/SocketEvent.swift | 2 +- SwiftIO/SocketEventHandler.swift | 8 +-- SwiftIO/SocketIOClient.swift | 51 +++++++++++++---- SwiftIO/SocketParser.swift | 95 +++++++------------------------- 5 files changed, 65 insertions(+), 93 deletions(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 40b9eb9..8e12f6a 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -81,7 +81,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { } var ws:WebSocket? - init(client:SocketEngineClient, forcePolling:Bool = false, withCookies cookies:[NSHTTPCookie]?) { + init(client:SocketEngineClient, forcePolling:Bool, withCookies cookies:[NSHTTPCookie]?) { self.client = client self.forcePolling = forcePolling self.cookies = cookies diff --git a/SwiftIO/SocketEvent.swift b/SwiftIO/SocketEvent.swift index 471e1b9..1bf5c95 100644 --- a/SwiftIO/SocketEvent.swift +++ b/SwiftIO/SocketEvent.swift @@ -247,4 +247,4 @@ class SocketEvent { return false } -} \ No newline at end of file +} diff --git a/SwiftIO/SocketEventHandler.swift b/SwiftIO/SocketEventHandler.swift index 09f99b7..1922e02 100644 --- a/SwiftIO/SocketEventHandler.swift +++ b/SwiftIO/SocketEventHandler.swift @@ -28,12 +28,10 @@ public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias AnyHandler = (event:String, items:AnyObject?) public typealias AckEmitter = (AnyObject...) -> Void -private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter { - func emitter(items:AnyObject...) { +private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) + // Curried + (items:AnyObject...) -> Void { socket.emitAck(num, withData: items, withAckType: type) - } - - return emitter } class SocketEventHandler { diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 00a7119..56c37e6 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -75,6 +75,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { return self._sid } + /** + Create a new SocketIOClient. opts can be omitted + */ public init(var socketURL:String, opts:NSDictionary? = nil) { if socketURL["https://"].matches().count != 0 { self._secure = true @@ -127,7 +130,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { self.init(socketURL: socketURL, opts: options) } - // Closes the socket + /** + Closes the socket. Only reopen the same socket if you know what you're doing. + */ public func close() { self._closed = true self._connecting = false @@ -136,7 +141,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { self.engine?.close() } - // Connects to the server + /** + Connect to the server. + */ public func connect() { if self.closed { println("Warning! This socket was previously closed. This might be dangerous!") @@ -146,7 +153,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { self.engine?.open() } - // Connect to the server using params + /** + Connect to the server with params that will be passed on connection. + */ public func connectWithParams(params:[String: AnyObject]) { if self.closed { println("Warning! This socket was previously closed. This might be dangerous!") @@ -174,7 +183,7 @@ public class SocketIOClient: NSObject, SocketEngineClient { self.handleEvent("connect", data: nil, isInternalMessage: false) } - // Server wants us to die + /// Server wants us to die func didForceClose(#message:String) { self._closed = true self._connected = false @@ -184,9 +193,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { self.handleEvent("disconnect", data: message, isInternalMessage: true) } - // Sends a message with multiple args - // If a message contains binary we have to send those - // seperately. + /** + Send a message to the server + */ public func emit(event:String, _ args:AnyObject...) { if !self.connected { return @@ -198,11 +207,17 @@ public class SocketIOClient: NSObject, SocketEngineClient { } } - // Objc doesn't have variadics + /** + Same as emit, but meant for Objective-C + */ public func emitObjc(event:String, withItems items:[AnyObject]) { self.emit(event, items) } + /** + Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add + an ack. + */ public func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler { if !self.connected { return SocketAckHandler(event: "fail", socket: self) @@ -221,6 +236,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { return ackHandler } + /** + Same as emitWithAck, but for Objective-C + */ public func emitWithAckObjc(event:String, withItems items:[AnyObject]) -> SocketAckHandler { return self.emitWithAck(event, items) } @@ -265,6 +283,7 @@ public class SocketIOClient: NSObject, SocketEngineClient { return } + // println("sending ack: \(ack) \(data)") let (items, hasBinary, emitDatas) = SocketParser.parseEmitArgs(data!) var str:String @@ -311,7 +330,9 @@ public class SocketIOClient: NSObject, SocketEngineClient { } } - // Handles events + /** + Causes an event to be handled. Only use if you know what you're doing. + */ 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)") @@ -363,18 +384,24 @@ public class SocketIOClient: NSObject, SocketEngineClient { } } - // Adds handler for an event + /** + Adds a handler for an event. + */ public func on(name:String, callback:NormalCallback) { let handler = SocketEventHandler(event: name, callback: callback) self.handlers.append(handler) } - // Adds a handler for any event + /** + Adds a handler that will be called on every event. + */ public func onAny(handler:(AnyHandler) -> Void) { self.anyHandler = handler } - // Opens the connection to the socket + /** + Same as connect + */ public func open() { self.connect() } diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index b7346f5..91f5eb8 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -220,39 +220,20 @@ class SocketParser { return } - var messageGroups:[String]? - let type = stringMessage.removeAtIndex(stringMessage.startIndex) if type == "2" { - if let groups = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", + if let groups = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - messageGroups = groups - - var mesNum = messageGroups![1] - var ackNum:String - var namespace:String? - - if mesNum == "" { - ackNum = "" - } else if messageGroups![3] != "" { - ackNum = messageGroups![3] - } else { - let range = Range(start: mesNum.startIndex, - end: advance(mesNum.startIndex, 1)) - mesNum.replaceRange(range, with: "") - ackNum = mesNum - } - - namespace = messageGroups![2] + let namespace = groups[2] + let ackNum = groups[3] + let event = groups[4] + let data = "[\(groups[5])]" if namespace == "" && socket.nsp != nil { return } - let event = messageGroups![4] - let data = "[\(messageGroups![5])]" - if let parsed:AnyObject = self.parseData(data) { if ackNum == "" { socket.handleEvent(event, data: parsed) @@ -264,25 +245,16 @@ class SocketParser { } } } else if type == "3" { - if let ackGroup = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", + if let ackGroup = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - messageGroups = ackGroup - - let arr = Array(messageGroups![1]) - var ackNum:String - let nsp = messageGroups![2] + let nsp = ackGroup[2] + let ackNum = ackGroup[3] + let ackData:AnyObject? = self.parseData("[\(ackGroup[4])]") if nsp == "" && socket.nsp != nil { return } - if nsp == "" { - ackNum = String(arr[0...arr.count-1]) - } else { - ackNum = messageGroups![3] - } - - let ackData:AnyObject? = self.parseData("[\(messageGroups![4])]") socket.handleAck(ackNum.toInt()!, data: ackData) } } else { @@ -346,32 +318,17 @@ class SocketParser { // Tries to parse a message that contains binary class func parseBinaryMessage(var message:String, socket:SocketIOClient) { // NSLog(message) - var binaryGroup:[String]? let type = message.removeAtIndex(message.startIndex) if type == "5" { - if let groups = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(\".*?\")?,?(.*)?\\]$", + if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - binaryGroup = groups - - var ackNum:String - var event:String - var mutMessageObject:String - var namespace:String? - let numberOfPlaceholders = binaryGroup![1] - - namespace = binaryGroup![2] - if binaryGroup![3] != "" { - ackNum = binaryGroup![3] as String - } else if socket.nsp == nil && binaryGroup![2] != "" { - ackNum = binaryGroup![2] - } else { - ackNum = "" - } - - event = (binaryGroup![4]["\""] ~= "") as String - mutMessageObject = binaryGroup![5] + 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 @@ -393,26 +350,16 @@ class SocketParser { socket.waitingData.append(mes) } } else if type == "6" { - if let groups = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", + if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - binaryGroup = groups + let numberOfPlaceholders = groups[1] + let namespace = groups[3] + let ackNum = groups[4] + let mutMessageObject = groups[5] - let numberOfPlaceholders = binaryGroup![1] - var ackNum:String - var nsp:String - - if binaryGroup![3] == "" { - ackNum = binaryGroup![2] - nsp = "" - } else { - ackNum = binaryGroup![3] - nsp = binaryGroup![2] - } - - if nsp == "" && socket.nsp != nil { + if namespace == "" && socket.nsp != nil { return } - var mutMessageObject = binaryGroup![4] let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" From 2837c7c42cd065c6d43eb78a3949df706ca91ed0 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 20 Mar 2015 10:54:52 -0400 Subject: [PATCH 2/2] bump version --- Socket.IO-Client-Swift.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 485685c..76aeb47 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Socket.IO-Client-Swift" - s.version = "1.3.1" + s.version = "1.3.2" s.summary = "Socket.IO-client for Swift" s.description = <<-DESC Socket.IO-client for Swift. @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.author = { "Erik" => "nuclear.ace@gmail.com" } s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.10' - s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.3.1' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.3.2' } s.source_files = "SwiftIO/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files