From 78727dc0ee18758f8dfdfcf0548aea325f380108 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 8 Jun 2015 20:02:59 -0400 Subject: [PATCH 01/95] untested with socket.io, this just compiles --- SocketIOClientSwift/SocketEngine.swift | 62 ++++----- SocketIOClientSwift/SocketEventHandler.swift | 12 +- SocketIOClientSwift/SocketIOClient.swift | 10 +- SocketIOClientSwift/SocketLogger.swift | 18 +-- SocketIOClientSwift/SocketPacket.swift | 24 ++-- SocketIOClientSwift/SocketParser.swift | 26 ++-- SocketIOClientSwift/SocketTypes.swift | 4 +- SocketIOClientSwift/SwiftRegex.swift | 136 +++++++++---------- SocketIOClientSwift/WebSocket.swift | 40 +++--- 9 files changed, 166 insertions(+), 166 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 28593da..f449252 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -88,7 +88,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { case NOOP = 6 init?(str:String?) { - if let value = str?.toInt(), raw = PacketType(rawValue: value) { + if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { self = raw } else { return nil @@ -115,7 +115,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { SocketLogger.log("Engine is being deinit", client: self) } - public func close(#fast:Bool) { + public func close(fast fast:Bool) { SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast) pingTimer?.invalidate() @@ -135,7 +135,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if websocket { var byteArray = [UInt8](count: 1, repeatedValue: 0x0) byteArray[0] = 4 - var mutData = NSMutableData(bytes: &byteArray, length: 1) + let mutData = NSMutableData(bytes: &byteArray, length: 1) mutData.appendData(data) @@ -156,7 +156,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let path = socketPath == "" ? "/socket.io" : socketPath - var url = "\(client!.socketURL)\(path)/?transport=" + let url = "\(client!.socketURL)\(path)/?transport=" var urlPolling:String var urlWebSocket:String @@ -243,18 +243,18 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { session.dataTaskWithRequest(req) {[weak self] data, res, err in if let this = self { - if err != nil { + if err != nil || data == nil { if this.polling { - this.handlePollingFailed(err.localizedDescription) + this.handlePollingFailed(err?.localizedDescription ?? "Error") } else { - SocketLogger.err(err.localizedDescription, client: this) + SocketLogger.err(err?.localizedDescription ?? "Error", client: this) } return } SocketLogger.log("Got polling response", client: this) - if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String { + if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String { dispatch_async(this.parseQueue) {[weak this] in this?.parsePollingMessage(str) } @@ -267,7 +267,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } else if !this.closed && this.polling { this.doPoll() } - }}.resume() + }}?.resume() } private func flushProbeWait() { @@ -299,7 +299,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { var postStr = "" for packet in postWait { - let len = count(packet) + let len = packet.characters.count postStr += "\(len):\(packet)" } @@ -329,10 +329,10 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { session.dataTaskWithRequest(req) {[weak self] data, res, err in if let this = self { if err != nil && this.polling { - this.handlePollingFailed(err.localizedDescription) + this.handlePollingFailed(err?.localizedDescription ?? "Error") return } else if err != nil { - NSLog(err.localizedDescription) + NSLog(err?.localizedDescription ?? "Error") return } @@ -344,7 +344,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { this?.doPoll() } } - }}.resume() + }}?.resume() } // We had packets waiting for send when we upgraded @@ -391,12 +391,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func handleOpen(openData:String) { - var err:NSError? let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! - if let json = NSJSONSerialization.JSONObjectWithData(mesData, - options: NSJSONReadingOptions.AllowFragments, - error: &err) as? NSDictionary, sid = json["sid"] as? String { + do { + let json = try NSJSONSerialization.JSONObjectWithData(mesData, + options: NSJSONReadingOptions.AllowFragments) as? NSDictionary + if let sid = json?["sid"] as? String { self.sid = sid _connected = true @@ -404,13 +404,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { createWebsocket(andConnect: true) } - if let pingInterval = json["pingInterval"] as? Int, pingTimeout = json["pingTimeout"] as? Int { + if let pingInterval = json?["pingInterval"] as? Int, pingTimeout = json?["pingTimeout"] as? Int { self.pingInterval = pingInterval / 1000 self.pingTimeout = pingTimeout / 1000 } - } else { - client?.didError("Engine failed to handshake") - return + } + } catch { + SocketLogger.err("Error parsing open packet", client: self) } startPingTimer() @@ -482,19 +482,19 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { // Translatation of engine.io-parser#decodePayload private func parsePollingMessage(str:String) { - if count(str) == 1 { + if str.characters.count == 1 { return } // println(str) - let strArray = Array(str) + let strArray = Array(str.characters) var length = "" var n = 0 var msg = "" func testLength(length:String, inout n:Int) -> Bool { - if let num = length.toInt() { + if let num = Int(length) { n = num return false } else { @@ -502,13 +502,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - for var i = 0, l = count(str); i < l; i++ { + for var i = 0, l = str.characters.count; i < l; i++ { let chr = String(strArray[i]) if chr != ":" { length += chr } else { - if length == "" || testLength(length, &n) { + if length == "" || testLength(length, n: &n) { SocketLogger.err("Parsing error: %@", client: self, args: str) handlePollingFailed("Error parsing XHR message") return @@ -516,12 +516,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { msg = String(strArray[i+1...i+n]) - if let lengthInt = length.toInt() where lengthInt != count(msg) { + if let lengthInt = Int(length) where lengthInt != msg.characters.count { SocketLogger.err("Parsing error: %@", client: self, args: str) return } - if count(msg) != 0 { + if msg.characters.count != 0 { // Be sure to capture the value of the msg dispatch_async(handleQueue) {[weak self, msg] in self?.parseEngineMessage(msg, fromPolling: true) @@ -552,7 +552,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let type = PacketType(str: (message["^(\\d)"].groups()?[1])) ?? { self.checkIfMessageIsBase64Binary(message) return PacketType.NOOP - }() + }() switch type { case PacketType.MESSAGE: @@ -612,7 +612,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if datas != nil { for data in datas! { - let (nilData, b64Data) = createBinaryDataForSend(data) + let (_, b64Data) = createBinaryDataForSend(data) postWait.append(b64Data!) } @@ -633,7 +633,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if datas != nil { for data in datas! { - let (data, nilString) = createBinaryDataForSend(data) + let (data, _) = createBinaryDataForSend(data) if data != nil { ws?.writeData(data!) } diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index cef0d4d..afdab80 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -24,24 +24,24 @@ import Foundation -private func emitAckCallback(socket:SocketIOClient, num:Int) - (items:AnyObject...) -> Void { - socket.emitAck(num, withData: items) +private func emitAckCallback(socket:SocketIOClient?, num:Int?) + (items:[AnyObject]) -> Void { + socket?.emitAck(num ?? -1, withData: items) } final class SocketEventHandler { let event:String! - let callback:NormalCallback? + let callback:NormalCallback init(event:String, callback:NormalCallback) { self.event = event self.callback = callback } - func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, + func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, withSocket socket:SocketIOClient? = nil) { dispatch_async(dispatch_get_main_queue()) {[weak self] in - self?.callback?(items, ack != nil ? emitAckCallback(socket!, ack!) : nil) + self?.callback(items, emitAckCallback(socket, num: ack)) } } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 31ee191..6f9e732 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -145,7 +145,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Will turn off automatic reconnects. Pass true to fast if you're closing from a background task */ - public func close(#fast:Bool) { + public func close(fast fast:Bool) { SocketLogger.log("Closing socket", client: self) reconnects = false @@ -166,7 +166,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ - public func connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { + public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { if closed { SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) _closed = false @@ -175,7 +175,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } addEngine() - engine?.open(opts: connectParams) + engine?.open(connectParams) if timeoutAfter == 0 { return @@ -260,7 +260,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as close */ - public func disconnect(#fast:Bool) { + public func disconnect(fast fast:Bool) { close(fast: fast) } @@ -433,7 +433,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public func off(event:String) { SocketLogger.log("Removing handler for event: %@", client: self, args: event) - handlers = handlers.filter {$0.event == event ? false : true} + handlers = ContiguousArray(handlers.filter {$0.event == event ? false : true}) } /** diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 16a4378..3f524bf 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -24,8 +24,6 @@ import Foundation -private let MESSAGE_LENGTH_MAX = 10000 - protocol SocketLogClient { var log:Bool {get set} var logType:String {get} @@ -34,16 +32,8 @@ protocol SocketLogClient { final class SocketLogger { private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) - private static func shorten(item:AnyObject) -> CVarArgType { - var str = toString(item) - - if count(str) > MESSAGE_LENGTH_MAX { - let endIndex = advance(str.startIndex, MESSAGE_LENGTH_MAX) - - str = str.substringToIndex(endIndex) - } - - return str + private static func toCVArgType(item:AnyObject) -> CVarArgType { + return String(item) } static func log(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { @@ -52,7 +42,7 @@ final class SocketLogger { } dispatch_async(printQueue) {[type = client.logType] in - let newArgs = args.map(SocketLogger.shorten) + let newArgs = args.map(SocketLogger.toCVArgType) let replaced = String(format: message, arguments: newArgs) NSLog("%@: %@", altType ?? type, replaced) @@ -65,7 +55,7 @@ final class SocketLogger { } dispatch_async(printQueue) {[type = client.logType] in - let newArgs = args.map(SocketLogger.shorten) + let newArgs = args.map(SocketLogger.toCVArgType) let replaced = String(format: message, arguments: newArgs) NSLog("ERROR %@: %@", altType ?? type, replaced) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 5dcfd36..52b155e 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -24,7 +24,7 @@ import Foundation -final class SocketPacket: Printable { +final class SocketPacket: CustomStringConvertible { var binary = ContiguousArray() var currentPlace = 0 var data:[AnyObject]? @@ -55,7 +55,7 @@ final class SocketPacket: Printable { case BINARY_ACK = 6 init?(str:String) { - if let int = str.toInt(), raw = PacketType(rawValue: int) { + if let int = Int(str), raw = PacketType(rawValue: int) { self = raw } else { return nil @@ -167,8 +167,14 @@ final class SocketPacket: Printable { for arg in data! { if arg is NSDictionary || arg is [AnyObject] { - let jsonSend = NSJSONSerialization.dataWithJSONObject(arg, - options: NSJSONWritingOptions(0), error: &err) + let jsonSend: NSData? + do { + jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, + options: NSJSONWritingOptions(rawValue: 0)) + } catch var error as NSError { + err = error + jsonSend = nil + } let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) message += jsonString! as String + "," @@ -192,11 +198,11 @@ final class SocketPacket: Printable { } func fillInPlaceholders() { - var newArr = NSMutableArray(array: data!) + let newArr = NSMutableArray(array: data!) for i in 0.. AnyObject { if let str = data as? String { if let num = str["~~(\\d)"].groups() { - return binary[num[1].toInt()!] + return binary[Int(num[1])!] } else { return str } } else if let dict = data as? NSDictionary { - var newDict = NSMutableDictionary(dictionary: dict) + let newDict = NSMutableDictionary(dictionary: dict) for (key, value) in dict { newDict[key as! NSCopying] = _fillInPlaceholders(value) @@ -221,7 +227,7 @@ final class SocketPacket: Printable { return newDict } else if let arr = data as? NSArray { - var newArr = NSMutableArray(array: arr) + let newArr = NSMutableArray(array: arr) for i in 0.. SocketPacket? { - let arr = Array(str) + let arr = Array(str.characters) let type = String(arr[0]) if arr.count == 1 { @@ -103,7 +103,7 @@ class SocketParser { } } - if let holders = buf.toInt() where arr[i] == "-" { + if let holders = Int(buf) where arr[i] == "-" { placeholders = holders } else { NSLog("Error parsing \(str)") @@ -130,10 +130,10 @@ class SocketParser { let next = String(arr[i + 1]) - if next.toInt() != nil { + if Int(next) != nil { var c = "" while ++i < arr.count { - if let int = String(arr[i]).toInt() { + if let int = Int(String(arr[i])) { c += String(arr[i]) } else { --i @@ -141,11 +141,11 @@ class SocketParser { } } - id = c.toInt() + id = Int(c) } if ++i < arr.count { - let d = str[advance(str.startIndex, i)...advance(str.startIndex, count(str)-1)] + let d = str[advance(str.startIndex, i)...advance(str.startIndex, str.characters.count-1)] let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] @@ -160,8 +160,14 @@ class SocketParser { static func parseData(data:String) -> AnyObject? { var err:NSError? let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!, - options: NSJSONReadingOptions.MutableContainers, error: &err) + let parsed:AnyObject? + do { + parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, + options: NSJSONReadingOptions.MutableContainers) + } catch var error as NSError { + err = error + parsed = nil + } if err != nil { // println(err) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 8562024..2423d02 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -28,7 +28,7 @@ import Foundation // Objective-C blocks are copied, but Objective-C assumes that Swift will copy it. // And the way things are done here, the bridging fails to copy the block in // SocketAckMap#addAck -public typealias AckCallback = @objc_block (NSArray?) -> Void -public typealias AckEmitter = (AnyObject...) -> Void +public typealias AckCallback = @convention(block) (NSArray?) -> Void +public typealias AckEmitter = ([AnyObject]) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void diff --git a/SocketIOClientSwift/SwiftRegex.swift b/SocketIOClientSwift/SwiftRegex.swift index 2bbb363..dee77b2 100644 --- a/SocketIOClientSwift/SwiftRegex.swift +++ b/SocketIOClientSwift/SwiftRegex.swift @@ -18,34 +18,36 @@ var swiftRegexCache = [String: NSRegularExpression]() public class SwiftRegex: NSObject, BooleanType { var target:String var regex: NSRegularExpression - - init(target:String, pattern:String, options:NSRegularExpressionOptions = nil) { + + init(target:String, pattern:String, options:NSRegularExpressionOptions?) { self.target = target if let regex = swiftRegexCache[pattern] { self.regex = regex } else { var error: NSError? - if let regex = NSRegularExpression(pattern: pattern, options:options, error:&error) { + do { + let regex = try NSRegularExpression(pattern: pattern, options: + NSRegularExpressionOptions.DotMatchesLineSeparators) swiftRegexCache[pattern] = regex self.regex = regex - } - else { + } catch let error1 as NSError { + error = error1 SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") self.regex = NSRegularExpression() } } super.init() } - + class func failure(message: String) { - println("SwiftRegex: "+message) + print("SwiftRegex: "+message) //assert(false,"SwiftRegex: failed") } - + final var targetRange: NSRange { - return NSRange(location: 0,length: count(target.utf16)) + return NSRange(location: 0,length: target.utf16.count) } - + final func substring(range: NSRange) -> String? { if ( range.location != NSNotFound ) { return (target as NSString).substringWithRange(range) @@ -53,23 +55,24 @@ public class SwiftRegex: NSObject, BooleanType { return nil } } - - public func doesMatch(options: NSMatchingOptions = nil) -> Bool { - return range(options: options).location != NSNotFound + + public func doesMatch(options: NSMatchingOptions!) -> Bool { + return range(options).location != NSNotFound } - - public func range(options: NSMatchingOptions = nil) -> NSRange { - return regex.rangeOfFirstMatchInString(target as String, options: nil, range: targetRange) + + public func range(options: NSMatchingOptions) -> NSRange { + return regex.rangeOfFirstMatchInString(target as String, options: [], range: targetRange) } - - public func match(options: NSMatchingOptions = nil) -> String? { - return substring(range(options: options)) + + public func match(options: NSMatchingOptions) -> String? { + return substring(range(options)) } - - public func groups(options: NSMatchingOptions = nil) -> [String]? { - return groupsForMatch(regex.firstMatchInString(target as String, options: options, range: targetRange)) + + public func groups() -> [String]? { + return groupsForMatch(regex.firstMatchInString(target as String, options: + NSMatchingOptions.WithoutAnchoringBounds, range: targetRange)) } - + func groupsForMatch(match: NSTextCheckingResult!) -> [String]? { if match != nil { var groups = [String]() @@ -85,80 +88,75 @@ public class SwiftRegex: NSObject, BooleanType { return nil } } - + public subscript(groupno: Int) -> String? { get { return groups()?[groupno] } - + set(newValue) { if newValue == nil { return } - - for match in matchResults()!.reverse() { + + for match in Array(matchResults().reverse()) { let replacement = regex.replacementStringForResult(match, inString: target as String, offset: 0, template: newValue!) let mut = NSMutableString(string: target) mut.replaceCharactersInRange(match.rangeAtIndex(groupno), withString: replacement) - + target = mut as String } } } - - func matchResults(options: NSMatchingOptions = nil) -> [NSTextCheckingResult]? { - let matches = regex.matchesInString(target as String, options: options, range: targetRange) - as? [NSTextCheckingResult] - - if matches != nil { - return matches! - } else { - return nil - } + + func matchResults() -> [NSTextCheckingResult] { + let matches = regex.matchesInString(target as String, options: + NSMatchingOptions.WithoutAnchoringBounds, range: targetRange) + as [NSTextCheckingResult] + + return matches } - - public func ranges(options: NSMatchingOptions = nil) -> [NSRange] { - return matchResults(options: options)!.map { $0.range } + + public func ranges() -> [NSRange] { + return matchResults().map { $0.range } } - - public func matches(options: NSMatchingOptions = nil) -> [String] { - return matchResults(options: options)!.map( { self.substring($0.range)!}) + + public func matches() -> [String] { + return matchResults().map( { self.substring($0.range)!}) } - - public func allGroups(options: NSMatchingOptions = nil) -> [[String]?] { - return matchResults(options: options)!.map {self.groupsForMatch($0)} + + public func allGroups() -> [[String]?] { + return matchResults().map {self.groupsForMatch($0)} } - - public func dictionary(options: NSMatchingOptions = nil) -> Dictionary { + + public func dictionary(options: NSMatchingOptions!) -> Dictionary { var out = Dictionary() - for match in matchResults(options: options)! { + for match in matchResults() { out[substring(match.rangeAtIndex(1))!] = substring(match.rangeAtIndex(2))! } return out } - + func substituteMatches(substitution: ((NSTextCheckingResult, UnsafeMutablePointer) -> String), - options:NSMatchingOptions = nil) -> String { + options:NSMatchingOptions) -> String { let out = NSMutableString() var pos = 0 - - regex.enumerateMatchesInString(target as String, options: options, range: targetRange ) { - (match: NSTextCheckingResult!, flags: NSMatchingFlags, stop: UnsafeMutablePointer) in - - let matchRange = match.range + + regex.enumerateMatchesInString(target as String, options: options, range: targetRange ) {match, flags, stop in + let matchRange = match!.range out.appendString( self.substring(NSRange(location:pos, length:matchRange.location-pos))!) - out.appendString( substitution(match, stop) ) + out.appendString( substitution(match!, stop) ) pos = matchRange.location + matchRange.length } - + out.appendString(substring(NSRange(location:pos, length:targetRange.length-pos))!) - + return out as String } - + public var boolValue: Bool { - return doesMatch() + return doesMatch(nil) } } @@ -170,7 +168,7 @@ extension String { extension String { public subscript(pattern: String) -> SwiftRegex { - return SwiftRegex(target: self, pattern: pattern) + return SwiftRegex(target: self, pattern: pattern, options: nil) } } @@ -178,20 +176,20 @@ public func ~= (left: SwiftRegex, right: String) -> String { return left.substituteMatches({match, stop in return left.regex.replacementStringForResult( match, inString: left.target as String, offset: 0, template: right ) - }, options: nil) + }, options: []) } public func ~= (left: SwiftRegex, right: [String]) -> String { var matchNumber = 0 return left.substituteMatches({match, stop -> String in - + if ++matchNumber == right.count { stop.memory = true } - + return left.regex.replacementStringForResult( match, inString: left.target as String, offset: 0, template: right[matchNumber-1] ) - }, options: nil) + }, options: []) } public func ~= (left: SwiftRegex, right: (String) -> String) -> String { @@ -199,11 +197,11 @@ public func ~= (left: SwiftRegex, right: (String) -> String) -> String { return left.substituteMatches( {match, stop -> String in right(left.substring(match.range)!) - }, options: nil) + }, options: []) } public func ~= (left: SwiftRegex, right: ([String]?) -> String) -> String { return left.substituteMatches({match, stop -> String in return right(left.groupsForMatch(match)) - }, options: nil) + }, options: []) } diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 8ddd2c1..6e98bed 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -169,7 +169,7 @@ public class WebSocket : NSObject, NSStreamDelegate { //private method that starts the connection private func createHTTPRequest() { - let str: NSString = url.absoluteString! + let str: NSString = url.absoluteString let urlRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", url, kCFHTTPVersion1_1) @@ -185,7 +185,7 @@ public class WebSocket : NSObject, NSStreamDelegate { if self.cookies != nil { let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(self.cookies!) for (key, value) in headers { - self.addHeader(urlRequest, key: key as! String, val: value as! String) + self.addHeader(urlRequest, key: key as String, val: value as String) } } @@ -196,14 +196,14 @@ public class WebSocket : NSObject, NSStreamDelegate { } self.addHeader(urlRequest, key: headerWSVersionName, val: headerWSVersionValue) self.addHeader(urlRequest, key: headerWSKeyName, val: self.generateWebSocketKey()) - self.addHeader(urlRequest, key: headerOriginName, val: url.absoluteString!) + self.addHeader(urlRequest, key: headerOriginName, val: url.absoluteString) self.addHeader(urlRequest, key: headerWSHostName, val: "\(url.host!):\(port!)") for (key,value) in headers { self.addHeader(urlRequest, key: key, val: value) } - let serializedRequest: NSData = CFHTTPMessageCopySerializedMessage(urlRequest.takeUnretainedValue()).takeUnretainedValue() - self.initStreamsWithData(serializedRequest, Int(port!)) + let serializedRequest = CFHTTPMessageCopySerializedMessage(urlRequest.takeUnretainedValue())?.takeUnretainedValue() + self.initStreamsWithData(serializedRequest!, Int(port!)) } //Add a header to the CFHTTPMessage by using the NSString bridges to CFString private func addHeader(urlRequest: Unmanaged,key: String, val: String) { @@ -221,8 +221,8 @@ public class WebSocket : NSObject, NSStreamDelegate { let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25))) key += "\(Character(uni))" } - var data = key.dataUsingEncoding(NSUTF8StringEncoding) - var baseKey = data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(0)) + let data = key.dataUsingEncoding(NSUTF8StringEncoding) + let baseKey = data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) return baseKey! } //Start the stream connection and write the data to the output stream @@ -260,7 +260,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let bytes = UnsafePointer(data.bytes) outputStream!.write(bytes, maxLength: data.length) while(isRunLoop) { - NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as! NSDate) + NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as NSDate) } } //delegate for the stream methods. Processes incoming bytes @@ -300,7 +300,7 @@ public class WebSocket : NSObject, NSStreamDelegate { ///handles the incoming bytes and sending them to the proper processing method private func processInputStream() { let buf = NSMutableData(capacity: BUFFER_MAX) - var buffer = UnsafeMutablePointer(buf!.bytes) + let buffer = UnsafeMutablePointer(buf!.bytes) let length = inputStream!.read(buffer, maxLength: BUFFER_MAX) if length > 0 { if !connected { @@ -333,7 +333,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let data = inputQueue[0] var work = data if (fragBuffer != nil) { - var combine = NSMutableData(data: fragBuffer!) + let combine = NSMutableData(data: fragBuffer!) combine.appendData(data) work = combine fragBuffer = nil @@ -388,8 +388,8 @@ public class WebSocket : NSObject, NSStreamDelegate { return false } let cfHeaders = CFHTTPMessageCopyAllHeaderFields(response) - let headers: NSDictionary = cfHeaders.takeRetainedValue() - let acceptKey = headers[headerWSAcceptName] as! NSString + let headers:NSDictionary? = cfHeaders?.takeRetainedValue() + let acceptKey = headers?[headerWSAcceptName] as! NSString if acceptKey.length > 0 { return true } @@ -398,7 +398,7 @@ public class WebSocket : NSObject, NSStreamDelegate { ///process the websocket data private func processRawMessage(buffer: UnsafePointer, bufferLen: Int) { - var response = readStack.last + let response = readStack.last if response != nil && bufferLen < 2 { fragBuffer = NSData(bytes: buffer, length: bufferLen) return @@ -414,7 +414,7 @@ public class WebSocket : NSObject, NSStreamDelegate { resp.bytesLeft -= len resp.buffer?.appendData(NSData(bytes: buffer, length: len)) processResponse(resp) - var offset = bufferLen - extra + let offset = bufferLen - extra if extra > 0 { processExtra((buffer+offset), bufferLen: extra) } @@ -473,7 +473,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let len = Int(payloadLen-2) if len > 0 { let bytes = UnsafePointer((buffer+offset)) - var str: NSString? = NSString(data: NSData(bytes: bytes, length: len), encoding: NSUTF8StringEncoding) + let str: NSString? = NSString(data: NSData(bytes: bytes, length: len), encoding: NSUTF8StringEncoding) if str == nil { code = CloseCode.ProtocolError.rawValue } @@ -603,7 +603,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let data = response.buffer! //local copy so it is perverse for writing dequeueWrite(data, code: OpCode.Pong) } else if response.code == .TextFrame { - var str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding) + let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding) if str == nil { writeError(CloseCode.Encoding.rawValue) return false @@ -640,7 +640,7 @@ public class WebSocket : NSObject, NSStreamDelegate { ///write a an error to the socket private func writeError(code: UInt16) { let buf = NSMutableData(capacity: sizeof(UInt16)) - var buffer = UnsafeMutablePointer(buf!.bytes) + let buffer = UnsafeMutablePointer(buf!.bytes) buffer[0] = code.byteSwapped dequeueWrite(NSData(bytes: buffer, length: sizeof(UInt16)), code: .ConnectionClose) } @@ -675,12 +675,12 @@ public class WebSocket : NSObject, NSStreamDelegate { buffer[1] = CUnsignedChar(dataLength) } else if dataLength <= Int(UInt16.max) { buffer[1] = 126 - var sizeBuffer = UnsafeMutablePointer((buffer+offset)) + let sizeBuffer = UnsafeMutablePointer((buffer+offset)) sizeBuffer[0] = UInt16(dataLength).byteSwapped offset += sizeof(UInt16) } else { buffer[1] = 127 - var sizeBuffer = UnsafeMutablePointer((buffer+offset)) + let sizeBuffer = UnsafeMutablePointer((buffer+offset)) sizeBuffer[0] = UInt64(dataLength).byteSwapped offset += sizeof(UInt64) } @@ -699,7 +699,7 @@ public class WebSocket : NSObject, NSStreamDelegate { break } let writeBuffer = UnsafePointer(frame!.bytes+total) - var len = self.outputStream?.write(writeBuffer, maxLength: offset-total) + let len = self.outputStream?.write(writeBuffer, maxLength: offset-total) if len == nil || len! < 0 { var error: NSError? if let streamError = self.outputStream?.streamError { From 7bf35e182cdc47e0275088ae14a3594552c963ef Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 8 Jun 2015 20:23:22 -0400 Subject: [PATCH 02/95] tweaks --- SocketIOClientSwift/SocketParser.swift | 4 ++-- SocketIOClientSwift/WebSocket.swift | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 63d6100..60794b5 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -134,7 +134,7 @@ class SocketParser { var c = "" while ++i < arr.count { if let int = Int(String(arr[i])) { - c += String(arr[i]) + c += String(int) } else { --i break @@ -164,7 +164,7 @@ class SocketParser { do { parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.MutableContainers) - } catch var error as NSError { + } catch let error as NSError { err = error parsed = nil } diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 6e98bed..ca11125 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -169,7 +169,6 @@ public class WebSocket : NSObject, NSStreamDelegate { //private method that starts the connection private func createHTTPRequest() { - let str: NSString = url.absoluteString let urlRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", url, kCFHTTPVersion1_1) From 66622fffb31bd6ff33b5e0a1d4eede616a1b846d Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 8 Jun 2015 20:24:57 -0400 Subject: [PATCH 03/95] I hope Swift fixes the case where I use variadics, because this ugly --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0345805..e34ee57 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ socket.on("currentAmount") {data, ack in socket.emit("update", ["amount": cur + 2.50]) } - ack?("Got your currentAmount", "dude") + ack?(["Got your currentAmount", "dude"]) } } From fafeebe18506add5e54347af39149816856b19b7 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 8 Jun 2015 21:03:49 -0400 Subject: [PATCH 04/95] remove warnings --- SocketIOClientSwift/SocketPacket.swift | 5 +---- SocketIOClientSwift/SwiftRegex.swift | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 52b155e..0f4260c 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -157,8 +157,6 @@ final class SocketPacket: CustomStringConvertible { } private func completeMessage(var message:String, ack:Bool = false) -> String { - var err:NSError? - if data == nil || data!.count == 0 { return message + "]" } else if !ack { @@ -171,8 +169,7 @@ final class SocketPacket: CustomStringConvertible { do { jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, options: NSJSONWritingOptions(rawValue: 0)) - } catch var error as NSError { - err = error + } catch { jsonSend = nil } let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) diff --git a/SocketIOClientSwift/SwiftRegex.swift b/SocketIOClientSwift/SwiftRegex.swift index dee77b2..fb306aa 100644 --- a/SocketIOClientSwift/SwiftRegex.swift +++ b/SocketIOClientSwift/SwiftRegex.swift @@ -24,15 +24,13 @@ public class SwiftRegex: NSObject, BooleanType { if let regex = swiftRegexCache[pattern] { self.regex = regex } else { - var error: NSError? do { let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.DotMatchesLineSeparators) swiftRegexCache[pattern] = regex self.regex = regex } catch let error1 as NSError { - error = error1 - SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") + SwiftRegex.failure("Error in pattern: \(pattern) - \(error1)") self.regex = NSRegularExpression() } } From a15b57e9006d3fa7a63a7ae5e787ffda2ace45a4 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 10 Jun 2015 19:27:07 -0400 Subject: [PATCH 05/95] extract methods, clean up --- SocketIOClientSwift/SocketIOClient.swift | 12 ++- SocketIOClientSwift/SocketParser.swift | 103 ++++++++++++++--------- 2 files changed, 68 insertions(+), 47 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 6f9e732..da63dd4 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -395,13 +395,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - for handler in handlers { - if handler.event == event { - if ack != nil { - handler.executeCallback(data, withAck: ack!, withSocket: self) - } else { - handler.executeCallback(data) - } + for handler in handlers where handler.event == event { + if ack != nil { + handler.executeCallback(data, withAck: ack!, withSocket: self) + } else { + handler.executeCallback(data) } } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 60794b5..32e9cd3 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -79,6 +79,54 @@ class SocketParser { } } + private static func checkNSP(nsp:String) -> Bool { + return nsp == "" && socket.nsp != "/" + } + + private static func handleAck(p:SocketPacket, socket:SocketIOClient) { + if checkNSP(p.nsp) { + return + } + + socket.handleAck(p.id!, data: p.data) + } + + private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { + if checkNSP(p.nsp) { + return + } + + p.justAck = true + socket.waitingData.append(p) + } + + private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) { + if checkNSP(p.nsp) { + return + } + + socket.waitingData.append(p) + } + + private static func handleConnect(p:SocketPacket, socket:SocketIOClient) { + if p.nsp == "" && socket.nsp != "/" { + socket.joinNamespace() + } else if p.nsp != "" && socket.nsp == "/" { + socket.didConnect() + } else { + socket.didConnect() + } + } + + private static func handleEvent(p:SocketPacket, socket:SocketIOClient) { + if checkNSP(p.nsp) { + return + } + + socket.handleEvent(p.getEvent(), data: p.data, + isInternalMessage: false, wantsAck: p.id) + } + // Translation of socket.io-client#decodeString static func parseString(str:String) -> SocketPacket? { let arr = Array(str.characters) @@ -187,10 +235,6 @@ class SocketParser { return } - func checkNSP(nsp:String) -> Bool { - return nsp == "" && socket.nsp != "/" - } - SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) let p:SocketPacket @@ -204,44 +248,23 @@ class SocketParser { SocketLogger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p) - if p.type == SocketPacket.PacketType.EVENT { - if checkNSP(p.nsp) { - return - } - - socket.handleEvent(p.getEvent(), data: p.data, - isInternalMessage: false, wantsAck: p.id) - } else if p.type == SocketPacket.PacketType.ACK { - if checkNSP(p.nsp) { - return - } - - socket.handleAck(p.id!, data: p.data) - } else if p.type == SocketPacket.PacketType.BINARY_EVENT { - if checkNSP(p.nsp) { - return - } - - socket.waitingData.append(p) - } else if p.type == SocketPacket.PacketType.BINARY_ACK { - if checkNSP(p.nsp) { - return - } - - p.justAck = true - socket.waitingData.append(p) - } else if p.type == SocketPacket.PacketType.CONNECT { - if p.nsp == "" && socket.nsp != "/" { - socket.joinNamespace() - } else if p.nsp != "" && socket.nsp == "/" { - socket.didConnect() - } else { - socket.didConnect() - } - } else if p.type == SocketPacket.PacketType.DISCONNECT { + switch p.type { + case SocketPacket.PacketType.EVENT?: + handleEvent(p, socket: socket) + case SocketPacket.PacketType.ACK?: + handleAck(p, socket: socket) + case SocketPacket.PacketType.BINARY_EVENT?: + handleBinaryEvent(p, socket: socket) + case SocketPacket.PacketType.BINARY_ACK?: + handleBinaryAck(p, socket: socket) + case SocketPacket.PacketType.CONNECT?: + handleConnect(p, socket: socket) + case SocketPacket.PacketType.DISCONNECT?: socket.didDisconnect("Got Disconnect") - } else if p.type == SocketPacket.PacketType.ERROR { + case SocketPacket.PacketType.ERROR?: socket.didError(p.data == nil ? "Error" : p.data!) + case nil: + SocketLogger.err("Got packet with invalid packet type", client: socket) } } From 11d84305375afe00d0f2c65f0388855cd9e4c7f2 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 11 Jun 2015 11:50:30 -0400 Subject: [PATCH 06/95] use struct --- SocketIOClientSwift/SocketEventHandler.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index afdab80..68c5eb9 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -29,8 +29,8 @@ private func emitAckCallback(socket:SocketIOClient?, num:Int?) socket?.emitAck(num ?? -1, withData: items) } -final class SocketEventHandler { - let event:String! +struct SocketEventHandler { + let event:String let callback:NormalCallback init(event:String, callback:NormalCallback) { @@ -40,8 +40,8 @@ final class SocketEventHandler { func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, withSocket socket:SocketIOClient? = nil) { - dispatch_async(dispatch_get_main_queue()) {[weak self] in - self?.callback(items, emitAckCallback(socket, num: ack)) + dispatch_async(dispatch_get_main_queue()) { + self.callback(items, emitAckCallback(socket, num: ack)) } } } From 1c8fcee7726171f3d4cbec469b92446ae77cf303 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 12 Jun 2015 09:23:11 -0400 Subject: [PATCH 07/95] remove comment --- SocketIOClientSwift/SocketTypes.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 2423d02..23723db 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -24,10 +24,6 @@ import Foundation -// @objc_block is undocumented, but is used because Swift assumes that all -// Objective-C blocks are copied, but Objective-C assumes that Swift will copy it. -// And the way things are done here, the bridging fails to copy the block in -// SocketAckMap#addAck public typealias AckCallback = @convention(block) (NSArray?) -> Void public typealias AckEmitter = ([AnyObject]) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void From 5854262280b07b0c7194cf678c470741d5fad88e Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 12 Jun 2015 09:39:39 -0400 Subject: [PATCH 08/95] Fix reference error --- SocketIOClientSwift/SocketParser.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 32e9cd3..512cef7 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -79,12 +79,12 @@ class SocketParser { } } - private static func checkNSP(nsp:String) -> Bool { + private static func checkNSP(nsp:String, _ socket:SocketIOClient) -> Bool { return nsp == "" && socket.nsp != "/" } private static func handleAck(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp) { + if checkNSP(p.nsp, socket) { return } @@ -92,7 +92,7 @@ class SocketParser { } private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp) { + if checkNSP(p.nsp, socket) { return } @@ -101,7 +101,7 @@ class SocketParser { } private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp) { + if checkNSP(p.nsp, socket) { return } @@ -119,7 +119,7 @@ class SocketParser { } private static func handleEvent(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp) { + if checkNSP(p.nsp, socket) { return } From a0c676bc54f57a854842fdb4c15d11d1758ec67b Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 12 Jun 2015 09:42:44 -0400 Subject: [PATCH 09/95] unify objc/swift constructors --- SocketIOClientSwift/SocketIOClient.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index da63dd4..4b74303 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -76,7 +76,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Create a new SocketIOClient. opts can be omitted */ - public init(var socketURL:String, opts:[String: AnyObject]? = nil) { + public init(var socketURL:String, opts:[String: AnyObject]?) { if socketURL["https://"].matches().count != 0 { self._secure = true } @@ -125,10 +125,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient super.init() } - public convenience init(socketURL:String, options:[String: AnyObject]?) { - self.init(socketURL: socketURL, opts: options) - } - deinit { SocketLogger.log("Client is being deinit", client: self) engine?.close(fast: true) From f2e5a1437becfbec281ea602fe2c2ce27b43a9d8 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 16 Jun 2015 05:13:08 -0400 Subject: [PATCH 10/95] use computed variable for sid --- SocketIOClientSwift/SocketIOClient.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 4b74303..f8aca1c 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -33,7 +33,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var handlers = ContiguousArray() private var connectParams:[String: AnyObject]? private var _secure = false - private var _sid:String? private var _reconnecting = false private var reconnectTimer:NSTimer? @@ -70,7 +69,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return _secure } public var sid:String? { - return _sid + return engine?.sid } /** @@ -220,7 +219,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient currentReconnectAttempt = 0 reconnectTimer?.invalidate() reconnectTimer = nil - _sid = engine?.sid // Don't handle as internal because something crazy could happen where // we disconnect before it's handled From 76637d160e08c82ad3f602a3866f2a65b91f9d8b Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 19 Jun 2015 08:00:09 -0400 Subject: [PATCH 11/95] use struct for socketpacket --- SocketIOClientSwift/SocketEngine.swift | 12 +- SocketIOClientSwift/SocketIOClient.swift | 14 +- SocketIOClientSwift/SocketPacket.swift | 487 ++++++++++++++++++----- SocketIOClientSwift/SocketParser.swift | 103 +---- 4 files changed, 413 insertions(+), 203 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index f449252..384cf95 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { - private typealias Probe = (msg:String, type:PacketType, data:ContiguousArray?) + private typealias Probe = (msg:String, type:PacketType, data:[NSData]?) private typealias ProbeWaitQueue = [Probe] private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet @@ -579,7 +579,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } /// Send an engine message (4) - public func send(msg:String, withData datas:ContiguousArray?) { + public func send(msg:String, withData datas:[NSData]?) { if probing { probeWait.append((msg, PacketType.MESSAGE, datas)) } else { @@ -602,7 +602,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send polling message. /// Only call on emitQueue private func sendPollMessage(var msg:String, withType type:PacketType, - datas:ContiguousArray? = nil) { + datas:[NSData]? = nil) { SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue) doubleEncodeUTF8(&msg) @@ -626,7 +626,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send message on WebSockets /// Only call on emitQueue private func sendWebSocketMessage(str:String, withType type:PacketType, - datas:ContiguousArray? = nil) { + datas:[NSData]? = nil) { SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue) ws?.writeString("\(type.rawValue)\(str)") @@ -674,7 +674,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. */ - public func write(msg:String, withType type:PacketType, withData data:ContiguousArray?) { + public func write(msg:String, withType type:PacketType, withData data:[NSData]?) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { if this.websocket { @@ -695,7 +695,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { */ public func writeObjc(msg:String, withType type:Int, withData data:NSArray?) { if let pType = PacketType(rawValue: type) { - var arr = ContiguousArray() + var arr = [NSData]() if data != nil { for d in data! { diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index f8aca1c..662d8df 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -312,11 +312,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return } - let packet = SocketPacket(type: nil, data: args, nsp: nsp, id: ack) - let str:String - - SocketParser.parseForEmit(packet) - str = packet.createMessageForEvent(event) + let packet = SocketPacket.packetFromEmitWithData(args, id: ack ?? -1, nsp: nsp) + let str = packet.createMessageForEvent(event) SocketLogger.log("Emitting: %@", client: self, args: str) @@ -331,11 +328,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient func emitAck(ack:Int, withData args:[AnyObject]) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { - let packet = SocketPacket(type: nil, data: args, nsp: this.nsp, id: ack) - let str:String - - SocketParser.parseForEmit(packet) - str = packet.createAck() + let packet = SocketPacket.packetFromEmitWithData(args, id: ack ?? -1, nsp: this.nsp) + let str = packet.createAck() SocketLogger.log("Emitting Ack: %@", client: this, args: str) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 0f4260c..9270d5a 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -24,27 +24,7 @@ import Foundation -final class SocketPacket: CustomStringConvertible { - var binary = ContiguousArray() - var currentPlace = 0 - var data:[AnyObject]? - var description:String { - var better = "SocketPacket {type: ~~0; data: ~~1; " + - "id: ~~2; placeholders: ~~3;}" - - better = better["~~0"] ~= (type != nil ? String(type!.rawValue) : "nil") - better = better["~~1"] ~= (data != nil ? "\(data!)" : "nil") - better = better["~~2"] ~= (id != nil ? String(id!) : "nil") - better = better["~~3"] ~= (placeholders != nil ? String(placeholders!) : "nil") - - return better - } - var id:Int? - var justAck = false - var nsp = "" - var placeholders:Int? - var type:PacketType? - +struct SocketPacket { enum PacketType:Int { case CONNECT = 0 case DISCONNECT = 1 @@ -63,20 +43,69 @@ final class SocketPacket: CustomStringConvertible { } } - init(type:PacketType?, 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 + var currentPlace = 0 + var binary:[NSData] + var data:[AnyObject] + var id:Int = -1 + var nsp = "" + var justAck = false + var placeholders:Int + var type:PacketType + var description:String { + var better = "SocketPacket {type: ~~0; data: ~~1; " + + "id: ~~2; placeholders: ~~3;}" + + better = better["~~0"] ~= String(type.rawValue) + better = better["~~1"] ~= String(data) + better = better["~~2"] ~= String(id) + better = better["~~3"] ~= String(placeholders) + + return better + } + + init(type:SocketPacket.PacketType, data:[AnyObject] = [AnyObject](), id:Int = -1, + nsp:String, placeholders:Int = 0, binary:[NSData] = [NSData]()) { + self.data = data + self.id = id + self.nsp = nsp + self.type = type + self.placeholders = placeholders + self.binary = binary + } + + static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + func findType(num:Int) -> SocketPacket.PacketType { + switch num { + case 0: + return SocketPacket.PacketType.EVENT + default: + return SocketPacket.PacketType.BINARY_EVENT + } + } + + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) + + return packet } func getEvent() -> String { - return data?.removeAtIndex(0) as! String + return data[0] as! String } - func addData(data:NSData) -> Bool { + func getArgs() -> [AnyObject]? { + var arr = data + + if data.count == 0 { + return nil + } else { + arr.removeAtIndex(0) + return arr + } + } + + mutating func addData(data:NSData) -> Bool { if placeholders == currentPlace { return true } @@ -92,83 +121,19 @@ final class SocketPacket: CustomStringConvertible { } } - func createMessageForEvent(event:String) -> String { - let message:String - - if binary.count == 0 { - type = PacketType.EVENT - - if nsp == "/" { - if id == nil { - message = "2[\"\(event)\"" - } else { - message = "2\(id!)[\"\(event)\"" - } - } else { - if id == nil { - message = "2/\(nsp),[\"\(event)\"" - } else { - message = "2/\(nsp),\(id!)[\"\(event)\"" - } - } - } else { - type = PacketType.BINARY_EVENT - - if nsp == "/" { - if id == nil { - message = "5\(binary.count)-[\"\(event)\"" - } else { - message = "5\(binary.count)-\(id!)[\"\(event)\"" - } - } else { - if id == nil { - message = "5\(binary.count)-/\(nsp),[\"\(event)\"" - } else { - message = "5\(binary.count)-/\(nsp),\(id!)[\"\(event)\"" - } - } - } - - return completeMessage(message) - } - - func createAck() -> String { - var msg:String - - if binary.count == 0 { - type = PacketType.ACK - - if nsp == "/" { - msg = "3\(id!)[" - } else { - msg = "3/\(nsp),\(id!)[" - } - } else { - type = PacketType.BINARY_ACK - - if nsp == "/" { - msg = "6\(binary.count)-\(id!)[" - } else { - msg = "6\(binary.count)-/\(nsp),\(id!)[" - } - } - - return completeMessage(msg, ack: true) - } - private func completeMessage(var message:String, ack:Bool = false) -> String { - if data == nil || data!.count == 0 { + if data.count == 0 { return message + "]" } else if !ack { message += "," } - for arg in data! { + for arg in data { if arg is NSDictionary || arg is [AnyObject] { let jsonSend: NSData? do { jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, - options: NSJSONWritingOptions(rawValue: 0)) + options: NSJSONWritingOptions(rawValue: 0)) } catch { jsonSend = nil } @@ -194,21 +159,78 @@ final class SocketPacket: CustomStringConvertible { return message + "]" } - func fillInPlaceholders() { - let newArr = NSMutableArray(array: data!) + func createAck() -> String { + var msg:String - for i in 0.. String { + let message:String + + if binary.count == 0 { + if nsp == "/" { + if id == -1 { + message = "2[\"\(event)\"" + } else { + message = "2\(id)[\"\(event)\"" + } + } else { + if id == -1 { + message = "2/\(nsp),[\"\(event)\"" + } else { + message = "2/\(nsp),\(id)[\"\(event)\"" + } + } + } else { + if nsp == "/" { + if id == -1 { + message = "5\(binary.count)-[\"\(event)\"" + } else { + message = "5\(binary.count)-\(id)[\"\(event)\"" + } + } else { + if id == -1 { + message = "5\(binary.count)-/\(nsp),[\"\(event)\"" + } else { + message = "5\(binary.count)-/\(nsp),\(id)[\"\(event)\"" + } + } + } + + return completeMessage(message) + } + + mutating func fillInPlaceholders() { + let newArr = NSMutableArray(array: data) + + for i in 0.. AnyObject { + private mutating func _fillInPlaceholders(data:AnyObject) -> AnyObject { if let str = data as? String { if let num = str["~~(\\d)"].groups() { return binary[Int(num[1])!] @@ -235,4 +257,261 @@ final class SocketPacket: CustomStringConvertible { return data } } + + + private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { + if let bin = data as? NSData { + let placeholder = ["_placeholder" :true, "num": binary.count] + + binary.append(bin) + + return placeholder + } else if let arr = data as? NSArray { + let newArr = NSMutableArray(array: arr) + + for i in 0.. ([AnyObject], [NSData]) { + var binary = [NSData]() + + for i in 0..() +// var currentPlace = 0 +// var data:[AnyObject]? +// var description:String { +// var better = "SocketPacket {type: ~~0; data: ~~1; " + +// "id: ~~2; placeholders: ~~3;}" +// +// better = better["~~0"] ~= (type != nil ? String(type!.rawValue) : "nil") +// better = better["~~1"] ~= (data != nil ? "\(data!)" : "nil") +// better = better["~~2"] ~= (id != nil ? String(id!) : "nil") +// better = better["~~3"] ~= (placeholders != nil ? String(placeholders!) : "nil") +// +// return better +// } +// var id:Int? +// var justAck = false +// var nsp = "" +// var placeholders:Int? +// var type:PacketType? +// +// enum PacketType: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?(str:String) { +// if let int = Int(str), raw = PacketType(rawValue: int) { +// self = raw +// } else { +// return nil +// } +// } +// } +// +// init(type:PacketType?, 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 +// } +// +// func getEvent() -> String { +// return data?.removeAtIndex(0) as! String +// } +// +// func addData(data:NSData) -> Bool { +// if placeholders == currentPlace { +// return true +// } +// +// binary.append(data) +// currentPlace++ +// +// if placeholders == currentPlace { +// currentPlace = 0 +// return true +// } else { +// return false +// } +// } +// +// func createMessageForEvent(event:String) -> String { +// let message:String +// +// if binary.count == 0 { +// type = PacketType.EVENT +// +// if nsp == "/" { +// if id == nil { +// message = "2[\"\(event)\"" +// } else { +// message = "2\(id!)[\"\(event)\"" +// } +// } else { +// if id == nil { +// message = "2/\(nsp),[\"\(event)\"" +// } else { +// message = "2/\(nsp),\(id!)[\"\(event)\"" +// } +// } +// } else { +// type = PacketType.BINARY_EVENT +// +// if nsp == "/" { +// if id == nil { +// message = "5\(binary.count)-[\"\(event)\"" +// } else { +// message = "5\(binary.count)-\(id!)[\"\(event)\"" +// } +// } else { +// if id == nil { +// message = "5\(binary.count)-/\(nsp),[\"\(event)\"" +// } else { +// message = "5\(binary.count)-/\(nsp),\(id!)[\"\(event)\"" +// } +// } +// } +// +// return completeMessage(message) +// } +// +// func createAck() -> String { +// var msg:String +// +// if binary.count == 0 { +// type = PacketType.ACK +// +// if nsp == "/" { +// msg = "3\(id!)[" +// } else { +// msg = "3/\(nsp),\(id!)[" +// } +// } else { +// type = PacketType.BINARY_ACK +// +// if nsp == "/" { +// msg = "6\(binary.count)-\(id!)[" +// } else { +// msg = "6\(binary.count)-/\(nsp),\(id!)[" +// } +// } +// +// return completeMessage(msg, ack: true) +// } + +// private func completeMessage(var message:String, ack:Bool = false) -> String { +// if data == nil || data!.count == 0 { +// return message + "]" +// } else if !ack { +// message += "," +// } +// +// for arg in data! { +// if arg is NSDictionary || arg is [AnyObject] { +// let jsonSend: NSData? +// do { +// jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, +// options: NSJSONWritingOptions(rawValue: 0)) +// } catch { +// jsonSend = nil +// } +// let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) +// +// message += jsonString! as String + "," +// } else if var str = arg as? String { +// str = str["\n"] ~= "\\\\n" +// str = str["\r"] ~= "\\\\r" +// +// message += "\"\(str)\"," +// } else if arg is NSNull { +// message += "null," +// } else { +// message += "\(arg)," +// } +// } +// +// if message != "" { +// message.removeAtIndex(message.endIndex.predecessor()) +// } +// +// return message + "]" +// } +// +// func fillInPlaceholders() { +// let newArr = NSMutableArray(array: data!) +// +// for i in 0.. AnyObject { +// if let str = data as? String { +// if let num = str["~~(\\d)"].groups() { +// return binary[Int(num[1])!] +// } else { +// return str +// } +// } else if let dict = data as? NSDictionary { +// let newDict = NSMutableDictionary(dictionary: dict) +// +// for (key, value) in dict { +// newDict[key as! NSCopying] = _fillInPlaceholders(value) +// } +// +// return newDict +// } else if let arr = data as? NSArray { +// let newArr = NSMutableArray(array: arr) +// +// for i in 0..() - - func shred(data:AnyObject) -> AnyObject { - if let bin = data as? NSData { - let placeholder = ["_placeholder" :true, "num": buf.count] - - buf.append(bin) - - return placeholder - } else if let arr = data as? NSArray { - let newArr = NSMutableArray(array: arr) - - for i in 0.. Bool { return nsp == "" && socket.nsp != "/" } @@ -88,7 +32,7 @@ class SocketParser { return } - socket.handleAck(p.id!, data: p.data) + socket.handleAck(p.id, data: p.data) } private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { @@ -96,7 +40,6 @@ class SocketParser { return } - p.justAck = true socket.waitingData.append(p) } @@ -123,7 +66,7 @@ class SocketParser { return } - socket.handleEvent(p.getEvent(), data: p.data, + socket.handleEvent(p.getEvent(), data: p.getArgs(), isInternalMessage: false, wantsAck: p.id) } @@ -133,7 +76,7 @@ class SocketParser { let type = String(arr[0]) if arr.count == 1 { - return SocketPacket(type: SocketPacket.PacketType(str: type)) + return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/") } var id = nil as Int? @@ -172,8 +115,8 @@ class SocketParser { } if i + 1 >= arr.count { - return SocketPacket(type: SocketPacket.PacketType(str: type), - nsp: nsp, placeholders: placeholders, id: id) + return SocketPacket(type: SocketPacket.PacketType(str: type)!, id: id ?? -1, + nsp: nsp, placeholders: placeholders) } let next = String(arr[i + 1]) @@ -197,8 +140,8 @@ class SocketParser { let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] - return SocketPacket(type: SocketPacket.PacketType(str: type), data: data, - nsp: nsp, placeholders: placeholders, id: id) + return SocketPacket(type: SocketPacket.PacketType(str: type)!, data: data, id: id ?? -1, + nsp: nsp, placeholders: placeholders) } return nil @@ -225,10 +168,6 @@ class SocketParser { return parsed } - static func parseForEmit(packet:SocketPacket) { - shredder.deconstructPacket(packet) - } - // Parses messages recieved static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { if stringMessage == "" { @@ -246,25 +185,23 @@ class SocketParser { return } - SocketLogger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p) + SocketLogger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p.description) switch p.type { - case SocketPacket.PacketType.EVENT?: + case SocketPacket.PacketType.EVENT: handleEvent(p, socket: socket) - case SocketPacket.PacketType.ACK?: + case SocketPacket.PacketType.ACK: handleAck(p, socket: socket) - case SocketPacket.PacketType.BINARY_EVENT?: + case SocketPacket.PacketType.BINARY_EVENT: handleBinaryEvent(p, socket: socket) - case SocketPacket.PacketType.BINARY_ACK?: + case SocketPacket.PacketType.BINARY_ACK: handleBinaryAck(p, socket: socket) - case SocketPacket.PacketType.CONNECT?: + case SocketPacket.PacketType.CONNECT: handleConnect(p, socket: socket) - case SocketPacket.PacketType.DISCONNECT?: + case SocketPacket.PacketType.DISCONNECT: socket.didDisconnect("Got Disconnect") - case SocketPacket.PacketType.ERROR?: - socket.didError(p.data == nil ? "Error" : p.data!) - case nil: - SocketLogger.err("Got packet with invalid packet type", client: socket) + case SocketPacket.PacketType.ERROR: + socket.didError("Error: \(p.data)") } } @@ -280,14 +217,14 @@ class SocketParser { return } - let packet = socket.waitingData.removeAtIndex(0) + var packet = socket.waitingData.removeAtIndex(0) packet.fillInPlaceholders() if !packet.justAck { - socket.handleEvent(packet.getEvent(), data: packet.data, + socket.handleEvent(packet.getEvent(), data: packet.getArgs(), wantsAck: packet.id) } else { - socket.handleAck(packet.id!, data: packet.data) + socket.handleAck(packet.id, data: packet.getArgs()) } } } From 65be52418d95147b0c5c110b92385c1e2defa6d3 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 19 Jun 2015 08:02:51 -0400 Subject: [PATCH 12/95] remove old stuff --- SocketIOClientSwift/SocketPacket.swift | 213 ------------------------- 1 file changed, 213 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 9270d5a..5bb541f 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -302,216 +302,3 @@ struct SocketPacket { return (data, binary) } } - -//final class SocketPacket: CustomStringConvertible { -// var binary = ContiguousArray() -// var currentPlace = 0 -// var data:[AnyObject]? -// var description:String { -// var better = "SocketPacket {type: ~~0; data: ~~1; " + -// "id: ~~2; placeholders: ~~3;}" -// -// better = better["~~0"] ~= (type != nil ? String(type!.rawValue) : "nil") -// better = better["~~1"] ~= (data != nil ? "\(data!)" : "nil") -// better = better["~~2"] ~= (id != nil ? String(id!) : "nil") -// better = better["~~3"] ~= (placeholders != nil ? String(placeholders!) : "nil") -// -// return better -// } -// var id:Int? -// var justAck = false -// var nsp = "" -// var placeholders:Int? -// var type:PacketType? -// -// enum PacketType: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?(str:String) { -// if let int = Int(str), raw = PacketType(rawValue: int) { -// self = raw -// } else { -// return nil -// } -// } -// } -// -// init(type:PacketType?, 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 -// } -// -// func getEvent() -> String { -// return data?.removeAtIndex(0) as! String -// } -// -// func addData(data:NSData) -> Bool { -// if placeholders == currentPlace { -// return true -// } -// -// binary.append(data) -// currentPlace++ -// -// if placeholders == currentPlace { -// currentPlace = 0 -// return true -// } else { -// return false -// } -// } -// -// func createMessageForEvent(event:String) -> String { -// let message:String -// -// if binary.count == 0 { -// type = PacketType.EVENT -// -// if nsp == "/" { -// if id == nil { -// message = "2[\"\(event)\"" -// } else { -// message = "2\(id!)[\"\(event)\"" -// } -// } else { -// if id == nil { -// message = "2/\(nsp),[\"\(event)\"" -// } else { -// message = "2/\(nsp),\(id!)[\"\(event)\"" -// } -// } -// } else { -// type = PacketType.BINARY_EVENT -// -// if nsp == "/" { -// if id == nil { -// message = "5\(binary.count)-[\"\(event)\"" -// } else { -// message = "5\(binary.count)-\(id!)[\"\(event)\"" -// } -// } else { -// if id == nil { -// message = "5\(binary.count)-/\(nsp),[\"\(event)\"" -// } else { -// message = "5\(binary.count)-/\(nsp),\(id!)[\"\(event)\"" -// } -// } -// } -// -// return completeMessage(message) -// } -// -// func createAck() -> String { -// var msg:String -// -// if binary.count == 0 { -// type = PacketType.ACK -// -// if nsp == "/" { -// msg = "3\(id!)[" -// } else { -// msg = "3/\(nsp),\(id!)[" -// } -// } else { -// type = PacketType.BINARY_ACK -// -// if nsp == "/" { -// msg = "6\(binary.count)-\(id!)[" -// } else { -// msg = "6\(binary.count)-/\(nsp),\(id!)[" -// } -// } -// -// return completeMessage(msg, ack: true) -// } - -// private func completeMessage(var message:String, ack:Bool = false) -> String { -// if data == nil || data!.count == 0 { -// return message + "]" -// } else if !ack { -// message += "," -// } -// -// for arg in data! { -// if arg is NSDictionary || arg is [AnyObject] { -// let jsonSend: NSData? -// do { -// jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, -// options: NSJSONWritingOptions(rawValue: 0)) -// } catch { -// jsonSend = nil -// } -// let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) -// -// message += jsonString! as String + "," -// } else if var str = arg as? String { -// str = str["\n"] ~= "\\\\n" -// str = str["\r"] ~= "\\\\r" -// -// message += "\"\(str)\"," -// } else if arg is NSNull { -// message += "null," -// } else { -// message += "\(arg)," -// } -// } -// -// if message != "" { -// message.removeAtIndex(message.endIndex.predecessor()) -// } -// -// return message + "]" -// } -// -// func fillInPlaceholders() { -// let newArr = NSMutableArray(array: data!) -// -// for i in 0.. AnyObject { -// if let str = data as? String { -// if let num = str["~~(\\d)"].groups() { -// return binary[Int(num[1])!] -// } else { -// return str -// } -// } else if let dict = data as? NSDictionary { -// let newDict = NSMutableDictionary(dictionary: dict) -// -// for (key, value) in dict { -// newDict[key as! NSCopying] = _fillInPlaceholders(value) -// } -// -// return newDict -// } else if let arr = data as? NSArray { -// let newArr = NSMutableArray(array: arr) -// -// for i in 0.. Date: Fri, 19 Jun 2015 08:03:55 -0400 Subject: [PATCH 13/95] update ignorefile --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 34964d4..55e6111 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store .AppleDouble .LSOverride +*.xcodeproj # Icon must end with two \r Icon From df2f149f85ae14d36f6579f2938d8f04ad8498b4 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 19 Jun 2015 08:12:27 -0400 Subject: [PATCH 14/95] handle acks better --- SocketIOClientSwift/SocketIOClient.swift | 2 +- SocketIOClientSwift/SocketPacket.swift | 63 ++++++++++++++---------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 662d8df..9779f95 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -328,7 +328,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient func emitAck(ack:Int, withData args:[AnyObject]) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { - let packet = SocketPacket.packetFromEmitWithData(args, id: ack ?? -1, nsp: this.nsp) + let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) let str = packet.createAck() SocketLogger.log("Emitting Ack: %@", client: this, args: str) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 5bb541f..cde88bb 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -74,35 +74,19 @@ struct SocketPacket { } static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - func findType(num:Int) -> SocketPacket.PacketType { - switch num { - case 0: - return SocketPacket.PacketType.EVENT - default: - return SocketPacket.PacketType.BINARY_EVENT - } - } - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count), data: parsedData, + let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) return packet } - func getEvent() -> String { - return data[0] as! String - } - - func getArgs() -> [AnyObject]? { - var arr = data + static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) - if data.count == 0 { - return nil - } else { - arr.removeAtIndex(0) - return arr - } + return packet } mutating func addData(data:NSData) -> Bool { @@ -162,7 +146,7 @@ struct SocketPacket { func createAck() -> String { var msg:String - if binary.count == 0 { + if type == PacketType.ACK { if nsp == "/" { msg = "3\(id)[" } else { @@ -183,7 +167,7 @@ struct SocketPacket { func createMessageForEvent(event:String) -> String { let message:String - if binary.count == 0 { + if type == PacketType.EVENT { if nsp == "/" { if id == -1 { message = "2[\"\(event)\"" @@ -257,7 +241,36 @@ struct SocketPacket { return data } } - + + private static func findType(binCount:Int, ack:Bool) -> PacketType { + switch binCount { + case 0 where !ack: + return PacketType.EVENT + case 0 where ack: + return PacketType.ACK + case _ where !ack: + return PacketType.BINARY_EVENT + case _ where ack: + return PacketType.BINARY_ACK + default: + return PacketType.BINARY_ACK + } + } + + func getEvent() -> String { + return data[0] as! String + } + + func getArgs() -> [AnyObject]? { + var arr = data + + if data.count == 0 { + return nil + } else { + arr.removeAtIndex(0) + return arr + } + } private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { if let bin = data as? NSData { From bd88ff763bc5af8e80396fd37dab6322aa0d91a0 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 19 Jun 2015 09:28:13 -0400 Subject: [PATCH 15/95] change default type --- SocketIOClientSwift/SocketPacket.swift | 3 +-- SocketIOClientSwift/SocketParser.swift | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index cde88bb..1474da7 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -48,7 +48,6 @@ struct SocketPacket { var data:[AnyObject] var id:Int = -1 var nsp = "" - var justAck = false var placeholders:Int var type:PacketType var description:String { @@ -253,7 +252,7 @@ struct SocketPacket { case _ where ack: return PacketType.BINARY_ACK default: - return PacketType.BINARY_ACK + return PacketType.EVENT } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 6a4ca82..ac4c2e7 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -220,7 +220,7 @@ class SocketParser { var packet = socket.waitingData.removeAtIndex(0) packet.fillInPlaceholders() - if !packet.justAck { + if packet.type == SocketPacket.PacketType.BINARY_ACK { socket.handleEvent(packet.getEvent(), data: packet.getArgs(), wantsAck: packet.id) } else { From 9454a47ef42a21319531595a5b34025ec8edd619 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 23 Jun 2015 15:11:30 -0400 Subject: [PATCH 16/95] fix binary --- SocketIOClientSwift/SocketPacket.swift | 2 +- SocketIOClientSwift/SocketParser.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 1474da7..46adf43 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -252,7 +252,7 @@ struct SocketPacket { case _ where ack: return PacketType.BINARY_ACK default: - return PacketType.EVENT + return PacketType.ERROR } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index ac4c2e7..f251673 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -220,7 +220,7 @@ class SocketParser { var packet = socket.waitingData.removeAtIndex(0) packet.fillInPlaceholders() - if packet.type == SocketPacket.PacketType.BINARY_ACK { + if packet.type != SocketPacket.PacketType.BINARY_ACK { socket.handleEvent(packet.getEvent(), data: packet.getArgs(), wantsAck: packet.id) } else { From 7206fa6d5cd2686f662e23098769995c6c3d9f57 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 26 Jun 2015 09:57:37 -0400 Subject: [PATCH 17/95] change readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e34ee57..4933e3c 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,9 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8 - Can be used from Objective-C ##Installation -Requires Swift 1.2/Xcode 6.3 +Requires Swift 2/Xcode 7 -If you need Swift 1.1/Xcode 6.2 use v1.5.2. (Pre-Swift 1.2 support is no longer maintained) +If you need Swift 1.2/Xcode 6.3/4 use v2 (Pre-Swift 2 support is no longer maintained) Manually (iOS 7+) ----------------- 1. Copy the SocketIOClientSwift folder into your Xcode project. (Make sure you add the files to your target(s)) From b388df798b9c12206cf6c863a317037eb3108bc8 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 29 Jun 2015 21:25:00 -0400 Subject: [PATCH 18/95] shorter expression in off --- SocketIOClientSwift/SocketIOClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 0ec1483..071db31 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -420,7 +420,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public func off(event:String) { SocketLogger.log("Removing handler for event: %@", client: self, args: event) - handlers = ContiguousArray(handlers.filter {$0.event == event ? false : true}) + handlers = ContiguousArray(handlers.filter {!($0.event == event)}) } /** From a22869efadb87177e0e7ad6abb05b7cd54f67efc Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 3 Jul 2015 09:03:44 -0400 Subject: [PATCH 19/95] Just use regular array for packets --- SocketIOClientSwift/SocketIOClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 071db31..0877a99 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -41,7 +41,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient var ackHandlers = SocketAckManager() var currentAck = -1 var log = false - var waitingData = ContiguousArray() + var waitingData = [SocketPacket]() var sessionDelegate:NSURLSessionDelegate? public let socketURL:String From 38a7cc8648ccf921bab4d45f0a6a55afc3a192f4 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 3 Jul 2015 09:04:40 -0400 Subject: [PATCH 20/95] whitespace --- SocketIOClientSwift/SocketEngine.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 2437c1a..b81c349 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -466,8 +466,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { public func open(opts:[String: AnyObject]? = nil) { if connected { SocketLogger.err("Tried to open while connected", client: self) - client?.didError("Tried to open while connected") + return } From 652c81a80e38aac7943975d4a84dd52e7e0561e8 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 9 Jul 2015 10:38:24 -0400 Subject: [PATCH 21/95] add back default value --- SocketIOClientSwift/SocketIOClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 5400135..6c058e6 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -75,7 +75,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Create a new SocketIOClient. opts can be omitted */ - public init(var socketURL:String, opts:[String: AnyObject]?) { + public init(var socketURL:String, opts:[String: AnyObject]? = nil) { if socketURL["https://"].matches().count != 0 { self._secure = true } From 24583f19c1cc916029549101892c49461fa2f75c Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 9 Jul 2015 10:44:57 -0400 Subject: [PATCH 22/95] fix socketio/socket.io-client-swift#113 --- SocketIOClientSwift/SocketParser.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index f251673..9001509 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -52,9 +52,9 @@ class SocketParser { } private static func handleConnect(p:SocketPacket, socket:SocketIOClient) { - if p.nsp == "" && socket.nsp != "/" { + if p.nsp == "/" && socket.nsp != "/" { socket.joinNamespace() - } else if p.nsp != "" && socket.nsp == "/" { + } else if p.nsp != "/" && socket.nsp == "/" { socket.didConnect() } else { socket.didConnect() From 8daa7da42624d16401e52feffa2354c97b59ee83 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 9 Jul 2015 12:29:26 -0400 Subject: [PATCH 23/95] clean up namespace logic --- SocketIOClientSwift/SocketIOClient.swift | 10 +++------- SocketIOClientSwift/SocketPacket.swift | 15 ++++++++------- SocketIOClientSwift/SocketParser.swift | 22 ++++++++++++---------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 6c058e6..7214803 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -99,11 +99,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.log = log } - if var nsp = opts?["nsp"] as? String { - if nsp != "/" && nsp.hasPrefix("/") { - nsp.removeAtIndex(nsp.startIndex) - } - + if let nsp = opts?["nsp"] as? String { self.nsp = nsp } @@ -402,7 +398,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func leaveNamespace() { if nsp != "/" { - engine?.send("1/\(nsp)", withData: nil) + engine?.send("1\(nsp)", withData: nil) nsp = "/" } } @@ -414,7 +410,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient SocketLogger.log("Joining namespace", client: self) if nsp != "/" { - engine?.send("0/\(nsp)", withData: nil) + engine?.send("0\(nsp)", withData: nil) } } diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 46adf43..1287f3b 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -25,6 +25,9 @@ import Foundation struct SocketPacket { + let nsp:String + let id:Int + enum PacketType:Int { case CONNECT = 0 case DISCONNECT = 1 @@ -46,8 +49,6 @@ struct SocketPacket { var currentPlace = 0 var binary:[NSData] var data:[AnyObject] - var id:Int = -1 - var nsp = "" var placeholders:Int var type:PacketType var description:String { @@ -149,7 +150,7 @@ struct SocketPacket { if nsp == "/" { msg = "3\(id)[" } else { - msg = "3/\(nsp),\(id)[" + msg = "3\(nsp),\(id)[" } } else { if nsp == "/" { @@ -175,9 +176,9 @@ struct SocketPacket { } } else { if id == -1 { - message = "2/\(nsp),[\"\(event)\"" + message = "2\(nsp),[\"\(event)\"" } else { - message = "2/\(nsp),\(id)[\"\(event)\"" + message = "2\(nsp),\(id)[\"\(event)\"" } } } else { @@ -189,9 +190,9 @@ struct SocketPacket { } } else { if id == -1 { - message = "5\(binary.count)-/\(nsp),[\"\(event)\"" + message = "5\(binary.count)-\(nsp),[\"\(event)\"" } else { - message = "5\(binary.count)-/\(nsp),\(id)[\"\(event)\"" + message = "5\(binary.count)-\(nsp),\(id)[\"\(event)\"" } } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 9001509..be86b3c 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -23,12 +23,12 @@ import Foundation class SocketParser { - private static func checkNSP(nsp:String, _ socket:SocketIOClient) -> Bool { - return nsp == "" && socket.nsp != "/" + private static func isCorrectNamespace(nsp:String, _ socket:SocketIOClient) -> Bool { + return nsp == socket.nsp } private static func handleAck(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp, socket) { + if !isCorrectNamespace(p.nsp, socket) { return } @@ -36,7 +36,7 @@ class SocketParser { } private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp, socket) { + if !isCorrectNamespace(p.nsp, socket) { return } @@ -44,7 +44,7 @@ class SocketParser { } private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp, socket) { + if !isCorrectNamespace(p.nsp, socket) { return } @@ -62,7 +62,7 @@ class SocketParser { } private static func handleEvent(p:SocketPacket, socket:SocketIOClient) { - if checkNSP(p.nsp, socket) { + if !isCorrectNamespace(p.nsp, socket) { return } @@ -80,7 +80,7 @@ class SocketParser { } var id = nil as Int? - var nsp = "" + var nsp:String? var i = 0 var placeholders = -1 @@ -103,6 +103,8 @@ class SocketParser { } if arr[i + 1] == "/" { + nsp = "" + while ++i < arr.count { let c = arr[i] @@ -110,13 +112,13 @@ class SocketParser { break } - nsp += String(c) + nsp! += String(c) } } if i + 1 >= arr.count { return SocketPacket(type: SocketPacket.PacketType(str: type)!, id: id ?? -1, - nsp: nsp, placeholders: placeholders) + nsp: nsp ?? "/", placeholders: placeholders) } let next = String(arr[i + 1]) @@ -141,7 +143,7 @@ class SocketParser { let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] return SocketPacket(type: SocketPacket.PacketType(str: type)!, data: data, id: id ?? -1, - nsp: nsp, placeholders: placeholders) + nsp: nsp ?? "/", placeholders: placeholders) } return nil From 68078e50d5de93ed97ed89151bae714e04eba35d Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 10 Jul 2015 06:45:58 -0400 Subject: [PATCH 24/95] the weirdness with objc blocks is fixed in Swift 2 --- SocketIOClientSwift/SocketTypes.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 23723db..306a7c9 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -24,7 +24,7 @@ import Foundation -public typealias AckCallback = @convention(block) (NSArray?) -> Void +public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = ([AnyObject]) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void From 5057226a6cfa3e732ac5ac3aa29ecd29e580ddc1 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 12 Jul 2015 20:40:23 -0400 Subject: [PATCH 25/95] maybe fix socketio/socket.io-client-swift#100 and socketio/socket.io-client-swift#22 --- SocketIOClientSwift/SocketEngine.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index b81c349..f20bfc2 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -194,7 +194,9 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func createWebsocket(andConnect connect:Bool) { - ws = WebSocket(url: NSURL(string: urlWebSocket! + "&sid=\(sid)")!, + let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)") + + ws = WebSocket(url: NSURL(string: wsUrl)!, cookies: cookies) if extraHeaders != nil { From a277e88c3b4e43f9a558ab8afc51a4512fc0a4e4 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 21 Jul 2015 16:19:15 -0400 Subject: [PATCH 26/95] update for xcode 7 beta 4 --- README.md | 2 +- SocketIOClientSwift/SocketAnyEvent.swift | 2 +- SocketIOClientSwift/SocketEngine.swift | 4 ++-- SocketIOClientSwift/SocketEngineClient.swift | 2 +- SocketIOClientSwift/SocketEventHandler.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ccf3a80..96d67a6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ socket.on("currentAmount") {data, ack in socket.emit("update", ["amount": cur + 2.50]) } - ack?(["Got your currentAmount", "dude"]) + ack?("Got your currentAmount", "dude") } } diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 6d7228c..9926bc5 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -24,7 +24,7 @@ import Foundation -@objc public final class SocketAnyEvent { +public final class SocketAnyEvent: NSObject { public let event:String! public let items:NSArray? diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index f20bfc2..6fa37b8 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -284,7 +284,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } else if !this.closed && this.polling { this.doPoll() } - }}?.resume() + }}.resume() } private func flushProbeWait() { @@ -361,7 +361,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { this?.doPoll() } } - }}?.resume() + }}.resume() } // We had packets waiting for send when we upgraded diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index 27040fb..3824722 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -26,7 +26,7 @@ import Foundation @objc public protocol SocketEngineClient { - var handleQueue:dispatch_queue_attr_t! {get} + var handleQueue:dispatch_queue_t! {get} var socketURL:String {get} var secure:Bool {get} diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 68c5eb9..7b2d92b 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -25,7 +25,7 @@ import Foundation private func emitAckCallback(socket:SocketIOClient?, num:Int?) - (items:[AnyObject]) -> Void { + (items:AnyObject...) -> Void { socket?.emitAck(num ?? -1, withData: items) } diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 306a7c9..596a267 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -25,6 +25,6 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void -public typealias AckEmitter = ([AnyObject]) -> Void +public typealias AckEmitter = (AnyObject...) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void From 94a3844181ae51ceb457c636a1f6398aabaff378 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 22 Jul 2015 08:49:51 -0400 Subject: [PATCH 27/95] warnings --- SocketIOClientSwift/WebSocket.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 71e644a..ef4ac88 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -250,8 +250,8 @@ public class WebSocket : NSObject, NSStreamDelegate { } if self.selfSignedSSL { let settings: Dictionary = [kCFStreamSSLValidatesCertificateChain: NSNumber(bool:false), kCFStreamSSLPeerName: kCFNull] - inputStream!.setProperty(settings, forKey: kCFStreamPropertySSLSettings as! String) - outputStream!.setProperty(settings, forKey: kCFStreamPropertySSLSettings as! String) + inputStream!.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) + outputStream!.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) } isRunLoop = true inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) @@ -268,9 +268,9 @@ public class WebSocket : NSObject, NSStreamDelegate { public func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { if let sec = security where !certValidated && (eventCode == .HasBytesAvailable || eventCode == .HasSpaceAvailable) { - var possibleTrust: AnyObject? = aStream.propertyForKey(kCFStreamPropertySSLPeerTrust as! String) + let possibleTrust: AnyObject? = aStream.propertyForKey(kCFStreamPropertySSLPeerTrust as String) if let trust: AnyObject = possibleTrust { - var domain: AnyObject? = aStream.propertyForKey(kCFStreamSSLPeerName as! String) + let domain: AnyObject? = aStream.propertyForKey(kCFStreamSSLPeerName as String) if sec.isValid(trust as! SecTrustRef, domain: domain as! String?) { certValidated = true } else { From 47a839b934e00d36cdfe24fb01c4e7d41938e9c2 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 22 Jul 2015 19:09:47 -0400 Subject: [PATCH 28/95] change api for emitack callback --- SocketIOClientSwift/SocketTypes.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 8562024..d0e5df0 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -31,4 +31,4 @@ import Foundation public typealias AckCallback = @objc_block (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void -public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void +public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void From 11730b5fcd92db1750dd2163b0864cf603e06803 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 22 Jul 2015 19:10:55 -0400 Subject: [PATCH 29/95] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 657f2e7..f5b3398 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ socket.on("connect") {data, ack in socket.on("currentAmount") {data, ack in if let cur = data?[0] as? Double { - socket.emitWithAck("canUpdate", cur)(timeout: 0) {data in + socket.emitWithAck("canUpdate", cur)(timeoutAfter: 0) {data in socket.emit("update", ["amount": cur + 2.50]) } @@ -128,7 +128,7 @@ Methods 2. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. 3. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. 4. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C -5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeout:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. 6. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. 7. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 8. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. From 67f57daaab477f9fe77c824f6b4dcd6bd69bc266 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 24 Jul 2015 08:00:31 -0400 Subject: [PATCH 30/95] bump version --- README.md | 4 ++-- Socket.IO-Client-Swift.podspec | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f5b3398..bc30ccd 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 2.3.10 # Or latest version +github "socketio/socket.io-client-swift" ~> 2.4.0 # Or latest version ``` Run `carthage update`. @@ -79,7 +79,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 2.3.10' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 2.4.0' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index fcfc4fb..5ff6cbe 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 = "2.3.10" + s.version = "2.4.0" s.summary = "Socket.IO-client for iOS and OS X" s.description = <<-DESC Socket.IO-client for iOS and OS X. @@ -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 => 'v2.3.10' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v2.4.0' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 224c660e4c33e047db14f4ad5cd68f14bbffc1a4 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Fri, 24 Jul 2015 19:55:35 +0200 Subject: [PATCH 31/95] basic test structure / tests --- .../project.pbxproj | 26 +++++++++ SocketIO-iOSTests/SocketIO_iOSTests.swift | 54 +++++++++++++++---- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index a54247f..acac5a0 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -39,6 +39,19 @@ 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; + 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; + 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; + 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */; }; + 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF801B51F254004FF46E /* SocketEventHandler.swift */; }; + 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */; }; + 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF821B51F254004FF46E /* SocketIOClient.swift */; }; + 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF831B51F254004FF46E /* SocketLogger.swift */; }; + 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF841B51F254004FF46E /* SocketPacket.swift */; }; + 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; + 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; + 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; + 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -424,7 +437,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */, + 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, + 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, + 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, + 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, + 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, + 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, + 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, + 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, + 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, + 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift index 8e9aad8..d1914ec 100644 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ b/SocketIO-iOSTests/SocketIO_iOSTests.swift @@ -10,27 +10,63 @@ import UIKit import XCTest class SocketIO_iOSTests: XCTestCase { + var socketClient:SocketIOClient! override func setUp() { super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. + self.socketClient = SocketIOClient(socketURL: "localhost:8080") + openConnection() } override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. super.tearDown() } - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") + func testConnectionStatus() { + XCTAssertTrue(socketClient.connected) + XCTAssertFalse(socketClient.connecting) + XCTAssertFalse(socketClient.reconnecting) + XCTAssertFalse(socketClient.closed) } - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. + func testeventWithAcknowledgements() { + let sendedValue = 15; + let expection = self.expectationWithDescription("AcknowledgementTestIncomming") + func didGetEmit(result:NSArray?) { + let resultValue = result?.firstObject as! Int + XCTAssertEqual(sendedValue + 20, resultValue) + expection.fulfill() } + socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeout: 0, callback: didGetEmit) + waitForExpectationsWithTimeout(10, handler: nil) + } + + func testoutGoingEmit() { + let sendedValue = 15; + let expection = self.expectationWithDescription("firstEmitTestIncomming") + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + let resultValue = result?.firstObject as! Int + XCTAssertEqual(sendedValue + 10, resultValue) + expection.fulfill() + } + socketClient.on("firstEmitTestOutGoing", callback: didGetEmit) + socketClient.emit("firstEmitTestIncomming", sendedValue) + waitForExpectationsWithTimeout(10, handler: nil) + } + + func openConnection() { + let expection = self.expectationWithDescription("connect") + socketClient.on("connect") {data, ack in + expection.fulfill() + } + socketClient.connect() + XCTAssertTrue(socketClient.connecting) + waitForExpectationsWithTimeout(10, handler: nil) + } + + func testCloseConnection() { + socketClient.close(fast: false) + XCTAssertTrue(socketClient.closed) } } From 4b9db85a49dbbf55b645c2e43d47582f66668a21 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Fri, 24 Jul 2015 20:11:47 +0200 Subject: [PATCH 32/95] update api --- SocketIO-iOSTests/SocketIO_iOSTests.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift index d1914ec..c91a0de 100644 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ b/SocketIO-iOSTests/SocketIO_iOSTests.swift @@ -27,6 +27,7 @@ class SocketIO_iOSTests: XCTestCase { XCTAssertFalse(socketClient.connecting) XCTAssertFalse(socketClient.reconnecting) XCTAssertFalse(socketClient.closed) + XCTAssertFalse(socketClient.secure) } func testeventWithAcknowledgements() { @@ -37,7 +38,7 @@ class SocketIO_iOSTests: XCTestCase { XCTAssertEqual(sendedValue + 20, resultValue) expection.fulfill() } - socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeout: 0, callback: didGetEmit) + socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeoutAfter: 0, callback: didGetEmit) waitForExpectationsWithTimeout(10, handler: nil) } From a07916fb2f437ff3f18392ae2bb70461a5843fd7 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sat, 25 Jul 2015 18:45:41 +0200 Subject: [PATCH 33/95] basic emit tests --- .../project.pbxproj | 4 + SocketIO-iOSTests/ConvertedSocketTest.swift | 190 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 SocketIO-iOSTests/ConvertedSocketTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index acac5a0..01c833d 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,6 +98,7 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; + 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConvertedSocketTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,6 +178,7 @@ 572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = { isa = PBXGroup; children = ( + 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */, 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); @@ -443,6 +446,7 @@ 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, diff --git a/SocketIO-iOSTests/ConvertedSocketTest.swift b/SocketIO-iOSTests/ConvertedSocketTest.swift new file mode 100644 index 0000000..fed9352 --- /dev/null +++ b/SocketIO-iOSTests/ConvertedSocketTest.swift @@ -0,0 +1,190 @@ +// +// ConvertedSocketTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 25.07.15. +// +// + +import XCTest +import Foundation + +class ConvertedSocketTest: XCTestCase { + + var socket:SocketIOClient! + + + let headers = ["testing": "blah", "testing2": "b/:lah"] + let testCytube = false + + override func setUp() { + super.setUp() + if testCytube { + socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ + "forcePolling": false, + "forceWebsockets": false, + "log": true + ]) + } else { + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "nsp": "/swift", + "path": "", + "extraHeaders": headers, + // "connectParams": [ + // "test": 2.1, + // "d": "{}" + // ], + //"cookies": cookieArray + ]) + } + openConnection() + } + + override func tearDown() { + + super.tearDown() + } + + func openConnection() { + let expection = self.expectationWithDescription("connect") + socket.on("connect") {data, ack in + expection.fulfill() + } + socket.connect() + XCTAssertTrue(socket.connecting) + waitForExpectationsWithTimeout(5, handler: nil) + } + + func testConnectionStatus() { + XCTAssertTrue(socket.connected) + XCTAssertFalse(socket.connecting) + XCTAssertFalse(socket.reconnecting) + XCTAssertFalse(socket.closed) + XCTAssertFalse(socket.secure) + } + + func testEmit() { + let testName = "testEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + + } + abstractSocketEmitTest(testName, emitData: nil, callback: didGetEmit) + } + + func testEmitNull() { + let testName = "testEmitNull" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let _ = result?.firstObject as? NSNull { + + }else + { + XCTFail("Should have NSNull as result") + } + } + abstractSocketEmitTest(testName, emitData: NSNull(), callback: didGetEmit) + } + + func testEmitBinary() { + let testName = "testEmitBinary" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let data = result?.firstObject as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + abstractSocketEmitTest(testName, emitData: data, callback: didGetEmit) + } + + func testArrayEmit() { + let testName = "testEmitArray" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let array = result?.firstObject as? NSArray { + XCTAssertEqual(array.count, 2) + XCTAssertEqual(array.firstObject! as! String, "test3") + }else { + XCTFail("Should have NSArray as result") + } + } + abstractSocketEmitTest(testName, emitData: ["test1", "test2"], callback: didGetEmit) + } + + func testStringEmit() { + let testName = "testStringEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let string = result?.firstObject as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketEmitTest(testName, emitData: "marco", callback: didGetEmit) + } + + func testBoolEmit() { + let testName = "testBoolEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let bool = result?.firstObject as? NSNumber { + XCTAssertTrue(bool.boolValue) + }else { + XCTFail("Should have Boolean as result") + } + } + abstractSocketEmitTest(testName, emitData: false, callback: didGetEmit) + } + + func testIntegerEmit() { + let testName = "testIntegerEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let integer = result?.firstObject as? Int { + XCTAssertEqual(integer, 20) + }else { + XCTFail("Should have Integer as result") + } + } + abstractSocketEmitTest(testName, emitData: 10, callback: didGetEmit) + } + + func testDoubleEmit() { + let testName = "testDoubleEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let double = result?.firstObject as? NSNumber { + XCTAssertEqual(double.floatValue, 1.2) + }else { + XCTFail("Should have String as result") + } + } + abstractSocketEmitTest(testName, emitData: 1.1, callback: didGetEmit) + } + + + func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let expection = self.expectationWithDescription(testName) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.on(testName + "Return", callback: didGetEmit) + if let emitData = emitData { + socket.emit(testName, emitData) + } else { + socket.emit(testName) + } + + waitForExpectationsWithTimeout(5, handler: nil) + } + + func testCloseConnection() { +// socket.close(fast: false) +// XCTAssertTrue(socket.closed) + } + +} From aa6db7c837ccc32eeff817b50b18119ccf8f7980 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 26 Jul 2015 12:42:18 +0200 Subject: [PATCH 34/95] remove old files --- .../project.pbxproj | 4 - SocketIO-iOSTests/SocketIO_iOSTests.swift | 73 ------------------- 2 files changed, 77 deletions(-) delete mode 100644 SocketIO-iOSTests/SocketIO_iOSTests.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 01c833d..053773a 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 572EF21F1B51F16C00EEBB58 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 572EF2251B51F16C00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2191B51F16C00EEBB58 /* SocketIO.framework */; }; - 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */; }; 572EF23D1B51F18A00EEBB58 /* SocketIO-Mac.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */; settings = {ATTRIBUTES = (Public, ); }; }; 572EF2431B51F18A00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2381B51F18A00EEBB58 /* SocketIO.framework */; }; 572EF24A1B51F18A00EEBB58 /* SocketIO_MacTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF2491B51F18A00EEBB58 /* SocketIO_MacTests.swift */; }; @@ -78,7 +77,6 @@ 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-iOS.h"; sourceTree = ""; }; 572EF2241B51F16C00EEBB58 /* SocketIO-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF22A1B51F16C00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketIO_iOSTests.swift; sourceTree = ""; }; 572EF2381B51F18A00EEBB58 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF23B1B51F18A00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-Mac.h"; sourceTree = ""; }; @@ -179,7 +177,6 @@ isa = PBXGroup; children = ( 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */, - 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -448,7 +445,6 @@ 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, - 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift deleted file mode 100644 index c91a0de..0000000 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// SocketIO_iOSTests.swift -// SocketIO-iOSTests -// -// Created by Nacho Soto on 7/11/15. -// -// - -import UIKit -import XCTest - -class SocketIO_iOSTests: XCTestCase { - var socketClient:SocketIOClient! - - override func setUp() { - super.setUp() - self.socketClient = SocketIOClient(socketURL: "localhost:8080") - openConnection() - } - - override func tearDown() { - super.tearDown() - } - - func testConnectionStatus() { - XCTAssertTrue(socketClient.connected) - XCTAssertFalse(socketClient.connecting) - XCTAssertFalse(socketClient.reconnecting) - XCTAssertFalse(socketClient.closed) - XCTAssertFalse(socketClient.secure) - } - - func testeventWithAcknowledgements() { - let sendedValue = 15; - let expection = self.expectationWithDescription("AcknowledgementTestIncomming") - func didGetEmit(result:NSArray?) { - let resultValue = result?.firstObject as! Int - XCTAssertEqual(sendedValue + 20, resultValue) - expection.fulfill() - } - socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeoutAfter: 0, callback: didGetEmit) - waitForExpectationsWithTimeout(10, handler: nil) - } - - func testoutGoingEmit() { - let sendedValue = 15; - let expection = self.expectationWithDescription("firstEmitTestIncomming") - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - let resultValue = result?.firstObject as! Int - XCTAssertEqual(sendedValue + 10, resultValue) - expection.fulfill() - } - socketClient.on("firstEmitTestOutGoing", callback: didGetEmit) - socketClient.emit("firstEmitTestIncomming", sendedValue) - waitForExpectationsWithTimeout(10, handler: nil) - } - - func openConnection() { - let expection = self.expectationWithDescription("connect") - socketClient.on("connect") {data, ack in - expection.fulfill() - } - socketClient.connect() - XCTAssertTrue(socketClient.connecting) - waitForExpectationsWithTimeout(10, handler: nil) - } - - func testCloseConnection() { - socketClient.close(fast: false) - XCTAssertTrue(socketClient.closed) - } - -} From a1af98e1731de939c4b464ad95596e7b6f9f0e8f Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 26 Jul 2015 16:58:08 +0200 Subject: [PATCH 35/95] refactor --- .../project.pbxproj | 8 +- ...dSocketTest.swift => SocketEmitTest.swift} | 97 +++++++++++++++---- 2 files changed, 84 insertions(+), 21 deletions(-) rename SocketIO-iOSTests/{ConvertedSocketTest.swift => SocketEmitTest.swift} (60%) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 053773a..75f5ac1 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -51,7 +51,7 @@ 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; - 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */; }; + 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -96,7 +96,7 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; - 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConvertedSocketTest.swift; sourceTree = ""; }; + 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,7 +176,7 @@ 572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = { isa = PBXGroup; children = ( - 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */, + 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -443,7 +443,7 @@ 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, - 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */, + 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, diff --git a/SocketIO-iOSTests/ConvertedSocketTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift similarity index 60% rename from SocketIO-iOSTests/ConvertedSocketTest.swift rename to SocketIO-iOSTests/SocketEmitTest.swift index fed9352..d2866d6 100644 --- a/SocketIO-iOSTests/ConvertedSocketTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -9,8 +9,8 @@ import XCTest import Foundation -class ConvertedSocketTest: XCTestCase { - +class SocketEmitTest: XCTestCase { + private static let TEST_TIMEOUT = 20.0 var socket:SocketIOClient! @@ -32,15 +32,8 @@ class ConvertedSocketTest: XCTestCase { "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false - "nsp": "/swift", "path": "", - "extraHeaders": headers, - // "connectParams": [ - // "test": 2.1, - // "d": "{}" - // ], - //"cookies": cookieArray - ]) + "extraHeaders": headers]) } openConnection() } @@ -158,11 +151,86 @@ class ConvertedSocketTest: XCTestCase { if let double = result?.firstObject as? NSNumber { XCTAssertEqual(double.floatValue, 1.2) }else { - XCTFail("Should have String as result") + XCTFail("Should have Double as result") } } abstractSocketEmitTest(testName, emitData: 1.1, callback: didGetEmit) } + + func testJSONEmit() { + let testName = "testJSONEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketEmitTest(testName, emitData: json, callback: didGetEmit) + } + + func testUnicodeEmit() { + let testName = "testUnicodeEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let unicode = result?.firstObject as? String { + XCTAssertEqual(unicode, "🚄") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketEmitTest(testName, emitData: "🚀", callback: didGetEmit) + } + + func testMultipleItemsEmit() { + let testName = "testMultipleItemsEmit" + let expection = self.expectationWithDescription(testName) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + let string = NSString(data: array.first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + + }else { + XCTFail("Should have Integer as result") + } + if let data = result?[4] as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + expection.fulfill() + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + socket.emit(testName, withItems: [["test1", "test2"], ["test": "test"], 15, "marco", data]) + socket.on(testName + "Return", callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ @@ -179,12 +247,7 @@ class ConvertedSocketTest: XCTestCase { socket.emit(testName) } - waitForExpectationsWithTimeout(5, handler: nil) - } - - func testCloseConnection() { -// socket.close(fast: false) -// XCTAssertTrue(socket.closed) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) } } From a4988e6404510e7d6945a776b1623137ab379e98 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 26 Jul 2015 17:14:21 +0200 Subject: [PATCH 36/95] namespace tests --- .../project.pbxproj | 4 + SocketIO-iOSTests/SocketEmitTest.swift | 2 +- .../SocketNamespaceEmitTest.swift | 89 +++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 SocketIO-iOSTests/SocketNamespaceEmitTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 75f5ac1..041d1bb 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; + 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,6 +98,7 @@ 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -178,6 +180,7 @@ children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -450,6 +453,7 @@ 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index d2866d6..d669070 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -39,7 +39,7 @@ class SocketEmitTest: XCTestCase { } override func tearDown() { - + socket.close(fast: false) super.tearDown() } diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift new file mode 100644 index 0000000..8e50c11 --- /dev/null +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -0,0 +1,89 @@ +// +// SocketNamespaceEmitTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 26.07.15. +// +// + +import XCTest + +class SocketNamespaceEmitTest: SocketEmitTest { + + override func setUp() { + super.setUp() + if testCytube { + socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ + "forcePolling": false, + "forceWebsockets": false, + "log": true + ]) + } else { + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift", + "extraHeaders": headers]) + } + openConnection() + + } + + override func tearDown() { + socket.close(fast: false) + super.tearDown() + } + + override func testConnectionStatus() { + super.testConnectionStatus() + } + + override func testEmit() { + super.testEmit() + } + + override func testEmitNull() { + super.testEmitNull() + } + + override func testEmitBinary() { + super.testEmitBinary() + } + + override func testArrayEmit() { + super.testArrayEmit() + } + + override func testStringEmit() { + super.testStringEmit() + } + + override func testBoolEmit() { + super.testBoolEmit() + } + + override func testIntegerEmit() { + super.testIntegerEmit() + } + + override func testDoubleEmit() { + super.testDoubleEmit() + } + + override func testJSONEmit() { + super.testJSONEmit() + } + + override func testUnicodeEmit() { + super.testUnicodeEmit() + } + + override func testMultipleItemsEmit() { + super.testMultipleItemsEmit() + } + +} From 252181b0c5428d3357bcff6856a4d7adb4129994 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 27 Jul 2015 11:33:41 +0200 Subject: [PATCH 37/95] clean up --- .../project.pbxproj | 2 +- SocketIO-iOSTests/SocketEmitTest.swift | 25 ++++++------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 041d1bb..c3dc8fc 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -179,8 +179,8 @@ isa = PBXGroup; children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, - 572EF2291B51F16C00EEBB58 /* Supporting Files */, 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; sourceTree = ""; diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index d669070..1e599c5 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -15,26 +15,17 @@ class SocketEmitTest: XCTestCase { let headers = ["testing": "blah", "testing2": "b/:lah"] - let testCytube = false override func setUp() { super.setUp() - if testCytube { - socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ - "forcePolling": false, - "forceWebsockets": false, - "log": true - ]) - } else { - socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ - "reconnects": true, // default true - "reconnectAttempts": -1, // default -1 - "reconnectWait": 5, // default 10 - "forcePolling": false, - "forceWebsockets": false,// default false - "path": "", - "extraHeaders": headers]) - } + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "extraHeaders": headers]) openConnection() } From 3c9c473e7087ad764c77f524aee0983845f93f2e Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 27 Jul 2015 17:12:57 -0400 Subject: [PATCH 38/95] clean up socketpacket --- SocketIOClientSwift/SocketPacket.swift | 62 ++++++++++++++------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 1287f3b..9ce91bb 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -73,22 +73,6 @@ struct SocketPacket { self.binary = binary } - static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - - static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - mutating func addData(data:NSData) -> Bool { if placeholders == currentPlace { return true @@ -144,7 +128,7 @@ struct SocketPacket { } func createAck() -> String { - var msg:String + let msg:String if type == PacketType.ACK { if nsp == "/" { @@ -242,6 +226,23 @@ struct SocketPacket { } } + func getEvent() -> String { + return data[0] as! String + } + + func getArgs() -> [AnyObject]? { + var arr = data + + if data.count == 0 { + return nil + } else { + arr.removeAtIndex(0) + return arr + } + } +} + +extension SocketPacket { private static func findType(binCount:Int, ack:Bool) -> PacketType { switch binCount { case 0 where !ack: @@ -257,21 +258,24 @@ struct SocketPacket { } } - func getEvent() -> String { - return data[0] as! String - } - - func getArgs() -> [AnyObject]? { - var arr = data + static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) - if data.count == 0 { - return nil - } else { - arr.removeAtIndex(0) - return arr - } + return packet } + static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) + + return packet + } +} + +extension SocketPacket { private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": binary.count] From e7920062452711093eecfac3864f8a0187b27e86 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 27 Jul 2015 18:50:12 -0400 Subject: [PATCH 39/95] change to default session config --- SocketIOClientSwift/SocketEngine.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 86f4b5c..f26f050 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -99,7 +99,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { public init(client:SocketEngineClient, sessionDelegate:NSURLSessionDelegate?) { self.client = client - self.session = NSURLSession(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(), + self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: sessionDelegate, delegateQueue: workQueue) } From b1b9a7edaf273ad28fbde9748b5a714aed48beef Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 14:25:15 +0200 Subject: [PATCH 40/95] more tests --- .../project.pbxproj | 8 ++ .../SocketAcknowledgementTest.swift | 93 +++++++++++++++++++ SocketIO-iOSTests/SocketEmitTest.swift | 37 ++++---- .../SocketNamespaceEmitTest.swift | 9 -- SocketIO-iOSTests/TestKind.swift | 13 +++ 5 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 SocketIO-iOSTests/SocketAcknowledgementTest.swift create mode 100644 SocketIO-iOSTests/TestKind.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index c3dc8fc..03e8493 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; @@ -53,6 +54,7 @@ 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; + 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,8 +99,10 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; + 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; + 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -180,7 +184,9 @@ children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 941A4AB91B67A56C00C42318 /* TestKind.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -446,11 +452,13 @@ 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, + 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */, 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift new file mode 100644 index 0000000..e8f6633 --- /dev/null +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -0,0 +1,93 @@ +// +// SocketAcknowledgementTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 27.07.15. +// +// + +import XCTest + +class SocketAcknowledgementTest: SocketEmitTest { + override func setUp() { + super.setUp() + testKind = TestKind.Acknowledgement + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift", + "extraHeaders": headers]) + openConnection() + } + + override func testConnectionStatus() { + super.testConnectionStatus() + } + + override func testEmit() { + super.testEmit() + } + + override func testEmitNull() { + super.testEmitNull() + } + + override func testEmitBinary() { + super.testEmitBinary() + } + + override func testArrayEmit() { + super.testArrayEmit() + } + + override func testStringEmit() { + super.testStringEmit() + } + + override func testBoolEmit() { + super.testBoolEmit() + } + + override func testIntegerEmit() { + super.testIntegerEmit() + } + + override func testDoubleEmit() { + super.testDoubleEmit() + } + + override func testJSONEmit() { + super.testJSONEmit() + } + + override func testUnicodeEmit() { + super.testUnicodeEmit() + } + + override func testMultipleItemsEmit() { + super.testMultipleItemsEmit() + } + + override func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = testName + testKind.rawValue + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + var ack:OnAckCallback! + if let emitData = emitData { + ack = socket.emitWithAck(finalTestname, emitData) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGetEmit) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + +} diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 1e599c5..f6a16d2 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -10,11 +10,10 @@ import XCTest import Foundation class SocketEmitTest: XCTestCase { - private static let TEST_TIMEOUT = 20.0 + static let TEST_TIMEOUT = 5.0 var socket:SocketIOClient! - - let headers = ["testing": "blah", "testing2": "b/:lah"] + var testKind = TestKind.Emit override func setUp() { super.setUp() @@ -53,7 +52,7 @@ class SocketEmitTest: XCTestCase { } func testEmit() { - let testName = "testEmit" + let testName = "basicTest" func didGetEmit(result:NSArray?, ack:AckEmitter?) { } @@ -61,7 +60,7 @@ class SocketEmitTest: XCTestCase { } func testEmitNull() { - let testName = "testEmitNull" + let testName = "testNull" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let _ = result?.firstObject as? NSNull { @@ -74,7 +73,7 @@ class SocketEmitTest: XCTestCase { } func testEmitBinary() { - let testName = "testEmitBinary" + let testName = "testBinary" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let data = result?.firstObject as? NSData { let string = NSString(data: data, encoding: NSUTF8StringEncoding)! @@ -88,11 +87,12 @@ class SocketEmitTest: XCTestCase { } func testArrayEmit() { - let testName = "testEmitArray" + let testName = "testArray" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let array = result?.firstObject as? NSArray { XCTAssertEqual(array.count, 2) XCTAssertEqual(array.firstObject! as! String, "test3") + XCTAssertEqual(array.lastObject! as! String, "test4") }else { XCTFail("Should have NSArray as result") } @@ -101,7 +101,7 @@ class SocketEmitTest: XCTestCase { } func testStringEmit() { - let testName = "testStringEmit" + let testName = "testString" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let string = result?.firstObject as? String { XCTAssertEqual(string, "polo") @@ -113,7 +113,7 @@ class SocketEmitTest: XCTestCase { } func testBoolEmit() { - let testName = "testBoolEmit" + let testName = "testBool" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let bool = result?.firstObject as? NSNumber { XCTAssertTrue(bool.boolValue) @@ -125,7 +125,7 @@ class SocketEmitTest: XCTestCase { } func testIntegerEmit() { - let testName = "testIntegerEmit" + let testName = "testInteger" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let integer = result?.firstObject as? Int { XCTAssertEqual(integer, 20) @@ -137,7 +137,7 @@ class SocketEmitTest: XCTestCase { } func testDoubleEmit() { - let testName = "testDoubleEmit" + let testName = "testDouble" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let double = result?.firstObject as? NSNumber { XCTAssertEqual(double.floatValue, 1.2) @@ -149,7 +149,7 @@ class SocketEmitTest: XCTestCase { } func testJSONEmit() { - let testName = "testJSONEmit" + let testName = "testJSON" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual(json.valueForKey("testString")! as! String, "test") @@ -168,7 +168,7 @@ class SocketEmitTest: XCTestCase { } func testUnicodeEmit() { - let testName = "testUnicodeEmit" + let testName = "testUnicode" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let unicode = result?.firstObject as? String { XCTAssertEqual(unicode, "🚄") @@ -180,7 +180,7 @@ class SocketEmitTest: XCTestCase { } func testMultipleItemsEmit() { - let testName = "testMultipleItemsEmit" + let testName = "testMultipleItems" let expection = self.expectationWithDescription(testName) func didGetEmit(result:NSArray?, ack:AckEmitter?) { XCTAssertEqual(result!.count, 5) @@ -225,17 +225,18 @@ class SocketEmitTest: XCTestCase { func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let expection = self.expectationWithDescription(testName) + let finalTestname = testName + testKind.rawValue + let expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) expection.fulfill() } - socket.on(testName + "Return", callback: didGetEmit) + socket.on(finalTestname + "Return", callback: didGetEmit) if let emitData = emitData { - socket.emit(testName, emitData) + socket.emit(finalTestname, emitData) } else { - socket.emit(testName) + socket.emit(finalTestname) } waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index 8e50c11..945a242 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -12,13 +12,6 @@ class SocketNamespaceEmitTest: SocketEmitTest { override func setUp() { super.setUp() - if testCytube { - socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ - "forcePolling": false, - "forceWebsockets": false, - "log": true - ]) - } else { socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 @@ -28,9 +21,7 @@ class SocketNamespaceEmitTest: SocketEmitTest { "path": "", "nsp": "/swift", "extraHeaders": headers]) - } openConnection() - } override func tearDown() { diff --git a/SocketIO-iOSTests/TestKind.swift b/SocketIO-iOSTests/TestKind.swift new file mode 100644 index 0000000..d83c59b --- /dev/null +++ b/SocketIO-iOSTests/TestKind.swift @@ -0,0 +1,13 @@ +// +// TestKind.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 28.07.15. +// +// + +import Foundation + +enum TestKind: String { + case Emit, Acknowledgement +} \ No newline at end of file From 30cf2bb67a53fe0783b1e271981f6d5fdd2b0b8a Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 14:46:30 +0200 Subject: [PATCH 41/95] namespace tests --- .../project.pbxproj | 8 +- .../SocketAcknowledgementTest.swift | 3 +- SocketIO-iOSTests/SocketEmitTest.swift | 47 +++++---- .../SocketNamespaceAcknowledgementTest.swift | 95 +++++++++++++++++++ 4 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 03e8493..de8ab5f 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; + 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; }; 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; @@ -100,6 +101,7 @@ 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; + 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; @@ -183,10 +185,11 @@ isa = PBXGroup; children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, - 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */, - 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, 941A4AB91B67A56C00C42318 /* TestKind.swift */, + 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -463,6 +466,7 @@ 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, + 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index e8f6633..81247d9 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -19,7 +19,6 @@ class SocketAcknowledgementTest: SocketEmitTest { "forcePolling": false, "forceWebsockets": false,// default false "path": "", - "nsp": "/swift", "extraHeaders": headers]) openConnection() } @@ -72,7 +71,7 @@ class SocketAcknowledgementTest: SocketEmitTest { super.testMultipleItemsEmit() } - override func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ + override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ let finalTestname = testName + testKind.rawValue let expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?) { diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index f6a16d2..7516224 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -56,7 +56,7 @@ class SocketEmitTest: XCTestCase { func didGetEmit(result:NSArray?, ack:AckEmitter?) { } - abstractSocketEmitTest(testName, emitData: nil, callback: didGetEmit) + abstractSocketEmit(testName, emitData: nil, callback: didGetEmit) } func testEmitNull() { @@ -69,7 +69,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have NSNull as result") } } - abstractSocketEmitTest(testName, emitData: NSNull(), callback: didGetEmit) + abstractSocketEmit(testName, emitData: NSNull(), callback: didGetEmit) } func testEmitBinary() { @@ -83,7 +83,7 @@ class SocketEmitTest: XCTestCase { } } let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - abstractSocketEmitTest(testName, emitData: data, callback: didGetEmit) + abstractSocketEmit(testName, emitData: data, callback: didGetEmit) } func testArrayEmit() { @@ -97,7 +97,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have NSArray as result") } } - abstractSocketEmitTest(testName, emitData: ["test1", "test2"], callback: didGetEmit) + abstractSocketEmit(testName, emitData: ["test1", "test2"], callback: didGetEmit) } func testStringEmit() { @@ -109,7 +109,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have String as result") } } - abstractSocketEmitTest(testName, emitData: "marco", callback: didGetEmit) + abstractSocketEmit(testName, emitData: "marco", callback: didGetEmit) } func testBoolEmit() { @@ -121,7 +121,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have Boolean as result") } } - abstractSocketEmitTest(testName, emitData: false, callback: didGetEmit) + abstractSocketEmit(testName, emitData: false, callback: didGetEmit) } func testIntegerEmit() { @@ -133,7 +133,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have Integer as result") } } - abstractSocketEmitTest(testName, emitData: 10, callback: didGetEmit) + abstractSocketEmit(testName, emitData: 10, callback: didGetEmit) } func testDoubleEmit() { @@ -145,7 +145,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have Double as result") } } - abstractSocketEmitTest(testName, emitData: 1.1, callback: didGetEmit) + abstractSocketEmit(testName, emitData: 1.1, callback: didGetEmit) } func testJSONEmit() { @@ -164,7 +164,7 @@ class SocketEmitTest: XCTestCase { } let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] - abstractSocketEmitTest(testName, emitData: json, callback: didGetEmit) + abstractSocketEmit(testName, emitData: json, callback: didGetEmit) } func testUnicodeEmit() { @@ -176,12 +176,11 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have String as result") } } - abstractSocketEmitTest(testName, emitData: "🚀", callback: didGetEmit) + abstractSocketEmit(testName, emitData: "🚀", callback: didGetEmit) } func testMultipleItemsEmit() { let testName = "testMultipleItems" - let expection = self.expectationWithDescription(testName) func didGetEmit(result:NSArray?, ack:AckEmitter?) { XCTAssertEqual(result!.count, 5) if let array = result?.firstObject as? Array { @@ -215,17 +214,33 @@ class SocketEmitTest: XCTestCase { }else { XCTFail("Should have NSData as result") } - expection.fulfill() } let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - socket.emit(testName, withItems: [["test1", "test2"], ["test": "test"], 15, "marco", data]) - socket.on(testName + "Return", callback: didGetEmit) + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] + abstractSocketMultipleEmit(testName, emitData: emitArray, callback: didGetEmit) + } + + func generateTestName(rawTestName:String) ->String { + return rawTestName + testKind.rawValue + } + + func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.emit(finalTestname, withItems: emitData) + socket.on(finalTestname + "Return", callback: didGetEmit) waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } - func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = testName + testKind.rawValue + func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) let expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift new file mode 100644 index 0000000..318ba76 --- /dev/null +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -0,0 +1,95 @@ +// +// SocketNamespaceAcknowledgementTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 28.07.15. +// +// + +import XCTest + +class SocketNamespaceAcknowledgementTest: SocketEmitTest { + + override func setUp() { + super.setUp() + testKind = TestKind.Acknowledgement + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift", + "extraHeaders": headers]) + openConnection() + } + + override func testConnectionStatus() { + super.testConnectionStatus() + } + + override func testEmit() { + super.testEmit() + } + + override func testEmitNull() { + super.testEmitNull() + } + + override func testEmitBinary() { + super.testEmitBinary() + } + + override func testArrayEmit() { + super.testArrayEmit() + } + + override func testStringEmit() { + super.testStringEmit() + } + + override func testBoolEmit() { + super.testBoolEmit() + } + + override func testIntegerEmit() { + super.testIntegerEmit() + } + + override func testDoubleEmit() { + super.testDoubleEmit() + } + + override func testJSONEmit() { + super.testJSONEmit() + } + + override func testUnicodeEmit() { + super.testUnicodeEmit() + } + + override func testMultipleItemsEmit() { + super.testMultipleItemsEmit() + } + + override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = testName + testKind.rawValue + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + var ack:OnAckCallback! + if let emitData = emitData { + ack = socket.emitWithAck(finalTestname, emitData) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGetEmit) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + +} From 79848b1ce07a4a8825657a521b813cac78c203f6 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 16:15:12 +0200 Subject: [PATCH 42/95] cleanup --- .../SocketAcknowledgementTest.swift | 13 +++++++++++ SocketIO-iOSTests/SocketEmitTest.swift | 5 ++--- .../SocketNamespaceAcknowledgementTest.swift | 22 +------------------ 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 81247d9..733ef74 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -71,6 +71,19 @@ class SocketAcknowledgementTest: SocketEmitTest { super.testMultipleItemsEmit() } + override func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + + socket.emitWithAck(finalTestname, withItems: emitData)(timeoutAfter: 5, callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + + } + override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ let finalTestname = testName + testKind.rawValue let expection = self.expectationWithDescription(finalTestname) diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 7516224..48a43f7 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -10,7 +10,7 @@ import XCTest import Foundation class SocketEmitTest: XCTestCase { - static let TEST_TIMEOUT = 5.0 + static let TEST_TIMEOUT = 15.0 var socket:SocketIOClient! let headers = ["testing": "blah", "testing2": "b/:lah"] var testKind = TestKind.Emit @@ -185,8 +185,7 @@ class SocketEmitTest: XCTestCase { XCTAssertEqual(result!.count, 5) if let array = result?.firstObject as? Array { XCTAssertEqual(array.last! as! Int, 2) - let string = NSString(data: array.first! as! NSData, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") + XCTAssertEqual(array.first! as! Int, 1) }else { XCTFail("Should have Array as result") } diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index 318ba76..a8d715e 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -8,7 +8,7 @@ import XCTest -class SocketNamespaceAcknowledgementTest: SocketEmitTest { +class SocketNamespaceAcknowledgementTest: SocketAcknowledgementTest { override func setUp() { super.setUp() @@ -72,24 +72,4 @@ class SocketNamespaceAcknowledgementTest: SocketEmitTest { override func testMultipleItemsEmit() { super.testMultipleItemsEmit() } - - override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = testName + testKind.rawValue - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?) { - callback(result, nil) - expection.fulfill() - } - var ack:OnAckCallback! - if let emitData = emitData { - ack = socket.emitWithAck(finalTestname, emitData) - } else { - ack = socket.emitWithAck(finalTestname) - } - ack(timeoutAfter: 20, callback: didGetEmit) - - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) - } - - } From a0e30528933d4680db8205761af07d100925697a Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 17:02:44 +0200 Subject: [PATCH 43/95] test server --- .gitignore | 2 + Socket.IO-Test-Server/TestCases.js | 78 +++++++++++++++++++ .../acknowledgementEvents.js | 10 +++ Socket.IO-Test-Server/emitEvents.js | 20 +++++ Socket.IO-Test-Server/main.js | 13 ++++ Socket.IO-Test-Server/package.json | 15 ++++ Socket.IO-Test-Server/socketEventRegister.js | 13 ++++ 7 files changed, 151 insertions(+) create mode 100644 Socket.IO-Test-Server/TestCases.js create mode 100644 Socket.IO-Test-Server/acknowledgementEvents.js create mode 100644 Socket.IO-Test-Server/emitEvents.js create mode 100644 Socket.IO-Test-Server/main.js create mode 100644 Socket.IO-Test-Server/package.json create mode 100644 Socket.IO-Test-Server/socketEventRegister.js diff --git a/.gitignore b/.gitignore index 8fcf4d1..2f7122e 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ DerivedData *.hmap *.ipa *.xcuserstate + +Socket.IO-Test-Server/node_modules/* diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js new file mode 100644 index 0000000..f0fa660 --- /dev/null +++ b/Socket.IO-Test-Server/TestCases.js @@ -0,0 +1,78 @@ +var assert = require("assert") + +module.exports = { + basicTest: { + assert: function(inputData) { + + }, + returnData: [] + }, + testNull: { + assert: function(inputData) { + assert(!inputData) + }, + returnData: [null] + }, + testBinary: { + assert: function(inputData) { + assert.equal(inputData.toString(), "gakgakgak2") + }, + returnData: [new Buffer("gakgakgak2", "utf-8")] + }, + testArray: { + assert: function(inputData) { + assert.equal(inputData.length, 2) + assert.equal(inputData[0], "test1") + assert.equal(inputData[1], "test2") + }, + returnData: [["test3", "test4"]] + }, + testString: { + assert: function(inputData) { + assert.equal(inputData, "marco") + }, + returnData: ["polo"] + }, + testBool: { + assert: function(inputData) { + assert(!inputData) + }, + returnData: [true] + }, + testInteger: { + assert: function(inputData) { + assert.equal(inputData, 10) + }, + returnData: [20] + }, + testDouble: { + assert: function(inputData) { + assert.equal(inputData, 1.1) + }, + returnData: [1.2] + }, + testJSON: { + assert: function(inputData) { + assert.equal(inputData.name, "test") + assert.equal(inputData.nestedTest.test, "test") + assert.equal(inputData.testArray.length, 1) + }, + returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [new Buffer("gakgakgak2", "utf-8"), 1]}] + },testUnicode: { + assert: function(inputData) { + assert.equal(inputData, "🚀") + }, + returnData: ["🚄"] + },testMultipleItems: { + assert: function(array, object, number, string, binary) { + assert.equal(array.length, 2) + assert.equal(array[0], "test1") + assert.equal(array[1], "test2") + assert.equal(number, 15) + assert.equal(string, "marco") + assert.equal(binary.toString(), "gakgakgak2") + + }, + returnData: [[1, 2], {test: "bob"}, 25, "polo", new Buffer("gakgakgak2")] + }, +} \ No newline at end of file diff --git a/Socket.IO-Test-Server/acknowledgementEvents.js b/Socket.IO-Test-Server/acknowledgementEvents.js new file mode 100644 index 0000000..a4c2c9d --- /dev/null +++ b/Socket.IO-Test-Server/acknowledgementEvents.js @@ -0,0 +1,10 @@ +function socketCallback(testKey, socket, testCase) { + return function() { + testCase.assert.apply(undefined , arguments) + var emitArguments = testCase.returnData; + var ack = arguments[arguments.length - 1] + ack.apply(socket, emitArguments) + } +} + +module.exports.socketCallback = socketCallback diff --git a/Socket.IO-Test-Server/emitEvents.js b/Socket.IO-Test-Server/emitEvents.js new file mode 100644 index 0000000..14f9ce5 --- /dev/null +++ b/Socket.IO-Test-Server/emitEvents.js @@ -0,0 +1,20 @@ +function socketCallback(testKey, socket, testCase) { + return function() { + testCase.assert.apply(undefined , arguments) + + var emitArguments = addArrays([testKey + "EmitReturn"], testCase.returnData) + socket.emit.apply(socket, emitArguments) + } +} + +function addArrays(firstArray, secondArray) { + var length = secondArray.length + var i; + for(i = 0; i < length; i++) { + firstArray.push(secondArray[i]) + } + + return firstArray; +} + +module.exports.socketCallback = socketCallback \ No newline at end of file diff --git a/Socket.IO-Test-Server/main.js b/Socket.IO-Test-Server/main.js new file mode 100644 index 0000000..ae83f97 --- /dev/null +++ b/Socket.IO-Test-Server/main.js @@ -0,0 +1,13 @@ +var app = require('express')() +var server = app.listen(8080) +var io = require('socket.io')(server) +var acknowledgementsEvents = require("./acknowledgementEvents.js") +var emitEvents = require("./emitEvents.js") +var socketEventRegister = require("./socketEventRegister.js") + +socketEventRegister.register(io, emitEvents.socketCallback, "Emit") +socketEventRegister.register(io, acknowledgementsEvents.socketCallback, "Acknowledgement") + +var nsp = io.of("/swift") +socketEventRegister.register(nsp, emitEvents.socketCallback, "Emit") +socketEventRegister.register(nsp, acknowledgementsEvents.socketCallback, "Acknowledgement") diff --git a/Socket.IO-Test-Server/package.json b/Socket.IO-Test-Server/package.json new file mode 100644 index 0000000..a62aa0b --- /dev/null +++ b/Socket.IO-Test-Server/package.json @@ -0,0 +1,15 @@ +{ + "name": "socket.io-client-swift-test-server", + "version": "0.0.1", + "description": "A simple server to test aginst", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Lukas Schmidt", + "license": "MIT", + "dependencies": { + "express": "^4.13.1", + "socket.io": "^1.3.6" + } +} diff --git a/Socket.IO-Test-Server/socketEventRegister.js b/Socket.IO-Test-Server/socketEventRegister.js new file mode 100644 index 0000000..9e0c208 --- /dev/null +++ b/Socket.IO-Test-Server/socketEventRegister.js @@ -0,0 +1,13 @@ +var testCases = require("./TestCases.js") + +function registerSocketForEvents(ioSocket, socketCallback, testKind) { + ioSocket.on('connection', function(socket) { + var testCase; + for(testKey in testCases) { + testCase = testCases[testKey] + socket.on((testKey + testKind), socketCallback(testKey, socket, testCase)) + } + }) +} + +module.exports.register = registerSocketForEvents \ No newline at end of file From feea80a2f9db30c8b47a414e1e63f7361dd7614c Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 31 Jul 2015 16:05:33 -0400 Subject: [PATCH 44/95] use immutable values --- SocketIOClientSwift/SocketPacket.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 9ce91bb..5adccf6 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -27,6 +27,8 @@ import Foundation struct SocketPacket { let nsp:String let id:Int + let placeholders:Int + let type:PacketType enum PacketType:Int { case CONNECT = 0 @@ -49,8 +51,6 @@ struct SocketPacket { var currentPlace = 0 var binary:[NSData] var data:[AnyObject] - var placeholders:Int - var type:PacketType var description:String { var better = "SocketPacket {type: ~~0; data: ~~1; " + "id: ~~2; placeholders: ~~3;}" From 4086ce7d75a30e011749e04efb065632d3e4b0c7 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 15:07:05 +0200 Subject: [PATCH 45/95] relocate test cases for better understanding --- .../project.pbxproj | 4 + Socket.IO-Test-Server/TestCases.js | 8 + .../SocketAcknowledgementTest.swift | 4 + SocketIO-iOSTests/SocketEmitTest.swift | 3 +- SocketIO-iOSTests/SocketTestCases.swift | 201 ++++++++++++++++++ 5 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 SocketIO-iOSTests/SocketTestCases.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index de8ab5f..05ec9e0 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -56,6 +56,7 @@ 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; + 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -105,6 +106,7 @@ 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; + 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -189,6 +191,7 @@ 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, 941A4AB91B67A56C00C42318 /* TestKind.swift */, + 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -453,6 +456,7 @@ 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, + 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js index f0fa660..c40ab2f 100644 --- a/Socket.IO-Test-Server/TestCases.js +++ b/Socket.IO-Test-Server/TestCases.js @@ -51,6 +51,14 @@ module.exports = { }, returnData: [1.2] }, + testJSONWithoutBuffer: { + assert: function(inputData) { + assert.equal(inputData.name, "test") + assert.equal(inputData.nestedTest.test, "test") + assert.equal(inputData.testArray.length, 1) + }, + returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [1, 1]}] + }, testJSON: { assert: function(inputData) { assert.equal(inputData.name, "test") diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 733ef74..7c27622 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -63,6 +63,10 @@ class SocketAcknowledgementTest: SocketEmitTest { super.testJSONEmit() } + func testJSONWithoutBuffer() { + SocketTestCases.testJSONEmit(abstractSocketEmit, testKind: self.testKind) + } + override func testUnicodeEmit() { super.testUnicodeEmit() } diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 48a43f7..cbdaeff 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -24,7 +24,8 @@ class SocketEmitTest: XCTestCase { "forcePolling": false, "forceWebsockets": false,// default false "path": "", - "extraHeaders": headers]) + "extraHeaders": headers] + ) openConnection() } diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift new file mode 100644 index 0000000..53c4489 --- /dev/null +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -0,0 +1,201 @@ +// +// SocketTestCases.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 02.08.15. +// +// + +import XCTest +import Foundation + +class SocketTestCases: NSObject { + typealias SocketSendFunction = (testName:String, emitData:AnyObject?, callback:NormalCallback)->() + + static func testBasic(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "basicTest" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + + } + abstractSocketSend(testName: testName, emitData: nil, callback: didGetResult) + } + + static func testNull(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testNull" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let _ = result?.firstObject as? NSNull { + + }else + { + XCTFail("Should have NSNull as result") + } + } + abstractSocketSend(testName: testName, emitData: NSNull(), callback: didGetResult) + } + + static func testBinary(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testBinary" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let data = result?.firstObject as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + abstractSocketSend(testName: testName, emitData: data, callback: didGetResult) + } + + static func testArray(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testArray" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let array = result?.firstObject as? NSArray { + XCTAssertEqual(array.count, 2) + XCTAssertEqual(array.firstObject! as! String, "test3") + XCTAssertEqual(array.lastObject! as! String, "test4") + }else { + XCTFail("Should have NSArray as result") + } + } + abstractSocketSend(testName: testName, emitData: ["test1", "test2"], callback: didGetResult) + } + + static func testString(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testString" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let string = result?.firstObject as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketSend(testName: testName, emitData: "marco", callback: didGetResult) + } + + static func testBool(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testBool" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let bool = result?.firstObject as? NSNumber { + XCTAssertTrue(bool.boolValue) + }else { + XCTFail("Should have Boolean as result") + } + } + abstractSocketSend(testName: testName, emitData: false, callback: didGetResult) + } + + static func testInteger(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testInteger" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let integer = result?.firstObject as? Int { + XCTAssertEqual(integer, 20) + }else { + XCTFail("Should have Integer as result") + } + } + abstractSocketSend(testName: testName, emitData: 10, callback: didGetResult) + } + + static func testDouble(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testDouble" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let double = result?.firstObject as? NSNumber { + XCTAssertEqual(double.floatValue, 1.2) + }else { + XCTFail("Should have Double as result") + } + } + abstractSocketSend(testName: testName, emitData: 1.1, callback: didGetResult) + } + + static func testJSON(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testJSON" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) + } + + static func testJSONWithoutBuffer(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testJSONWithoutBuffer" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).first! as! Int, 1) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) + } + + static func testUnicode(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testUnicode" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let unicode = result?.firstObject as? String { + XCTAssertEqual(unicode, "🚄") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketSend(testName: testName, emitData: "🚀", callback: didGetResult) + } + + static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->(), testKind:TestKind) { + let testName = "testMultipleItems" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + XCTAssertEqual(array.first! as! Int, 1) + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + + }else { + XCTFail("Should have Integer as result") + } + if let data = result?[4] as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] + abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) + } +} From bf3e28df81e523276d8ba528a3c1d4e7d177347e Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 17:28:09 +0200 Subject: [PATCH 46/95] improve tests on server --- Socket.IO-Test-Server/TestCases.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js index c40ab2f..1f7511f 100644 --- a/Socket.IO-Test-Server/TestCases.js +++ b/Socket.IO-Test-Server/TestCases.js @@ -51,7 +51,7 @@ module.exports = { }, returnData: [1.2] }, - testJSONWithoutBuffer: { + testJSON: { assert: function(inputData) { assert.equal(inputData.name, "test") assert.equal(inputData.nestedTest.test, "test") @@ -59,7 +59,7 @@ module.exports = { }, returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [1, 1]}] }, - testJSON: { + testJSONWithBuffer: { assert: function(inputData) { assert.equal(inputData.name, "test") assert.equal(inputData.nestedTest.test, "test") @@ -72,6 +72,16 @@ module.exports = { }, returnData: ["🚄"] },testMultipleItems: { + assert: function(array, object, number, string, bool) { + assert.equal(array.length, 2) + assert.equal(array[0], "test1") + assert.equal(array[1], "test2") + assert.equal(number, 15) + assert.equal(string, "marco") + assert.equal(bool, false) + }, + returnData: [[1, 2], {test: "bob"}, 25, "polo", false] + },testMultipleItemsWithBuffer: { assert: function(array, object, number, string, binary) { assert.equal(array.length, 2) assert.equal(array[0], "test1") @@ -79,8 +89,7 @@ module.exports = { assert.equal(number, 15) assert.equal(string, "marco") assert.equal(binary.toString(), "gakgakgak2") - }, returnData: [[1, 2], {test: "bob"}, 25, "polo", new Buffer("gakgakgak2")] - }, + } } \ No newline at end of file From 1b08411ed4b14f75351a6608be4a7606706c5e91 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 17:29:16 +0200 Subject: [PATCH 47/95] refactored iOS testcases Add test cases for complex data structure (JSON, multiple data emit) without binary Buffer attached --- .../project.pbxproj | 4 + SocketIO-iOSTests/AbstractSocketTest.swift | 104 ++++++++ .../SocketAcknowledgementTest.swift | 89 +++---- SocketIO-iOSTests/SocketEmitTest.swift | 232 +++--------------- .../SocketNamespaceAcknowledgementTest.swift | 61 +++-- .../SocketNamespaceEmitTest.swift | 77 +++--- SocketIO-iOSTests/SocketTestCases.swift | 75 ++++-- 7 files changed, 303 insertions(+), 339 deletions(-) create mode 100644 SocketIO-iOSTests/AbstractSocketTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 05ec9e0..653762f 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -57,6 +57,7 @@ 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; }; + 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -107,6 +108,7 @@ 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = ""; }; + 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractSocketTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -192,6 +194,7 @@ 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, 941A4AB91B67A56C00C42318 /* TestKind.swift */, 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, + 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -460,6 +463,7 @@ 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, + 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift new file mode 100644 index 0000000..ee1e335 --- /dev/null +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -0,0 +1,104 @@ +// +// AbstractSocketTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 02.08.15. +// +// + +import XCTest + +class AbstractSocketTest: XCTestCase { + static let TEST_TIMEOUT = 4.0 + var socket:SocketIOClient! + var testKind:TestKind? + + override func tearDown() { + super.tearDown() + socket.close(fast: false) + } + + func openConnection() { + let expection = self.expectationWithDescription("connect") + socket.on("connect") {data, ack in + expection.fulfill() + } + socket.connect() + XCTAssertTrue(socket.connecting) + waitForExpectationsWithTimeout(5, handler: nil) + } + + func generateTestName(rawTestName:String) ->String { + return rawTestName + testKind!.rawValue + } + + func checkConnectionStatus() { + XCTAssertTrue(socket.connected) + XCTAssertFalse(socket.connecting) + XCTAssertFalse(socket.reconnecting) + XCTAssertFalse(socket.closed) + XCTAssertFalse(socket.secure) + } + + func socketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.emit(finalTestname, withItems: emitData) + socket.on(finalTestname + "Return", callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + + func socketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.on(finalTestname + "Return", callback: didGetEmit) + if let emitData = emitData { + socket.emit(finalTestname, emitData) + } else { + socket.emit(finalTestname) + } + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + func socketAcknwoledgeMultiple(testName:String, Data:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetResult(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + + socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + func socketAcknwoledge(testName:String, Data:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGet(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + var ack:OnAckCallback! + if let Data = Data { + ack = socket.emitWithAck(finalTestname, Data) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGet) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } +} diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 7c27622..801e852 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -8,7 +8,8 @@ import XCTest -class SocketAcknowledgementTest: SocketEmitTest { +class SocketAcknowledgementTest: AbstractSocketTest { + override func setUp() { super.setUp() testKind = TestKind.Acknowledgement @@ -18,92 +19,64 @@ class SocketAcknowledgementTest: SocketEmitTest { "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false - "path": "", - "extraHeaders": headers]) + "path": ""]) openConnection() } - override func testConnectionStatus() { - super.testConnectionStatus() + func testConnectionStatus() { + super.checkConnectionStatus() } - override func testEmit() { - super.testEmit() + func testBasic() { + SocketTestCases.testBasic(socketAcknwoledge) } - override func testEmitNull() { - super.testEmitNull() + func testNull() { + SocketTestCases.testNull(socketAcknwoledge) } - override func testEmitBinary() { - super.testEmitBinary() + func testBinary() { + SocketTestCases.testBinary(socketAcknwoledge) } - override func testArrayEmit() { - super.testArrayEmit() + func testArray() { + SocketTestCases.testArray(socketAcknwoledge) } - override func testStringEmit() { - super.testStringEmit() + func testString() { + SocketTestCases.testString(socketAcknwoledge) } - override func testBoolEmit() { - super.testBoolEmit() + func testBool() { + SocketTestCases.testBool(socketAcknwoledge) } - override func testIntegerEmit() { - super.testIntegerEmit() + func testInteger() { + SocketTestCases.testInteger(socketAcknwoledge) } - override func testDoubleEmit() { - super.testDoubleEmit() + func testDouble() { + SocketTestCases.testDouble(socketAcknwoledge) } - override func testJSONEmit() { - super.testJSONEmit() + func testJSON() { + SocketTestCases.testJSON(socketAcknwoledge) } - func testJSONWithoutBuffer() { - SocketTestCases.testJSONEmit(abstractSocketEmit, testKind: self.testKind) + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketAcknwoledge) } - override func testUnicodeEmit() { - super.testUnicodeEmit() + func testUnicode() { + SocketTestCases.testUnicode(socketAcknwoledge) } - override func testMultipleItemsEmit() { - super.testMultipleItemsEmit() + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketAcknwoledgeMultiple) } - override func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ - let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?) { - callback(result, nil) - expection.fulfill() - } - - socket.emitWithAck(finalTestname, withItems: emitData)(timeoutAfter: 5, callback: didGetEmit) - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) - - } - - override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = testName + testKind.rawValue - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?) { - callback(result, nil) - expection.fulfill() - } - var ack:OnAckCallback! - if let emitData = emitData { - ack = socket.emitWithAck(finalTestname, emitData) - } else { - ack = socket.emitWithAck(finalTestname) - } - ack(timeoutAfter: 20, callback: didGetEmit) - - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketAcknwoledgeMultiple) } } diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index cbdaeff..a970444 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -9,22 +9,17 @@ import XCTest import Foundation -class SocketEmitTest: XCTestCase { - static let TEST_TIMEOUT = 15.0 - var socket:SocketIOClient! - let headers = ["testing": "blah", "testing2": "b/:lah"] - var testKind = TestKind.Emit - +class SocketEmitTest: AbstractSocketTest { override func setUp() { super.setUp() + testKind = TestKind.Emit socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false - "path": "", - "extraHeaders": headers] + "path": ""] ) openConnection() } @@ -34,227 +29,60 @@ class SocketEmitTest: XCTestCase { super.tearDown() } - func openConnection() { - let expection = self.expectationWithDescription("connect") - socket.on("connect") {data, ack in - expection.fulfill() - } - socket.connect() - XCTAssertTrue(socket.connecting) - waitForExpectationsWithTimeout(5, handler: nil) - } - func testConnectionStatus() { - XCTAssertTrue(socket.connected) - XCTAssertFalse(socket.connecting) - XCTAssertFalse(socket.reconnecting) - XCTAssertFalse(socket.closed) - XCTAssertFalse(socket.secure) + super.checkConnectionStatus() } - func testEmit() { - let testName = "basicTest" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - - } - abstractSocketEmit(testName, emitData: nil, callback: didGetEmit) + func testBasic() { + SocketTestCases.testBasic(socketEmit) } - func testEmitNull() { - let testName = "testNull" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let _ = result?.firstObject as? NSNull { - - }else - { - XCTFail("Should have NSNull as result") - } - } - abstractSocketEmit(testName, emitData: NSNull(), callback: didGetEmit) + func testNull() { + SocketTestCases.testNull(socketEmit) } - func testEmitBinary() { - let testName = "testBinary" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let data = result?.firstObject as? NSData { - let string = NSString(data: data, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") - }else { - XCTFail("Should have NSData as result") - } - } - let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - abstractSocketEmit(testName, emitData: data, callback: didGetEmit) + func testBinary() { + SocketTestCases.testBinary(socketEmit) } - func testArrayEmit() { - let testName = "testArray" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let array = result?.firstObject as? NSArray { - XCTAssertEqual(array.count, 2) - XCTAssertEqual(array.firstObject! as! String, "test3") - XCTAssertEqual(array.lastObject! as! String, "test4") - }else { - XCTFail("Should have NSArray as result") - } - } - abstractSocketEmit(testName, emitData: ["test1", "test2"], callback: didGetEmit) + func testArray() { + SocketTestCases.testArray(socketEmit) } - func testStringEmit() { - let testName = "testString" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let string = result?.firstObject as? String { - XCTAssertEqual(string, "polo") - }else { - XCTFail("Should have String as result") - } - } - abstractSocketEmit(testName, emitData: "marco", callback: didGetEmit) + func testString() { + SocketTestCases.testString(socketEmit) } - func testBoolEmit() { - let testName = "testBool" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let bool = result?.firstObject as? NSNumber { - XCTAssertTrue(bool.boolValue) - }else { - XCTFail("Should have Boolean as result") - } - } - abstractSocketEmit(testName, emitData: false, callback: didGetEmit) + func testBool() { + SocketTestCases.testBool(socketEmit) } - func testIntegerEmit() { - let testName = "testInteger" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let integer = result?.firstObject as? Int { - XCTAssertEqual(integer, 20) - }else { - XCTFail("Should have Integer as result") - } - } - abstractSocketEmit(testName, emitData: 10, callback: didGetEmit) + func testInteger() { + SocketTestCases.testInteger(socketEmit) } - func testDoubleEmit() { - let testName = "testDouble" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let double = result?.firstObject as? NSNumber { - XCTAssertEqual(double.floatValue, 1.2) - }else { - XCTFail("Should have Double as result") - } - } - abstractSocketEmit(testName, emitData: 1.1, callback: didGetEmit) + func testDouble() { + SocketTestCases.testDouble(socketEmit) } - func testJSONEmit() { - let testName = "testJSON" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let json = result?.firstObject as? NSDictionary { - XCTAssertEqual(json.valueForKey("testString")! as! String, "test") - XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) - let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") - }else { - XCTFail("Should have NSDictionary as result") - } - } - let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] - - abstractSocketEmit(testName, emitData: json, callback: didGetEmit) + func testJSON() { + SocketTestCases.testJSON(socketEmit) } - func testUnicodeEmit() { - let testName = "testUnicode" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let unicode = result?.firstObject as? String { - XCTAssertEqual(unicode, "🚄") - }else { - XCTFail("Should have String as result") - } - } - abstractSocketEmit(testName, emitData: "🚀", callback: didGetEmit) + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketEmit) } - func testMultipleItemsEmit() { - let testName = "testMultipleItems" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - XCTAssertEqual(result!.count, 5) - if let array = result?.firstObject as? Array { - XCTAssertEqual(array.last! as! Int, 2) - XCTAssertEqual(array.first! as! Int, 1) - }else { - XCTFail("Should have Array as result") - } - if let dict = result?[1] as? NSDictionary { - XCTAssertEqual(dict.valueForKey("test") as! String, "bob") - - }else { - XCTFail("Should have NSDictionary as result") - } - if let number = result?[2] as? Int { - XCTAssertEqual(number, 25) - - }else { - XCTFail("Should have Integer as result") - } - if let string = result?[3] as? String { - XCTAssertEqual(string, "polo") - - }else { - XCTFail("Should have Integer as result") - } - if let data = result?[4] as? NSData { - let string = NSString(data: data, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") - }else { - XCTFail("Should have NSData as result") - } - } - let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] - abstractSocketMultipleEmit(testName, emitData: emitArray, callback: didGetEmit) + func testUnicode() { + SocketTestCases.testUnicode(socketEmit) } - func generateTestName(rawTestName:String) ->String { - return rawTestName + testKind.rawValue + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketMultipleEmit) } - func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ - let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - callback(result, ack) - expection.fulfill() - } - - socket.emit(finalTestname, withItems: emitData) - socket.on(finalTestname + "Return", callback: didGetEmit) - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) - - } - - - func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - callback(result, ack) - expection.fulfill() - } - - socket.on(finalTestname + "Return", callback: didGetEmit) - if let emitData = emitData { - socket.emit(finalTestname, emitData) - } else { - socket.emit(finalTestname) - } - - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketMultipleEmit) } } diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index a8d715e..d25fecf 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -8,7 +8,7 @@ import XCTest -class SocketNamespaceAcknowledgementTest: SocketAcknowledgementTest { +class SocketNamespaceAcknowledgementTest: AbstractSocketTest { override func setUp() { super.setUp() @@ -20,56 +20,63 @@ class SocketNamespaceAcknowledgementTest: SocketAcknowledgementTest { "forcePolling": false, "forceWebsockets": false,// default false "path": "", - "nsp": "/swift", - "extraHeaders": headers]) + "nsp": "/swift"]) openConnection() } - override func testConnectionStatus() { - super.testConnectionStatus() + func testConnectionStatus() { + super.checkConnectionStatus() } - override func testEmit() { - super.testEmit() + func testBasic() { + SocketTestCases.testBasic(socketAcknwoledge) } - override func testEmitNull() { - super.testEmitNull() + func testNull() { + SocketTestCases.testNull(socketAcknwoledge) } - override func testEmitBinary() { - super.testEmitBinary() + func testBinary() { + SocketTestCases.testBinary(socketAcknwoledge) } - override func testArrayEmit() { - super.testArrayEmit() + func testArray() { + SocketTestCases.testArray(socketAcknwoledge) } - override func testStringEmit() { - super.testStringEmit() + func testString() { + SocketTestCases.testString(socketAcknwoledge) } - override func testBoolEmit() { - super.testBoolEmit() + func testBool() { + SocketTestCases.testBool(socketAcknwoledge) } - override func testIntegerEmit() { - super.testIntegerEmit() + func testInteger() { + SocketTestCases.testInteger(socketAcknwoledge) } - override func testDoubleEmit() { - super.testDoubleEmit() + func testDouble() { + SocketTestCases.testDouble(socketAcknwoledge) } - override func testJSONEmit() { - super.testJSONEmit() + func testJSON() { + SocketTestCases.testJSON(socketAcknwoledge) } - override func testUnicodeEmit() { - super.testUnicodeEmit() + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketAcknwoledge) } - override func testMultipleItemsEmit() { - super.testMultipleItemsEmit() + func testUnicode() { + SocketTestCases.testUnicode(socketAcknwoledge) + } + + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketAcknwoledgeMultiple) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketAcknwoledgeMultiple) } } diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index 945a242..057fcc1 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -8,73 +8,76 @@ import XCTest -class SocketNamespaceEmitTest: SocketEmitTest { +class SocketNamespaceEmitTest: AbstractSocketTest { override func setUp() { super.setUp() - socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ - "reconnects": true, // default true - "reconnectAttempts": -1, // default -1 - "reconnectWait": 5, // default 10 - "forcePolling": false, - "forceWebsockets": false,// default false - "path": "", - "nsp": "/swift", - "extraHeaders": headers]) + testKind = TestKind.Emit + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift"]) openConnection() } - override func tearDown() { - socket.close(fast: false) - super.tearDown() + func testConnectionStatus() { + super.checkConnectionStatus() } - override func testConnectionStatus() { - super.testConnectionStatus() + func testBasic() { + SocketTestCases.testBasic(socketEmit) } - override func testEmit() { - super.testEmit() + func testNull() { + SocketTestCases.testNull(socketEmit) } - override func testEmitNull() { - super.testEmitNull() + func testBinary() { + SocketTestCases.testBinary(socketEmit) } - override func testEmitBinary() { - super.testEmitBinary() + func testArray() { + SocketTestCases.testArray(socketEmit) } - override func testArrayEmit() { - super.testArrayEmit() + func testString() { + SocketTestCases.testString(socketEmit) } - override func testStringEmit() { - super.testStringEmit() + func testBool() { + SocketTestCases.testBool(socketEmit) } - override func testBoolEmit() { - super.testBoolEmit() + func testInteger() { + SocketTestCases.testInteger(socketEmit) } - override func testIntegerEmit() { - super.testIntegerEmit() + func testDouble() { + SocketTestCases.testDouble(socketEmit) } - override func testDoubleEmit() { - super.testDoubleEmit() + func testJSON() { + SocketTestCases.testJSON(socketEmit) } - override func testJSONEmit() { - super.testJSONEmit() + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketEmit) } - override func testUnicodeEmit() { - super.testUnicodeEmit() + func testUnicode() { + SocketTestCases.testUnicode(socketEmit) } - override func testMultipleItemsEmit() { - super.testMultipleItemsEmit() + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketMultipleEmit) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketMultipleEmit) } } diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift index 53c4489..e17718e 100644 --- a/SocketIO-iOSTests/SocketTestCases.swift +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -12,7 +12,7 @@ import Foundation class SocketTestCases: NSObject { typealias SocketSendFunction = (testName:String, emitData:AnyObject?, callback:NormalCallback)->() - static func testBasic(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testBasic(abstractSocketSend:SocketSendFunction) { let testName = "basicTest" func didGetResult(result:NSArray?, ack:AckEmitter?) { @@ -20,7 +20,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: nil, callback: didGetResult) } - static func testNull(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testNull(abstractSocketSend:SocketSendFunction) { let testName = "testNull" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let _ = result?.firstObject as? NSNull { @@ -33,7 +33,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: NSNull(), callback: didGetResult) } - static func testBinary(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testBinary(abstractSocketSend:SocketSendFunction) { let testName = "testBinary" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let data = result?.firstObject as? NSData { @@ -47,7 +47,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: data, callback: didGetResult) } - static func testArray(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testArray(abstractSocketSend:SocketSendFunction) { let testName = "testArray" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let array = result?.firstObject as? NSArray { @@ -61,7 +61,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: ["test1", "test2"], callback: didGetResult) } - static func testString(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testString(abstractSocketSend:SocketSendFunction) { let testName = "testString" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let string = result?.firstObject as? String { @@ -73,7 +73,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: "marco", callback: didGetResult) } - static func testBool(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testBool(abstractSocketSend:SocketSendFunction) { let testName = "testBool" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let bool = result?.firstObject as? NSNumber { @@ -85,7 +85,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: false, callback: didGetResult) } - static func testInteger(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testInteger(abstractSocketSend:SocketSendFunction) { let testName = "testInteger" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let integer = result?.firstObject as? Int { @@ -97,7 +97,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: 10, callback: didGetResult) } - static func testDouble(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testDouble(abstractSocketSend:SocketSendFunction) { let testName = "testDouble" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let double = result?.firstObject as? NSNumber { @@ -109,8 +109,8 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: 1.1, callback: didGetResult) } - static func testJSON(abstractSocketSend:SocketSendFunction, testKind:TestKind) { - let testName = "testJSON" + static func testJSONWithBuffer(abstractSocketSend:SocketSendFunction) { + let testName = "testJSONWithBuffer" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual(json.valueForKey("testString")! as! String, "test") @@ -128,8 +128,8 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) } - static func testJSONWithoutBuffer(abstractSocketSend:SocketSendFunction, testKind:TestKind) { - let testName = "testJSONWithoutBuffer" + static func testJSON(abstractSocketSend:SocketSendFunction) { + let testName = "testJSON" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual(json.valueForKey("testString")! as! String, "test") @@ -147,7 +147,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) } - static func testUnicode(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testUnicode(abstractSocketSend:SocketSendFunction) { let testName = "testUnicode" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let unicode = result?.firstObject as? String { @@ -159,10 +159,14 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: "🚀", callback: didGetResult) } - static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->(), testKind:TestKind) { - let testName = "testMultipleItems" + static func testMultipleItemsWithBuffer(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->()) { + let testName = "testMultipleItemsWithBuffer" func didGetResult(result:NSArray?, ack:AckEmitter?) { XCTAssertEqual(result!.count, 5) + if result!.count != 5 { + XCTFail("Fatal Fail. Lost some Data") + return + } if let array = result?.firstObject as? Array { XCTAssertEqual(array.last! as! Int, 2) XCTAssertEqual(array.first! as! Int, 1) @@ -198,4 +202,45 @@ class SocketTestCases: NSObject { let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) } + + static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->()) { + let testName = "testMultipleItems" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if result!.count != 5 { + XCTFail("Fatal Fail. Lost some Data") + return + } + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + XCTAssertEqual(array.first! as! Int, 1) + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have Integer as result") + } + if let bool = result?[4] as? NSNumber { + XCTAssertFalse(bool.boolValue) + }else { + XCTFail("Should have NSNumber as result") + } + } + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", false] + abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) + } } From f0b4f077d41cf78e75fab05039d0ddc5e6c02dac Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 17:44:06 +0200 Subject: [PATCH 48/95] fix crash --- .../xcschemes/SocketIO-iOS.xcscheme | 10 +++++-- SocketIO-iOSTests/AbstractSocketTest.swift | 29 ++++++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme index e9b0653..baf02a7 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme @@ -37,10 +37,11 @@ + codeCoverageEnabled = "YES"> @@ -62,15 +63,18 @@ ReferencedContainer = "container:Socket.IO-Client-Swift.xcodeproj"> + + String { @@ -42,10 +42,12 @@ class AbstractSocketTest: XCTestCase { func socketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } socket.emit(finalTestname, withItems: emitData) @@ -56,10 +58,13 @@ class AbstractSocketTest: XCTestCase { func socketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } + } socket.on(finalTestname + "Return", callback: didGetEmit) @@ -74,10 +79,12 @@ class AbstractSocketTest: XCTestCase { func socketAcknwoledgeMultiple(testName:String, Data:Array, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGetResult(result:NSArray?) { callback(result, nil) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) @@ -86,10 +93,12 @@ class AbstractSocketTest: XCTestCase { func socketAcknwoledge(testName:String, Data:AnyObject?, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGet(result:NSArray?) { callback(result, nil) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } var ack:OnAckCallback! if let Data = Data { From 92367fc796c1e1b4d42903d36f41861c6721118f Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 18:23:48 +0200 Subject: [PATCH 49/95] minor improvements using let / guard --- SocketIOClientSwift/SocketEngine.swift | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 6fa37b8..beb790a 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -325,8 +325,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let req = NSMutableURLRequest(URL: NSURL(string: urlPolling! + "&sid=\(sid)")!) - if cookies != nil { - let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!) + if let cookies = cookies { + let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies) req.allHTTPHeaderFields = headers } @@ -375,8 +375,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func handleClose() { - if polling { - client?.engineDidClose("Disconnect") + if let client = client where polling == true { + client.engineDidClose("Disconnect") } } @@ -494,8 +494,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { reqPolling.allHTTPHeaderFields = headers } - if extraHeaders != nil { - for (headerName, value) in extraHeaders! { + if let extraHeaders = extraHeaders { + for (headerName, value) in extraHeaders { reqPolling.setValue(value, forHTTPHeaderField: headerName) } } @@ -505,10 +505,9 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { // Translatation of engine.io-parser#decodePayload private func parsePollingMessage(str:String) { - if str.characters.count == 1 { + guard str.characters.count == 1 else { return } - // println(str) let strArray = Array(str.characters) @@ -633,8 +632,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { postWait.append(strMsg) - if datas != nil { - for data in datas! { + if let datas = datas { + for data in datas { let (_, b64Data) = createBinaryDataForSend(data) postWait.append(b64Data!) @@ -654,8 +653,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { ws?.writeString("\(type.rawValue)\(str)") - if datas != nil { - for data in datas! { + if let datas = datas { + for data in datas { let (data, _) = createBinaryDataForSend(data) if data != nil { ws?.writeData(data!) @@ -666,7 +665,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { // Starts the ping timer private func startPingTimer() { - if pingInterval == nil { + guard pingInterval != nil else { return } @@ -719,8 +718,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if let pType = PacketType(rawValue: type) { var arr = [NSData]() - if data != nil { - for d in data! { + if let data = data { + for d in data { arr.append(d as! NSData) } } From 7800591367a8fad92a3a899cfc709455aa810d1f Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 18:47:37 +0200 Subject: [PATCH 50/95] cleanup status api --- SocketIOClientSwift/SocketIOClient.swift | 93 +++++++----------------- SocketIOClientSwift/SocketTypes.swift | 4 + 2 files changed, 31 insertions(+), 66 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2660092..8260eed 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -26,14 +26,11 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient { private var anyHandler:((SocketAnyEvent) -> Void)? - private var _closed = false - private var _connected = false - private var _connecting = false + public private(set) var status = SocketIOClientStatus.NotConnected private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() private var connectParams:[String: AnyObject]? private var _secure = false - private var _reconnecting = false private var reconnectTimer:NSTimer? let reconnectAttempts:Int! @@ -48,22 +45,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) - public var closed:Bool { - return _closed - } - public var connected:Bool { - return _connected - } - public var connecting:Bool { - return _connecting - } public var engine:SocketEngine? public var nsp = "/" public var opts:[String: AnyObject]? public var reconnects = true - public var reconnecting:Bool { - return _reconnecting - } + public var reconnectWait = 10 public var secure:Bool { return _secure @@ -145,9 +131,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient SocketLogger.log("Closing socket", client: self) reconnects = false - _connecting = false - _connected = false - _reconnecting = false + status = SocketIOClientStatus.Closed engine?.close(fast: fast) engine = nil } @@ -163,14 +147,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Connect to the server. If we aren't connected after timeoutAfter, call handler */ public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { - if closed { - SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) - _closed = false - } else if connected { + guard status == SocketIOClientStatus.Connected else { return } + if status == SocketIOClientStatus.Closed { + SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) + } - _connecting = true + status = SocketIOClientStatus.Connecting addEngine() engine?.open(connectParams) @@ -181,9 +165,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) dispatch_after(time, dispatch_get_main_queue()) {[weak self] in - if let this = self where !this.connected { - this._closed = true - this._connecting = false + if let this = self where this.status != SocketIOClientStatus.Connected { + this.status = SocketIOClientStatus.Closed this.engine?.close(fast: true) handler?() @@ -213,11 +196,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient func didConnect() { SocketLogger.log("Socket connected", client: self) - - _closed = false - _connected = true - _connecting = false - _reconnecting = false + status = SocketIOClientStatus.Connected currentReconnectAttempt = 0 clearReconnectTimer() @@ -227,17 +206,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } func didDisconnect(reason:String) { - if closed { + guard status == SocketIOClientStatus.Closed else { return } SocketLogger.log("Disconnected: %@", client: self, args: reason) - _closed = true - _connected = false + status = SocketIOClientStatus.Closed + reconnects = false - _connecting = false - _reconnecting = false // Make sure the engine is actually dead. engine?.close(fast: true) @@ -263,10 +240,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Send a message to the server */ public func emit(event:String, _ items:AnyObject...) { - if !connected { + guard status == SocketIOClientStatus.Connected else { return } - dispatch_async(emitQueue) {[weak self] in self?._emit(event, items) } @@ -276,7 +252,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Same as emit, but meant for Objective-C */ public func emit(event:String, withItems items:[AnyObject]) { - if !connected { + guard status != SocketIOClientStatus.Connected else { return } @@ -290,10 +266,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient an ack. */ public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { - if !connected { - return createOnAck(event, items: items) - } - return createOnAck(event, items: items) } @@ -301,15 +273,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Same as emitWithAck, but for Objective-C */ public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { - if !connected { - return createOnAck(event, items: items) - } - return createOnAck(event, items: items) } private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { - if !connected { + guard status != SocketIOClientStatus.Connected else { return } @@ -328,7 +296,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient // If the server wants to know that the client received data func emitAck(ack:Int, withData args:[AnyObject]) { dispatch_async(emitQueue) {[weak self] in - if let this = self where this.connected { + if let this = self where this.status == SocketIOClientStatus.Connected { let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) let str = packet.createAck() @@ -345,12 +313,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } public func engineDidClose(reason:String) { - _connected = false - _connecting = false - - if closed || !reconnects { + if status == SocketIOClientStatus.Closed || !reconnects { didDisconnect(reason) - } else if !reconnecting { + } else if status != SocketIOClientStatus.Reconnecting { handleEvent("reconnect", data: [reason], isInternalMessage: true) tryReconnect() } @@ -370,10 +335,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil) { - // println("Should do event: \(event) with data: \(data)") - if !connected && !isInternalMessage { + guard status != SocketIOClientStatus.Connected && !isInternalMessage else { return } + // println("Should do event: \(event) with data: \(data)") SocketLogger.log("Handling event: %@ with data: %@", client: self, args: event, data ?? "") @@ -467,31 +432,27 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Trieds to reconnect to the server. */ public func reconnect() { - _connected = false - _connecting = false - _reconnecting = false - + status = SocketIOClientStatus.Reconnecting engine?.stopPolling() tryReconnect() } // We lost connection and should attempt to reestablish @objc private func tryReconnect() { + guard status == SocketIOClientStatus.Connected else { + return + } if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() didDisconnect("Reconnect Failed") - return - } else if connected { - _connecting = false - _reconnecting = false return } if reconnectTimer == nil { SocketLogger.log("Starting reconnect", client: self) - _reconnecting = true + status = SocketIOClientStatus.Reconnecting dispatch_async(dispatch_get_main_queue()) {[weak self] in if let this = self { diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 596a267..0009677 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -28,3 +28,7 @@ public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void + +public enum SocketIOClientStatus { + case NotConnected, Closed, Connecting, Connected, Reconnecting +} From f0a45e13e2ff34619edeaf6ac05476df6656b91c Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 2 Aug 2015 13:09:18 -0400 Subject: [PATCH 51/95] clean up --- SocketIOClientSwift/SocketPacket.swift | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 5adccf6..1d59940 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -98,16 +98,15 @@ struct SocketPacket { for arg in data { if arg is NSDictionary || arg is [AnyObject] { - let jsonSend: NSData? do { - jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, + let jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, options: NSJSONWritingOptions(rawValue: 0)) + let jsonString = NSString(data: jsonSend, encoding: NSUTF8StringEncoding) + + message += jsonString! as String + "," } catch { - jsonSend = nil + print("Error creating JSON object in SocketPacket.completeMessage") } - let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) - - message += jsonString! as String + "," } else if var str = arg as? String { str = str["\n"] ~= "\\\\n" str = str["\r"] ~= "\\\\r" From 150e26aefd8cc8b5b2bbfba8311bfd9862bb1927 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 2 Aug 2015 13:40:45 -0400 Subject: [PATCH 52/95] fix getting args for ack and binary-ack --- SocketIOClientSwift/SocketPacket.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 1d59940..510bb92 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -231,12 +231,16 @@ struct SocketPacket { func getArgs() -> [AnyObject]? { var arr = data - + if data.count == 0 { return nil } else { - arr.removeAtIndex(0) - return arr + if type == PacketType.EVENT || type == PacketType.BINARY_EVENT { + arr.removeAtIndex(0) + return arr + } else { + return arr + } } } } From 2579c04f67798e3603df8fcf0c4a6711c2c6beb4 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 3 Aug 2015 10:07:59 -0400 Subject: [PATCH 53/95] better swift style --- SocketIOClientSwift/SocketAckManager.swift | 20 ++--- SocketIOClientSwift/SocketAnyEvent.swift | 6 +- SocketIOClientSwift/SocketEngine.swift | 78 ++++++++++---------- SocketIOClientSwift/SocketEngineClient.swift | 14 ++-- SocketIOClientSwift/SocketEventHandler.swift | 14 ++-- SocketIOClientSwift/SocketFixUTF8.swift | 4 +- SocketIOClientSwift/SocketIOClient.swift | 73 +++++++++--------- SocketIOClientSwift/SocketLogger.swift | 10 +-- SocketIOClientSwift/SocketPacket.swift | 46 ++++++------ SocketIOClientSwift/SocketParser.swift | 29 ++++---- SocketIOClientSwift/SocketTypes.swift | 2 +- 11 files changed, 145 insertions(+), 151 deletions(-) diff --git a/SocketIOClientSwift/SocketAckManager.swift b/SocketIOClientSwift/SocketAckManager.swift index a68d247..c206109 100644 --- a/SocketIOClientSwift/SocketAckManager.swift +++ b/SocketIOClientSwift/SocketAckManager.swift @@ -25,38 +25,38 @@ import Foundation private struct SocketAck: Hashable, Equatable { - let ack:Int - var callback:AckCallback! - var hashValue:Int { + let ack: Int + var callback: AckCallback! + var hashValue: Int { return ack.hashValue } - init(ack:Int) { + init(ack: Int) { self.ack = ack } - init(ack:Int, callback:AckCallback) { + init(ack: Int, callback: AckCallback) { self.ack = ack self.callback = callback } } -private func <(lhs:SocketAck, rhs:SocketAck) -> Bool { +private func <(lhs: SocketAck, rhs: SocketAck) -> Bool { return lhs.ack < rhs.ack } -private func ==(lhs:SocketAck, rhs:SocketAck) -> Bool { +private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool { return lhs.ack == rhs.ack } struct SocketAckManager { private var acks = Set(minimumCapacity: 1) - mutating func addAck(ack:Int, callback:AckCallback) { + mutating func addAck(ack: Int, callback: AckCallback) { acks.insert(SocketAck(ack: ack, callback: callback)) } - mutating func executeAck(ack:Int, items:[AnyObject]?) { + mutating func executeAck(ack: Int, items: [AnyObject]?) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { @@ -64,7 +64,7 @@ struct SocketAckManager { } } - mutating func timeoutAck(ack:Int) { + mutating func timeoutAck(ack: Int) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 9926bc5..3b3e97e 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -25,10 +25,10 @@ import Foundation public final class SocketAnyEvent: NSObject { - public let event:String! - public let items:NSArray? + public let event: String! + public let items: NSArray? - init(event:String, items:NSArray?) { + init(event: String, items: NSArray?) { self.event = event self.items = items } diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index c321833..92e873c 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { - private typealias Probe = (msg:String, type:PacketType, data:[NSData]?) + private typealias Probe = (msg: String, type: PacketType, data: [NSData]?) private typealias ProbeWaitQueue = [Probe] private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet @@ -37,12 +37,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private var closed = false private var _connected = false - private var extraHeaders:[String: String]? + private var extraHeaders: [String: String]? private var fastUpgrade = false private var forcePolling = false private var forceWebsockets = false - private var pingInterval:Double? - private var pingTimer:NSTimer? + private var pingInterval: Double? + private var pingTimer: NSTimer? private var pingTimeout = 0.0 { didSet { pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25)) @@ -61,25 +61,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let logType = "SocketEngine" - var connected:Bool { + var connected: Bool { return _connected } - weak var client:SocketEngineClient? - var cookies:[NSHTTPCookie]? + weak var client: SocketEngineClient? + var cookies: [NSHTTPCookie]? var log = false - var polling:Bool { + var polling: Bool { return _polling } var sid = "" var socketPath = "" - var urlPolling:String? - var urlWebSocket:String? - var websocket:Bool { + var urlPolling: String? + var urlWebSocket: String? + var websocket: Bool { return _websocket } var ws:WebSocket? - public enum PacketType:Int { + public enum PacketType: Int { case OPEN = 0 case CLOSE = 1 case PING = 2 @@ -88,7 +88,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { case UPGRADE = 5 case NOOP = 6 - init?(str:String?) { + init?(str: String?) { if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { self = raw } else { @@ -97,13 +97,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public init(client:SocketEngineClient, sessionDelegate:NSURLSessionDelegate?) { + public init(client: SocketEngineClient, sessionDelegate: NSURLSessionDelegate?) { self.client = client self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: sessionDelegate, delegateQueue: workQueue) } - public convenience init(client:SocketEngineClient, opts:NSDictionary?) { + public convenience init(client: SocketEngineClient, opts: NSDictionary?) { self.init(client: client, sessionDelegate: opts?["sessionDelegate"] as? NSURLSessionDelegate) forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false forcePolling = opts?["forcePolling"] as? Bool ?? false @@ -117,7 +117,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { SocketLogger.log("Engine is being deinit", client: self) } - public func close(fast fast:Bool) { + public func close(fast fast: Bool) { SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast) pingTimer?.invalidate() @@ -133,7 +133,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { stopPolling() } - private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { + private func createBinaryDataForSend(data: NSData) -> (NSData?, String?) { if websocket { var byteArray = [UInt8](count: 1, repeatedValue: 0x0) byteArray[0] = 4 @@ -151,7 +151,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func createURLs(params:[String: AnyObject]?) -> (String?, String?) { + private func createURLs(params: [String: AnyObject]?) -> (String?, String?) { if client == nil { return (nil, nil) } @@ -159,8 +159,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let path = socketPath == "" ? "/socket.io" : socketPath let url = "\(client!.socketURL)\(path)/?transport=" - var urlPolling:String - var urlWebSocket:String + var urlPolling: String + var urlWebSocket: String if client!.secure { urlPolling = "https://" + url + "polling" @@ -193,7 +193,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { return (urlPolling, urlWebSocket) } - private func createWebsocket(andConnect connect:Bool) { + private func createWebsocket(andConnect connect: Bool) { let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)") ws = WebSocket(url: NSURL(string: wsUrl)!, @@ -249,7 +249,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { doRequest(req) } - private func doRequest(req:NSMutableURLRequest) { + private func doRequest(req: NSMutableURLRequest) { if !polling { return } @@ -380,7 +380,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func checkIfMessageIsBase64Binary(var message:String) { + private func checkIfMessageIsBase64Binary(var message: String) { if message.hasPrefix("b4") { // binary in base64 string message.removeRange(Range(start: message.startIndex, @@ -395,7 +395,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func handleMessage(message:String) { + private func handleMessage(message: String) { if let client = client { dispatch_async(client.handleQueue) {[weak client] in client?.parseSocketMessage(message) @@ -407,7 +407,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { doPoll() } - private func handleOpen(openData:String) { + private func handleOpen(openData: String) { let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! do { @@ -437,7 +437,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func handlePong(pongMessage:String) { + private func handlePong(pongMessage: String) { pongsMissed = 0 // We should upgrade @@ -447,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // A poll failed, tell the client about it - private func handlePollingFailed(reason:String) { + private func handlePollingFailed(reason: String) { _connected = false ws?.disconnect() pingTimer?.invalidate() @@ -465,7 +465,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func open(opts:[String: AnyObject]? = nil) { + public func open(opts: [String: AnyObject]? = nil) { if connected { SocketLogger.err("Tried to open while connected", client: self) client?.didError("Tried to open while connected") @@ -504,7 +504,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // Translatation of engine.io-parser#decodePayload - private func parsePollingMessage(str:String) { + private func parsePollingMessage(str: String) { if str.characters.count == 1 { return } @@ -557,7 +557,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func parseEngineData(data:NSData) { + private func parseEngineData(data: NSData) { if let client = client { dispatch_async(client.handleQueue) {[weak self] in self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) @@ -565,7 +565,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func parseEngineMessage(var message:String, fromPolling:Bool) { + private func parseEngineMessage(var message: String, fromPolling: Bool) { SocketLogger.log("Got message: %@", client: self, args: message) if fromPolling { @@ -602,7 +602,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } /// Send an engine message (4) - public func send(msg:String, withData datas:[NSData]?) { + public func send(msg: String, withData datas: [NSData]?) { if probing { probeWait.append((msg, PacketType.MESSAGE, datas)) } else { @@ -624,7 +624,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send polling message. /// Only call on emitQueue - private func sendPollMessage(var msg:String, withType type:PacketType, + private func sendPollMessage(var msg: String, withType type: PacketType, datas:[NSData]? = nil) { SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue) @@ -648,7 +648,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send message on WebSockets /// Only call on emitQueue - private func sendWebSocketMessage(str:String, withType type:PacketType, + private func sendWebSocketMessage(str: String, withType type: PacketType, datas:[NSData]? = nil) { SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue) @@ -696,7 +696,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. */ - public func write(msg:String, withType type:PacketType, withData data:[NSData]?) { + public func write(msg: String, withType type: PacketType, withData data: [NSData]?) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { if this.websocket { @@ -715,7 +715,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. For Objective-C. withData should be an NSArray of NSData */ - public func writeObjc(msg:String, withType type:Int, withData data:NSArray?) { + public func writeObjc(msg: String, withType type: Int, withData data: NSArray?) { if let pType = PacketType(rawValue: type) { var arr = [NSData]() @@ -744,7 +744,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func websocketDidDisconnect(socket:WebSocket, error:NSError?) { + public func websocketDidDisconnect(socket: WebSocket, error: NSError?) { websocketConnected = false probing = false @@ -770,11 +770,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func websocketDidReceiveMessage(socket:WebSocket, text:String) { + public func websocketDidReceiveMessage(socket: WebSocket, text: String) { parseEngineMessage(text, fromPolling: false) } - public func websocketDidReceiveData(socket:WebSocket, data:NSData) { + public func websocketDidReceiveData(socket: WebSocket, data: NSData) { parseEngineData(data) } } diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index 3824722..fe16367 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -26,12 +26,12 @@ import Foundation @objc public protocol SocketEngineClient { - var handleQueue:dispatch_queue_t! {get} - var socketURL:String {get} - var secure:Bool {get} + var handleQueue: dispatch_queue_t! {get} + var socketURL: String {get} + var secure: Bool {get} - func didError(reason:AnyObject) - func engineDidClose(reason:String) - func parseSocketMessage(msg:String) - func parseBinaryData(data:NSData) + func didError(reason: AnyObject) + func engineDidClose(reason: String) + func parseSocketMessage(msg: String) + func parseBinaryData(data: NSData) } diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 7b2d92b..5b74cf4 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -24,22 +24,22 @@ import Foundation -private func emitAckCallback(socket:SocketIOClient?, num:Int?) - (items:AnyObject...) -> Void { +private func emitAckCallback(socket: SocketIOClient?, num: Int?) + (items: AnyObject...) -> Void { socket?.emitAck(num ?? -1, withData: items) } struct SocketEventHandler { - let event:String - let callback:NormalCallback + let event: String + let callback: NormalCallback - init(event:String, callback:NormalCallback) { + init(event: String, callback: NormalCallback) { self.event = event self.callback = callback } - func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, - withSocket socket:SocketIOClient? = nil) { + func executeCallback(items: NSArray? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, + withSocket socket: SocketIOClient? = nil) { dispatch_async(dispatch_get_main_queue()) { self.callback(items, emitAckCallback(socket, num: ack)) } diff --git a/SocketIOClientSwift/SocketFixUTF8.swift b/SocketIOClientSwift/SocketFixUTF8.swift index c8ea8ef..4061303 100644 --- a/SocketIOClientSwift/SocketFixUTF8.swift +++ b/SocketIOClientSwift/SocketFixUTF8.swift @@ -25,13 +25,13 @@ import Foundation -func fixDoubleUTF8(inout name:String) { +func fixDoubleUTF8(inout name: String) { let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)! let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)! name = latin1 as String } -func doubleEncodeUTF8(inout str:String) { +func doubleEncodeUTF8(inout str: String) { let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)! let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)! str = utf8 as String diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2660092..7ced5d0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -31,51 +31,50 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var _connecting = false private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() - private var connectParams:[String: AnyObject]? + private var connectParams: [String: AnyObject]? private var _secure = false private var _reconnecting = false - private var reconnectTimer:NSTimer? + private var reconnectTimer: NSTimer? - let reconnectAttempts:Int! + let reconnectAttempts: Int! let logType = "SocketClient" var ackHandlers = SocketAckManager() var currentAck = -1 var log = false var waitingData = [SocketPacket]() - var sessionDelegate:NSURLSessionDelegate? - public let socketURL:String + public let socketURL: String public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) - public var closed:Bool { + public var closed: Bool { return _closed } - public var connected:Bool { + public var connected: Bool { return _connected } - public var connecting:Bool { + public var connecting: Bool { return _connecting } public var engine:SocketEngine? public var nsp = "/" - public var opts:[String: AnyObject]? + public var opts: [String: AnyObject]? public var reconnects = true - public var reconnecting:Bool { + public var reconnecting: Bool { return _reconnecting } public var reconnectWait = 10 - public var secure:Bool { + public var secure: Bool { return _secure } - public var sid:String? { + public var sid: String? { return engine?.sid } /** Create a new SocketIOClient. opts can be omitted */ - public init(var socketURL:String, opts:[String: AnyObject]? = nil) { + public init(var socketURL: String, opts: [String: AnyObject]? = nil) { if socketURL["https://"].matches().count != 0 { self._secure = true } @@ -86,11 +85,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.socketURL = socketURL self.opts = opts - // Set options - if let sessionDelegate = opts?["sessionDelegate"] as? NSURLSessionDelegate { - self.sessionDelegate = sessionDelegate - } - if let connectParams = opts?["connectParams"] as? [String: AnyObject] { self.connectParams = connectParams } @@ -141,7 +135,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Will turn off automatic reconnects. Pass true to fast if you're closing from a background task */ - public func close(fast fast:Bool) { + public func close(fast fast: Bool) { SocketLogger.log("Closing socket", client: self) reconnects = false @@ -162,7 +156,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ - public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { + public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) { if closed { SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) _closed = false @@ -191,7 +185,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - private func createOnAck(event:String, items:[AnyObject]) -> OnAckCallback { + private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback { return {[weak self, ack = ++currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) @@ -226,7 +220,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handleEvent("connect", data: nil, isInternalMessage: false) } - func didDisconnect(reason:String) { + func didDisconnect(reason: String) { if closed { return } @@ -245,7 +239,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } /// error - public func didError(reason:AnyObject) { + public func didError(reason: AnyObject) { SocketLogger.err("%@", client: self, args: reason) handleEvent("error", data: reason as? [AnyObject] ?? [reason], @@ -255,14 +249,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as close */ - public func disconnect(fast fast:Bool) { + public func disconnect(fast fast: Bool) { close(fast: fast) } /** Send a message to the server */ - public func emit(event:String, _ items:AnyObject...) { + public func emit(event:String, _ items: AnyObject...) { if !connected { return } @@ -275,7 +269,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emit, but meant for Objective-C */ - public func emit(event:String, withItems items:[AnyObject]) { + public func emit(event: String, withItems items: [AnyObject]) { if !connected { return } @@ -289,7 +283,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add an ack. */ - public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { + public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { if !connected { return createOnAck(event, items: items) } @@ -300,7 +294,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emitWithAck, but for Objective-C */ - public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { + public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { if !connected { return createOnAck(event, items: items) } @@ -308,7 +302,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return createOnAck(event, items: items) } - private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { + private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { if !connected { return } @@ -326,7 +320,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // If the server wants to know that the client received data - func emitAck(ack:Int, withData args:[AnyObject]) { + func emitAck(ack: Int, withData args: [AnyObject]) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) @@ -344,7 +338,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - public func engineDidClose(reason:String) { + public func engineDidClose(reason: String) { _connected = false _connecting = false @@ -357,7 +351,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // Called when the socket gets an ack for something it sent - func handleAck(ack:Int, data:AnyObject?) { + func handleAck(ack: Int, data: AnyObject?) { SocketLogger.log("Handling ack: %@ with data: %@", client: self, args: ack, data ?? "") @@ -368,8 +362,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** 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) { + public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool = false, + wantsAck ack: Int? = nil) { // println("Should do event: \(event) with data: \(data)") if !connected && !isInternalMessage { return @@ -417,7 +411,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Removes handler(s) */ - public func off(event:String) { + public func off(event: String) { SocketLogger.log("Removing handler for event: %@", client: self, args: event) handlers = ContiguousArray(handlers.filter {!($0.event == event)}) @@ -426,7 +420,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Adds a handler for an event. */ - public func on(event:String, callback:NormalCallback) { + public func on(event: String, callback: NormalCallback) { SocketLogger.log("Adding handler for event: %@", client: self, args: event) let handler = SocketEventHandler(event: event, callback: callback) @@ -444,7 +438,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Adds a handler that will be called on every event. */ - public func onAny(handler:(SocketAnyEvent) -> Void) { + public func onAny(handler: (SocketAnyEvent) -> Void) { anyHandler = handler } @@ -455,11 +449,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient connect() } - public func parseSocketMessage(msg:String) { + public func parseSocketMessage(msg: String) { SocketParser.parseSocketMessage(msg, socket: self) } - public func parseBinaryData(data:NSData) { + public func parseBinaryData(data: NSData) { SocketParser.parseBinaryData(data, socket: self) } @@ -475,7 +469,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient tryReconnect() } - // We lost connection and should attempt to reestablish @objc private func tryReconnect() { if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 3f524bf..65f1156 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -25,18 +25,18 @@ import Foundation protocol SocketLogClient { - var log:Bool {get set} - var logType:String {get} + var log: Bool {get set} + var logType: String {get} } final class SocketLogger { private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) - private static func toCVArgType(item:AnyObject) -> CVarArgType { + private static func toCVArgType(item: AnyObject) -> CVarArgType { return String(item) } - static func log(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { + static func log(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { if !client.log { return } @@ -49,7 +49,7 @@ final class SocketLogger { } } - static func err(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { + static func err(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { if !client.log { return } diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 510bb92..a127143 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -25,12 +25,12 @@ import Foundation struct SocketPacket { - let nsp:String - let id:Int - let placeholders:Int - let type:PacketType + let nsp: String + let id: Int + let placeholders: Int + let type: PacketType - enum PacketType:Int { + enum PacketType: Int { case CONNECT = 0 case DISCONNECT = 1 case EVENT = 2 @@ -39,7 +39,7 @@ struct SocketPacket { case BINARY_EVENT = 5 case BINARY_ACK = 6 - init?(str:String) { + init?(str: String) { if let int = Int(str), raw = PacketType(rawValue: int) { self = raw } else { @@ -49,9 +49,9 @@ struct SocketPacket { } var currentPlace = 0 - var binary:[NSData] - var data:[AnyObject] - var description:String { + var binary: [NSData] + var data: [AnyObject] + var description: String { var better = "SocketPacket {type: ~~0; data: ~~1; " + "id: ~~2; placeholders: ~~3;}" @@ -63,8 +63,8 @@ struct SocketPacket { return better } - init(type:SocketPacket.PacketType, data:[AnyObject] = [AnyObject](), id:Int = -1, - nsp:String, placeholders:Int = 0, binary:[NSData] = [NSData]()) { + init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, + nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) { self.data = data self.id = id self.nsp = nsp @@ -73,7 +73,7 @@ struct SocketPacket { self.binary = binary } - mutating func addData(data:NSData) -> Bool { + mutating func addData(data: NSData) -> Bool { if placeholders == currentPlace { return true } @@ -89,7 +89,7 @@ struct SocketPacket { } } - private func completeMessage(var message:String, ack:Bool = false) -> String { + private func completeMessage(var message: String, ack: Bool) -> String { if data.count == 0 { return message + "]" } else if !ack { @@ -127,7 +127,7 @@ struct SocketPacket { } func createAck() -> String { - let msg:String + let msg: String if type == PacketType.ACK { if nsp == "/" { @@ -147,8 +147,8 @@ struct SocketPacket { } - func createMessageForEvent(event:String) -> String { - let message:String + func createMessageForEvent(event: String) -> String { + let message: String if type == PacketType.EVENT { if nsp == "/" { @@ -180,7 +180,7 @@ struct SocketPacket { } } - return completeMessage(message) + return completeMessage(message, ack: false) } mutating func fillInPlaceholders() { @@ -197,7 +197,7 @@ struct SocketPacket { data = newArr as [AnyObject] } - private mutating func _fillInPlaceholders(data:AnyObject) -> AnyObject { + private mutating func _fillInPlaceholders(data: AnyObject) -> AnyObject { if let str = data as? String { if let num = str["~~(\\d)"].groups() { return binary[Int(num[1])!] @@ -246,7 +246,7 @@ struct SocketPacket { } extension SocketPacket { - private static func findType(binCount:Int, ack:Bool) -> PacketType { + private static func findType(binCount: Int, ack: Bool) -> PacketType { switch binCount { case 0 where !ack: return PacketType.EVENT @@ -261,7 +261,7 @@ extension SocketPacket { } } - static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { let (parsedData, binary) = deconstructData(data) let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) @@ -269,7 +269,7 @@ extension SocketPacket { return packet } - static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { let (parsedData, binary) = deconstructData(data) let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) @@ -279,7 +279,7 @@ extension SocketPacket { } extension SocketPacket { - private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { + private static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": binary.count] @@ -307,7 +307,7 @@ extension SocketPacket { } } - private static func deconstructData(var data:[AnyObject]) -> ([AnyObject], [NSData]) { + private static func deconstructData(var data: [AnyObject]) -> ([AnyObject], [NSData]) { var binary = [NSData]() for i in 0.. Bool { + private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool { return nsp == socket.nsp } - private static func handleAck(p:SocketPacket, socket:SocketIOClient) { + private static func handleAck(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -35,7 +35,7 @@ class SocketParser { socket.handleAck(p.id, data: p.data) } - private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { + private static func handleBinaryAck(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -43,7 +43,7 @@ class SocketParser { socket.waitingData.append(p) } - private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) { + private static func handleBinaryEvent(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -51,7 +51,7 @@ class SocketParser { socket.waitingData.append(p) } - private static func handleConnect(p:SocketPacket, socket:SocketIOClient) { + private static func handleConnect(p: SocketPacket, socket: SocketIOClient) { if p.nsp == "/" && socket.nsp != "/" { socket.joinNamespace() } else if p.nsp != "/" && socket.nsp == "/" { @@ -61,7 +61,7 @@ class SocketParser { } } - private static func handleEvent(p:SocketPacket, socket:SocketIOClient) { + private static func handleEvent(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -71,7 +71,7 @@ class SocketParser { } // Translation of socket.io-client#decodeString - static func parseString(str:String) -> SocketPacket? { + static func parseString(str: String) -> SocketPacket? { let arr = Array(str.characters) let type = String(arr[0]) @@ -79,7 +79,7 @@ class SocketParser { return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/") } - var id = nil as Int? + var id: Int? var nsp:String? var i = 0 var placeholders = -1 @@ -150,10 +150,11 @@ class SocketParser { } // Parses data for events - static func parseData(data:String) -> AnyObject? { - var err:NSError? + static func parseData(data: String) -> AnyObject? { + var err: NSError? let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - let parsed:AnyObject? + let parsed: AnyObject? + do { parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.MutableContainers) @@ -171,14 +172,14 @@ class SocketParser { } // Parses messages recieved - static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { + static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { if stringMessage == "" { return } SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) - let p:SocketPacket + let p: SocketPacket if let pack = parseString(stringMessage) { p = pack @@ -207,7 +208,7 @@ class SocketParser { } } - static func parseBinaryData(data:NSData, socket:SocketIOClient) { + static func parseBinaryData(data: NSData, socket: SocketIOClient) { if socket.waitingData.count == 0 { SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") return diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index e5198f9..674e699 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -27,4 +27,4 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void -public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void +public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void From 06e2311accc4c88834472384a4d0bd2c0a015acc Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 3 Aug 2015 12:41:14 -0400 Subject: [PATCH 54/95] fix socketio/socket.io-client-swift#133 can't expose variadics to objective-c --- SocketIOClientSwift/SocketEventHandler.swift | 21 +++++++++++++++++--- SocketIOClientSwift/SocketIOClient.swift | 7 +++++++ SocketIOClientSwift/SocketTypes.swift | 2 ++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 5b74cf4..f145600 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -29,19 +29,34 @@ private func emitAckCallback(socket: SocketIOClient?, num: Int?) socket?.emitAck(num ?? -1, withData: items) } +private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) + (items: NSArray) -> Void { + socket?.emitAck(num ?? -1, withData: items as [AnyObject]) +} + struct SocketEventHandler { let event: String - let callback: NormalCallback + let callback: NormalCallback? + let callBackObjectiveC: NormalCallbackObjectiveC? init(event: String, callback: NormalCallback) { self.event = event self.callback = callback + self.callBackObjectiveC = nil } - func executeCallback(items: NSArray? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, + init(event: String, callback: NormalCallbackObjectiveC) { + self.event = event + self.callback = nil + self.callBackObjectiveC = callback + } + + func executeCallback(items: [AnyObject]? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, withSocket socket: SocketIOClient? = nil) { dispatch_async(dispatch_get_main_queue()) { - self.callback(items, emitAckCallback(socket, num: ack)) + self.callback != nil ? + self.callback?(items, emitAckCallback(socket, num: ack)) + : self.callBackObjectiveC?(items, emitAckCallbackObjectiveC(socket, num: ack)) } } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 7ced5d0..e664193 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -426,6 +426,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) } + + public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { + SocketLogger.log("Adding handler for event: %@", client: self, args: event) + + let handler = SocketEventHandler(event: event, callback: callback) + handlers.append(handler) + } /** Removes all handlers. diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 674e699..342564c 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -26,5 +26,7 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void +public typealias AckEmitterObjectiveC = (NSArray) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void +public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void From dd71d4954d64e45117d5142dbc170363bed5fffd Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 3 Aug 2015 13:41:58 -0400 Subject: [PATCH 55/95] update readme --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 776c43a..cf03197 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ socket.connect() ```objective-c SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; -[socket on:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); }]; -[socket on:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { double cur = [[data objectAtIndex:0] floatValue]; [socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) { @@ -126,17 +126,18 @@ Options Methods ------- 1. `on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -2. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -3. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. -4. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C -5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. -6. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. -7. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. -8. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -9. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. -10. `reconnect()` - Causes the client to reconnect to the server. -11. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. -12. `leaveNamespace()` - Causes the client to leave the nsp and go back to / +2. `onObjectiveC(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +3. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. +4. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. +5. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C +6. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +7. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. +8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. +9. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. +11. `reconnect()` - Causes the client to reconnect to the server. +12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. +13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / Client Events ------ From 80ea42c91f776e51a5bd4866a43906cf7dea7f50 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 06:03:06 -0400 Subject: [PATCH 56/95] document objc method --- SocketIOClientSwift/SocketIOClient.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e664193..459771e 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -427,6 +427,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handlers.append(handler) } + /** + Adds a handler for an event. + */ public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { SocketLogger.log("Adding handler for event: %@", client: self, args: event) From ffbe1e4ec4b59021cbc7ee8682c2813f85948520 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 06:09:24 -0400 Subject: [PATCH 57/95] add option for handle queue --- README.md | 1 + SocketIOClientSwift/SocketEventHandler.swift | 4 +-- SocketIOClientSwift/SocketIOClient.swift | 34 +++++++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bc30ccd..a66216b 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Options - `sessionDelegate: NSURLSessionDelegate` Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil. - `path: String` - If the server uses a custom path. ex: `"/swift"`. Default is `""` - `extraHeaders: [String: String]?` - Adds custom headers to the initial request. Default is nil. +- `handleQueue: dispatch_queue_t` - The dispatch queue that handlers are run on. Default is the main queue. Methods ------- diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index cef0d4d..9559532 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -40,8 +40,6 @@ final class SocketEventHandler { func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, withSocket socket:SocketIOClient? = nil) { - dispatch_async(dispatch_get_main_queue()) {[weak self] in - self?.callback?(items, ack != nil ? emitAckCallback(socket!, ack!) : nil) - } + self.callback?(items, ack != nil ? emitAckCallback(socket!, ack!) : nil) } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 0dffd87..d7ff0c5 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -46,7 +46,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let socketURL:String public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) - public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) + public let handleQueue: dispatch_queue_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public var closed:Bool { return _closed @@ -121,6 +121,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.reconnectWait = abs(reconnectWait) } + if let handleQueue = opts?["handleQueue"] as? dispatch_queue_t { + self.handleQueue = handleQueue + } else { + self.handleQueue = dispatch_get_main_queue() + } + super.init() } @@ -393,7 +399,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient args: event, data ?? "") if anyHandler != nil { - dispatch_async(dispatch_get_main_queue()) {[weak self] in + dispatch_async(handleQueue) {[weak self] in self?.anyHandler?(SocketAnyEvent(event: event, items: data)) } } @@ -401,9 +407,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient for handler in handlers { if handler.event == event { if ack != nil { - handler.executeCallback(data, withAck: ack!, withSocket: self) + dispatch_async(handleQueue) {[weak self] in + handler.executeCallback(data, withAck: ack!, withSocket: self) + } } else { - handler.executeCallback(data) + dispatch_async(handleQueue) {[weak self] in + handler.executeCallback(data) + } } } } @@ -448,14 +458,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) } - - /** - Removes all handlers. - Can be used after disconnecting to break any potential remaining retain cycles. - */ - public func removeAllHandlers() { - handlers.removeAll(keepCapacity: false) - } + + /** + Removes all handlers. + Can be used after disconnecting to break any potential remaining retain cycles. + */ + public func removeAllHandlers() { + handlers.removeAll(keepCapacity: false) + } /** Adds a handler that will be called on every event. From 969e6d6ea84364f25a38139ae6c0c2a1ce6675c2 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Wed, 5 Aug 2015 12:12:21 +0200 Subject: [PATCH 58/95] minor imporvements Signed-off-by: Lukas Schmidt --- SocketIOClientSwift/SocketIOClient.swift | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 8260eed..ba17752 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -30,7 +30,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() private var connectParams:[String: AnyObject]? - private var _secure = false + public private(set) var secure = false private var reconnectTimer:NSTimer? let reconnectAttempts:Int! @@ -51,9 +51,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public var reconnects = true public var reconnectWait = 10 - public var secure:Bool { - return _secure - } public var sid:String? { return engine?.sid } @@ -63,7 +60,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public init(var socketURL:String, opts:[String: AnyObject]? = nil) { if socketURL["https://"].matches().count != 0 { - self._secure = true + self.secure = true } socketURL = socketURL["http://"] ~= "" @@ -158,7 +155,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient addEngine() engine?.open(connectParams) - if timeoutAfter == 0 { + guard timeoutAfter == 0 else { return } @@ -379,6 +376,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } + /** + Joins namespace / + */ + public func joinNamespace(namespace:String) { + self.nsp = namespace + joinNamespace() + } + /** Removes handler(s) */ From 9b9becebae995adef3435ba9f2c3ddaf3cc43f1e Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 06:14:44 -0400 Subject: [PATCH 59/95] bump version --- README.md | 4 ++-- Socket.IO-Client-Swift.podspec | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a66216b..3994f4a 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 2.4.0 # Or latest version +github "socketio/socket.io-client-swift" ~> 2.4.1 # Or latest version ``` Run `carthage update`. @@ -79,7 +79,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 2.4.0' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 2.4.1' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 5ff6cbe..3987b1f 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 = "2.4.0" + s.version = "2.4.1" s.summary = "Socket.IO-client for iOS and OS X" s.description = <<-DESC Socket.IO-client for iOS and OS X. @@ -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 => 'v2.4.0' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v2.4.1' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 8bde261acbb0cf5db10745e09de1dc88be42cfff Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 12:25:37 -0400 Subject: [PATCH 60/95] fix socketio/socket.io-client-swift#137 --- SocketIOClientSwift/SocketIOClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index d7ff0c5..e55f8d1 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -46,7 +46,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let socketURL:String public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) - public let handleQueue: dispatch_queue_t! + public let handleQueue: dispatch_queue_attr_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public var closed:Bool { return _closed From c38412cae69035065d6e871fb70934663d61b7f3 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 12:27:46 -0400 Subject: [PATCH 61/95] bump version --- README.md | 4 ++-- Socket.IO-Client-Swift.podspec | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3994f4a..25ccaa2 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 2.4.1 # Or latest version +github "socketio/socket.io-client-swift" ~> 2.4.2 # Or latest version ``` Run `carthage update`. @@ -79,7 +79,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 2.4.1' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 2.4.2' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 3987b1f..b20853b 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 = "2.4.1" + s.version = "2.4.2" s.summary = "Socket.IO-client for iOS and OS X" s.description = <<-DESC Socket.IO-client for iOS and OS X. @@ -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 => 'v2.4.1' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v2.4.2' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 469caf1b5436aaaeaa1599107155fa2f3984e54c Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 6 Aug 2015 14:12:35 -0400 Subject: [PATCH 62/95] update for latest beta --- SocketIOClientSwift/WebSocket.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index ef4ac88..c82b08b 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -388,7 +388,7 @@ public class WebSocket : NSObject, NSStreamDelegate { ///validates the HTTP is a 101 as per the RFC spec private func validateResponse(buffer: UnsafePointer, bufferLen: Int) -> Bool { - let response = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, 0).takeRetainedValue() + let response = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, false).takeRetainedValue() CFHTTPMessageAppendBytes(response, buffer, bufferLen) if CFHTTPMessageGetResponseStatusCode(response) != 101 { return false @@ -854,7 +854,7 @@ public class Security { } var policy: SecPolicyRef if self.validatedDN { - policy = SecPolicyCreateSSL(1, domain) + policy = SecPolicyCreateSSL(true, domain) } else { policy = SecPolicyCreateBasicX509() } From d0ec1de56680c58f15f647b4bc42a4616767415c Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 06:18:37 +0200 Subject: [PATCH 63/95] merge Signed-off-by: Lukas Schmidt --- SocketIOClientSwift/SocketIOClient.swift | 94 +----------------------- 1 file changed, 4 insertions(+), 90 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 5c0ec43..3707968 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -29,16 +29,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public private(set) var status = SocketIOClientStatus.NotConnected private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() -<<<<<<< HEAD - private var connectParams:[String: AnyObject]? public private(set) var secure = false - private var reconnectTimer:NSTimer? -======= private var connectParams: [String: AnyObject]? private var _secure = false private var _reconnecting = false private var reconnectTimer: NSTimer? ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 let reconnectAttempts: Int! let logType = "SocketClient" @@ -51,36 +46,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue: dispatch_queue_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) -<<<<<<< HEAD -======= - public var closed: Bool { - return _closed - } - public var connected: Bool { - return _connected - } - public var connecting: Bool { - return _connecting - } ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 + public var engine:SocketEngine? public var nsp = "/" public var opts: [String: AnyObject]? public var reconnects = true -<<<<<<< HEAD - public var reconnectWait = 10 public var sid:String? { -======= - public var reconnecting: Bool { - return _reconnecting - } - public var reconnectWait = 10 - public var secure: Bool { - return _secure - } - public var sid: String? { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return engine?.sid } @@ -173,16 +145,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ -<<<<<<< HEAD - public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { + public func connect(timeoutAfter timeoutAfter:Int, + withTimeoutHandler handler:(() -> Void)?) { guard status == SocketIOClientStatus.Connected else { -======= - public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) { - if closed { - SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) - _closed = false - } else if connected { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return } if status == SocketIOClientStatus.Closed { @@ -240,13 +205,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handleEvent("connect", data: nil, isInternalMessage: false) } -<<<<<<< HEAD func didDisconnect(reason:String) { guard status == SocketIOClientStatus.Closed else { -======= - func didDisconnect(reason: String) { - if closed { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return } @@ -279,13 +239,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Send a message to the server */ -<<<<<<< HEAD public func emit(event:String, _ items:AnyObject...) { guard status == SocketIOClientStatus.Connected else { -======= - public func emit(event:String, _ items: AnyObject...) { - if !connected { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return } dispatch_async(emitQueue) {[weak self] in @@ -296,13 +251,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emit, but meant for Objective-C */ -<<<<<<< HEAD public func emit(event:String, withItems items:[AnyObject]) { guard status != SocketIOClientStatus.Connected else { -======= - public func emit(event: String, withItems items: [AnyObject]) { - if !connected { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return } @@ -315,40 +265,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add an ack. */ -<<<<<<< HEAD public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { -======= - public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { - if !connected { - return createOnAck(event, items: items) - } - ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return createOnAck(event, items: items) } /** Same as emitWithAck, but for Objective-C */ -<<<<<<< HEAD public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { return createOnAck(event, items: items) } private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { guard status != SocketIOClientStatus.Connected else { -======= - public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { - if !connected { - return createOnAck(event, items: items) - } - - return createOnAck(event, items: items) - } - - private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { - if !connected { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return } @@ -383,16 +312,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } -<<<<<<< HEAD public func engineDidClose(reason:String) { if status == SocketIOClientStatus.Closed || !reconnects { -======= - public func engineDidClose(reason: String) { - _connected = false - _connecting = false - - if closed || !reconnects { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 didDisconnect(reason) } else if status != SocketIOClientStatus.Reconnecting { handleEvent("reconnect", data: [reason], isInternalMessage: true) @@ -412,16 +333,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Causes an event to be handled. Only use if you know what you're doing. */ -<<<<<<< HEAD public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil) { guard status != SocketIOClientStatus.Connected && !isInternalMessage else { -======= - public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool = false, - wantsAck ack: Int? = nil) { - // println("Should do event: \(event) with data: \(data)") - if !connected && !isInternalMessage { ->>>>>>> 514193e6ec46854097ead71c4b3efde292915938 return } // println("Should do event: \(event) with data: \(data)") @@ -436,7 +350,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } for handler in handlers where handler.event == event { - if ack != nil { + if let ack = ack { dispatch_async(handleQueue) {[weak self] in handler.executeCallback(data, withAck: ack!, withSocket: self) } From 184b97ef8c1b0308468ea6b6da2c8451bad5d925 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 06:21:29 +0200 Subject: [PATCH 64/95] fix merge issues Signed-off-by: Lukas Schmidt --- SocketIOClientSwift/SocketIOClient.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 3707968..ad37d8d 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -352,7 +352,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient for handler in handlers where handler.event == event { if let ack = ack { dispatch_async(handleQueue) {[weak self] in - handler.executeCallback(data, withAck: ack!, withSocket: self) + handler.executeCallback(data, withAck: ack, withSocket: self) } } else { dispatch_async(handleQueue) { diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index f938e20..8ced279 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -27,6 +27,7 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void public typealias AckEmitterObjectiveC = (NSArray) -> Void +public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void From 84bb6b7dad84479d9ff82ce852499a70c601b6d0 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 06:33:32 +0200 Subject: [PATCH 65/95] update tests Signed-off-by: Lukas Schmidt --- SocketIO-iOSTests/AbstractSocketTest.swift | 8 +++----- SocketIO-iOSTests/SocketTestCases.swift | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index 5f66991..e5b16d5 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -20,11 +20,12 @@ class AbstractSocketTest: XCTestCase { func openConnection() { let expection = self.expectationWithDescription("connect") + XCTAssertTrue(socket.status == SocketIOClientStatus.NotConnected) socket.on("connect") {data, ack in expection.fulfill() } socket.connect() - XCTAssertTrue(socket.connecting) + XCTAssertEqual(socket.status, SocketIOClientStatus.Connecting) waitForExpectationsWithTimeout(AbstractSocketTest.TEST_TIMEOUT, handler: nil) } @@ -33,10 +34,7 @@ class AbstractSocketTest: XCTestCase { } func checkConnectionStatus() { - XCTAssertTrue(socket.connected) - XCTAssertFalse(socket.connecting) - XCTAssertFalse(socket.reconnecting) - XCTAssertFalse(socket.closed) + XCTAssertEqual(socket.status, SocketIOClientStatus.Connected) XCTAssertFalse(socket.secure) } diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift index e17718e..617fb13 100644 --- a/SocketIO-iOSTests/SocketTestCases.swift +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -52,8 +52,8 @@ class SocketTestCases: NSObject { func didGetResult(result:NSArray?, ack:AckEmitter?) { if let array = result?.firstObject as? NSArray { XCTAssertEqual(array.count, 2) - XCTAssertEqual(array.firstObject! as! String, "test3") - XCTAssertEqual(array.lastObject! as! String, "test4") + XCTAssertEqual((array.firstObject! as! String), "test3") + XCTAssertEqual((array.lastObject! as! String), "test4") }else { XCTFail("Should have NSArray as result") } From 5eeac96b2bfa6408a9a8dbb69261781c839a2085 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 07:04:11 +0200 Subject: [PATCH 66/95] fix issues Signed-off-by: Lukas Schmidt --- SocketIOClientSwift/SocketEngine.swift | 2 +- SocketIOClientSwift/SocketIOClient.swift | 21 ++++++++------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index e3dfb6c..a375844 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -505,7 +505,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { // Translatation of engine.io-parser#decodePayload private func parsePollingMessage(str:String) { - guard str.characters.count == 1 else { + guard str.characters.count != 1 else { return } // println(str) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index ad37d8d..4d10186 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -147,7 +147,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { - guard status == SocketIOClientStatus.Connected else { + guard status != SocketIOClientStatus.Connected else { return } if status == SocketIOClientStatus.Closed { @@ -158,7 +158,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient addEngine() engine?.open(connectParams) - guard timeoutAfter == 0 else { + guard timeoutAfter == 0 else { return } @@ -206,7 +206,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } func didDisconnect(reason:String) { - guard status == SocketIOClientStatus.Closed else { + guard status != SocketIOClientStatus.Closed else { return } @@ -240,19 +240,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Send a message to the server */ public func emit(event:String, _ items:AnyObject...) { - guard status == SocketIOClientStatus.Connected else { - return - } - dispatch_async(emitQueue) {[weak self] in - self?._emit(event, items) - } + emit(event, withItems: items) } /** Same as emit, but meant for Objective-C */ public func emit(event:String, withItems items:[AnyObject]) { - guard status != SocketIOClientStatus.Connected else { + guard status == SocketIOClientStatus.Connected else { return } @@ -277,7 +272,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { - guard status != SocketIOClientStatus.Connected else { + guard status == SocketIOClientStatus.Connected else { return } @@ -335,7 +330,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil) { - guard status != SocketIOClientStatus.Connected && !isInternalMessage else { + guard status == SocketIOClientStatus.Connected && isInternalMessage else { return } // println("Should do event: \(event) with data: \(data)") @@ -460,7 +455,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } @objc private func tryReconnect() { - guard status == SocketIOClientStatus.Connected else { + guard status != SocketIOClientStatus.Connected else { return } if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { From 6fa76362616d350e032d13f61547c76288086973 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 07:14:52 +0200 Subject: [PATCH 67/95] working test Signed-off-by: Lukas Schmidt --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 4d10186..2249698 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -158,7 +158,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient addEngine() engine?.open(connectParams) - guard timeoutAfter == 0 else { + guard timeoutAfter != 0 else { return } @@ -330,7 +330,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil) { - guard status == SocketIOClientStatus.Connected && isInternalMessage else { + guard status == SocketIOClientStatus.Connected && !isInternalMessage else { return } // println("Should do event: \(event) with data: \(data)") From 889ad404bc43c9addf0ac4fef31115a60f6e14bc Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 07:42:09 +0200 Subject: [PATCH 68/95] remove compiler warnings --- SocketIO-iOSTests/SocketTestCases.swift | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift index 617fb13..b090e7d 100644 --- a/SocketIO-iOSTests/SocketTestCases.swift +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -113,10 +113,10 @@ class SocketTestCases: NSObject { let testName = "testJSONWithBuffer" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { - XCTAssertEqual(json.valueForKey("testString")! as! String, "test") - XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testString")! as! String), "test") + XCTAssertEqual((json.valueForKey("testNumber")! as! Int), 15) XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + XCTAssertEqual(((json.valueForKey("testArray")! as! Array).last! as! Int), 1) let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! XCTAssertEqual(string, "gakgakgak2") }else { @@ -132,11 +132,11 @@ class SocketTestCases: NSObject { let testName = "testJSON" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { - XCTAssertEqual(json.valueForKey("testString")! as! String, "test") - XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testString")! as! String), "test") + XCTAssertEqual(json.valueForKey("testNumber")! as? Int, 15) XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).first! as! Int, 1) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).first! as? Int, 1) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as? Int, 1) }else { XCTFail("Should have NSDictionary as result") @@ -168,13 +168,13 @@ class SocketTestCases: NSObject { return } if let array = result?.firstObject as? Array { - XCTAssertEqual(array.last! as! Int, 2) - XCTAssertEqual(array.first! as! Int, 1) + XCTAssertEqual((array.last! as! Int), 2) + XCTAssertEqual((array.first! as! Int), 1) }else { XCTFail("Should have Array as result") } if let dict = result?[1] as? NSDictionary { - XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + XCTAssertEqual((dict.valueForKey("test") as! String), "bob") }else { XCTFail("Should have NSDictionary as result") @@ -212,13 +212,13 @@ class SocketTestCases: NSObject { return } if let array = result?.firstObject as? Array { - XCTAssertEqual(array.last! as! Int, 2) - XCTAssertEqual(array.first! as! Int, 1) + XCTAssertEqual((array.last! as! Int), 2) + XCTAssertEqual((array.first! as! Int), 1) }else { XCTFail("Should have Array as result") } if let dict = result?[1] as? NSDictionary { - XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + XCTAssertEqual((dict.valueForKey("test") as! String), "bob") }else { XCTFail("Should have NSDictionary as result") From d0f091e9831d895cdd314e103d8644e1e7b0ab3b Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 07:44:01 +0200 Subject: [PATCH 69/95] remove unused variables --- SocketIOClientSwift/SocketIOClient.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2249698..218d900 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -31,8 +31,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var handlers = ContiguousArray() public private(set) var secure = false private var connectParams: [String: AnyObject]? - private var _secure = false - private var _reconnecting = false private var reconnectTimer: NSTimer? let reconnectAttempts: Int! From 25464ffb9de4a80c15b4c60eb0ff858c60b4bace Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 10 Aug 2015 15:47:59 +0200 Subject: [PATCH 70/95] objc suppoert --- SocketIOClientSwift/SocketTypes.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 8ced279..263653f 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -32,6 +32,7 @@ public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void -public enum SocketIOClientStatus { +@objc public enum SocketIOClientStatus: Int { case NotConnected, Closed, Connecting, Connected, Reconnecting + } From 42aced5e9c24903344876cc339088bae93a5d117 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 10 Aug 2015 11:00:01 -0400 Subject: [PATCH 71/95] don't remove engine --- SocketIOClientSwift/SocketIOClient.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 218d900..db7a023 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -130,7 +130,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient reconnects = false status = SocketIOClientStatus.Closed engine?.close(fast: fast) - engine = nil } /** From 0fd8a9540bd78280a9ad775fac5cfed1d778e671 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 10 Aug 2015 11:00:01 -0400 Subject: [PATCH 72/95] don't remove engine --- SocketIOClientSwift/SocketIOClient.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e55f8d1..aeb65ae 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -163,7 +163,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient _connected = false _reconnecting = false engine?.close(fast: fast) - engine = nil } /** From 848f7e5da74c1c600412664f089b7bac4fe5add3 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 11 Aug 2015 08:31:23 -0400 Subject: [PATCH 73/95] clean up enums --- SocketIOClientSwift/SocketEngine.swift | 34 ++++++++++-------------- SocketIOClientSwift/SocketIOClient.swift | 4 +-- SocketIOClientSwift/SocketPacket.swift | 30 ++++++++++----------- SocketIOClientSwift/SocketParser.swift | 16 +++++------ 4 files changed, 39 insertions(+), 45 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index a375844..23c5e53 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -80,13 +80,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { var ws:WebSocket? public enum PacketType: Int { - case OPEN = 0 - case CLOSE = 1 - case PING = 2 - case PONG = 3 - case MESSAGE = 4 - case UPGRADE = 5 - case NOOP = 6 + case Open, Close, Ping, Pong, Message, Upgrade, Noop init?(str: String?) { if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { @@ -126,7 +120,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { ws?.disconnect() if fast || polling { - write("", withType: PacketType.CLOSE, withData: nil) + write("", withType: PacketType.Close, withData: nil) client?.engineDidClose("Disconnect") } @@ -219,7 +213,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { "we'll probably disconnect soon. You should report this.", client: self) } - sendWebSocketMessage("", withType: PacketType.UPGRADE, datas: nil) + sendWebSocketMessage("", withType: PacketType.Upgrade, datas: nil) _websocket = true _polling = false fastUpgrade = false @@ -573,21 +567,21 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let type = PacketType(str: (message["^(\\d)"].groups()?[1])) ?? { self.checkIfMessageIsBase64Binary(message) - return PacketType.NOOP + return PacketType.Noop }() switch type { - case PacketType.MESSAGE: + case PacketType.Message: message.removeAtIndex(message.startIndex) handleMessage(message) - case PacketType.NOOP: + case PacketType.Noop: handleNOOP() - case PacketType.PONG: + case PacketType.Pong: handlePong(message) - case PacketType.OPEN: + case PacketType.Open: message.removeAtIndex(message.startIndex) handleOpen(message) - case PacketType.CLOSE: + case PacketType.Close: handleClose() default: SocketLogger.log("Got unknown packet type", client: self) @@ -596,16 +590,16 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private func probeWebSocket() { if websocketConnected { - sendWebSocketMessage("probe", withType: PacketType.PING) + sendWebSocketMessage("probe", withType: PacketType.Ping) } } /// Send an engine message (4) public func send(msg: String, withData datas: [NSData]?) { if probing { - probeWait.append((msg, PacketType.MESSAGE, datas)) + probeWait.append((msg, PacketType.Message, datas)) } else { - write(msg, withType: PacketType.MESSAGE, withData: datas) + write(msg, withType: PacketType.Message, withData: datas) } } @@ -618,7 +612,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } ++pongsMissed - write("", withType: PacketType.PING, withData: nil) + write("", withType: PacketType.Ping, withData: nil) } /// Send polling message. @@ -687,7 +681,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { SocketLogger.log("Upgrading transport to WebSockets", client: self) fastUpgrade = true - sendPollMessage("", withType: PacketType.NOOP) + sendPollMessage("", withType: PacketType.Noop) // After this point, we should not send anymore polling messages } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index db7a023..ed0eafd 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -278,7 +278,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient SocketLogger.log("Emitting: %@", client: self, args: str) - if packet.type == SocketPacket.PacketType.BINARY_EVENT { + if packet.type == SocketPacket.PacketType.BinaryEvent { engine?.send(str, withData: packet.binary) } else { engine?.send(str, withData: nil) @@ -294,7 +294,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient SocketLogger.log("Emitting Ack: %@", client: this, args: str) - if packet.type == SocketPacket.PacketType.BINARY_ACK { + if packet.type == SocketPacket.PacketType.BinaryAck { this.engine?.send(str, withData: packet.binary) } else { this.engine?.send(str, withData: nil) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index a127143..01d9eac 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -31,13 +31,13 @@ struct SocketPacket { let type: PacketType enum PacketType: Int { - case CONNECT = 0 - case DISCONNECT = 1 - case EVENT = 2 - case ACK = 3 - case ERROR = 4 - case BINARY_EVENT = 5 - case BINARY_ACK = 6 + case Connect = 0 + case Disconnect = 1 + case Event = 2 + case Ack = 3 + case Error = 4 + case BinaryEvent = 5 + case BinaryAck = 6 init?(str: String) { if let int = Int(str), raw = PacketType(rawValue: int) { @@ -129,7 +129,7 @@ struct SocketPacket { func createAck() -> String { let msg: String - if type == PacketType.ACK { + if type == PacketType.Ack { if nsp == "/" { msg = "3\(id)[" } else { @@ -150,7 +150,7 @@ struct SocketPacket { func createMessageForEvent(event: String) -> String { let message: String - if type == PacketType.EVENT { + if type == PacketType.Event { if nsp == "/" { if id == -1 { message = "2[\"\(event)\"" @@ -235,7 +235,7 @@ struct SocketPacket { if data.count == 0 { return nil } else { - if type == PacketType.EVENT || type == PacketType.BINARY_EVENT { + if type == PacketType.Event || type == PacketType.BinaryEvent { arr.removeAtIndex(0) return arr } else { @@ -249,15 +249,15 @@ extension SocketPacket { private static func findType(binCount: Int, ack: Bool) -> PacketType { switch binCount { case 0 where !ack: - return PacketType.EVENT + return PacketType.Event case 0 where ack: - return PacketType.ACK + return PacketType.Ack case _ where !ack: - return PacketType.BINARY_EVENT + return PacketType.BinaryEvent case _ where ack: - return PacketType.BINARY_ACK + return PacketType.BinaryAck default: - return PacketType.ERROR + return PacketType.Error } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 7901120..23c4e72 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -191,19 +191,19 @@ class SocketParser { SocketLogger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p.description) switch p.type { - case SocketPacket.PacketType.EVENT: + case SocketPacket.PacketType.Event: handleEvent(p, socket: socket) - case SocketPacket.PacketType.ACK: + case SocketPacket.PacketType.Ack: handleAck(p, socket: socket) - case SocketPacket.PacketType.BINARY_EVENT: + case SocketPacket.PacketType.BinaryEvent: handleBinaryEvent(p, socket: socket) - case SocketPacket.PacketType.BINARY_ACK: + case SocketPacket.PacketType.BinaryAck: handleBinaryAck(p, socket: socket) - case SocketPacket.PacketType.CONNECT: + case SocketPacket.PacketType.Connect: handleConnect(p, socket: socket) - case SocketPacket.PacketType.DISCONNECT: + case SocketPacket.PacketType.Disconnect: socket.didDisconnect("Got Disconnect") - case SocketPacket.PacketType.ERROR: + case SocketPacket.PacketType.Error: socket.didError("Error: \(p.data)") } } @@ -223,7 +223,7 @@ class SocketParser { var packet = socket.waitingData.removeAtIndex(0) packet.fillInPlaceholders() - if packet.type != SocketPacket.PacketType.BINARY_ACK { + if packet.type != SocketPacket.PacketType.BinaryAck { socket.handleEvent(packet.getEvent(), data: packet.getArgs(), wantsAck: packet.id) } else { From b563334d14a57537e7eda4ad71be448fc23add1a Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 11 Aug 2015 08:33:11 -0400 Subject: [PATCH 74/95] clean up enums --- SocketIOClientSwift/SocketPacket.swift | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 01d9eac..adff5b0 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -31,13 +31,7 @@ struct SocketPacket { let type: PacketType enum PacketType: Int { - case Connect = 0 - case Disconnect = 1 - case Event = 2 - case Ack = 3 - case Error = 4 - case BinaryEvent = 5 - case BinaryAck = 6 + case Connect, Disconnect, Event, Ack, Error, BinaryEvent, BinaryAck init?(str: String) { if let int = Int(str), raw = PacketType(rawValue: int) { From 884b73c777822f0a3d41aee3056809b14f67c676 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 11 Aug 2015 09:54:59 -0400 Subject: [PATCH 75/95] clean up --- SocketIOClientSwift/SocketEngine.swift | 36 +++++++++--------------- SocketIOClientSwift/SocketIOClient.swift | 5 ++-- SocketIOClientSwift/SocketPacket.swift | 6 ++-- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 23c5e53..24913bd 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -36,7 +36,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private let session:NSURLSession! private var closed = false - private var _connected = false private var extraHeaders: [String: String]? private var fastUpgrade = false private var forcePolling = false @@ -51,32 +50,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private var pongsMissed = 0 private var pongsMissedMax = 0 private var postWait = [String]() - private var _polling = true private var probing = false private var probeWait = ProbeWaitQueue() private var waitingForPoll = false private var waitingForPost = false - private var _websocket = false private var websocketConnected = false let logType = "SocketEngine" - var connected: Bool { - return _connected - } + private(set) var connected = false + private(set) var polling = true + private(set) var websocket = false + weak var client: SocketEngineClient? var cookies: [NSHTTPCookie]? var log = false - var polling: Bool { - return _polling - } var sid = "" var socketPath = "" var urlPolling: String? var urlWebSocket: String? - var websocket: Bool { - return _websocket - } var ws:WebSocket? public enum PacketType: Int { @@ -214,8 +206,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } sendWebSocketMessage("", withType: PacketType.Upgrade, datas: nil) - _websocket = true - _polling = false + websocket = true + polling = false fastUpgrade = false probing = false flushProbeWait() @@ -409,7 +401,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { options: NSJSONReadingOptions.AllowFragments) as? NSDictionary if let sid = json?["sid"] as? String { self.sid = sid - _connected = true + connected = true if !forcePolling && !forceWebsockets { createWebsocket(andConnect: true) @@ -442,7 +434,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { // A poll failed, tell the client about it private func handlePollingFailed(reason: String) { - _connected = false + connected = false ws?.disconnect() pingTimer?.invalidate() waitingForPoll = false @@ -475,8 +467,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { (urlPolling, urlWebSocket) = createURLs(opts) if forceWebsockets { - _polling = false - _websocket = true + polling = false + websocket = true createWebsocket(andConnect: true) return } @@ -731,9 +723,9 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { probing = true probeWebSocket() } else { - _connected = true + connected = true probing = false - _polling = false + polling = false } } @@ -748,8 +740,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if websocket { pingTimer?.invalidate() - _connected = false - _websocket = false + connected = false + websocket = false let reason = error?.localizedDescription ?? "Socket Disconnected" diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index ed0eafd..8405c0d 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -26,10 +26,8 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient { private var anyHandler:((SocketAnyEvent) -> Void)? - public private(set) var status = SocketIOClientStatus.NotConnected private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() - public private(set) var secure = false private var connectParams: [String: AnyObject]? private var reconnectTimer: NSTimer? @@ -45,6 +43,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let handleQueue: dispatch_queue_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) + public private(set) var secure = false + public private(set) var status = SocketIOClientStatus.NotConnected + public var engine:SocketEngine? public var nsp = "/" public var opts: [String: AnyObject]? diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index adff5b0..27c4674 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -272,8 +272,8 @@ extension SocketPacket { } } -extension SocketPacket { - private static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject { +private extension SocketPacket { + static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": binary.count] @@ -301,7 +301,7 @@ extension SocketPacket { } } - private static func deconstructData(var data: [AnyObject]) -> ([AnyObject], [NSData]) { + static func deconstructData(var data: [AnyObject]) -> ([AnyObject], [NSData]) { var binary = [NSData]() for i in 0.. Date: Tue, 11 Aug 2015 10:03:35 -0400 Subject: [PATCH 76/95] style --- SocketIOClientSwift/SocketIOClient.swift | 55 ++++++++++++------------ 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 8405c0d..e3eee01 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -145,31 +145,31 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { - guard status != SocketIOClientStatus.Connected else { - return - } - if status == SocketIOClientStatus.Closed { - SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) - } - - status = SocketIOClientStatus.Connecting - addEngine() - engine?.open(connectParams) - - guard timeoutAfter != 0 else { - return - } - - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) - - dispatch_after(time, dispatch_get_main_queue()) {[weak self] in - if let this = self where this.status != SocketIOClientStatus.Connected { - this.status = SocketIOClientStatus.Closed - this.engine?.close(fast: true) - - handler?() + guard status != SocketIOClientStatus.Connected else { + return + } + if status == SocketIOClientStatus.Closed { + SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) + } + + status = SocketIOClientStatus.Connecting + addEngine() + engine?.open(connectParams) + + guard timeoutAfter != 0 else { + return + } + + let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) + + dispatch_after(time, dispatch_get_main_queue()) {[weak self] in + if let this = self where this.status != SocketIOClientStatus.Connected { + this.status = SocketIOClientStatus.Closed + this.engine?.close(fast: true) + + handler?() + } } - } } private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback { @@ -379,8 +379,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Joins namespace / */ - public func joinNamespace(namespace:String) { - self.nsp = namespace + public func joinNamespace(namespace: String) { + self.nsp = namespace joinNamespace() } @@ -452,10 +452,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient tryReconnect() } - @objc private func tryReconnect() { + @objc prgivate func tryReconnect() { guard status != SocketIOClientStatus.Connected else { return } + if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() didDisconnect("Reconnect Failed") From c2b927fd02a96507074b400e658c7e316e52ed5d Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 11 Aug 2015 10:04:43 -0400 Subject: [PATCH 77/95] oops --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e3eee01..b00a196 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -436,7 +436,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } public func parseSocketMessage(msg: String) { - SocketParser.parseSocketMessage(msg, socket: self) + SocketPargser.parseSocketMessage(msg, socket: self) } public func parseBinaryData(data: NSData) { @@ -452,7 +452,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient tryReconnect() } - @objc prgivate func tryReconnect() { + @objc private func tryReconnect() { guard status != SocketIOClientStatus.Connected else { return } From 5e92fc323d8ca8ea405ce59d50d594a7678353f6 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 11 Aug 2015 10:05:35 -0400 Subject: [PATCH 78/95] dammit --- SocketIOClientSwift/SocketIOClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index b00a196..7e98c30 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -436,7 +436,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } public func parseSocketMessage(msg: String) { - SocketPargser.parseSocketMessage(msg, socket: self) + SocketParser.parseSocketMessage(msg, socket: self) } public func parseBinaryData(data: NSData) { From 7ebcd7439f08054822f5654815d50e473cf56540 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 13 Aug 2015 09:56:22 -0400 Subject: [PATCH 79/95] refactor, fix reconnect bug, fix internalmessages --- SocketIOClientSwift/SocketAnyEvent.swift | 5 ++- SocketIOClientSwift/SocketEngine.swift | 4 +-- SocketIOClientSwift/SocketIOClient.swift | 39 +++++++++++++----------- SocketIOClientSwift/SocketParser.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 6 +++- SocketIOClientSwift/WebSocket.swift | 12 ++++---- 6 files changed, 40 insertions(+), 28 deletions(-) diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 3b3e97e..9e951fd 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -24,9 +24,12 @@ import Foundation -public final class SocketAnyEvent: NSObject { +@objc public final class SocketAnyEvent: NSObject { public let event: String! public let items: NSArray? + override public var description: String { + return "SocketAnyEvent: Event: \(event) items: \(items ?? nil)" + } init(event: String, items: NSArray?) { self.event = event diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 24913bd..fd58a7e 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -33,7 +33,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL) private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL) private let handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL) - private let session:NSURLSession! + private let session: NSURLSession! private var closed = false private var extraHeaders: [String: String]? @@ -748,7 +748,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if error != nil { client?.didError(reason) } - + client?.engineDidClose(reason) } else { flushProbeWait() diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 7e98c30..fc95d73 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -309,6 +309,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient if status == SocketIOClientStatus.Closed || !reconnects { didDisconnect(reason) } else if status != SocketIOClientStatus.Reconnecting { + status = SocketIOClientStatus.Reconnecting handleEvent("reconnect", data: [reason], isInternalMessage: true) tryReconnect() } @@ -326,9 +327,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** 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, + public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage: Bool, wantsAck ack:Int? = nil) { - guard status == SocketIOClientStatus.Connected && !isInternalMessage else { + guard status == SocketIOClientStatus.Connected || isInternalMessage else { return } // println("Should do event: \(event) with data: \(data)") @@ -444,26 +445,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } /** - Trieds to reconnect to the server. + Tries to reconnect to the server. */ public func reconnect() { - status = SocketIOClientStatus.Reconnecting engine?.stopPolling() tryReconnect() } - @objc private func tryReconnect() { - guard status != SocketIOClientStatus.Connected else { - return - } - - if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { - clearReconnectTimer() - didDisconnect("Reconnect Failed") - - return - } - + private func tryReconnect() { if reconnectTimer == nil { SocketLogger.log("Starting reconnect", client: self) @@ -472,10 +461,26 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient dispatch_async(dispatch_get_main_queue()) {[weak self] in if let this = self { this.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(this.reconnectWait), - target: this, selector: "tryReconnect", userInfo: nil, repeats: true) + target: this, selector: "_tryReconnect", userInfo: nil, repeats: true) } } } + } + + @objc private func _tryReconnect() { + if status == SocketIOClientStatus.Connected { + clearReconnectTimer() + + return + } + + + if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { + clearReconnectTimer() + didDisconnect("Reconnect Failed") + + return + } SocketLogger.log("Trying to reconnect", client: self) handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt], diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 23c4e72..933413f 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -225,7 +225,7 @@ class SocketParser { if packet.type != SocketPacket.PacketType.BinaryAck { socket.handleEvent(packet.getEvent(), data: packet.getArgs(), - wantsAck: packet.id) + isInternalMessage: false, wantsAck: packet.id) } else { socket.handleAck(packet.id, data: packet.getArgs()) } diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 263653f..d47e5b8 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -32,7 +32,11 @@ public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void -@objc public enum SocketIOClientStatus: Int { +@objc public enum SocketIOClientStatus: Int, CustomStringConvertible { + public var description: String { + return String(self.rawValue) + } + case NotConnected, Closed, Connecting, Connected, Reconnecting } diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index c82b08b..c2796f3 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -93,7 +93,7 @@ public class WebSocket : NSObject, NSStreamDelegate { public var headers = Dictionary() public var voipEnabled = false public var selfSignedSSL = false - public var security: Security? + private var security: Security? public var isConnected :Bool { return connected } @@ -771,8 +771,8 @@ public class SSLCert { } } -public class Security { - public var validatedDN = true //should the domain name be validated? +private class Security { + private var validatedDN = true //should the domain name be validated? var isReady = false //is the key processing done? var certificates: [NSData]? //the certificates @@ -786,7 +786,7 @@ public class Security { :returns: a representation security object to be used with */ - public convenience init(usePublicKeys: Bool = false) { + private convenience init(usePublicKeys: Bool = false) { let paths = NSBundle.mainBundle().pathsForResourcesOfType("cer", inDirectory: ".") var collect = Array() for path in paths { @@ -805,7 +805,7 @@ public class Security { :returns: a representation security object to be used with */ - public init(certs: [SSLCert], usePublicKeys: Bool) { + private init(certs: [SSLCert], usePublicKeys: Bool) { self.usePublicKeys = usePublicKeys if self.usePublicKeys { @@ -842,7 +842,7 @@ public class Security { :returns: if the key was successfully validated */ - public func isValid(trust: SecTrustRef, domain: String?) -> Bool { + private func isValid(trust: SecTrustRef, domain: String?) -> Bool { var tries = 0 while(!self.isReady) { From 2cafec6f12a9372469d771f31112929fd3d6f28b Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 14 Aug 2015 16:20:43 -0400 Subject: [PATCH 80/95] move enum, better description --- .../project.pbxproj | 10 ++++ SocketIOClientSwift/SocketAckManager.swift | 2 +- SocketIOClientSwift/SocketAnyEvent.swift | 2 +- SocketIOClientSwift/SocketEngine.swift | 2 +- SocketIOClientSwift/SocketEngineClient.swift | 2 +- SocketIOClientSwift/SocketEventHandler.swift | 2 +- SocketIOClientSwift/SocketFixUTF8.swift | 2 +- SocketIOClientSwift/SocketIOClient.swift | 2 +- .../SocketIOClientStatus.swift | 51 +++++++++++++++++++ SocketIOClientSwift/SocketLogger.swift | 2 +- SocketIOClientSwift/SocketPacket.swift | 2 +- SocketIOClientSwift/SocketParser.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 11 +--- 13 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 SocketIOClientSwift/SocketIOClientStatus.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 653762f..c02cda4 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -38,6 +38,10 @@ 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; }; + 74781D5B1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; }; + 74781D5C1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; }; + 74781D5D1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; }; 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; }; 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; @@ -102,6 +106,7 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; + 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketIOClientStatus.swift; path = SocketIOClientSwift/SocketIOClientStatus.swift; sourceTree = ""; }; 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; @@ -252,6 +257,7 @@ 5764DF801B51F254004FF46E /* SocketEventHandler.swift */, 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */, 5764DF821B51F254004FF46E /* SocketIOClient.swift */, + 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */, 5764DF831B51F254004FF46E /* SocketLogger.swift */, 5764DF841B51F254004FF46E /* SocketPacket.swift */, 5764DF851B51F254004FF46E /* SocketParser.swift */, @@ -444,6 +450,7 @@ 5764DF951B51F254004FF46E /* SocketIOClient.swift in Sources */, 5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */, 5764DF971B51F254004FF46E /* SocketLogger.swift in Sources */, + 74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */, 5764DF991B51F254004FF46E /* SocketPacket.swift in Sources */, 5764DF891B51F254004FF46E /* SocketAckManager.swift in Sources */, @@ -471,6 +478,7 @@ 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */, 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, + 74781D5B1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, @@ -491,6 +499,7 @@ 5764DF961B51F254004FF46E /* SocketIOClient.swift in Sources */, 5764DF8C1B51F254004FF46E /* SocketAnyEvent.swift in Sources */, 5764DF981B51F254004FF46E /* SocketLogger.swift in Sources */, + 74781D5C1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */, 5764DF9A1B51F254004FF46E /* SocketPacket.swift in Sources */, 5764DF8A1B51F254004FF46E /* SocketAckManager.swift in Sources */, @@ -503,6 +512,7 @@ buildActionMask = 2147483647; files = ( 572EF24A1B51F18A00EEBB58 /* SocketIO_MacTests.swift in Sources */, + 74781D5D1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SocketIOClientSwift/SocketAckManager.swift b/SocketIOClientSwift/SocketAckManager.swift index c206109..c707a23 100644 --- a/SocketIOClientSwift/SocketAckManager.swift +++ b/SocketIOClientSwift/SocketAckManager.swift @@ -1,6 +1,6 @@ // // SocketAckManager.swift -// SocketIO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 4/3/15. // diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 9e951fd..fdaa315 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -1,6 +1,6 @@ // // SocketAnyEvent.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 3/28/15. // diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index fd58a7e..1c6a465 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -1,6 +1,6 @@ // // SocketEngine.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 3/3/15. // diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index fe16367..bf22886 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -1,6 +1,6 @@ // // SocketEngineClient.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 3/19/15. // diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index ef4ede3..307d6b6 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -1,6 +1,6 @@ // // EventHandler.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 1/18/15. // diff --git a/SocketIOClientSwift/SocketFixUTF8.swift b/SocketIOClientSwift/SocketFixUTF8.swift index 4061303..0cffd86 100644 --- a/SocketIOClientSwift/SocketFixUTF8.swift +++ b/SocketIOClientSwift/SocketFixUTF8.swift @@ -1,6 +1,6 @@ // // SocketFixUTF8.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 3/16/15. // diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index fc95d73..4c240a0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -1,6 +1,6 @@ // // SocketIOClient.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 11/23/14. // diff --git a/SocketIOClientSwift/SocketIOClientStatus.swift b/SocketIOClientSwift/SocketIOClientStatus.swift new file mode 100644 index 0000000..7ca333c --- /dev/null +++ b/SocketIOClientSwift/SocketIOClientStatus.swift @@ -0,0 +1,51 @@ +// +// SocketIOClientStatus.swift +// Socket.IO-Client-Swift +// +// Created by Erik Little on 8/14/15. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Foundation + +@objc public enum SocketIOClientStatus: Int, CustomStringConvertible { + public var description: String { + let des: String + + switch self.rawValue { + case 0: + des = "Not Connected" + case 1: + des = "Closed" + case 2: + des = "Connecting" + case 3: + des = "Connected" + case 4: + des = "Reconnecting" + default: + des = "Unknown State" + } + + return des + } + + case NotConnected, Closed, Connecting, Connected, Reconnecting + +} \ No newline at end of file diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 65f1156..abef5d2 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -1,6 +1,6 @@ // // SocketLogger.swift -// SocketIO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 4/11/15. // diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 27c4674..6d57787 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -1,6 +1,6 @@ // // SocketPacket.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 1/18/15. // diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 933413f..c56282a 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -1,6 +1,6 @@ // // SocketParser.swift -// Socket.IO-Swift +// Socket.IO-Client-Swift // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index d47e5b8..e27bbe3 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -1,6 +1,6 @@ // // SocketTypes.swift -// SocketIO-Swift +// Socket.IO-Client-Swift // // Created by Erik Little on 4/8/15. // @@ -31,12 +31,3 @@ public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void - -@objc public enum SocketIOClientStatus: Int, CustomStringConvertible { - public var description: String { - return String(self.rawValue) - } - - case NotConnected, Closed, Connecting, Connected, Reconnecting - -} From f752507a1183a9d84d7e8d09ae51a0cb00a53b8f Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 14 Aug 2015 22:08:33 -0400 Subject: [PATCH 81/95] style --- SocketIOClientSwift/SocketIOClient.swift | 10 +++++----- SocketIOClientSwift/SocketIOClientStatus.swift | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 4c240a0..236bdbc 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -237,14 +237,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Send a message to the server */ - public func emit(event:String, _ items:AnyObject...) { + public func emit(event: String, _ items: AnyObject...) { emit(event, withItems: items) } /** Same as emit, but meant for Objective-C */ - public func emit(event:String, withItems items:[AnyObject]) { + public func emit(event: String, withItems items: [AnyObject]) { guard status == SocketIOClientStatus.Connected else { return } @@ -258,18 +258,18 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add an ack. */ - public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { + public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { return createOnAck(event, items: items) } /** Same as emitWithAck, but for Objective-C */ - public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { + public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { return createOnAck(event, items: items) } - private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { + private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { guard status == SocketIOClientStatus.Connected else { return } diff --git a/SocketIOClientSwift/SocketIOClientStatus.swift b/SocketIOClientSwift/SocketIOClientStatus.swift index 7ca333c..1817f51 100644 --- a/SocketIOClientSwift/SocketIOClientStatus.swift +++ b/SocketIOClientSwift/SocketIOClientStatus.swift @@ -28,7 +28,7 @@ import Foundation public var description: String { let des: String - switch self.rawValue { + switch rawValue { case 0: des = "Not Connected" case 1: From 09a26c0b1c9e6422134ea1a51373c10a0c2e6e72 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 17 Aug 2015 00:04:13 -0400 Subject: [PATCH 82/95] remove all data on engine close --- SocketIOClientSwift/SocketIOClient.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 236bdbc..b6e2092 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -306,6 +306,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } public func engineDidClose(reason:String) { + waitingData.removeAll() + if status == SocketIOClientStatus.Closed || !reconnects { didDisconnect(reason) } else if status != SocketIOClientStatus.Reconnecting { From 6ee1daeaf7dfb710efba36fd590d551aa1dc7ab9 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 17 Aug 2015 00:09:04 -0400 Subject: [PATCH 83/95] fix bug in websocket library --- SocketIOClientSwift/WebSocket.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 810f1b4..2fdb8f2 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -495,7 +495,7 @@ public class WebSocket : NSObject, NSStreamDelegate { dataLength = UInt64(bytes[0].bigEndian) offset += sizeof(UInt16) } - if bufferLen < offset { + if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { fragBuffer = NSData(bytes: buffer, length: bufferLen) return } From 9c3d991bed4d7503bb4674e61cf4137633e11d84 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 17 Aug 2015 00:09:04 -0400 Subject: [PATCH 84/95] fix bug in websocket library --- SocketIOClientSwift/WebSocket.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index c2796f3..666cf38 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -495,7 +495,7 @@ public class WebSocket : NSObject, NSStreamDelegate { dataLength = UInt64(bytes[0].bigEndian) offset += sizeof(UInt16) } - if bufferLen < offset { + if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { fragBuffer = NSData(bytes: buffer, length: bufferLen) return } From 46cea36df795b8418eb7d8957f721129b0b8f044 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 17 Aug 2015 00:15:39 -0400 Subject: [PATCH 85/95] bump version --- README.md | 4 ++-- Socket.IO-Client-Swift.podspec | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 25ccaa2..b985e03 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 2.4.2 # Or latest version +github "socketio/socket.io-client-swift" ~> 2.4.3 # Or latest version ``` Run `carthage update`. @@ -79,7 +79,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 2.4.2' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 2.4.3' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index b20853b..ed772a2 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 = "2.4.2" + s.version = "2.4.3" s.summary = "Socket.IO-client for iOS and OS X" s.description = <<-DESC Socket.IO-client for iOS and OS X. @@ -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 => 'v2.4.2' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v2.4.3' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From aa43107ad69795f61381a7841b185c712c1729f4 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 17 Aug 2015 11:43:16 -0400 Subject: [PATCH 86/95] remove unused dispatch queue --- SocketIOClientSwift/SocketIOClient.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index b6e2092..4c3d15e 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -39,7 +39,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient var waitingData = [SocketPacket]() public let socketURL: String - public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue: dispatch_queue_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) From 4c9d6ef3def1b7fc6c8ec99d51105c1afe4e5325 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 17 Aug 2015 14:47:14 -0400 Subject: [PATCH 87/95] refactor socketpacket --- SocketIOClientSwift/SocketEventHandler.swift | 4 +- SocketIOClientSwift/SocketIOClient.swift | 34 ++++++------- SocketIOClientSwift/SocketPacket.swift | 52 +++++++++++--------- 3 files changed, 48 insertions(+), 42 deletions(-) diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 307d6b6..05efb10 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -26,12 +26,12 @@ import Foundation private func emitAckCallback(socket: SocketIOClient?, num: Int?) (items: AnyObject...) -> Void { - socket?.emitAck(num ?? -1, withData: items) + socket?.emitAck(num ?? -1, withItems: items) } private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) (items: NSArray) -> Void { - socket?.emitAck(num ?? -1, withData: items as [AnyObject]) + socket?.emitAck(num ?? -1, withItems: items as [AnyObject]) } struct SocketEventHandler { diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 4c3d15e..8c53b8f 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient { - private var anyHandler:((SocketAnyEvent) -> Void)? + private var anyHandler: ((SocketAnyEvent) -> Void)? private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() private var connectParams: [String: AnyObject]? @@ -38,19 +38,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient var log = false var waitingData = [SocketPacket]() - public let socketURL: String - public let handleQueue: dispatch_queue_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) + public let handleQueue: dispatch_queue_t! + public let socketURL: String + public private(set) var engine: SocketEngine? public private(set) var secure = false public private(set) var status = SocketIOClientStatus.NotConnected - - public var engine:SocketEngine? + public var nsp = "/" public var opts: [String: AnyObject]? public var reconnects = true public var reconnectWait = 10 - public var sid:String? { + public var sid: String? { return engine?.sid } @@ -171,13 +171,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback { + private func createOnAck(items: [AnyObject]) -> OnAckCallback { return {[weak self, ack = ++currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) dispatch_async(this.emitQueue) {[weak this] in - this?._emit(event, items, ack: ack) + this?._emit(items, ack: ack) } if timeout != 0 { @@ -249,7 +249,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } dispatch_async(emitQueue) {[weak self] in - self?._emit(event, items) + self?._emit([event] + items) } } @@ -258,23 +258,23 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient an ack. */ public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { - return createOnAck(event, items: items) + return emitWithAck(event, withItems: items) } /** Same as emitWithAck, but for Objective-C */ public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { - return createOnAck(event, items: items) + return createOnAck([event] + items) } - private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { + private func _emit(data: [AnyObject], ack: Int? = nil) { guard status == SocketIOClientStatus.Connected else { return } - let packet = SocketPacket.packetFromEmitWithData(args, id: ack ?? -1, nsp: nsp) - let str = packet.createMessageForEvent(event) + let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false) + let str = packet.packetString SocketLogger.log("Emitting: %@", client: self, args: str) @@ -286,11 +286,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // If the server wants to know that the client received data - func emitAck(ack: Int, withData args: [AnyObject]) { + func emitAck(ack: Int, withItems items: [AnyObject]) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.status == SocketIOClientStatus.Connected { - let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) - let str = packet.createAck() + let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true) + let str = packet.packetString SocketLogger.log("Emitting Ack: %@", client: this, args: str) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 6d57787..221acff 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -57,6 +57,10 @@ struct SocketPacket { return better } + var packetString: String { + return createPacketString() + } + init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) { self.data = data @@ -86,8 +90,6 @@ struct SocketPacket { private func completeMessage(var message: String, ack: Bool) -> String { if data.count == 0 { return message + "]" - } else if !ack { - message += "," } for arg in data { @@ -120,7 +122,7 @@ struct SocketPacket { return message + "]" } - func createAck() -> String { + private func createAck() -> String { let msg: String if type == PacketType.Ack { @@ -141,35 +143,35 @@ struct SocketPacket { } - func createMessageForEvent(event: String) -> String { + private func createMessageForEvent() -> String { let message: String if type == PacketType.Event { if nsp == "/" { if id == -1 { - message = "2[\"\(event)\"" + message = "2[" } else { - message = "2\(id)[\"\(event)\"" + message = "2\(id)[" } } else { if id == -1 { - message = "2\(nsp),[\"\(event)\"" + message = "2\(nsp),[" } else { - message = "2\(nsp),\(id)[\"\(event)\"" + message = "2\(nsp),\(id)[" } } } else { if nsp == "/" { if id == -1 { - message = "5\(binary.count)-[\"\(event)\"" + message = "5\(binary.count)-[" } else { - message = "5\(binary.count)-\(id)[\"\(event)\"" + message = "5\(binary.count)-\(id)[" } } else { if id == -1 { - message = "5\(binary.count)-\(nsp),[\"\(event)\"" + message = "5\(binary.count)-\(nsp),[" } else { - message = "5\(binary.count)-\(nsp),\(id)[\"\(event)\"" + message = "5\(binary.count)-\(nsp),\(id)[" } } } @@ -177,6 +179,18 @@ struct SocketPacket { return completeMessage(message, ack: false) } + private func createPacketString() -> String { + let str: String + + if type == PacketType.Event || type == PacketType.BinaryEvent { + str = createMessageForEvent() + } else { + str = createAck() + } + + return str + } + mutating func fillInPlaceholders() { let newArr = NSMutableArray(array: data) @@ -255,17 +269,9 @@ extension SocketPacket { } } - static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - - static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, + static func packetFromEmit(items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket { + let (parsedData, binary) = deconstructData(items) + let packet = SocketPacket(type: findType(binary.count, ack: ack), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) return packet From 58097fa39e64685d5b36c735d8a5741a67ac10ef Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 18 Aug 2015 10:05:51 -0400 Subject: [PATCH 88/95] leave it up to the engineclient how to handle messages --- SocketIOClientSwift/SocketEngine.swift | 16 ++++------------ SocketIOClientSwift/SocketEngineClient.swift | 1 - SocketIOClientSwift/SocketIOClient.swift | 14 +++++++++++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 1c6a465..cbd5c61 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -373,19 +373,15 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { end: advance(message.startIndex, 2))) if let data = NSData(base64EncodedString: message, - options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters), client = client { - dispatch_async(client.handleQueue) {[weak self] in - self?.client?.parseBinaryData(data) - } + options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { + client?.parseBinaryData(data) } } } private func handleMessage(message: String) { if let client = client { - dispatch_async(client.handleQueue) {[weak client] in - client?.parseSocketMessage(message) - } + client.parseSocketMessage(message) } } @@ -543,11 +539,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func parseEngineData(data: NSData) { - if let client = client { - dispatch_async(client.handleQueue) {[weak self] in - self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) - } - } + client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) } private func parseEngineMessage(var message: String, fromPolling: Bool) { diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index bf22886..bc0f4ae 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -26,7 +26,6 @@ import Foundation @objc public protocol SocketEngineClient { - var handleQueue: dispatch_queue_t! {get} var socketURL: String {get} var secure: Bool {get} diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 8c53b8f..2612ca6 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -45,7 +45,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public private(set) var engine: SocketEngine? public private(set) var secure = false public private(set) var status = SocketIOClientStatus.NotConnected - + public var nsp = "/" public var opts: [String: AnyObject]? public var reconnects = true @@ -438,11 +438,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } public func parseSocketMessage(msg: String) { - SocketParser.parseSocketMessage(msg, socket: self) + dispatch_async(handleQueue) {[weak self] in + if let this = self { + SocketParser.parseSocketMessage(msg, socket: this) + } + } } public func parseBinaryData(data: NSData) { - SocketParser.parseBinaryData(data, socket: self) + dispatch_async(handleQueue) {[weak self] in + if let this = self { + SocketParser.parseBinaryData(data, socket: this) + } + } } /** From 2351637ab46903f94f6a1fe12995a51c93f041ab Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 18 Aug 2015 10:07:57 -0400 Subject: [PATCH 89/95] don't need to unwrap --- SocketIOClientSwift/SocketEngine.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index cbd5c61..802abd1 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -380,9 +380,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func handleMessage(message: String) { - if let client = client { - client.parseSocketMessage(message) - } + client?.parseSocketMessage(message) } private func handleNOOP() { From 4fdb49ea2fe0a87e5bc6add8259f54a69f38646c Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 18 Aug 2015 10:19:58 -0400 Subject: [PATCH 90/95] use static variable for log --- SocketIOClientSwift/SocketEngine.swift | 2 -- SocketIOClientSwift/SocketIOClient.swift | 3 +-- SocketIOClientSwift/SocketLogger.swift | 6 +++--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 802abd1..ad05f70 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -64,7 +64,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { weak var client: SocketEngineClient? var cookies: [NSHTTPCookie]? - var log = false var sid = "" var socketPath = "" var urlPolling: String? @@ -94,7 +93,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false forcePolling = opts?["forcePolling"] as? Bool ?? false cookies = opts?["cookies"] as? [NSHTTPCookie] - log = opts?["log"] as? Bool ?? false socketPath = opts?["path"] as? String ?? "" extraHeaders = opts?["extraHeaders"] as? [String: String] } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2612ca6..d606152 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -35,7 +35,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let logType = "SocketClient" var ackHandlers = SocketAckManager() var currentAck = -1 - var log = false var waitingData = [SocketPacket]() public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) @@ -73,7 +72,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } if let log = opts?["log"] as? Bool { - self.log = log + SocketLogger.log = log } if let nsp = opts?["nsp"] as? String { diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index abef5d2..5071c02 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -25,19 +25,19 @@ import Foundation protocol SocketLogClient { - var log: Bool {get set} var logType: String {get} } final class SocketLogger { private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) + static var log = false private static func toCVArgType(item: AnyObject) -> CVarArgType { return String(item) } static func log(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { - if !client.log { + if !log { return } @@ -50,7 +50,7 @@ final class SocketLogger { } static func err(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { - if !client.log { + if !log { return } From ccd6dcbf0a05d5c0ddc564a1b385beba3715c8c3 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 25 Aug 2015 09:31:33 -0400 Subject: [PATCH 91/95] update for latest beta --- SocketIOClientSwift/SocketEngine.swift | 2 +- SocketIOClientSwift/SocketParser.swift | 2 +- SocketIOClientSwift/WebSocket.swift | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index ad05f70..dd3b3a9 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -368,7 +368,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if message.hasPrefix("b4") { // binary in base64 string message.removeRange(Range(start: message.startIndex, - end: advance(message.startIndex, 2))) + end: message.startIndex.advancedBy(2))) if let data = NSData(base64EncodedString: message, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index c56282a..ef92c46 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -138,7 +138,7 @@ class SocketParser { } if ++i < arr.count { - let d = str[advance(str.startIndex, i)...advance(str.startIndex, str.characters.count-1)] + let d = str[str.startIndex.advancedBy(i)...str.startIndex.advancedBy(str.characters.count-1)] let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 666cf38..04192a4 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -190,7 +190,7 @@ public class WebSocket : NSObject, NSStreamDelegate { self.addHeader(urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue) self.addHeader(urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue) if let protocols = optionalProtocols { - self.addHeader(urlRequest, key: headerWSProtocolName, val: ",".join(protocols)) + self.addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joinWithSeparator(",")) } self.addHeader(urlRequest, key: headerWSVersionName, val: headerWSVersionValue) self.addHeader(urlRequest, key: headerWSKeyName, val: self.generateWebSocketKey()) @@ -459,7 +459,7 @@ public class WebSocket : NSObject, NSStreamDelegate { if payloadLen == 1 { code = CloseCode.ProtocolError.rawValue } else if payloadLen > 1 { - var codeBuffer = UnsafePointer((buffer+offset)) + let codeBuffer = UnsafePointer((buffer+offset)) code = codeBuffer[0].bigEndian if code < 1000 || (code > 1003 && code < 1007) || (code > 1011 && code < 3000) { code = CloseCode.ProtocolError.rawValue @@ -680,7 +680,7 @@ public class WebSocket : NSObject, NSStreamDelegate { offset += sizeof(UInt64) } buffer[1] |= self.MaskMask - var maskKey = UnsafeMutablePointer(buffer + offset) + let maskKey = UnsafeMutablePointer(buffer + offset) SecRandomCopyBytes(kSecRandomDefault, Int(sizeof(UInt32)), maskKey) offset += sizeof(UInt32) From 2a7ec38d48e29022ec418ad90823ef912a75ca8c Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Thu, 27 Aug 2015 04:21:06 +0000 Subject: [PATCH 92/95] Using new Xcode 7 -Owholemodule optimization setting --- Socket.IO-Client-Swift.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index c02cda4..73cd272 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -545,7 +545,7 @@ isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = SocketIO; - SWIFT_WHOLE_MODULE_OPTIMIZATION = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; }; name = Release; }; From 1f5402ce1c0e74c21c239ae1568d56074ab4a1fe Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 27 Aug 2015 09:45:27 -0400 Subject: [PATCH 93/95] use computed variables --- SocketIOClientSwift/SocketPacket.swift | 43 +++++++++++++------------- SocketIOClientSwift/SocketParser.swift | 6 ++-- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 221acff..e25bd9d 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -25,9 +25,11 @@ import Foundation struct SocketPacket { + private var currentPlace = 0 + private let placeholders: Int + let nsp: String let id: Int - let placeholders: Int let type: PacketType enum PacketType: Int { @@ -42,7 +44,21 @@ struct SocketPacket { } } - var currentPlace = 0 + var args: [AnyObject]? { + var arr = data + + if data.count == 0 { + return nil + } else { + if type == PacketType.Event || type == PacketType.BinaryEvent { + arr.removeAtIndex(0) + return arr + } else { + return arr + } + } + } + var binary: [NSData] var data: [AnyObject] var description: String { @@ -57,6 +73,10 @@ struct SocketPacket { return better } + var event: String { + return data[0] as! String + } + var packetString: String { return createPacketString() } @@ -232,25 +252,6 @@ struct SocketPacket { return data } } - - func getEvent() -> String { - return data[0] as! String - } - - func getArgs() -> [AnyObject]? { - var arr = data - - if data.count == 0 { - return nil - } else { - if type == PacketType.Event || type == PacketType.BinaryEvent { - arr.removeAtIndex(0) - return arr - } else { - return arr - } - } - } } extension SocketPacket { diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index ef92c46..f601bcd 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -66,7 +66,7 @@ class SocketParser { return } - socket.handleEvent(p.getEvent(), data: p.getArgs(), + socket.handleEvent(p.event, data: p.args, isInternalMessage: false, wantsAck: p.id) } @@ -224,10 +224,10 @@ class SocketParser { packet.fillInPlaceholders() if packet.type != SocketPacket.PacketType.BinaryAck { - socket.handleEvent(packet.getEvent(), data: packet.getArgs(), + socket.handleEvent(packet.event, data: packet.args, isInternalMessage: false, wantsAck: packet.id) } else { - socket.handleAck(packet.id, data: packet.getArgs()) + socket.handleAck(packet.id, data: packet.args) } } } From 5a73a5e6dace6d6f0a7870956a4cafd367233724 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 28 Aug 2015 13:42:04 -0400 Subject: [PATCH 94/95] style --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index d606152..c8ee902 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -201,7 +201,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handleEvent("connect", data: nil, isInternalMessage: false) } - func didDisconnect(reason:String) { + func didDisconnect(reason: String) { guard status != SocketIOClientStatus.Closed else { return } @@ -303,7 +303,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - public func engineDidClose(reason:String) { + public func engineDidClose(reason: String) { waitingData.removeAll() if status == SocketIOClientStatus.Closed || !reconnects { @@ -327,8 +327,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Causes an event to be handled. Only use if you know what you're doing. */ - public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage: Bool, - wantsAck ack:Int? = nil) { + public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool, + wantsAck ack: Int? = nil) { guard status == SocketIOClientStatus.Connected || isInternalMessage else { return } From 17426c14320b485670e2e3e45c1fa2264b261177 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 31 Aug 2015 09:22:56 -0400 Subject: [PATCH 95/95] fix socketio/socket.io-client-swift#152 --- SocketIOClientSwift/SocketEngine.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index f26f050..6a2b306 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -414,17 +414,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if let json = NSJSONSerialization.JSONObjectWithData(mesData, options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary, sid = json["sid"] as? String { + let upgradeWs: Bool + self.sid = sid _connected = true - if !forcePolling && !forceWebsockets { - createWebsocket(andConnect: true) + if let upgrades = json["upgrades"] as? [String] { + upgradeWs = upgrades.filter {$0 == "websocket"}.count != 0 + } else { + upgradeWs = false } if let pingInterval = json["pingInterval"] as? Double, pingTimeout = json["pingTimeout"] as? Double { self.pingInterval = pingInterval / 1000.0 self.pingTimeout = pingTimeout / 1000.0 } + + if !forcePolling && !forceWebsockets && upgradeWs { + createWebsocket(andConnect: true) + } } else { client?.didError("Engine failed to handshake") return