From e79199d2e65487e59311a8b296f8ddb026766739 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sat, 5 Sep 2015 18:48:56 +0200 Subject: [PATCH 01/76] SocketAckManagerTest --- .../project.pbxproj | 4 +++ SocketIO-iOSTests/SocketAckManagerTest.swift | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 SocketIO-iOSTests/SocketAckManagerTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 3315a7a..f4c7536 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -58,6 +58,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 */; }; + 94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */; settings = {ASSET_TAGS = (); }; }; 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 */; }; @@ -110,6 +111,7 @@ 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 = ""; }; + 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAckManagerTest.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 = ""; }; @@ -201,6 +203,7 @@ 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -474,6 +477,7 @@ 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, + 94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketAckManagerTest.swift b/SocketIO-iOSTests/SocketAckManagerTest.swift new file mode 100644 index 0000000..04df7a5 --- /dev/null +++ b/SocketIO-iOSTests/SocketAckManagerTest.swift @@ -0,0 +1,26 @@ +// +// SocketAckManagerTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 04.09.15. +// +// + +import XCTest + +class SocketAckManagerTest: XCTestCase { + var ackManager = SocketAckManager() + + func testAddAcks() { + let callbackExpection = self.expectationWithDescription("callbackExpection") + let itemsArray = ["Hi", "ho"] + func callback(items:NSArray?) { + callbackExpection.fulfill() + items?.isEqualToArray(itemsArray) + } + ackManager.addAck(1, callback: callback) + ackManager.executeAck(1, items: itemsArray) + waitForExpectationsWithTimeout(3.0, handler: nil) + + } +} From de0d0b8676e2a8983f98c259e2795834053854c8 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 6 Sep 2015 20:04:10 +0200 Subject: [PATCH 02/76] socket parser Test --- .../project.pbxproj | 6 +- SocketIO-iOSTests/SocketParserTest.swift | 81 +++++++++++++++++++ SocketIOClientSwift/SocketPacket.swift | 10 +-- SocketIOClientSwift/SocketParser.swift | 27 +++---- 4 files changed, 98 insertions(+), 26 deletions(-) create mode 100644 SocketIO-iOSTests/SocketParserTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index f4c7536..7eb4cd2 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -58,6 +58,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 */; }; + 949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */; settings = {ASSET_TAGS = (); }; }; 94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */; settings = {ASSET_TAGS = (); }; }; 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; @@ -111,6 +112,7 @@ 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 = ""; }; + 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketParserTest.swift; sourceTree = ""; }; 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAckManagerTest.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 = ""; }; @@ -202,8 +204,9 @@ 941A4AB91B67A56C00C42318 /* TestKind.swift */, 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */, - 572EF2291B51F16C00EEBB58 /* Supporting Files */, 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */, + 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -484,6 +487,7 @@ 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, 74781D5B1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift new file mode 100644 index 0000000..948efb8 --- /dev/null +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -0,0 +1,81 @@ +// +// SocketParserTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 05.09.15. +// +// + +import XCTest + +class SocketParserTest: XCTestCase { + + //Format key: message; namespace-data-binary-id + static let packetTypes: Dictionary = [ + "0": ("/", [], [], -1), "1": ("/", [], [], -1), + "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn", ["test3", "test4"]], [], -1), + "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), + "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), + "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 9), + "4/swift": ("/swift", [], [], -1), + "10": ("/swift", [], [], -1)] + + func testDisconnect() { + let message = "1" + validateParseResult(message) + } + + func testConnect() { + let message = "0" + validateParseResult(message) + } + + func testNameSpaceArrayParse() { + let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]" + validateParseResult(message) + } + + func testNameSpaceArrayAckParse() { + let message = "3/swift,0[[\"test3\",\"test4\"]]" + validateParseResult(message) + } + + func testNameSpaceBinaryEventParse() { + let message = "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" + validateParseResult(message) + } + + func testNameSpaceBinaryAckParse() { + let message = "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" + validateParseResult(message) + } + + func testNamespaceErrorParse() { + let message = "4/swift" + validateParseResult(message) + } + + func testInvalidInput() { + let message = "10" + validateParseResult(message) + } + + func validateParseResult(message:String) { + let validValues = SocketParserTest.packetTypes[message]! + let packet = SocketParser.parseString(message) + let type = message.substringWithRange(Range(start: message.startIndex, end: message.startIndex.advancedBy(1))) + if let packet = packet { + XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) + XCTAssertEqual(packet.nsp, validValues.0) + XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) + XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) + XCTAssertEqual(packet.id, validValues.3) + }else { + XCTFail() + } + } + +// func testParsePerformance() { +// +// } +} diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index e25bd9d..e2f6f85 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -62,15 +62,7 @@ struct SocketPacket { var binary: [NSData] var data: [AnyObject] 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 + return "SocketPacket {type: \(String(type.rawValue)); data: \(String(data)); id: \(id); placeholders: \(placeholders);}" } var event: String { diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index e06681d..d37f8f2 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -173,38 +173,33 @@ class SocketParser { // Parses messages recieved static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { - if stringMessage == "" { - return - } + guard !stringMessage.isEmpty else { return } + print(stringMessage) Logger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) - let p: SocketPacket - - if let pack = parseString(stringMessage) { - p = pack - } else { + guard let pack = parseString(stringMessage) else { socket.didError("Error parsing packet") return } - Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p.description) + Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: pack.description) - switch p.type { + switch pack.type { case SocketPacket.PacketType.Event: - handleEvent(p, socket: socket) + handleEvent(pack, socket: socket) case SocketPacket.PacketType.Ack: - handleAck(p, socket: socket) + handleAck(pack, socket: socket) case SocketPacket.PacketType.BinaryEvent: - handleBinaryEvent(p, socket: socket) + handleBinaryEvent(pack, socket: socket) case SocketPacket.PacketType.BinaryAck: - handleBinaryAck(p, socket: socket) + handleBinaryAck(pack, socket: socket) case SocketPacket.PacketType.Connect: - handleConnect(p, socket: socket) + handleConnect(pack, socket: socket) case SocketPacket.PacketType.Disconnect: socket.didDisconnect("Got Disconnect") case SocketPacket.PacketType.Error: - socket.didError("Error: \(p.data)") + socket.didError("Error: \(pack.data)") } } From 16ed2bd1308ee9c67ccd0b3708905ff747dac380 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 6 Sep 2015 22:45:18 +0200 Subject: [PATCH 03/76] refactor clean up code --- SocketIO-iOSTests/SocketParserTest.swift | 15 +++++++++---- SocketIOClientSwift/SocketParser.swift | 27 ++++++++++++------------ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 948efb8..602e6ab 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -57,7 +57,8 @@ class SocketParserTest: XCTestCase { func testInvalidInput() { let message = "10" - validateParseResult(message) + let packet = SocketParser.parseString(message) + XCTAssertNil(packet) } func validateParseResult(message:String) { @@ -75,7 +76,13 @@ class SocketParserTest: XCTestCase { } } -// func testParsePerformance() { -// -// } + func testParsePerformance() { + let keys = Array(SocketParserTest.packetTypes.keys) + measureBlock({ + for item in keys.enumerate() { + SocketParser.parseString(item.element) + } + }) + + } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index d37f8f2..74c57b2 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -73,10 +73,12 @@ class SocketParser { // Translation of socket.io-client#decodeString static func parseString(str: String) -> SocketPacket? { let arr = Array(str.characters) - let type = String(arr[0]) + guard let type = SocketPacket.PacketType(str: String(arr[0])) else { + NSLog("Error parsing \(str)") + return nil} if arr.count == 1 { - return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/") + return SocketPacket(type: type, nsp: "/") } var id: Int? @@ -84,7 +86,7 @@ class SocketParser { var i = 0 var placeholders = -1 - if type == "5" || type == "6" { + if type == .BinaryEvent || type == .BinaryAck { var buf = "" while arr[++i] != "-" { @@ -117,7 +119,7 @@ class SocketParser { } if i + 1 >= arr.count { - return SocketPacket(type: SocketPacket.PacketType(str: type)!, id: id ?? -1, + return SocketPacket(type: type, id: id ?? -1, nsp: nsp ?? "/", placeholders: placeholders) } @@ -142,7 +144,7 @@ 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, id: id ?? -1, + return SocketPacket(type: type, data: data, id: id ?? -1, nsp: nsp ?? "/", placeholders: placeholders) } @@ -174,7 +176,6 @@ class SocketParser { // Parses messages recieved static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { guard !stringMessage.isEmpty else { return } - print(stringMessage) Logger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) @@ -186,19 +187,19 @@ class SocketParser { Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: pack.description) switch pack.type { - case SocketPacket.PacketType.Event: + case .Event: handleEvent(pack, socket: socket) - case SocketPacket.PacketType.Ack: + case .Ack: handleAck(pack, socket: socket) - case SocketPacket.PacketType.BinaryEvent: + case .BinaryEvent: handleBinaryEvent(pack, socket: socket) - case SocketPacket.PacketType.BinaryAck: + case .BinaryAck: handleBinaryAck(pack, socket: socket) - case SocketPacket.PacketType.Connect: + case .Connect: handleConnect(pack, socket: socket) - case SocketPacket.PacketType.Disconnect: + case .Disconnect: socket.didDisconnect("Got Disconnect") - case SocketPacket.PacketType.Error: + case .Error: socket.didError("Error: \(pack.data)") } } From 13087ff1b7d2050fba7fed5cc7b77982e22630a2 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 6 Sep 2015 23:45:52 +0200 Subject: [PATCH 04/76] clean up code --- SocketIOClientSwift/SocketParser.swift | 45 +++++++++++--------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 74c57b2..a3d97c7 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -23,6 +23,7 @@ import Foundation class SocketParser { + private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool { return nsp == socket.nsp } @@ -72,12 +73,12 @@ class SocketParser { // Translation of socket.io-client#decodeString static func parseString(str: String) -> SocketPacket? { - let arr = Array(str.characters) - guard let type = SocketPacket.PacketType(str: String(arr[0])) else { + let messageCharacters = Array(str.characters) + guard let type = SocketPacket.PacketType(str: String(messageCharacters[0])) else { NSLog("Error parsing \(str)") return nil} - if arr.count == 1 { + if messageCharacters.count == 1 { return SocketPacket(type: type, nsp: "/") } @@ -89,14 +90,14 @@ class SocketParser { if type == .BinaryEvent || type == .BinaryAck { var buf = "" - while arr[++i] != "-" { - buf += String(arr[i]) - if i == arr.count { + while messageCharacters[++i] != "-" { + buf += String(messageCharacters[i]) + if i == messageCharacters.count { break } } - if let holders = Int(buf) where arr[i] == "-" { + if let holders = Int(buf) where messageCharacters[i] == "-" { placeholders = holders } else { NSLog("Error parsing \(str)") @@ -104,11 +105,11 @@ class SocketParser { } } - if arr[i + 1] == "/" { + if messageCharacters[i + 1] == "/" { nsp = "" - while ++i < arr.count { - let c = arr[i] + while ++i < messageCharacters.count { + let c = messageCharacters[i] if c == "," { break @@ -118,17 +119,17 @@ class SocketParser { } } - if i + 1 >= arr.count { + if i + 1 >= messageCharacters.count { return SocketPacket(type: type, id: id ?? -1, nsp: nsp ?? "/", placeholders: placeholders) } - let next = String(arr[i + 1]) + let next = String(messageCharacters[i + 1]) if Int(next) != nil { var c = "" - while ++i < arr.count { - if let int = Int(String(arr[i])) { + while ++i < messageCharacters.count { + if let int = Int(String(messageCharacters[i])) { c += String(int) } else { --i @@ -139,7 +140,7 @@ class SocketParser { id = Int(c) } - if ++i < arr.count { + if ++i < messageCharacters.count { 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] @@ -153,24 +154,14 @@ class SocketParser { // Parses data for events static func parseData(data: String) -> AnyObject? { - var err: NSError? let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - let parsed: AnyObject? - do { - parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, + return try NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.MutableContainers) } catch let error as NSError { - err = error - parsed = nil - } - - if err != nil { - // println(err) + //TODO Log error return nil } - - return parsed } // Parses messages recieved From 0b8be08a5471edee2dcf742c872872fc95e7d8d9 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 12:53:28 +0200 Subject: [PATCH 05/76] use new parser for binary --- SocketIO-iOSTests/SocketParserTest.swift | 9 ++++ SocketIOClientSwift/SocketParser.swift | 55 +++++++++++++++++++----- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 602e6ab..71fb896 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -61,6 +61,15 @@ class SocketParserTest: XCTestCase { XCTAssertNil(packet) } + func testGenericParser() { + var parser = GenericParser(message: "61-/swift,", currentIndex: 0) + XCTAssertEqual(parser.read(1), "6") + XCTAssertEqual(parser.currentCharacter, "1") + XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") + XCTAssertEqual(parser.currentCharacter, "-") + + } + func validateParseResult(message:String) { let validValues = SocketParserTest.packetTypes[message]! let packet = SocketParser.parseString(message) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index d7086e8..1c20efd 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -22,6 +22,45 @@ import Foundation +struct GenericParser { + let message: String + var currentIndex:Int + var messageCharacters: Array { + get { + return Array(message.characters) + } + } + var currentCharacter: String? { + get{ + if currentIndex >= messageCharacters.count { + return nil + } + return String(messageCharacters[currentIndex]) + } + } + + mutating func read(characterLength:Int) -> String? { + let startIndex = message.startIndex.advancedBy(currentIndex) + let range = Range(start: startIndex, end: startIndex.advancedBy(characterLength)) + currentIndex = currentIndex + characterLength + + return message.substringWithRange(range) + } + + mutating func readUntilStringOccurence(string:String) -> String? { + let startIndex = message.startIndex.advancedBy(currentIndex) + let range = Range(start: startIndex, end: message.endIndex) + let subString = message.substringWithRange(range) as NSString + let foundRange = subString.rangeOfString(string) + if foundRange.location == Int.max { + return nil + } + currentIndex = foundRange.location + 1 + + return subString.substringToIndex(foundRange.location) + } +} + class SocketParser { private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool { @@ -73,8 +112,9 @@ class SocketParser { // Translation of socket.io-client#decodeString static func parseString(str: String) -> SocketPacket? { + var parser = GenericParser(message: str, currentIndex: 0) let messageCharacters = Array(str.characters) - guard let type = SocketPacket.PacketType(str: String(messageCharacters[0])) else { + guard let typeString = parser.read(1), let type = SocketPacket.PacketType(str: typeString) else { NSLog("Error parsing \(str)") return nil} @@ -88,21 +128,14 @@ class SocketParser { var placeholders = -1 if type == .BinaryEvent || type == .BinaryAck { - var buf = "" - - while messageCharacters[++i] != "-" { - buf += String(messageCharacters[i]) - if i == messageCharacters.count { - break - } - } - - if let holders = Int(buf) where messageCharacters[i] == "-" { + if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) where parser.read(1) == "-" { placeholders = holders } else { NSLog("Error parsing \(str)") return nil } + + i = parser.currentIndex - 1 } if messageCharacters[i + 1] == "/" { From 8bae7d06d2dbb1b912e3c08575b9507380693976 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 13:53:43 +0200 Subject: [PATCH 06/76] using parser for namespace --- SocketIO-iOSTests/SocketParserTest.swift | 6 +++--- SocketIOClientSwift/SocketParser.swift | 22 ++++++---------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 71fb896..883a6d8 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -17,7 +17,7 @@ class SocketParserTest: XCTestCase { "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 9), - "4/swift": ("/swift", [], [], -1), + "4/swift,": ("/swift", [], [], -1), "10": ("/swift", [], [], -1)] func testDisconnect() { @@ -51,12 +51,12 @@ class SocketParserTest: XCTestCase { } func testNamespaceErrorParse() { - let message = "4/swift" + let message = "4/swift," validateParseResult(message) } func testInvalidInput() { - let message = "10" + let message = "8" let packet = SocketParser.parseString(message) XCTAssertNil(packet) } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 1c20efd..1318462 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -55,7 +55,7 @@ struct GenericParser { if foundRange.location == Int.max { return nil } - currentIndex = foundRange.location + 1 + currentIndex = currentIndex + foundRange.location return subString.substringToIndex(foundRange.location) } @@ -128,7 +128,7 @@ class SocketParser { var placeholders = -1 if type == .BinaryEvent || type == .BinaryAck { - if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) where parser.read(1) == "-" { + if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) where parser.read(1)! == "-" { placeholders = holders } else { NSLog("Error parsing \(str)") @@ -137,22 +137,12 @@ class SocketParser { i = parser.currentIndex - 1 } - - if messageCharacters[i + 1] == "/" { - nsp = "" - - while ++i < messageCharacters.count { - let c = messageCharacters[i] - - if c == "," { - break - } - - nsp! += String(c) - } + if parser.currentCharacter == "/" { + nsp = parser.readUntilStringOccurence(",") + i = parser.currentIndex } - if i + 1 >= messageCharacters.count { + if parser.currentIndex + 1 >= parser.messageCharacters.count { return SocketPacket(type: type, id: id ?? -1, nsp: nsp ?? "/", placeholders: placeholders) } From fb9b19820bb7fe2c784a92192f8c465d0d7103b4 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 14:44:43 +0200 Subject: [PATCH 07/76] complete use of parser --- SocketIO-iOSTests/SocketParserTest.swift | 4 +-- SocketIOClientSwift/SocketParser.swift | 35 +++++++++--------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 883a6d8..362c71f 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -16,7 +16,7 @@ class SocketParserTest: XCTestCase { "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn", ["test3", "test4"]], [], -1), "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), - "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 9), + "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 19), "4/swift,": ("/swift", [], [], -1), "10": ("/swift", [], [], -1)] @@ -46,7 +46,7 @@ class SocketParserTest: XCTestCase { } func testNameSpaceBinaryAckParse() { - let message = "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" + let message = "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" validateParseResult(message) } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 1318462..31db9db 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -122,9 +122,7 @@ class SocketParser { return SocketPacket(type: type, nsp: "/") } - var id: Int? var nsp:String? - var i = 0 var placeholders = -1 if type == .BinaryEvent || type == .BinaryAck { @@ -134,41 +132,34 @@ class SocketParser { NSLog("Error parsing \(str)") return nil } - - i = parser.currentIndex - 1 } if parser.currentCharacter == "/" { nsp = parser.readUntilStringOccurence(",") - i = parser.currentIndex + parser.currentIndex++ } - if parser.currentIndex + 1 >= parser.messageCharacters.count { - return SocketPacket(type: type, id: id ?? -1, + if parser.currentIndex >= parser.messageCharacters.count { + return SocketPacket(type: type, id: -1, nsp: nsp ?? "/", placeholders: placeholders) } - let next = String(messageCharacters[i + 1]) - if Int(next) != nil { - var c = "" - while ++i < messageCharacters.count { - if let int = Int(String(messageCharacters[i])) { - c += String(int) - } else { - --i - break - } + var idString = "" + while parser.currentIndex < messageCharacters.count { + if let next = parser.read(1), let int = Int(next) { + idString += String(int) + } else { + parser.currentIndex -= 2 + break } - - id = Int(c) } - if ++i < messageCharacters.count { - let d = str[str.startIndex.advancedBy(i)...str.startIndex.advancedBy(str.characters.count-1)] + if parser.currentIndex < messageCharacters.count { + let d = str[str.startIndex.advancedBy(parser.currentIndex + 1)...str.startIndex.advancedBy(str.characters.count-1)] let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] - return SocketPacket(type: type, data: data, id: id ?? -1, + return SocketPacket(type: type, data: data, id: Int(idString) ?? -1, nsp: nsp ?? "/", placeholders: placeholders) } From 2bd612e47a0b875f5b61bfa2720f46c965b597e0 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 15:08:10 +0200 Subject: [PATCH 08/76] refactor, make use of try catch --- GenericSocketParser.swift | 48 ++++++++ .../project.pbxproj | 6 + SocketIO-iOSTests/SocketParserTest.swift | 32 +++-- SocketIOClientSwift/SocketParser.swift | 112 +++++++----------- 4 files changed, 109 insertions(+), 89 deletions(-) create mode 100644 GenericSocketParser.swift diff --git a/GenericSocketParser.swift b/GenericSocketParser.swift new file mode 100644 index 0000000..4ab7d9c --- /dev/null +++ b/GenericSocketParser.swift @@ -0,0 +1,48 @@ +// +// GenericSocketParser.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 07.09.15. +// +// + +import Foundation + +struct GenericParser { + let message: String + var currentIndex:Int + var messageCharacters: Array { + get { + return Array(message.characters) + } + } + var currentCharacter: String? { + get{ + if currentIndex >= messageCharacters.count { + return nil + } + return String(messageCharacters[currentIndex]) + } + } + + mutating func read(characterLength:Int) -> String? { + let startIndex = message.startIndex.advancedBy(currentIndex) + let range = Range(start: startIndex, end: startIndex.advancedBy(characterLength)) + currentIndex = currentIndex + characterLength + + return message.substringWithRange(range) + } + + mutating func readUntilStringOccurence(string:String) -> String? { + let startIndex = message.startIndex.advancedBy(currentIndex) + let range = Range(start: startIndex, end: message.endIndex) + let subString = message.substringWithRange(range) as NSString + let foundRange = subString.rangeOfString(string) + if foundRange.location == Int.max { + return nil + } + currentIndex = currentIndex + foundRange.location + + return subString.substringToIndex(foundRange.location) + } +} \ No newline at end of file diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 7eb4cd2..d49cac7 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -43,6 +43,8 @@ 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 */; }; + 9421F5D01B9DBF5900D625BB /* GenericSocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */; settings = {ASSET_TAGS = (); }; }; + 9421F5D11B9DBF5900D625BB /* GenericSocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */; settings = {ASSET_TAGS = (); }; }; 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 */; }; @@ -110,6 +112,7 @@ 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 = ""; }; + 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenericSocketParser.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 = ""; }; 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketParserTest.swift; sourceTree = ""; }; @@ -267,6 +270,7 @@ 5764DF831B51F254004FF46E /* SocketLogger.swift */, 5764DF841B51F254004FF46E /* SocketPacket.swift */, 5764DF851B51F254004FF46E /* SocketParser.swift */, + 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */, 5764DF861B51F254004FF46E /* SocketTypes.swift */, 5764DF871B51F254004FF46E /* SwiftRegex.swift */, 5764DF881B51F254004FF46E /* WebSocket.swift */, @@ -454,6 +458,7 @@ 5764DF911B51F254004FF46E /* SocketEventHandler.swift in Sources */, 5764DF931B51F254004FF46E /* SocketFixUTF8.swift in Sources */, 5764DF951B51F254004FF46E /* SocketIOClient.swift in Sources */, + 9421F5D01B9DBF5900D625BB /* GenericSocketParser.swift in Sources */, 5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */, 5764DF971B51F254004FF46E /* SocketLogger.swift in Sources */, 74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, @@ -475,6 +480,7 @@ 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 9421F5D11B9DBF5900D625BB /* GenericSocketParser.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 362c71f..83ffc05 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -17,8 +17,7 @@ class SocketParserTest: XCTestCase { "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 19), - "4/swift,": ("/swift", [], [], -1), - "10": ("/swift", [], [], -1)] + "4/swift,": ("/swift", [], [], -1)] func testDisconnect() { let message = "1" @@ -57,8 +56,12 @@ class SocketParserTest: XCTestCase { func testInvalidInput() { let message = "8" - let packet = SocketParser.parseString(message) - XCTAssertNil(packet) + do { + try SocketParser.parseString(message) + XCTFail("Should throw exeption") + } catch { + + } } func testGenericParser() { @@ -66,32 +69,27 @@ class SocketParserTest: XCTestCase { XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") - XCTAssertEqual(parser.currentCharacter, "-") + XCTAssertEqual(parser.currentCharacter, "-") } func validateParseResult(message:String) { let validValues = SocketParserTest.packetTypes[message]! - let packet = SocketParser.parseString(message) + let packet = try! SocketParser.parseString(message) let type = message.substringWithRange(Range(start: message.startIndex, end: message.startIndex.advancedBy(1))) - if let packet = packet { - XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) - XCTAssertEqual(packet.nsp, validValues.0) - XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) - XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) - XCTAssertEqual(packet.id, validValues.3) - }else { - XCTFail() - } + XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) + XCTAssertEqual(packet.nsp, validValues.0) + XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) + XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) + XCTAssertEqual(packet.id, validValues.3) } func testParsePerformance() { let keys = Array(SocketParserTest.packetTypes.keys) measureBlock({ for item in keys.enumerate() { - SocketParser.parseString(item.element) + try! SocketParser.parseString(item.element) } }) - } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 31db9db..05c0658 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -22,43 +22,8 @@ import Foundation -struct GenericParser { - let message: String - var currentIndex:Int - var messageCharacters: Array { - get { - return Array(message.characters) - } - } - var currentCharacter: String? { - get{ - if currentIndex >= messageCharacters.count { - return nil - } - return String(messageCharacters[currentIndex]) - } - } - - mutating func read(characterLength:Int) -> String? { - let startIndex = message.startIndex.advancedBy(currentIndex) - let range = Range(start: startIndex, end: startIndex.advancedBy(characterLength)) - currentIndex = currentIndex + characterLength - - return message.substringWithRange(range) - } - - mutating func readUntilStringOccurence(string:String) -> String? { - let startIndex = message.startIndex.advancedBy(currentIndex) - let range = Range(start: startIndex, end: message.endIndex) - let subString = message.substringWithRange(range) as NSString - let foundRange = subString.rangeOfString(string) - if foundRange.location == Int.max { - return nil - } - currentIndex = currentIndex + foundRange.location - - return subString.substringToIndex(foundRange.location) - } +enum SocketParserError: ErrorType { + case InvalidMessageType, InvalidBinaryPalceholder } class SocketParser { @@ -111,12 +76,12 @@ class SocketParser { } // Translation of socket.io-client#decodeString - static func parseString(str: String) -> SocketPacket? { + static func parseString(str: String) throws -> SocketPacket { var parser = GenericParser(message: str, currentIndex: 0) let messageCharacters = Array(str.characters) guard let typeString = parser.read(1), let type = SocketPacket.PacketType(str: typeString) else { - NSLog("Error parsing \(str)") - return nil} + throw SocketParserError.InvalidMessageType + } if messageCharacters.count == 1 { return SocketPacket(type: type, nsp: "/") @@ -129,8 +94,7 @@ class SocketParser { if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) where parser.read(1)! == "-" { placeholders = holders } else { - NSLog("Error parsing \(str)") - return nil + throw SocketParserError.InvalidBinaryPalceholder } } if parser.currentCharacter == "/" { @@ -154,16 +118,12 @@ class SocketParser { } } - if parser.currentIndex < messageCharacters.count { - let d = str[str.startIndex.advancedBy(parser.currentIndex + 1)...str.startIndex.advancedBy(str.characters.count-1)] - let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" - let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] - - return SocketPacket(type: type, data: data, id: Int(idString) ?? -1, - nsp: nsp ?? "/", placeholders: placeholders) - } + let d = str[str.startIndex.advancedBy(parser.currentIndex + 1)...str.startIndex.advancedBy(str.characters.count - 1)] + let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" + let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] - return nil + return SocketPacket(type: type, data: data, id: Int(idString) ?? -1, + nsp: nsp ?? "/", placeholders: placeholders) } // Parses data for events @@ -184,29 +144,37 @@ class SocketParser { Logger.log("Parsing %@", type: "SocketParser", args: stringMessage) - guard let pack = parseString(stringMessage) else { - socket.didError("Error parsing packet") - return + do { + let pack = try parseString(stringMessage) + Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) + + switch pack.type { + case .Event: + handleEvent(pack, socket: socket) + case .Ack: + handleAck(pack, socket: socket) + case .BinaryEvent: + handleBinaryEvent(pack, socket: socket) + case .BinaryAck: + handleBinaryAck(pack, socket: socket) + case .Connect: + handleConnect(pack, socket: socket) + case .Disconnect: + socket.didDisconnect("Got Disconnect") + case .Error: + socket.didError("Error: \(pack.data)") + } + + }catch SocketParserError.InvalidBinaryPalceholder { + Logger.error("Parsed Invalid Binary Placeholder", type: "SocketParser") } - - Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) - - switch pack.type { - case .Event: - handleEvent(pack, socket: socket) - case .Ack: - handleAck(pack, socket: socket) - case .BinaryEvent: - handleBinaryEvent(pack, socket: socket) - case .BinaryAck: - handleBinaryAck(pack, socket: socket) - case .Connect: - handleConnect(pack, socket: socket) - case .Disconnect: - socket.didDisconnect("Got Disconnect") - case .Error: - socket.didError("Error: \(pack.data)") + catch SocketParserError.InvalidMessageType { + Logger.error("Parsed Invalid Binary Placeholder", type: "SocketParser") } + catch { + + } + } static func parseBinaryData(data: NSData, socket: SocketIOClient) { From 5fdea20455f8d91883b197193fe3e45028042821 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 7 Sep 2015 13:15:54 -0400 Subject: [PATCH 09/76] simplify socketpacket methods --- SocketIOClientSwift/SocketPacket.swift | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index e25bd9d..9a9889c 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -212,17 +212,13 @@ struct SocketPacket { } mutating func fillInPlaceholders() { - let newArr = NSMutableArray(array: data) - for i in 0.. AnyObject { @@ -287,22 +283,18 @@ private extension SocketPacket { binary.append(bin) return placeholder - } else if let arr = data as? NSArray { - let newArr = NSMutableArray(array: arr) - + } else if var arr = data as? [AnyObject] { for i in 0.. Date: Mon, 7 Sep 2015 19:19:22 +0200 Subject: [PATCH 10/76] fix join namespace parse --- GenericSocketParser.swift | 4 ++++ SocketIO-iOSTests/AbstractSocketTest.swift | 2 +- SocketIO-iOSTests/SocketAcknowledgementTest.swift | 3 ++- SocketIO-iOSTests/SocketEmitTest.swift | 3 ++- .../SocketNamespaceAcknowledgementTest.swift | 3 ++- SocketIO-iOSTests/SocketNamespaceEmitTest.swift | 5 ++--- SocketIO-iOSTests/SocketParserTest.swift | 14 +++++++++++++- SocketIOClientSwift/SocketParser.swift | 4 ++-- 8 files changed, 28 insertions(+), 10 deletions(-) diff --git a/GenericSocketParser.swift b/GenericSocketParser.swift index 4ab7d9c..a963988 100644 --- a/GenericSocketParser.swift +++ b/GenericSocketParser.swift @@ -45,4 +45,8 @@ struct GenericParser { return subString.substringToIndex(foundRange.location) } + + mutating func readUntilEnd() ->String { + return read(messageCharacters.count - currentIndex)! + } } \ No newline at end of file diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index 1fd61c2..fb3c5f4 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -9,7 +9,7 @@ import XCTest class AbstractSocketTest: XCTestCase { - static let testLocal = false + static let testLocal = true static let serverURL = AbstractSocketTest.testLocal ? "localhost:6979" : "milkbartube.com:6979" static let TEST_TIMEOUT = 8.0 static var socket:SocketIOClient! diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 0f1f425..4a8c7ad 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -21,11 +21,12 @@ class SocketAcknowledgementTest: AbstractSocketTest { "forcePolling": false, "forceWebsockets": false,// default false "path": ""]) + openConnection() }else { AbstractSocketTest.socket.leaveNamespace() } - openConnection() + } func testConnectionStatus() { diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 5e58491..baffb95 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -22,11 +22,12 @@ class SocketEmitTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": ""] ) + openConnection() }else { AbstractSocketTest.socket.leaveNamespace() } - openConnection() + } override func tearDown() { diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index a0604f3..ce7e272 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -22,11 +22,12 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": "", "nsp": "/swift"]) + openConnection() }else { AbstractSocketTest.socket.joinNamespace("/swift") } - openConnection() + } func testConnectionStatus() { diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index e02ede3..9573a64 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -22,13 +22,12 @@ class SocketNamespaceEmitTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": "", "nsp": "/swift"]) + openConnection() }else { AbstractSocketTest.socket.joinNamespace("/swift") } - - openConnection() } - + func testConnectionStatus() { super.checkConnectionStatus() } diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 83ffc05..0e4e3ac 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -17,7 +17,9 @@ class SocketParserTest: XCTestCase { "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 19), - "4/swift,": ("/swift", [], [], -1)] + "4/swift,": ("/swift", [], [], -1), + "0/swift": ("/swift", [], [], -1), + "1/swift": ("/swift", [], [], -1)] func testDisconnect() { let message = "1" @@ -29,6 +31,16 @@ class SocketParserTest: XCTestCase { validateParseResult(message) } + func testDisconnectNameSpace() { + let message = "1/swift" + validateParseResult(message) + } + + func testConnecttNameSpace() { + let message = "0/swift" + validateParseResult(message) + } + func testNameSpaceArrayParse() { let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]" validateParseResult(message) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 05c0658..72ea70a 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -98,7 +98,7 @@ class SocketParser { } } if parser.currentCharacter == "/" { - nsp = parser.readUntilStringOccurence(",") + nsp = parser.readUntilStringOccurence(",") ?? parser.readUntilEnd() parser.currentIndex++ } @@ -178,7 +178,7 @@ class SocketParser { } static func parseBinaryData(data: NSData, socket: SocketIOClient) { - if socket.waitingData.count == 0 { + guard !socket.waitingData.isEmpty else { Logger.error("Got data when not remaking packet", type: "SocketParser") return } From c8c67d66a84b4afcc54d8405768787020fbdd0af Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 7 Sep 2015 13:26:58 -0400 Subject: [PATCH 11/76] typing dictionary might not always be right --- SocketIOClientSwift/SocketPacket.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 9a9889c..a8b44d3 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -289,9 +289,9 @@ private extension SocketPacket { } return arr - } else if var dict = data as? [String: AnyObject] { + } else if let dict = data as? NSMutableDictionary { for (key, value) in dict { - dict[key] = shred(value, binary: &binary) + dict[key as! NSCopying] = shred(value, binary: &binary) } return dict From 568b2ae1bc2f43ae786b4d2813290a0474b55688 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 19:28:19 +0200 Subject: [PATCH 12/76] clean up using guard --- SocketIOClientSwift/SocketParser.swift | 54 ++++++++------------------ 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 72ea70a..225c3cd 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -32,26 +32,20 @@ class SocketParser { return nsp == socket.nsp } + private static func handleEvent(p: SocketPacket, socket: SocketIOClient) { + guard isCorrectNamespace(p.nsp, socket) else { return } + socket.handleEvent(p.event, data: p.args, + isInternalMessage: false, wantsAck: p.id) + } + private static func handleAck(p: SocketPacket, socket: SocketIOClient) { - if !isCorrectNamespace(p.nsp, socket) { - return - } + guard isCorrectNamespace(p.nsp, socket) else { return } socket.handleAck(p.id, data: p.data) } - private static func handleBinaryAck(p: SocketPacket, socket: SocketIOClient) { - if !isCorrectNamespace(p.nsp, socket) { - return - } - - socket.waitingData.append(p) - } - - private static func handleBinaryEvent(p: SocketPacket, socket: SocketIOClient) { - if !isCorrectNamespace(p.nsp, socket) { - return - } + private static func handleBinary(p: SocketPacket, socket: SocketIOClient) { + guard isCorrectNamespace(p.nsp, socket) else { return } socket.waitingData.append(p) } @@ -66,24 +60,14 @@ class SocketParser { } } - private static func handleEvent(p: SocketPacket, socket: SocketIOClient) { - if !isCorrectNamespace(p.nsp, socket) { - return - } - - socket.handleEvent(p.event, data: p.args, - isInternalMessage: false, wantsAck: p.id) - } - // Translation of socket.io-client#decodeString static func parseString(str: String) throws -> SocketPacket { var parser = GenericParser(message: str, currentIndex: 0) - let messageCharacters = Array(str.characters) guard let typeString = parser.read(1), let type = SocketPacket.PacketType(str: typeString) else { throw SocketParserError.InvalidMessageType } - if messageCharacters.count == 1 { + if parser.messageCharacters.count == 1 { return SocketPacket(type: type, nsp: "/") } @@ -107,9 +91,8 @@ class SocketParser { nsp: nsp ?? "/", placeholders: placeholders) } - var idString = "" - while parser.currentIndex < messageCharacters.count { + while parser.currentIndex < parser.messageCharacters.count { if let next = parser.read(1), let int = Int(next) { idString += String(int) } else { @@ -132,8 +115,8 @@ class SocketParser { do { return try NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.MutableContainers) - } catch let error as NSError { - //TODO Log error + } catch { + Logger.error("Parsing JSON: %@", type: "SocketParser", args: data) return nil } } @@ -154,9 +137,9 @@ class SocketParser { case .Ack: handleAck(pack, socket: socket) case .BinaryEvent: - handleBinaryEvent(pack, socket: socket) + handleBinary(pack, socket: socket) case .BinaryAck: - handleBinaryAck(pack, socket: socket) + handleBinary(pack, socket: socket) case .Connect: handleConnect(pack, socket: socket) case .Disconnect: @@ -184,15 +167,12 @@ class SocketParser { } let shouldExecute = socket.waitingData[0].addData(data) - - if !shouldExecute { - return - } + guard shouldExecute else { return } var packet = socket.waitingData.removeAtIndex(0) packet.fillInPlaceholders() - if packet.type != SocketPacket.PacketType.BinaryAck { + if packet.type != .BinaryAck { socket.handleEvent(packet.event, data: packet.args, isInternalMessage: false, wantsAck: packet.id) } else { From 12f607e3c3aff4f87a7010be5e76eaaaded9ea1a Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 19:34:45 +0200 Subject: [PATCH 13/76] disable locale test --- SocketIO-iOSTests/AbstractSocketTest.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index fb3c5f4..1fd61c2 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -9,7 +9,7 @@ import XCTest class AbstractSocketTest: XCTestCase { - static let testLocal = true + static let testLocal = false static let serverURL = AbstractSocketTest.testLocal ? "localhost:6979" : "milkbartube.com:6979" static let TEST_TIMEOUT = 8.0 static var socket:SocketIOClient! From 91cc683b5b1ec0195264385c99c9dc316b2b2908 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 20:25:13 +0200 Subject: [PATCH 14/76] clean up code style --- GenericSocketParser.swift | 6 ++-- SocketIO-iOSTests/SocketAckManagerTest.swift | 2 +- SocketIO-iOSTests/SocketParserTest.swift | 2 +- SocketIOClientSwift/SocketParser.swift | 30 +++++++++++--------- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/GenericSocketParser.swift b/GenericSocketParser.swift index a963988..04b25ae 100644 --- a/GenericSocketParser.swift +++ b/GenericSocketParser.swift @@ -8,10 +8,10 @@ import Foundation -struct GenericParser { +struct GenericSocketParser { let message: String - var currentIndex:Int - var messageCharacters: Array { + var currentIndex: Int + var messageCharacters: [Character] { get { return Array(message.characters) } diff --git a/SocketIO-iOSTests/SocketAckManagerTest.swift b/SocketIO-iOSTests/SocketAckManagerTest.swift index 04df7a5..e2664d9 100644 --- a/SocketIO-iOSTests/SocketAckManagerTest.swift +++ b/SocketIO-iOSTests/SocketAckManagerTest.swift @@ -14,7 +14,7 @@ class SocketAckManagerTest: XCTestCase { func testAddAcks() { let callbackExpection = self.expectationWithDescription("callbackExpection") let itemsArray = ["Hi", "ho"] - func callback(items:NSArray?) { + func callback(items: NSArray?) { callbackExpection.fulfill() items?.isEqualToArray(itemsArray) } diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 0e4e3ac..e4f7a1a 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -77,7 +77,7 @@ class SocketParserTest: XCTestCase { } func testGenericParser() { - var parser = GenericParser(message: "61-/swift,", currentIndex: 0) + var parser = GenericSocketParser(message: "61-/swift,", currentIndex: 0) XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 225c3cd..59025e4 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -61,9 +61,10 @@ class SocketParser { } // Translation of socket.io-client#decodeString - static func parseString(str: String) throws -> SocketPacket { - var parser = GenericParser(message: str, currentIndex: 0) - guard let typeString = parser.read(1), let type = SocketPacket.PacketType(str: typeString) else { + static func parseString(message: String) throws -> SocketPacket { + var parser = GenericSocketParser(message: message, currentIndex: 0) + guard let typeString = parser.read(1), + let type = SocketPacket.PacketType(str: typeString) else { throw SocketParserError.InvalidMessageType } @@ -71,24 +72,25 @@ class SocketParser { return SocketPacket(type: type, nsp: "/") } - var nsp:String? + var namespace: String? var placeholders = -1 if type == .BinaryEvent || type == .BinaryAck { - if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) where parser.read(1)! == "-" { + if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) + where parser.read(1)! == "-" { placeholders = holders } else { throw SocketParserError.InvalidBinaryPalceholder } } if parser.currentCharacter == "/" { - nsp = parser.readUntilStringOccurence(",") ?? parser.readUntilEnd() + namespace = parser.readUntilStringOccurence(",") ?? parser.readUntilEnd() parser.currentIndex++ } if parser.currentIndex >= parser.messageCharacters.count { return SocketPacket(type: type, id: -1, - nsp: nsp ?? "/", placeholders: placeholders) + nsp: namespace ?? "/", placeholders: placeholders) } var idString = "" @@ -101,12 +103,12 @@ class SocketParser { } } - let d = str[str.startIndex.advancedBy(parser.currentIndex + 1)...str.startIndex.advancedBy(str.characters.count - 1)] + let d = message[message.startIndex.advancedBy(parser.currentIndex + 1)...message.startIndex.advancedBy(message.characters.count - 1)] let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" - let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] + let data = parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] return SocketPacket(type: type, data: data, id: Int(idString) ?? -1, - nsp: nsp ?? "/", placeholders: placeholders) + nsp: namespace ?? "/", placeholders: placeholders) } // Parses data for events @@ -122,13 +124,13 @@ class SocketParser { } // Parses messages recieved - static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { - guard !stringMessage.isEmpty else { return } + static func parseSocketMessage(message: String, socket: SocketIOClient) { + guard !message.isEmpty else { return } - Logger.log("Parsing %@", type: "SocketParser", args: stringMessage) + Logger.log("Parsing %@", type: "SocketParser", args: message) do { - let pack = try parseString(stringMessage) + let pack = try parseString(message) Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) switch pack.type { From 222f622d3a3f892c53ff138464c797f783c821cf Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 7 Sep 2015 21:29:51 +0200 Subject: [PATCH 15/76] use optionals instead of try/catch --- .../project.pbxproj | 12 ++-- ...tParser.swift => SocketGenericParser.swift | 2 +- SocketIO-iOSTests/SocketParserTest.swift | 28 ++++----- SocketIOClientSwift/SocketParser.swift | 60 ++++++++----------- 4 files changed, 44 insertions(+), 58 deletions(-) rename GenericSocketParser.swift => SocketGenericParser.swift (98%) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index d49cac7..3800e67 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -43,8 +43,8 @@ 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 */; }; - 9421F5D01B9DBF5900D625BB /* GenericSocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */; settings = {ASSET_TAGS = (); }; }; - 9421F5D11B9DBF5900D625BB /* GenericSocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */; settings = {ASSET_TAGS = (); }; }; + 9421F5D01B9DBF5900D625BB /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */; settings = {ASSET_TAGS = (); }; }; + 9421F5D11B9DBF5900D625BB /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */; settings = {ASSET_TAGS = (); }; }; 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 */; }; @@ -112,7 +112,7 @@ 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 = ""; }; - 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenericSocketParser.swift; sourceTree = ""; }; + 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketGenericParser.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 = ""; }; 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketParserTest.swift; sourceTree = ""; }; @@ -270,7 +270,7 @@ 5764DF831B51F254004FF46E /* SocketLogger.swift */, 5764DF841B51F254004FF46E /* SocketPacket.swift */, 5764DF851B51F254004FF46E /* SocketParser.swift */, - 9421F5CF1B9DBF5900D625BB /* GenericSocketParser.swift */, + 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */, 5764DF861B51F254004FF46E /* SocketTypes.swift */, 5764DF871B51F254004FF46E /* SwiftRegex.swift */, 5764DF881B51F254004FF46E /* WebSocket.swift */, @@ -458,7 +458,7 @@ 5764DF911B51F254004FF46E /* SocketEventHandler.swift in Sources */, 5764DF931B51F254004FF46E /* SocketFixUTF8.swift in Sources */, 5764DF951B51F254004FF46E /* SocketIOClient.swift in Sources */, - 9421F5D01B9DBF5900D625BB /* GenericSocketParser.swift in Sources */, + 9421F5D01B9DBF5900D625BB /* SocketGenericParser.swift in Sources */, 5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */, 5764DF971B51F254004FF46E /* SocketLogger.swift in Sources */, 74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, @@ -480,7 +480,7 @@ 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, - 9421F5D11B9DBF5900D625BB /* GenericSocketParser.swift in Sources */, + 9421F5D11B9DBF5900D625BB /* SocketGenericParser.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, diff --git a/GenericSocketParser.swift b/SocketGenericParser.swift similarity index 98% rename from GenericSocketParser.swift rename to SocketGenericParser.swift index 04b25ae..0320084 100644 --- a/GenericSocketParser.swift +++ b/SocketGenericParser.swift @@ -8,7 +8,7 @@ import Foundation -struct GenericSocketParser { +struct SocketGenericParser { let message: String var currentIndex: Int var messageCharacters: [Character] { diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index e4f7a1a..7198b4c 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -68,39 +68,37 @@ class SocketParserTest: XCTestCase { func testInvalidInput() { let message = "8" - do { - try SocketParser.parseString(message) - XCTFail("Should throw exeption") - } catch { - - } + XCTAssertNil(SocketParser.parseString(message)) } func testGenericParser() { - var parser = GenericSocketParser(message: "61-/swift,", currentIndex: 0) + var parser = SocketGenericParser(message: "61-/swift,", currentIndex: 0) XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") XCTAssertEqual(parser.currentCharacter, "-") - } func validateParseResult(message:String) { let validValues = SocketParserTest.packetTypes[message]! - let packet = try! SocketParser.parseString(message) + let packet = SocketParser.parseString(message) let type = message.substringWithRange(Range(start: message.startIndex, end: message.startIndex.advancedBy(1))) - XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) - XCTAssertEqual(packet.nsp, validValues.0) - XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) - XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) - XCTAssertEqual(packet.id, validValues.3) + if let packet = packet { + XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) + XCTAssertEqual(packet.nsp, validValues.0) + XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) + XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) + XCTAssertEqual(packet.id, validValues.3) + }else { + XCTFail() + } } func testParsePerformance() { let keys = Array(SocketParserTest.packetTypes.keys) measureBlock({ for item in keys.enumerate() { - try! SocketParser.parseString(item.element) + SocketParser.parseString(item.element) } }) } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 59025e4..fc637a6 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -22,10 +22,6 @@ import Foundation -enum SocketParserError: ErrorType { - case InvalidMessageType, InvalidBinaryPalceholder -} - class SocketParser { private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool { @@ -61,11 +57,11 @@ class SocketParser { } // Translation of socket.io-client#decodeString - static func parseString(message: String) throws -> SocketPacket { - var parser = GenericSocketParser(message: message, currentIndex: 0) + static func parseString(message: String) -> SocketPacket? { + var parser = SocketGenericParser(message: message, currentIndex: 0) guard let typeString = parser.read(1), let type = SocketPacket.PacketType(str: typeString) else { - throw SocketParserError.InvalidMessageType + return nil } if parser.messageCharacters.count == 1 { @@ -80,7 +76,7 @@ class SocketParser { where parser.read(1)! == "-" { placeholders = holders } else { - throw SocketParserError.InvalidBinaryPalceholder + return nil } } if parser.currentCharacter == "/" { @@ -129,35 +125,27 @@ class SocketParser { Logger.log("Parsing %@", type: "SocketParser", args: message) - do { - let pack = try parseString(message) - Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) - - switch pack.type { - case .Event: - handleEvent(pack, socket: socket) - case .Ack: - handleAck(pack, socket: socket) - case .BinaryEvent: - handleBinary(pack, socket: socket) - case .BinaryAck: - handleBinary(pack, socket: socket) - case .Connect: - handleConnect(pack, socket: socket) - case .Disconnect: - socket.didDisconnect("Got Disconnect") - case .Error: - socket.didError("Error: \(pack.data)") - } - - }catch SocketParserError.InvalidBinaryPalceholder { - Logger.error("Parsed Invalid Binary Placeholder", type: "SocketParser") + guard let pack = parseString(message) else { + Logger.error("Parsing message", type: "SocketParser", args: message) + return } - catch SocketParserError.InvalidMessageType { - Logger.error("Parsed Invalid Binary Placeholder", type: "SocketParser") - } - catch { - + Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) + + switch pack.type { + case .Event: + handleEvent(pack, socket: socket) + case .Ack: + handleAck(pack, socket: socket) + case .BinaryEvent: + handleBinary(pack, socket: socket) + case .BinaryAck: + handleBinary(pack, socket: socket) + case .Connect: + handleConnect(pack, socket: socket) + case .Disconnect: + socket.didDisconnect("Got Disconnect") + case .Error: + socket.didError("Error: \(pack.data)") } } From 70b06a224857c4fc93dac78ee853324a32e55fb4 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 7 Sep 2015 16:53:10 -0400 Subject: [PATCH 16/76] small tweak --- SocketIOClientSwift/SocketPacket.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index a8b44d3..ecd42d7 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -25,8 +25,8 @@ import Foundation struct SocketPacket { - private var currentPlace = 0 private let placeholders: Int + private var currentPlace = 0 let nsp: String let id: Int From 5d9a8e88bf0b47ee492df7468efc643bad61bd83 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 7 Sep 2015 17:56:53 -0400 Subject: [PATCH 17/76] don't need to specifiy get --- SocketGenericParser.swift | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/SocketGenericParser.swift b/SocketGenericParser.swift index 0320084..037ebd5 100644 --- a/SocketGenericParser.swift +++ b/SocketGenericParser.swift @@ -12,20 +12,18 @@ struct SocketGenericParser { let message: String var currentIndex: Int var messageCharacters: [Character] { - get { - return Array(message.characters) - } - } - var currentCharacter: String? { - get{ - if currentIndex >= messageCharacters.count { - return nil - } - return String(messageCharacters[currentIndex]) - } + return Array(message.characters) } - mutating func read(characterLength:Int) -> String? { + var currentCharacter: String? { + if currentIndex >= messageCharacters.count { + return nil + } + + return String(messageCharacters[currentIndex]) + } + + mutating func read(characterLength: Int) -> String? { let startIndex = message.startIndex.advancedBy(currentIndex) let range = Range(start: startIndex, end: startIndex.advancedBy(characterLength)) currentIndex = currentIndex + characterLength @@ -33,7 +31,7 @@ struct SocketGenericParser { return message.substringWithRange(range) } - mutating func readUntilStringOccurence(string:String) -> String? { + mutating func readUntilStringOccurence(string: String) -> String? { let startIndex = message.startIndex.advancedBy(currentIndex) let range = Range(start: startIndex, end: message.endIndex) let subString = message.substringWithRange(range) as NSString @@ -46,7 +44,7 @@ struct SocketGenericParser { return subString.substringToIndex(foundRange.location) } - mutating func readUntilEnd() ->String { + mutating func readUntilEnd() -> String { return read(messageCharacters.count - currentIndex)! } } \ No newline at end of file From 520a765c22c7dadf217eededc57835791e8968a4 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 08:36:35 -0400 Subject: [PATCH 18/76] fix file location --- Socket.IO-Client-Swift.xcodeproj/project.pbxproj | 14 ++++++++------ .../SocketGenericParser.swift | 0 2 files changed, 8 insertions(+), 6 deletions(-) rename SocketGenericParser.swift => SocketIOClientSwift/SocketGenericParser.swift (100%) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 3800e67..c2a770b 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -42,9 +42,10 @@ 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 */; }; + 74D765621B9F0D870028551C /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 74D765631B9F0D9F0028551C /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 74D765641B9F0DA40028551C /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; - 9421F5D01B9DBF5900D625BB /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */; settings = {ASSET_TAGS = (); }; }; - 9421F5D11B9DBF5900D625BB /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */; settings = {ASSET_TAGS = (); }; }; 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 */; }; @@ -111,8 +112,8 @@ 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 = ""; }; + 74D765611B9F0D870028551C /* SocketGenericParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SocketGenericParser.swift; path = SocketIOClientSwift/SocketGenericParser.swift; sourceTree = ""; }; 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; - 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketGenericParser.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 = ""; }; 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketParserTest.swift; sourceTree = ""; }; @@ -265,12 +266,12 @@ 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */, 5764DF801B51F254004FF46E /* SocketEventHandler.swift */, 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */, + 74D765611B9F0D870028551C /* SocketGenericParser.swift */, 5764DF821B51F254004FF46E /* SocketIOClient.swift */, 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */, 5764DF831B51F254004FF46E /* SocketLogger.swift */, 5764DF841B51F254004FF46E /* SocketPacket.swift */, 5764DF851B51F254004FF46E /* SocketParser.swift */, - 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */, 5764DF861B51F254004FF46E /* SocketTypes.swift */, 5764DF871B51F254004FF46E /* SwiftRegex.swift */, 5764DF881B51F254004FF46E /* WebSocket.swift */, @@ -451,6 +452,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 74D765631B9F0D9F0028551C /* SocketGenericParser.swift in Sources */, 5764DF8D1B51F254004FF46E /* SocketEngine.swift in Sources */, 5764DF9B1B51F254004FF46E /* SocketParser.swift in Sources */, 5764DF9D1B51F254004FF46E /* SocketTypes.swift in Sources */, @@ -458,7 +460,6 @@ 5764DF911B51F254004FF46E /* SocketEventHandler.swift in Sources */, 5764DF931B51F254004FF46E /* SocketFixUTF8.swift in Sources */, 5764DF951B51F254004FF46E /* SocketIOClient.swift in Sources */, - 9421F5D01B9DBF5900D625BB /* SocketGenericParser.swift in Sources */, 5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */, 5764DF971B51F254004FF46E /* SocketLogger.swift in Sources */, 74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, @@ -473,6 +474,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 74D765621B9F0D870028551C /* SocketGenericParser.swift in Sources */, 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */, 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, @@ -480,7 +482,6 @@ 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, - 9421F5D11B9DBF5900D625BB /* SocketGenericParser.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, @@ -504,6 +505,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 74D765641B9F0DA40028551C /* SocketGenericParser.swift in Sources */, 5764DF8E1B51F254004FF46E /* SocketEngine.swift in Sources */, 5764DF9C1B51F254004FF46E /* SocketParser.swift in Sources */, 5764DF9E1B51F254004FF46E /* SocketTypes.swift in Sources */, diff --git a/SocketGenericParser.swift b/SocketIOClientSwift/SocketGenericParser.swift similarity index 100% rename from SocketGenericParser.swift rename to SocketIOClientSwift/SocketGenericParser.swift From d8c8b4941e7aa31780a404fabb4dbc7511378a8e Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 09:00:57 -0400 Subject: [PATCH 19/76] fix case with nsdata in json --- SocketIO-iOSTests/SocketTestCases.swift | 4 +++- SocketIOClientSwift/SocketPacket.swift | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift index b090e7d..da5277c 100644 --- a/SocketIO-iOSTests/SocketTestCases.swift +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -111,6 +111,8 @@ class SocketTestCases: NSObject { static func testJSONWithBuffer(abstractSocketSend:SocketSendFunction) { let testName = "testJSONWithBuffer" + let data = "0".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! + func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual((json.valueForKey("testString")! as! String), "test") @@ -123,7 +125,7 @@ class SocketTestCases: NSObject { XCTFail("Should have NSDictionary as result") } } - let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15, "buf": data] abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) } diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index ee648fc..3f65d4a 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -281,12 +281,14 @@ private extension SocketPacket { } return arr - } else if let dict = data as? NSMutableDictionary { + } else if let dict = data as? NSDictionary { + let mutDict = NSMutableDictionary(dictionary: dict) + for (key, value) in dict { - dict[key as! NSCopying] = shred(value, binary: &binary) + mutDict[key as! NSCopying] = shred(value, binary: &binary) } - return dict + return mutDict } else { return data } From 8a911a871e64ed3b557f8cdfac1d62e855bd5271 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 09:10:37 -0400 Subject: [PATCH 20/76] Fix socketio/socket.io-client-swift#166 --- SocketIOClientSwift/SocketPacket.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 3f65d4a..a10854a 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -66,7 +66,7 @@ struct SocketPacket { } var event: String { - return data[0] as! String + return data[0] as? String ?? String(data[0]) } var packetString: String { From 77e1da2b51cb5f4e2d90ef2745fbf6bbfab73bf1 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 09:19:17 -0400 Subject: [PATCH 21/76] fix socketio/socket.io-client-swift#166 --- SocketIOClientSwift/SocketPacket.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 5dcfd36..e0b0dbb 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -73,7 +73,9 @@ final class SocketPacket: Printable { } func getEvent() -> String { - return data?.removeAtIndex(0) as! String + let event = data?.removeAtIndex(0) + + return event as? String ?? String(stringInterpolationSegment: event!) } func addData(data:NSData) -> Bool { From c9d26ebd6501d4a3c47d3283e85d7ce66829f3d6 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 09:20:29 -0400 Subject: [PATCH 22/76] 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 b985e03..ae5e88a 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.3 # Or latest version +github "socketio/socket.io-client-swift" ~> 2.4.4 # 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.3' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 2.4.4' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index ed772a2..981098c 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.3" + s.version = "2.4.4" 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.3' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v2.4.4' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 31a20792227568550ee7afd67df72556c299a18a Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 09:22:37 -0400 Subject: [PATCH 23/76] fix warning --- SocketIOClientSwift/SocketPacket.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index e0b0dbb..6197ff4 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -73,7 +73,7 @@ final class SocketPacket: Printable { } func getEvent() -> String { - let event = data?.removeAtIndex(0) + let event: AnyObject? = data?.removeAtIndex(0) return event as? String ?? String(stringInterpolationSegment: event!) } From 8320e296e94aaf3cc3e4d83a582028885fa372e9 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 8 Sep 2015 09:30:33 -0400 Subject: [PATCH 24/76] bump version again --- 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 ae5e88a..d99a2cf 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.4 # Or latest version +github "socketio/socket.io-client-swift" ~> 2.4.5 # 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.4' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 2.4.5' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 981098c..833f4c2 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.4" + s.version = "2.4.5" 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.4' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v2.4.5' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 44508a51934cdf230dfdc618a47744f4c5b41b73 Mon Sep 17 00:00:00 2001 From: Hank Bao Date: Wed, 9 Sep 2015 22:33:35 +0800 Subject: [PATCH 25/76] Fix use-after-release issue in WebSocket --- SocketIOClientSwift/WebSocket.swift | 74 +++++++++++++++++------------ 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 7c8c787..1bc87f7 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -133,15 +133,18 @@ public class WebSocket : NSObject, NSStreamDelegate { if isCreated { return } - unowned let weakSelf = self - - dispatch_async(queue,{ - weakSelf.didDisconnect = false + + dispatch_async(queue, { [weak self] in + if let weakSelf = self { + weakSelf.didDisconnect = false + } }) - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { - weakSelf.isCreated = true - weakSelf.createHTTPRequest() - weakSelf.isCreated = false + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { [weak self] in + if let weakSelf = self { + weakSelf.isCreated = true + weakSelf.createHTTPRequest() + weakSelf.isCreated = false + } }) } @@ -370,14 +373,15 @@ public class WebSocket : NSObject, NSStreamDelegate { } } if totalSize > 0 { - unowned let weakSelf = self if validateResponse(buffer, bufferLen: totalSize) { - dispatch_async(queue,{ - weakSelf.connected = true - if let connectBlock = weakSelf.onConnect { - connectBlock() + dispatch_async(queue, { [weak self] in + if let weakSelf = self { + weakSelf.connected = true + if let connectBlock = weakSelf.onConnect { + connectBlock() + } + weakSelf.delegate?.websocketDidConnect(weakSelf) } - weakSelf.delegate?.websocketDidConnect(self) }) totalSize += 1 //skip the last \n let restSize = bufferLen - totalSize @@ -515,11 +519,13 @@ public class WebSocket : NSObject, NSStreamDelegate { data = NSData(bytes: UnsafePointer((buffer+offset)), length: Int(len)) } if receivedOpcode == OpCode.Pong.rawValue { - dispatch_async(queue,{[unowned self] in - if let pongBlock = self.onPong { - pongBlock() + dispatch_async(queue, { [weak self] in + if let weakSelf = self { + if let pongBlock = weakSelf.onPong { + pongBlock() + } + weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf) } - self.pongDelegate?.websocketDidReceivePong(self) }) let step = Int(offset+numericCast(len)) @@ -608,19 +614,23 @@ public class WebSocket : NSObject, NSStreamDelegate { writeError(CloseCode.Encoding.rawValue) return false } - dispatch_async(queue,{[unowned self] in - if let textBlock = self.onText { - textBlock(str! as String) + dispatch_async(queue, { [weak self] in + if let weakSelf = self { + if let textBlock = weakSelf.onText { + textBlock(str! as String) + } + weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String) } - self.delegate?.websocketDidReceiveMessage(self, text: str! as String) }) } else if response.code == .BinaryFrame { let data = response.buffer! //local copy so it is perverse for writing - dispatch_async(queue,{[unowned self] in - if let dataBlock = self.onData { - dataBlock(data) + dispatch_async(queue, { [weak self] in + if let weakSelf = self { + if let dataBlock = weakSelf.onData { + dataBlock(data) + } + weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data) } - self.delegate?.websocketDidReceiveData(self, data: data) }) } readStack.removeLast() @@ -723,12 +733,14 @@ public class WebSocket : NSObject, NSStreamDelegate { ///used to preform the disconnect delegate private func doDisconnect(error: NSError?) { if !self.didDisconnect { - dispatch_async(queue,{[unowned self] in - self.didDisconnect = true - if let disconnect = self.onDisconnect { - disconnect(error) + dispatch_async(queue, { [weak self] in + if let weakSelf = self { + weakSelf.didDisconnect = true + if let disconnect = weakSelf.onDisconnect { + disconnect(error) + } + weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error) } - self.delegate?.websocketDidDisconnect(self, error: error) }) } } From 713ce46e3b9ea829dc32680809af8033fc939977 Mon Sep 17 00:00:00 2001 From: Hank Bao Date: Wed, 9 Sep 2015 22:40:09 +0800 Subject: [PATCH 26/76] Use swift 2 guard statement --- SocketIOClientSwift/WebSocket.swift | 80 +++++++++++++++++------------ 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 1bc87f7..af05abb 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -135,16 +135,20 @@ public class WebSocket : NSObject, NSStreamDelegate { } dispatch_async(queue, { [weak self] in - if let weakSelf = self { - weakSelf.didDisconnect = false + guard let weakSelf = self else { + return } + + weakSelf.didDisconnect = false }) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { [weak self] in - if let weakSelf = self { - weakSelf.isCreated = true - weakSelf.createHTTPRequest() - weakSelf.isCreated = false + guard let weakSelf = self else { + return } + + weakSelf.isCreated = true + weakSelf.createHTTPRequest() + weakSelf.isCreated = false }) } @@ -375,13 +379,15 @@ public class WebSocket : NSObject, NSStreamDelegate { if totalSize > 0 { if validateResponse(buffer, bufferLen: totalSize) { dispatch_async(queue, { [weak self] in - if let weakSelf = self { - weakSelf.connected = true - if let connectBlock = weakSelf.onConnect { - connectBlock() - } - weakSelf.delegate?.websocketDidConnect(weakSelf) + guard let weakSelf = self else { + return } + + weakSelf.connected = true + if let connectBlock = weakSelf.onConnect { + connectBlock() + } + weakSelf.delegate?.websocketDidConnect(weakSelf) }) totalSize += 1 //skip the last \n let restSize = bufferLen - totalSize @@ -520,12 +526,14 @@ public class WebSocket : NSObject, NSStreamDelegate { } if receivedOpcode == OpCode.Pong.rawValue { dispatch_async(queue, { [weak self] in - if let weakSelf = self { - if let pongBlock = weakSelf.onPong { - pongBlock() - } - weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf) + guard let weakSelf = self else { + return } + + if let pongBlock = weakSelf.onPong { + pongBlock() + } + weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf) }) let step = Int(offset+numericCast(len)) @@ -615,22 +623,26 @@ public class WebSocket : NSObject, NSStreamDelegate { return false } dispatch_async(queue, { [weak self] in - if let weakSelf = self { - if let textBlock = weakSelf.onText { - textBlock(str! as String) - } - weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String) + guard let weakSelf = self else { + return } + + if let textBlock = weakSelf.onText { + textBlock(str! as String) + } + weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String) }) } else if response.code == .BinaryFrame { let data = response.buffer! //local copy so it is perverse for writing dispatch_async(queue, { [weak self] in - if let weakSelf = self { - if let dataBlock = weakSelf.onData { - dataBlock(data) - } - weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data) + guard let weakSelf = self else { + return } + + if let dataBlock = weakSelf.onData { + dataBlock(data) + } + weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data) }) } readStack.removeLast() @@ -734,13 +746,15 @@ public class WebSocket : NSObject, NSStreamDelegate { private func doDisconnect(error: NSError?) { if !self.didDisconnect { dispatch_async(queue, { [weak self] in - if let weakSelf = self { - weakSelf.didDisconnect = true - if let disconnect = weakSelf.onDisconnect { - disconnect(error) - } - weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error) + guard let weakSelf = self else { + return } + + weakSelf.didDisconnect = true + if let disconnect = weakSelf.onDisconnect { + disconnect(error) + } + weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error) }) } } From a634f5baccbac4798efd8a5b0f07d3124f37d0ab Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 10 Sep 2015 16:32:57 -0400 Subject: [PATCH 27/76] simplify socketengine --- SocketIOClientSwift/SocketEngine.swift | 25 +++---------------- SocketIOClientSwift/SocketGenericParser.swift | 2 ++ SocketIOClientSwift/SocketParser.swift | 9 ++++--- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index bf0c70d..ff7b1fd 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -69,11 +69,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate { var urlWebSocket: String? var ws: WebSocket? - public enum PacketType: Int { + @objc public enum PacketType: Int { case Open, Close, Ping, Pong, Message, Upgrade, Noop - init?(str: String?) { - if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { + init?(str: String) { + if let value = Int(str), raw = PacketType(rawValue: value) { self = raw } else { return nil @@ -547,7 +547,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate { fixDoubleUTF8(&message) } - let type = PacketType(str: (message["^(\\d)"].groups()?[1])) ?? { + let type = PacketType(str: (message["^(\\d)"].groups()?[1]) ?? "") ?? { self.checkIfMessageIsBase64Binary(message) return PacketType.Noop }() @@ -687,23 +687,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate { } } - /** - 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?) { - if let pType = PacketType(rawValue: type) { - var arr = [NSData]() - - if let data = data { - for d in data { - arr.append(d as! NSData) - } - } - - write(msg, withType: pType, withData: arr) - } - } - // Delagate methods public func websocketDidConnect(socket:WebSocket) { diff --git a/SocketIOClientSwift/SocketGenericParser.swift b/SocketIOClientSwift/SocketGenericParser.swift index 037ebd5..af50c9a 100644 --- a/SocketIOClientSwift/SocketGenericParser.swift +++ b/SocketIOClientSwift/SocketGenericParser.swift @@ -36,9 +36,11 @@ struct SocketGenericParser { let range = Range(start: startIndex, end: message.endIndex) let subString = message.substringWithRange(range) as NSString let foundRange = subString.rangeOfString(string) + if foundRange.location == Int.max { return nil } + currentIndex = currentIndex + foundRange.location return subString.substringToIndex(foundRange.location) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index fc637a6..1c06328 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -30,6 +30,7 @@ class SocketParser { private static func handleEvent(p: SocketPacket, socket: SocketIOClient) { guard isCorrectNamespace(p.nsp, socket) else { return } + socket.handleEvent(p.event, data: p.args, isInternalMessage: false, wantsAck: p.id) } @@ -59,10 +60,9 @@ class SocketParser { // Translation of socket.io-client#decodeString static func parseString(message: String) -> SocketPacket? { var parser = SocketGenericParser(message: message, currentIndex: 0) - guard let typeString = parser.read(1), - let type = SocketPacket.PacketType(str: typeString) else { - return nil - } + + guard let typeString = parser.read(1), type = SocketPacket.PacketType(str: typeString) + else {return nil} if parser.messageCharacters.count == 1 { return SocketPacket(type: type, nsp: "/") @@ -129,6 +129,7 @@ class SocketParser { Logger.error("Parsing message", type: "SocketParser", args: message) return } + Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) switch pack.type { From 4f2040fbfdf1139091d0167a2ccbad11e2989825 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:25:01 +0000 Subject: [PATCH 28/76] Simplified SocketEngine.swift --- SocketIOClientSwift/SocketEngine.swift | 76 ++++++++++++-------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index ff7b1fd..946b38e 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -350,9 +350,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate { // We had packets waiting for send when we upgraded // Send them raw private func flushWaitingForPostToWebSocket() { - for msg in postWait { - ws?.writeString(msg) - } + if let ws = ws { + for msg in postWait { + ws.writeString(msg) + } + } postWait.removeAll(keepCapacity: true) } @@ -495,7 +497,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate { var n = 0 var msg = "" - func testLength(length:String, inout n:Int) -> Bool { + func testLength(length: String, inout n: Int) -> Bool { if let num = Int(length) { n = num return false @@ -525,8 +527,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate { 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) + dispatch_async(handleQueue) { + self.parseEngineMessage(msg, fromPolling: true) } } @@ -549,8 +551,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate { let type = PacketType(str: (message["^(\\d)"].groups()?[1]) ?? "") ?? { self.checkIfMessageIsBase64Binary(message) - return PacketType.Noop - }() + return .Noop + }() switch type { case PacketType.Message: @@ -608,13 +610,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate { postWait.append(strMsg) - if let datas = datas { - for data in datas { - let (_, b64Data) = createBinaryDataForSend(data) + for data in datas ?? [] { + let (_, b64Data) = createBinaryDataForSend(data) - postWait.append(b64Data!) - } - } + postWait.append(b64Data!) + } if !waitingForPost { flushWaitingForPost() @@ -629,30 +629,26 @@ public final class SocketEngine: NSObject, WebSocketDelegate { ws?.writeString("\(type.rawValue)\(str)") - if let datas = datas { - for data in datas { - let (data, _) = createBinaryDataForSend(data) - if data != nil { - ws?.writeData(data!) - } - } - } + for data in datas ?? [] { + let (data, _) = createBinaryDataForSend(data) + if data != nil { + ws?.writeData(data!) + } + } } // Starts the ping timer private func startPingTimer() { - guard pingInterval != nil else { - return - } + if let pingInterval = pingInterval { + pingTimer?.invalidate() + pingTimer = nil - pingTimer?.invalidate() - dispatch_async(dispatch_get_main_queue()) {[weak self] in - if let this = self { - this.pingTimer = NSTimer.scheduledTimerWithTimeInterval(this.pingInterval!, target: this, - selector: Selector("sendPing"), userInfo: nil, repeats: true) - } - } - } + dispatch_async(dispatch_get_main_queue()) { + self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self, + selector: Selector("sendPing"), userInfo: nil, repeats: true) + } + } + } func stopPolling() { session.invalidateAndCancel() @@ -672,16 +668,16 @@ public final class SocketEngine: NSObject, WebSocketDelegate { Write a message, independent of transport. */ 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 { - Logger.log("Writing ws: %@ has data: %@", type: this.logType, args: msg, + dispatch_async(emitQueue) { + if self.connected { + if self.websocket { + Logger.log("Writing ws: %@ has data: %@", type: self.logType, args: msg, data == nil ? false : true) - this.sendWebSocketMessage(msg, withType: type, datas: data) + self.sendWebSocketMessage(msg, withType: type, datas: data) } else { - Logger.log("Writing poll: %@ has data: %@", type: this.logType, args: msg, + Logger.log("Writing poll: %@ has data: %@", type: self.logType, args: msg, data == nil ? false : true) - this.sendPollMessage(msg, withType: type, datas: data) + self.sendPollMessage(msg, withType: type, datas: data) } } } From 40d76cdbeb4c4d6b032cffdd8fb3b76ddfe851c4 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:26:56 +0000 Subject: [PATCH 29/76] SocketIOClient: making a few fields private --- SocketIOClientSwift/SocketIOClient.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 0a1d8bf..d45c6d2 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -25,10 +25,11 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient { - public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) - public let handleQueue: dispatch_queue_t! - public let socketURL: String - + private let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) + private 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 @@ -49,10 +50,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient { private var connectParams: [String: AnyObject]? private var reconnectTimer: NSTimer? - let reconnectAttempts: Int! - var ackHandlers = SocketAckManager() - var currentAck = -1 - var waitingData = [SocketPacket]() + private let reconnectAttempts: Int! + private var ackHandlers = SocketAckManager() + private var currentAck = -1 + + internal var waitingData = [SocketPacket]() /** Create a new SocketIOClient. opts can be omitted From 1739afa670db28948976a4d85535ba0a6b671e5c Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:28:28 +0000 Subject: [PATCH 30/76] SocketIOClient: added assertion to check timeoutAfter is not negative --- SocketIOClientSwift/SocketIOClient.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index d45c6d2..b89141c 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -150,10 +150,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient { */ public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { - guard status != SocketIOClientStatus.Connected else { + assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") + + guard status != .Connected else { return } - if status == SocketIOClientStatus.Closed { + + if status == .Closed { Logger.log("Warning! This socket was previously closed. This might be dangerous!", type: logType) } From 2bc72e197585bd33fdddf9fb7946d5c5fe223894 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:31:41 +0000 Subject: [PATCH 31/76] SocketIOClient: removed unnecessary weak self --- SocketIOClientSwift/SocketIOClient.swift | 85 +++++++++++------------- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index b89141c..8d35d3b 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -171,10 +171,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient { 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) + dispatch_after(time, dispatch_get_main_queue()) { + if self.status != .Connected { + self.status = .Closed + self.engine?.close(fast: true) handler?() } @@ -186,15 +186,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { if let this = self { this.ackHandlers.addAck(ack, callback: callback) - dispatch_async(this.emitQueue) {[weak this] in - this?._emit(items, ack: ack) + dispatch_async(this.emitQueue) { + this._emit(items, ack: ack) } if timeout != 0 { let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) - dispatch_after(time, dispatch_get_main_queue()) {[weak this] in - this?.ackHandlers.timeoutAck(ack) + dispatch_after(time, dispatch_get_main_queue()) { + this.ackHandlers.timeoutAck(ack) } } } @@ -203,7 +203,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { func didConnect() { Logger.log("Socket connected", type: logType) - status = SocketIOClientStatus.Connected + status = .Connected currentReconnectAttempt = 0 clearReconnectTimer() @@ -213,13 +213,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient { } func didDisconnect(reason: String) { - guard status != SocketIOClientStatus.Closed else { + guard status != .Closed else { return } Logger.log("Disconnected: %@", type: logType, args: reason) - status = SocketIOClientStatus.Closed + status = .Closed reconnects = false @@ -254,12 +254,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient { Same as emit, but meant for Objective-C */ public func emit(event: String, withItems items: [AnyObject]) { - guard status == SocketIOClientStatus.Connected else { + guard status == .Connected else { return } - dispatch_async(emitQueue) {[weak self] in - self?._emit([event] + items) + dispatch_async(emitQueue) { + self._emit([event] + items) } } @@ -279,7 +279,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { } private func _emit(data: [AnyObject], ack: Int? = nil) { - guard status == SocketIOClientStatus.Connected else { + guard status == .Connected else { return } @@ -288,7 +288,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { Logger.log("Emitting: %@", type: logType, args: str) - if packet.type == SocketPacket.PacketType.BinaryEvent { + if packet.type == .BinaryEvent { engine?.send(str, withData: packet.binary) } else { engine?.send(str, withData: nil) @@ -297,17 +297,17 @@ public final class SocketIOClient: NSObject, SocketEngineClient { // If the server wants to know that the client received data 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.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true) + dispatch_async(emitQueue) { + if self.status == .Connected { + let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) let str = packet.packetString - Logger.log("Emitting Ack: %@", type: this.logType, args: str) + Logger.log("Emitting Ack: %@", type: self.logType, args: str) if packet.type == SocketPacket.PacketType.BinaryAck { - this.engine?.send(str, withData: packet.binary) + self.engine?.send(str, withData: packet.binary) } else { - this.engine?.send(str, withData: nil) + self.engine?.send(str, withData: nil) } } @@ -317,10 +317,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func engineDidClose(reason: String) { waitingData.removeAll() - if status == SocketIOClientStatus.Closed || !reconnects { + if status == .Closed || !reconnects { didDisconnect(reason) - } else if status != SocketIOClientStatus.Reconnecting { - status = SocketIOClientStatus.Reconnecting + } else if status != .Reconnecting { + status = .Reconnecting handleEvent("reconnect", data: [reason], isInternalMessage: true) tryReconnect() } @@ -339,22 +339,21 @@ public final class SocketIOClient: NSObject, SocketEngineClient { */ public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool, wantsAck ack: Int? = nil) { - guard status == SocketIOClientStatus.Connected || isInternalMessage else { + guard status == .Connected || isInternalMessage else { return } - // println("Should do event: \(event) with data: \(data)") Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "") if anyHandler != nil { - dispatch_async(handleQueue) {[weak self] in - self?.anyHandler?(SocketAnyEvent(event: event, items: data)) + dispatch_async(handleQueue) { + self.anyHandler?(SocketAnyEvent(event: event, items: data)) } } for handler in handlers where handler.event == event { if let ack = ack { - dispatch_async(handleQueue) {[weak self] in + dispatch_async(handleQueue) { handler.executeCallback(data, withAck: ack, withSocket: self) } } else { @@ -446,18 +445,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient { } public func parseSocketMessage(msg: String) { - dispatch_async(handleQueue) {[weak self] in - if let this = self { - SocketParser.parseSocketMessage(msg, socket: this) - } + dispatch_async(handleQueue) { + SocketParser.parseSocketMessage(msg, socket: self) } } public func parseBinaryData(data: NSData) { - dispatch_async(handleQueue) {[weak self] in - if let this = self { - SocketParser.parseBinaryData(data, socket: this) - } + dispatch_async(handleQueue) { + SocketParser.parseBinaryData(data, socket: self) } } @@ -473,19 +468,17 @@ public final class SocketIOClient: NSObject, SocketEngineClient { if reconnectTimer == nil { Logger.log("Starting reconnect", type: logType) - status = SocketIOClientStatus.Reconnecting + status = .Reconnecting - 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) - } + dispatch_async(dispatch_get_main_queue()) { + self.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(self.reconnectWait), + target: self, selector: "_tryReconnect", userInfo: nil, repeats: true) } } } - + @objc private func _tryReconnect() { - if status == SocketIOClientStatus.Connected { + if status == .Connected { clearReconnectTimer() return From a43548e20384b92c5cda903295ab392ce8458b40 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:33:01 +0000 Subject: [PATCH 32/76] SocketIOClient: remove unnecessary optional --- SocketIOClientSwift/SocketIOClient.swift | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 8d35d3b..f6ba154 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -114,10 +114,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient { engine?.close(fast: true) } - private func addEngine() { + private func addEngine() -> SocketEngine { Logger.log("Adding engine", type: logType) - - engine = SocketEngine(client: self, opts: opts) + + let newEngine = SocketEngine(client: self, opts: opts) + + engine = newEngine + return newEngine } private func clearReconnectTimer() { @@ -162,8 +165,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { } status = SocketIOClientStatus.Connecting - addEngine() - engine?.open(connectParams) + addEngine().open(connectParams) guard timeoutAfter != 0 else { return From b8cfdc8fd288cdef892b1a997414963141903652 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:33:40 +0000 Subject: [PATCH 33/76] SocketIOClient: simplified conditional --- SocketIOClientSwift/SocketIOClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index f6ba154..2118d1b 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -401,7 +401,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func off(event: String) { Logger.log("Removing handler for event: %@", type: logType, args: event) - handlers = ContiguousArray(handlers.filter {!($0.event == event)}) + handlers = ContiguousArray(handlers.filter { $0.event != event }) } /** From bad0d4b419b0a092b6f77369a768bdce0d94db9a Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:36:05 +0000 Subject: [PATCH 34/76] SocketPacket: using Logger instead of print --- SocketIOClientSwift/SocketPacket.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index a10854a..12b975a 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -28,6 +28,8 @@ struct SocketPacket { private let placeholders: Int private var currentPlace = 0 + private static let logType = "SocketPacket" + let nsp: String let id: Int let type: PacketType @@ -113,7 +115,7 @@ struct SocketPacket { message += jsonString! as String + "," } catch { - print("Error creating JSON object in SocketPacket.completeMessage") + Logger.error("Error creating JSON object in SocketPacket.completeMessage", type: SocketPacket.logType) } } else if var str = arg as? String { str = str["\n"] ~= "\\\\n" From dc50af1505976fc062b522f8420722b377c48dab Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:37:58 +0000 Subject: [PATCH 35/76] SwiftRegex: changed static method to static to avoid unnecessary dynamic dispatching --- SocketIOClientSwift/SwiftRegex.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SwiftRegex.swift b/SocketIOClientSwift/SwiftRegex.swift index fb306aa..66330ad 100644 --- a/SocketIOClientSwift/SwiftRegex.swift +++ b/SocketIOClientSwift/SwiftRegex.swift @@ -37,7 +37,7 @@ public class SwiftRegex: NSObject, BooleanType { super.init() } - class func failure(message: String) { + static func failure(message: String) { print("SwiftRegex: "+message) //assert(false,"SwiftRegex: failed") } From adb36506094b32f08d2301e9a03184102b25d02f Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:38:08 +0000 Subject: [PATCH 36/76] SwiftRegex: failing with fatalError --- SocketIOClientSwift/SwiftRegex.swift | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SwiftRegex.swift b/SocketIOClientSwift/SwiftRegex.swift index 66330ad..c237cc4 100644 --- a/SocketIOClientSwift/SwiftRegex.swift +++ b/SocketIOClientSwift/SwiftRegex.swift @@ -36,12 +36,11 @@ public class SwiftRegex: NSObject, BooleanType { } super.init() } - - static func failure(message: String) { - print("SwiftRegex: "+message) - //assert(false,"SwiftRegex: failed") - } - + + private static func failure(message: String) { + fatalError("SwiftRegex: \(message)") + } + final var targetRange: NSRange { return NSRange(location: 0,length: target.utf16.count) } From d5b9afd28d1f65997f955716ff15878d730d886b Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:39:24 +0000 Subject: [PATCH 37/76] SwiftRegex does not need to be exposed --- SocketIOClientSwift/SwiftRegex.swift | 44 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/SocketIOClientSwift/SwiftRegex.swift b/SocketIOClientSwift/SwiftRegex.swift index c237cc4..df384f4 100644 --- a/SocketIOClientSwift/SwiftRegex.swift +++ b/SocketIOClientSwift/SwiftRegex.swift @@ -13,9 +13,9 @@ import Foundation -var swiftRegexCache = [String: NSRegularExpression]() +private var swiftRegexCache = [String: NSRegularExpression]() -public class SwiftRegex: NSObject, BooleanType { +internal class SwiftRegex: NSObject, BooleanType { var target:String var regex: NSRegularExpression @@ -36,16 +36,16 @@ public class SwiftRegex: NSObject, BooleanType { } super.init() } - + private static func failure(message: String) { fatalError("SwiftRegex: \(message)") } - final var targetRange: NSRange { + private final var targetRange: NSRange { return NSRange(location: 0,length: target.utf16.count) } - final func substring(range: NSRange) -> String? { + private final func substring(range: NSRange) -> String? { if ( range.location != NSNotFound ) { return (target as NSString).substringWithRange(range) } else { @@ -53,24 +53,24 @@ public class SwiftRegex: NSObject, BooleanType { } } - public func doesMatch(options: NSMatchingOptions!) -> Bool { + func doesMatch(options: NSMatchingOptions!) -> Bool { return range(options).location != NSNotFound } - public func range(options: NSMatchingOptions) -> NSRange { + func range(options: NSMatchingOptions) -> NSRange { return regex.rangeOfFirstMatchInString(target as String, options: [], range: targetRange) } - public func match(options: NSMatchingOptions) -> String? { + func match(options: NSMatchingOptions) -> String? { return substring(range(options)) } - public func groups() -> [String]? { + func groups() -> [String]? { return groupsForMatch(regex.firstMatchInString(target as String, options: NSMatchingOptions.WithoutAnchoringBounds, range: targetRange)) } - func groupsForMatch(match: NSTextCheckingResult!) -> [String]? { + private func groupsForMatch(match: NSTextCheckingResult!) -> [String]? { if match != nil { var groups = [String]() for groupno in 0...regex.numberOfCaptureGroups { @@ -86,7 +86,7 @@ public class SwiftRegex: NSObject, BooleanType { } } - public subscript(groupno: Int) -> String? { + subscript(groupno: Int) -> String? { get { return groups()?[groupno] } @@ -115,19 +115,19 @@ public class SwiftRegex: NSObject, BooleanType { return matches } - public func ranges() -> [NSRange] { + func ranges() -> [NSRange] { return matchResults().map { $0.range } } - public func matches() -> [String] { + func matches() -> [String] { return matchResults().map( { self.substring($0.range)!}) } - public func allGroups() -> [[String]?] { + func allGroups() -> [[String]?] { return matchResults().map {self.groupsForMatch($0)} } - public func dictionary(options: NSMatchingOptions!) -> Dictionary { + func dictionary(options: NSMatchingOptions!) -> Dictionary { var out = Dictionary() for match in matchResults() { out[substring(match.rangeAtIndex(1))!] = substring(match.rangeAtIndex(2))! @@ -152,31 +152,31 @@ public class SwiftRegex: NSObject, BooleanType { return out as String } - public var boolValue: Bool { + var boolValue: Bool { return doesMatch(nil) } } extension String { - public subscript(pattern: String, options: NSRegularExpressionOptions) -> SwiftRegex { + subscript(pattern: String, options: NSRegularExpressionOptions) -> SwiftRegex { return SwiftRegex(target: self, pattern: pattern, options: options) } } extension String { - public subscript(pattern: String) -> SwiftRegex { + subscript(pattern: String) -> SwiftRegex { return SwiftRegex(target: self, pattern: pattern, options: nil) } } -public func ~= (left: SwiftRegex, right: String) -> String { +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: []) } -public func ~= (left: SwiftRegex, right: [String]) -> String { +func ~= (left: SwiftRegex, right: [String]) -> String { var matchNumber = 0 return left.substituteMatches({match, stop -> String in @@ -189,7 +189,7 @@ public func ~= (left: SwiftRegex, right: [String]) -> String { }, options: []) } -public func ~= (left: SwiftRegex, right: (String) -> String) -> String { +func ~= (left: SwiftRegex, right: (String) -> String) -> String { // return right(left.substring(match.range)) return left.substituteMatches( {match, stop -> String in @@ -197,7 +197,7 @@ public func ~= (left: SwiftRegex, right: (String) -> String) -> String { }, options: []) } -public func ~= (left: SwiftRegex, right: ([String]?) -> String) -> String { +func ~= (left: SwiftRegex, right: ([String]?) -> String) -> String { return left.substituteMatches({match, stop -> String in return right(left.groupsForMatch(match)) }, options: []) From 2bb7360918e0903b1f4e3cfc3506f08bf09a1166 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:42:55 +0000 Subject: [PATCH 38/76] WebSockets: removed unnecessary weaks and simplified code --- SocketIOClientSwift/WebSocket.swift | 78 ++++++++++------------------- 1 file changed, 27 insertions(+), 51 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index af05abb..8c2d1de 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -378,21 +378,17 @@ public class WebSocket : NSObject, NSStreamDelegate { } if totalSize > 0 { if validateResponse(buffer, bufferLen: totalSize) { - dispatch_async(queue, { [weak self] in - guard let weakSelf = self else { - return - } - - weakSelf.connected = true - if let connectBlock = weakSelf.onConnect { + dispatch_async(queue, { + self.connected = true + if let connectBlock = self.onConnect { connectBlock() } - weakSelf.delegate?.websocketDidConnect(weakSelf) + self.delegate?.websocketDidConnect(self) }) totalSize += 1 //skip the last \n let restSize = bufferLen - totalSize if restSize > 0 { - processRawMessage((buffer+totalSize),bufferLen: restSize) + processRawMessage((buffer+totalSize), bufferLen: restSize) } return true } @@ -525,15 +521,9 @@ public class WebSocket : NSObject, NSStreamDelegate { data = NSData(bytes: UnsafePointer((buffer+offset)), length: Int(len)) } if receivedOpcode == OpCode.Pong.rawValue { - dispatch_async(queue, { [weak self] in - guard let weakSelf = self else { - return - } - - if let pongBlock = weakSelf.onPong { - pongBlock() - } - weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf) + dispatch_async(queue, { + self.onPong?() + self.pongDelegate?.websocketDidReceivePong(self) }) let step = Int(offset+numericCast(len)) @@ -618,33 +608,24 @@ public class WebSocket : NSObject, NSStreamDelegate { dequeueWrite(data, code: OpCode.Pong) } else if response.code == .TextFrame { let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding) - if str == nil { - writeError(CloseCode.Encoding.rawValue) - return false - } - dispatch_async(queue, { [weak self] in - guard let weakSelf = self else { - return - } - if let textBlock = weakSelf.onText { - textBlock(str! as String) - } - weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String) - }) + if let str = str as String? { + dispatch_async(queue, { + self.onText?(str) + self.delegate?.websocketDidReceiveMessage(self, text: str) + }) + } else { + writeError(CloseCode.Encoding.rawValue) + return false + } } else if response.code == .BinaryFrame { let data = response.buffer! //local copy so it is perverse for writing - dispatch_async(queue, { [weak self] in - guard let weakSelf = self else { - return - } - - if let dataBlock = weakSelf.onData { - dataBlock(data) - } - weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data) - }) + dispatch_async(queue) { + self.onData?(data) + self.delegate?.websocketDidReceiveData(self, data: data) + } } + readStack.removeLast() return true } @@ -745,17 +726,12 @@ public class WebSocket : NSObject, NSStreamDelegate { ///used to preform the disconnect delegate private func doDisconnect(error: NSError?) { if !self.didDisconnect { - dispatch_async(queue, { [weak self] in - guard let weakSelf = self else { - return - } + dispatch_async(queue) { + self.didDisconnect = true - weakSelf.didDisconnect = true - if let disconnect = weakSelf.onDisconnect { - disconnect(error) - } - weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error) - }) + self.onDisconnect?(error) + self.delegate?.websocketDidDisconnect(self, error: error) + } } } From e955699b214de21d2577cd85c420ed6b11292e81 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:43:16 +0000 Subject: [PATCH 39/76] SSLCert is now private --- SocketIOClientSwift/WebSocket.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 8c2d1de..f4d5bb2 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -750,7 +750,7 @@ public class WebSocket : NSObject, NSStreamDelegate { import Foundation import Security -public class SSLCert { +private class SSLCert { var certData: NSData? var key: SecKeyRef? @@ -761,7 +761,7 @@ public class SSLCert { :returns: a representation security object to be used with */ - public init(data: NSData) { + init(data: NSData) { self.certData = data } @@ -772,7 +772,7 @@ public class SSLCert { :returns: a representation security object to be used with */ - public init(key: SecKeyRef) { + init(key: SecKeyRef) { self.key = key } } From c6997f32dd7e90b72ec6d2b5a9c2b9520bc17977 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 11 Sep 2015 05:52:17 +0000 Subject: [PATCH 40/76] Fixed indentation --- SocketIOClientSwift/SocketEngine.swift | 56 ++++++++++++------------ SocketIOClientSwift/SocketIOClient.swift | 30 ++++++------- SocketIOClientSwift/SwiftRegex.swift | 6 +-- SocketIOClientSwift/WebSocket.swift | 34 +++++++------- 4 files changed, 63 insertions(+), 63 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 946b38e..cddaaf9 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -24,7 +24,7 @@ import Foundation -public final class SocketEngine: NSObject, WebSocketDelegate { +public final class SocketEngine: NSObject, WebSocketDelegate { private typealias Probe = (msg: String, type: PacketType, data: [NSData]?) private typealias ProbeWaitQueue = [Probe] @@ -350,11 +350,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate { // We had packets waiting for send when we upgraded // Send them raw private func flushWaitingForPostToWebSocket() { - if let ws = ws { - for msg in postWait { - ws.writeString(msg) - } - } + if let ws = ws { + for msg in postWait { + ws.writeString(msg) + } + } postWait.removeAll(keepCapacity: true) } @@ -527,7 +527,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate { if msg.characters.count != 0 { // Be sure to capture the value of the msg - dispatch_async(handleQueue) { + dispatch_async(handleQueue) { self.parseEngineMessage(msg, fromPolling: true) } } @@ -552,7 +552,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate { let type = PacketType(str: (message["^(\\d)"].groups()?[1]) ?? "") ?? { self.checkIfMessageIsBase64Binary(message) return .Noop - }() + }() switch type { case PacketType.Message: @@ -610,11 +610,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate { postWait.append(strMsg) - for data in datas ?? [] { - let (_, b64Data) = createBinaryDataForSend(data) + for data in datas ?? [] { + let (_, b64Data) = createBinaryDataForSend(data) - postWait.append(b64Data!) - } + postWait.append(b64Data!) + } if !waitingForPost { flushWaitingForPost() @@ -629,26 +629,26 @@ public final class SocketEngine: NSObject, WebSocketDelegate { ws?.writeString("\(type.rawValue)\(str)") - for data in datas ?? [] { - let (data, _) = createBinaryDataForSend(data) - if data != nil { - ws?.writeData(data!) - } - } + for data in datas ?? [] { + let (data, _) = createBinaryDataForSend(data) + if data != nil { + ws?.writeData(data!) + } + } } // Starts the ping timer private func startPingTimer() { - if let pingInterval = pingInterval { - pingTimer?.invalidate() - pingTimer = nil + if let pingInterval = pingInterval { + pingTimer?.invalidate() + pingTimer = nil - dispatch_async(dispatch_get_main_queue()) { - self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self, - selector: Selector("sendPing"), userInfo: nil, repeats: true) - } - } - } + dispatch_async(dispatch_get_main_queue()) { + self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self, + selector: Selector("sendPing"), userInfo: nil, repeats: true) + } + } + } func stopPolling() { session.invalidateAndCancel() @@ -668,7 +668,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate { Write a message, independent of transport. */ public func write(msg: String, withType type: PacketType, withData data: [NSData]?) { - dispatch_async(emitQueue) { + dispatch_async(emitQueue) { if self.connected { if self.websocket { Logger.log("Writing ws: %@ has data: %@", type: self.logType, args: msg, diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2118d1b..3b3fbf3 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -28,7 +28,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { private let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) private let handleQueue: dispatch_queue_t! - public let socketURL: String + public let socketURL: String public private(set) var engine: SocketEngine? public private(set) var secure = false @@ -117,10 +117,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient { private func addEngine() -> SocketEngine { Logger.log("Adding engine", type: logType) - let newEngine = SocketEngine(client: self, opts: opts) + let newEngine = SocketEngine(client: self, opts: opts) engine = newEngine - return newEngine + return newEngine } private func clearReconnectTimer() { @@ -153,7 +153,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { */ public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { - assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") + assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .Connected else { return @@ -172,9 +172,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { } let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) - - dispatch_after(time, dispatch_get_main_queue()) { - if self.status != .Connected { + + dispatch_after(time, dispatch_get_main_queue()) { + if self.status != .Connected { self.status = .Closed self.engine?.close(fast: true) @@ -259,8 +259,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { guard status == .Connected else { return } - - dispatch_async(emitQueue) { + + dispatch_async(emitQueue) { self._emit([event] + items) } } @@ -300,7 +300,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { // If the server wants to know that the client received data func emitAck(ack: Int, withItems items: [AnyObject]) { dispatch_async(emitQueue) { - if self.status == .Connected { + if self.status == .Connected { let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) let str = packet.packetString @@ -448,13 +448,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func parseSocketMessage(msg: String) { dispatch_async(handleQueue) { - SocketParser.parseSocketMessage(msg, socket: self) + SocketParser.parseSocketMessage(msg, socket: self) } } public func parseBinaryData(data: NSData) { dispatch_async(handleQueue) { - SocketParser.parseBinaryData(data, socket: self) + SocketParser.parseBinaryData(data, socket: self) } } @@ -472,9 +472,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { status = .Reconnecting - dispatch_async(dispatch_get_main_queue()) { - self.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(self.reconnectWait), - target: self, selector: "_tryReconnect", userInfo: nil, repeats: true) + dispatch_async(dispatch_get_main_queue()) { + self.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(self.reconnectWait), + target: self, selector: "_tryReconnect", userInfo: nil, repeats: true) } } } diff --git a/SocketIOClientSwift/SwiftRegex.swift b/SocketIOClientSwift/SwiftRegex.swift index df384f4..fcd7652 100644 --- a/SocketIOClientSwift/SwiftRegex.swift +++ b/SocketIOClientSwift/SwiftRegex.swift @@ -37,9 +37,9 @@ internal class SwiftRegex: NSObject, BooleanType { super.init() } - private static func failure(message: String) { - fatalError("SwiftRegex: \(message)") - } + private static func failure(message: String) { + fatalError("SwiftRegex: \(message)") + } private final var targetRange: NSRange { return NSRange(location: 0,length: target.utf16.count) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index f4d5bb2..016be75 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -378,7 +378,7 @@ public class WebSocket : NSObject, NSStreamDelegate { } if totalSize > 0 { if validateResponse(buffer, bufferLen: totalSize) { - dispatch_async(queue, { + dispatch_async(queue, { self.connected = true if let connectBlock = self.onConnect { connectBlock() @@ -522,7 +522,7 @@ public class WebSocket : NSObject, NSStreamDelegate { } if receivedOpcode == OpCode.Pong.rawValue { dispatch_async(queue, { - self.onPong?() + self.onPong?() self.pongDelegate?.websocketDidReceivePong(self) }) @@ -609,20 +609,20 @@ public class WebSocket : NSObject, NSStreamDelegate { } else if response.code == .TextFrame { let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding) - if let str = str as String? { - dispatch_async(queue, { - self.onText?(str) - self.delegate?.websocketDidReceiveMessage(self, text: str) - }) - } else { - writeError(CloseCode.Encoding.rawValue) - return false - } + if let str = str as String? { + dispatch_async(queue, { + self.onText?(str) + self.delegate?.websocketDidReceiveMessage(self, text: str) + }) + } else { + writeError(CloseCode.Encoding.rawValue) + return false + } } else if response.code == .BinaryFrame { let data = response.buffer! //local copy so it is perverse for writing - dispatch_async(queue) { - self.onData?(data) - self.delegate?.websocketDidReceiveData(self, data: data) + dispatch_async(queue) { + self.onData?(data) + self.delegate?.websocketDidReceiveData(self, data: data) } } @@ -726,11 +726,11 @@ public class WebSocket : NSObject, NSStreamDelegate { ///used to preform the disconnect delegate private func doDisconnect(error: NSError?) { if !self.didDisconnect { - dispatch_async(queue) { + dispatch_async(queue) { self.didDisconnect = true - self.onDisconnect?(error) - self.delegate?.websocketDidDisconnect(self, error: error) + self.onDisconnect?(error) + self.delegate?.websocketDidDisconnect(self, error: error) } } } From 07f9d4f548dd612b60268985dd6dc718fe7c0c54 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Sat, 12 Sep 2015 00:15:07 +0000 Subject: [PATCH 41/76] Added support for tvOS ## Changes: - Duplicated target for both framework and tests. - Set the right platform on new targets. - Changed `tvOS` framework target product name to `SocketIO`. - Changed targets `plist`s to use the existing ones, and removed the copies. - Configured scheme to use the right test target. - Shared scheme. - Verified `tvOS` tests pass. --- .../project.pbxproj | 404 +++++++++++++++++- .../xcschemes/SocketIO-tvOS.xcscheme | 113 +++++ 2 files changed, 515 insertions(+), 2 deletions(-) create mode 100644 Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-tvOS.xcscheme diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index c2a770b..fd6adc5 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -12,6 +12,47 @@ 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 */; }; + 57425F9C1BA3A46000BDAAC1 /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 57425F9D1BA3A46000BDAAC1 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; + 57425F9E1BA3A46000BDAAC1 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; + 57425F9F1BA3A46000BDAAC1 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; + 57425FA01BA3A46000BDAAC1 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */; }; + 57425FA11BA3A46000BDAAC1 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF801B51F254004FF46E /* SocketEventHandler.swift */; }; + 57425FA21BA3A46000BDAAC1 /* SocketFixUTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */; }; + 57425FA31BA3A46000BDAAC1 /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF821B51F254004FF46E /* SocketIOClient.swift */; }; + 57425FA41BA3A46000BDAAC1 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; + 57425FA51BA3A46000BDAAC1 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF831B51F254004FF46E /* SocketLogger.swift */; }; + 57425FA61BA3A46000BDAAC1 /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; }; + 57425FA71BA3A46000BDAAC1 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 57425FA81BA3A46000BDAAC1 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF841B51F254004FF46E /* SocketPacket.swift */; }; + 57425FA91BA3A46000BDAAC1 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; + 57425FAA1BA3A46000BDAAC1 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; + 57425FAD1BA3A46000BDAAC1 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 57425FDC1BA3A4F100BDAAC1 /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 57425FDD1BA3A4F100BDAAC1 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; + 57425FDE1BA3A4F100BDAAC1 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF841B51F254004FF46E /* SocketPacket.swift */; }; + 57425FDF1BA3A4F100BDAAC1 /* SocketFixUTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */; }; + 57425FE01BA3A4F100BDAAC1 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF801B51F254004FF46E /* SocketEventHandler.swift */; }; + 57425FE11BA3A4F100BDAAC1 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; }; + 57425FE21BA3A4F100BDAAC1 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; + 57425FE31BA3A4F100BDAAC1 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; + 57425FE41BA3A4F100BDAAC1 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; + 57425FE51BA3A4F100BDAAC1 /* AbstractSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */; }; + 57425FE61BA3A4F100BDAAC1 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; + 57425FE71BA3A4F100BDAAC1 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; + 57425FE81BA3A4F100BDAAC1 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF831B51F254004FF46E /* SocketLogger.swift */; }; + 57425FE91BA3A4F100BDAAC1 /* SocketAckManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */; }; + 57425FEA1BA3A4F100BDAAC1 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */; }; + 57425FEB1BA3A4F100BDAAC1 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; + 57425FEC1BA3A4F100BDAAC1 /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; + 57425FED1BA3A4F100BDAAC1 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; + 57425FEE1BA3A4F100BDAAC1 /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; }; + 57425FEF1BA3A4F100BDAAC1 /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF821B51F254004FF46E /* SocketIOClient.swift */; }; + 57425FF01BA3A4F100BDAAC1 /* SocketParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */; }; + 57425FF11BA3A4F100BDAAC1 /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; + 57425FF21BA3A4F100BDAAC1 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 57425FF31BA3A4F100BDAAC1 /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; }; + 57425FF51BA3A4F100BDAAC1 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2191B51F16C00EEBB58 /* SocketIO.framework */; }; 5764DF891B51F254004FF46E /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 5764DF8A1B51F254004FF46E /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; @@ -61,8 +102,8 @@ 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 */; }; - 949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */; settings = {ASSET_TAGS = (); }; }; - 94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */; settings = {ASSET_TAGS = (); }; }; + 949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */; }; + 94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.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 */; }; @@ -84,6 +125,13 @@ remoteGlobalIDString = 572EF2371B51F18A00EEBB58; remoteInfo = "SocketIO-Mac"; }; + 57425FDA1BA3A4F100BDAAC1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 572EF20E1B51F12F00EEBB58 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 572EF2181B51F16C00EEBB58; + remoteInfo = "SocketIO-iOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -98,6 +146,8 @@ 572EF2421B51F18A00EEBB58 /* SocketIO-MacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-MacTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF2481B51F18A00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 572EF2491B51F18A00EEBB58 /* SocketIO_MacTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketIO_MacTests.swift; sourceTree = ""; }; + 57425FB21BA3A46000BDAAC1 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 57425FFA1BA3A4F100BDAAC1 /* SocketIO-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketAckManager.swift; path = SocketIOClientSwift/SocketAckManager.swift; sourceTree = ""; }; 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketAnyEvent.swift; path = SocketIOClientSwift/SocketAnyEvent.swift; sourceTree = ""; }; 5764DF7E1B51F254004FF46E /* SocketEngine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketEngine.swift; path = SocketIOClientSwift/SocketEngine.swift; sourceTree = ""; }; @@ -155,6 +205,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 57425FAB1BA3A46000BDAAC1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 57425FF41BA3A4F100BDAAC1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 57425FF51BA3A4F100BDAAC1 /* SocketIO.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -177,6 +242,8 @@ 572EF2241B51F16C00EEBB58 /* SocketIO-iOSTests.xctest */, 572EF2381B51F18A00EEBB58 /* SocketIO.framework */, 572EF2421B51F18A00EEBB58 /* SocketIO-MacTests.xctest */, + 57425FB21BA3A46000BDAAC1 /* SocketIO.framework */, + 57425FFA1BA3A4F100BDAAC1 /* SocketIO-tvOSTests.xctest */, ); name = Products; sourceTree = ""; @@ -298,6 +365,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 57425FAC1BA3A46000BDAAC1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 57425FAD1BA3A46000BDAAC1 /* SocketIO-iOS.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -373,6 +448,42 @@ productReference = 572EF2421B51F18A00EEBB58 /* SocketIO-MacTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 57425F9A1BA3A46000BDAAC1 /* SocketIO-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 57425FAF1BA3A46000BDAAC1 /* Build configuration list for PBXNativeTarget "SocketIO-tvOS" */; + buildPhases = ( + 57425F9B1BA3A46000BDAAC1 /* Sources */, + 57425FAB1BA3A46000BDAAC1 /* Frameworks */, + 57425FAC1BA3A46000BDAAC1 /* Headers */, + 57425FAE1BA3A46000BDAAC1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SocketIO-tvOS"; + productName = "SocketIO-iOS"; + productReference = 57425FB21BA3A46000BDAAC1 /* SocketIO.framework */; + productType = "com.apple.product-type.framework"; + }; + 57425FD81BA3A4F100BDAAC1 /* SocketIO-tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 57425FF71BA3A4F100BDAAC1 /* Build configuration list for PBXNativeTarget "SocketIO-tvOSTests" */; + buildPhases = ( + 57425FDB1BA3A4F100BDAAC1 /* Sources */, + 57425FF41BA3A4F100BDAAC1 /* Frameworks */, + 57425FF61BA3A4F100BDAAC1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 57425FD91BA3A4F100BDAAC1 /* PBXTargetDependency */, + ); + name = "SocketIO-tvOSTests"; + productName = "SocketIO-iOSTests"; + productReference = 57425FFA1BA3A4F100BDAAC1 /* SocketIO-tvOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -410,6 +521,8 @@ targets = ( 572EF2181B51F16C00EEBB58 /* SocketIO-iOS */, 572EF2231B51F16C00EEBB58 /* SocketIO-iOSTests */, + 57425F9A1BA3A46000BDAAC1 /* SocketIO-tvOS */, + 57425FD81BA3A4F100BDAAC1 /* SocketIO-tvOSTests */, 572EF2371B51F18A00EEBB58 /* SocketIO-Mac */, 572EF2411B51F18A00EEBB58 /* SocketIO-MacTests */, ); @@ -445,6 +558,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 57425FAE1BA3A46000BDAAC1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 57425FF61BA3A4F100BDAAC1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -532,6 +659,59 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 57425F9B1BA3A46000BDAAC1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 57425F9C1BA3A46000BDAAC1 /* SocketGenericParser.swift in Sources */, + 57425F9D1BA3A46000BDAAC1 /* SocketEngine.swift in Sources */, + 57425F9E1BA3A46000BDAAC1 /* SocketParser.swift in Sources */, + 57425F9F1BA3A46000BDAAC1 /* SocketTypes.swift in Sources */, + 57425FA01BA3A46000BDAAC1 /* SocketEngineClient.swift in Sources */, + 57425FA11BA3A46000BDAAC1 /* SocketEventHandler.swift in Sources */, + 57425FA21BA3A46000BDAAC1 /* SocketFixUTF8.swift in Sources */, + 57425FA31BA3A46000BDAAC1 /* SocketIOClient.swift in Sources */, + 57425FA41BA3A46000BDAAC1 /* SocketAnyEvent.swift in Sources */, + 57425FA51BA3A46000BDAAC1 /* SocketLogger.swift in Sources */, + 57425FA61BA3A46000BDAAC1 /* SocketIOClientStatus.swift in Sources */, + 57425FA71BA3A46000BDAAC1 /* WebSocket.swift in Sources */, + 57425FA81BA3A46000BDAAC1 /* SocketPacket.swift in Sources */, + 57425FA91BA3A46000BDAAC1 /* SocketAckManager.swift in Sources */, + 57425FAA1BA3A46000BDAAC1 /* SwiftRegex.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 57425FDB1BA3A4F100BDAAC1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 57425FDC1BA3A4F100BDAAC1 /* SocketGenericParser.swift in Sources */, + 57425FDD1BA3A4F100BDAAC1 /* SocketParser.swift in Sources */, + 57425FDE1BA3A4F100BDAAC1 /* SocketPacket.swift in Sources */, + 57425FDF1BA3A4F100BDAAC1 /* SocketFixUTF8.swift in Sources */, + 57425FE01BA3A4F100BDAAC1 /* SocketEventHandler.swift in Sources */, + 57425FE11BA3A4F100BDAAC1 /* SocketTestCases.swift in Sources */, + 57425FE21BA3A4F100BDAAC1 /* SocketEngine.swift in Sources */, + 57425FE31BA3A4F100BDAAC1 /* SocketAckManager.swift in Sources */, + 57425FE41BA3A4F100BDAAC1 /* TestKind.swift in Sources */, + 57425FE51BA3A4F100BDAAC1 /* AbstractSocketTest.swift in Sources */, + 57425FE61BA3A4F100BDAAC1 /* SocketEmitTest.swift in Sources */, + 57425FE71BA3A4F100BDAAC1 /* SwiftRegex.swift in Sources */, + 57425FE81BA3A4F100BDAAC1 /* SocketLogger.swift in Sources */, + 57425FE91BA3A4F100BDAAC1 /* SocketAckManagerTest.swift in Sources */, + 57425FEA1BA3A4F100BDAAC1 /* SocketEngineClient.swift in Sources */, + 57425FEB1BA3A4F100BDAAC1 /* SocketAnyEvent.swift in Sources */, + 57425FEC1BA3A4F100BDAAC1 /* SocketAcknowledgementTest.swift in Sources */, + 57425FED1BA3A4F100BDAAC1 /* SocketTypes.swift in Sources */, + 57425FEE1BA3A4F100BDAAC1 /* SocketIOClientStatus.swift in Sources */, + 57425FEF1BA3A4F100BDAAC1 /* SocketIOClient.swift in Sources */, + 57425FF01BA3A4F100BDAAC1 /* SocketParserTest.swift in Sources */, + 57425FF11BA3A4F100BDAAC1 /* SocketNamespaceEmitTest.swift in Sources */, + 57425FF21BA3A4F100BDAAC1 /* WebSocket.swift in Sources */, + 57425FF31BA3A4F100BDAAC1 /* SocketNamespaceAcknowledgementTest.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -545,6 +725,11 @@ target = 572EF2371B51F18A00EEBB58 /* SocketIO-Mac */; targetProxy = 572EF2441B51F18A00EEBB58 /* PBXContainerItemProxy */; }; + 57425FD91BA3A4F100BDAAC1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 572EF2181B51F16C00EEBB58 /* SocketIO-iOS */; + targetProxy = 57425FDA1BA3A4F100BDAAC1 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -959,6 +1144,203 @@ }; name = Release; }; + 57425FB01BA3A46000BDAAC1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "SocketIO-iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 57425FB11BA3A46000BDAAC1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "SocketIO-iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 57425FF81BA3A4F100BDAAC1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "SocketIO-iOSTests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 57425FF91BA3A4F100BDAAC1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "SocketIO-iOSTests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1007,6 +1389,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 57425FAF1BA3A46000BDAAC1 /* Build configuration list for PBXNativeTarget "SocketIO-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 57425FB01BA3A46000BDAAC1 /* Debug */, + 57425FB11BA3A46000BDAAC1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 57425FF71BA3A4F100BDAAC1 /* Build configuration list for PBXNativeTarget "SocketIO-tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 57425FF81BA3A4F100BDAAC1 /* Debug */, + 57425FF91BA3A4F100BDAAC1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 572EF20E1B51F12F00EEBB58 /* Project object */; diff --git a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-tvOS.xcscheme b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-tvOS.xcscheme new file mode 100644 index 0000000..1571679 --- /dev/null +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-tvOS.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bee997aff423f805c2f9b483e0fa75c052cdd1e5 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sat, 12 Sep 2015 19:04:27 +0200 Subject: [PATCH 42/76] replay xctool with xcodebuild MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit xcodebuild doesn’t format tests as well as xctool but it works at the moment. Change back later --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1e0cb54..71a19d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,4 @@ language: objective-c xcode_project: Socket.IO-Client-Swift.xcodeproj # path to your xcodeproj folder xcode_scheme: SocketIO-iOS osx_image: xcode7 -script: xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-iOS -sdk iphonesimulator build test CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO \ No newline at end of file +script: xcodebuild -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-iOS -sdk iphonesimulator build test CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO \ No newline at end of file From 0e0d47b6ed3e00d16a04abb762d5e279101685fb Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 12 Sep 2015 17:04:34 -0400 Subject: [PATCH 43/76] Refactor engine polling. Change SocketGenericParser to SocketStringReader --- .../project.pbxproj | 24 +++---- SocketIO-iOSTests/SocketParserTest.swift | 9 +-- SocketIOClientSwift/SocketEngine.swift | 64 ++++--------------- SocketIOClientSwift/SocketGenericParser.swift | 52 --------------- SocketIOClientSwift/SocketPacket.swift | 3 +- SocketIOClientSwift/SocketParser.swift | 24 +++---- SocketIOClientSwift/SocketStringReader.swift | 57 +++++++++++++++++ 7 files changed, 102 insertions(+), 131 deletions(-) delete mode 100644 SocketIOClientSwift/SocketGenericParser.swift create mode 100644 SocketIOClientSwift/SocketStringReader.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index fd6adc5..e7468e6 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -12,7 +12,7 @@ 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 */; }; - 57425F9C1BA3A46000BDAAC1 /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 57425F9C1BA3A46000BDAAC1 /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketStringReader.swift */; }; 57425F9D1BA3A46000BDAAC1 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; 57425F9E1BA3A46000BDAAC1 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; 57425F9F1BA3A46000BDAAC1 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; @@ -28,7 +28,7 @@ 57425FA91BA3A46000BDAAC1 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 57425FAA1BA3A46000BDAAC1 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 57425FAD1BA3A46000BDAAC1 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 57425FDC1BA3A4F100BDAAC1 /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 57425FDC1BA3A4F100BDAAC1 /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketStringReader.swift */; }; 57425FDD1BA3A4F100BDAAC1 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; 57425FDE1BA3A4F100BDAAC1 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF841B51F254004FF46E /* SocketPacket.swift */; }; 57425FDF1BA3A4F100BDAAC1 /* SocketFixUTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */; }; @@ -83,9 +83,9 @@ 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 */; }; - 74D765621B9F0D870028551C /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; - 74D765631B9F0D9F0028551C /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; - 74D765641B9F0DA40028551C /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketGenericParser.swift */; }; + 74D765621B9F0D870028551C /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketStringReader.swift */; }; + 74D765631B9F0D9F0028551C /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketStringReader.swift */; }; + 74D765641B9F0DA40028551C /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D765611B9F0D870028551C /* SocketStringReader.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 */; }; @@ -162,7 +162,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 = ""; }; 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketIOClientStatus.swift; path = SocketIOClientSwift/SocketIOClientStatus.swift; sourceTree = ""; }; - 74D765611B9F0D870028551C /* SocketGenericParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SocketGenericParser.swift; path = SocketIOClientSwift/SocketGenericParser.swift; sourceTree = ""; }; + 74D765611B9F0D870028551C /* SocketStringReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SocketStringReader.swift; path = SocketIOClientSwift/SocketStringReader.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 = ""; }; @@ -333,12 +333,12 @@ 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */, 5764DF801B51F254004FF46E /* SocketEventHandler.swift */, 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */, - 74D765611B9F0D870028551C /* SocketGenericParser.swift */, 5764DF821B51F254004FF46E /* SocketIOClient.swift */, 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */, 5764DF831B51F254004FF46E /* SocketLogger.swift */, 5764DF841B51F254004FF46E /* SocketPacket.swift */, 5764DF851B51F254004FF46E /* SocketParser.swift */, + 74D765611B9F0D870028551C /* SocketStringReader.swift */, 5764DF861B51F254004FF46E /* SocketTypes.swift */, 5764DF871B51F254004FF46E /* SwiftRegex.swift */, 5764DF881B51F254004FF46E /* WebSocket.swift */, @@ -579,7 +579,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 74D765631B9F0D9F0028551C /* SocketGenericParser.swift in Sources */, + 74D765631B9F0D9F0028551C /* SocketStringReader.swift in Sources */, 5764DF8D1B51F254004FF46E /* SocketEngine.swift in Sources */, 5764DF9B1B51F254004FF46E /* SocketParser.swift in Sources */, 5764DF9D1B51F254004FF46E /* SocketTypes.swift in Sources */, @@ -601,7 +601,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 74D765621B9F0D870028551C /* SocketGenericParser.swift in Sources */, + 74D765621B9F0D870028551C /* SocketStringReader.swift in Sources */, 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */, 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, @@ -632,7 +632,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 74D765641B9F0DA40028551C /* SocketGenericParser.swift in Sources */, + 74D765641B9F0DA40028551C /* SocketStringReader.swift in Sources */, 5764DF8E1B51F254004FF46E /* SocketEngine.swift in Sources */, 5764DF9C1B51F254004FF46E /* SocketParser.swift in Sources */, 5764DF9E1B51F254004FF46E /* SocketTypes.swift in Sources */, @@ -663,7 +663,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 57425F9C1BA3A46000BDAAC1 /* SocketGenericParser.swift in Sources */, + 57425F9C1BA3A46000BDAAC1 /* SocketStringReader.swift in Sources */, 57425F9D1BA3A46000BDAAC1 /* SocketEngine.swift in Sources */, 57425F9E1BA3A46000BDAAC1 /* SocketParser.swift in Sources */, 57425F9F1BA3A46000BDAAC1 /* SocketTypes.swift in Sources */, @@ -685,7 +685,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 57425FDC1BA3A4F100BDAAC1 /* SocketGenericParser.swift in Sources */, + 57425FDC1BA3A4F100BDAAC1 /* SocketStringReader.swift in Sources */, 57425FDD1BA3A4F100BDAAC1 /* SocketParser.swift in Sources */, 57425FDE1BA3A4F100BDAAC1 /* SocketPacket.swift in Sources */, 57425FDF1BA3A4F100BDAAC1 /* SocketFixUTF8.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 7198b4c..beab086 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -72,24 +72,25 @@ class SocketParserTest: XCTestCase { } func testGenericParser() { - var parser = SocketGenericParser(message: "61-/swift,", currentIndex: 0) + var parser = SocketStringReader(message: "61-/swift,", currentIndex: "61-/swift,".startIndex) XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") - XCTAssertEqual(parser.currentCharacter, "-") + XCTAssertEqual(parser.currentCharacter, "/") } - func validateParseResult(message:String) { + func validateParseResult(message: String) { let validValues = SocketParserTest.packetTypes[message]! let packet = SocketParser.parseString(message) let type = message.substringWithRange(Range(start: message.startIndex, end: message.startIndex.advancedBy(1))) if let packet = packet { + print(packet) XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) XCTAssertEqual(packet.nsp, validValues.0) XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) XCTAssertEqual(packet.id, validValues.3) - }else { + } else { XCTFail() } } diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index cddaaf9..da090c9 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -154,7 +154,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate { } if params != nil { - for (key, value) in params! { let keyEsc = key.stringByAddingPercentEncodingWithAllowedCharacters( allowedCharacterSet)! @@ -350,10 +349,10 @@ public final class SocketEngine: NSObject, WebSocketDelegate { // We had packets waiting for send when we upgraded // Send them raw private func flushWaitingForPostToWebSocket() { - if let ws = ws { - for msg in postWait { - ws.writeString(msg) - } + guard let ws = self.ws else {return} + + for msg in postWait { + ws.writeString(msg) } postWait.removeAll(keepCapacity: true) @@ -486,54 +485,19 @@ public final class SocketEngine: NSObject, WebSocketDelegate { } // Translatation of engine.io-parser#decodePayload - private func parsePollingMessage(str:String) { + private func parsePollingMessage(str: String) { guard str.characters.count != 1 else { return } - // println(str) - - let strArray = Array(str.characters) - var length = "" - var n = 0 - var msg = "" - - func testLength(length: String, inout n: Int) -> Bool { - if let num = Int(length) { - n = num - return false - } else { - return true - } - } - - 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: &n) { - Logger.error("Parsing error: %@", type: logType, args: str) - handlePollingFailed("Error parsing XHR message") - return - } - - msg = String(strArray[i+1...i+n]) - - if let lengthInt = Int(length) where lengthInt != msg.characters.count { - Logger.error("Parsing error: %@", type: logType, args: str) - return - } - - if msg.characters.count != 0 { - // Be sure to capture the value of the msg - dispatch_async(handleQueue) { - self.parseEngineMessage(msg, fromPolling: true) - } - } - - i += n - length = "" + + var reader = SocketStringReader(message: str, currentIndex: str.startIndex) + + while reader.hasNext { + let n = reader.readUntilStringOccurence(":") + let str = reader.read(Int(n)!) + + dispatch_async(handleQueue) { + self.parseEngineMessage(str, fromPolling: true) } } } diff --git a/SocketIOClientSwift/SocketGenericParser.swift b/SocketIOClientSwift/SocketGenericParser.swift deleted file mode 100644 index af50c9a..0000000 --- a/SocketIOClientSwift/SocketGenericParser.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// GenericSocketParser.swift -// Socket.IO-Client-Swift -// -// Created by Lukas Schmidt on 07.09.15. -// -// - -import Foundation - -struct SocketGenericParser { - let message: String - var currentIndex: Int - var messageCharacters: [Character] { - return Array(message.characters) - } - - var currentCharacter: String? { - if currentIndex >= messageCharacters.count { - return nil - } - - return String(messageCharacters[currentIndex]) - } - - mutating func read(characterLength: Int) -> String? { - let startIndex = message.startIndex.advancedBy(currentIndex) - let range = Range(start: startIndex, end: startIndex.advancedBy(characterLength)) - currentIndex = currentIndex + characterLength - - return message.substringWithRange(range) - } - - mutating func readUntilStringOccurence(string: String) -> String? { - let startIndex = message.startIndex.advancedBy(currentIndex) - let range = Range(start: startIndex, end: message.endIndex) - let subString = message.substringWithRange(range) as NSString - let foundRange = subString.rangeOfString(string) - - if foundRange.location == Int.max { - return nil - } - - currentIndex = currentIndex + foundRange.location - - return subString.substringToIndex(foundRange.location) - } - - mutating func readUntilEnd() -> String { - return read(messageCharacters.count - currentIndex)! - } -} \ No newline at end of file diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 12b975a..5608d7d 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -64,7 +64,8 @@ struct SocketPacket { var binary: [NSData] var data: [AnyObject] var description: String { - return "SocketPacket {type: \(String(type.rawValue)); data: \(String(data)); id: \(id); placeholders: \(placeholders);}" + return "SocketPacket {type: \(String(type.rawValue)); data: " + + "\(String(data)); id: \(id); placeholders: \(placeholders); nsp: \(nsp)}" } var event: String { diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 1c06328..ec47dbd 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -59,12 +59,12 @@ class SocketParser { // Translation of socket.io-client#decodeString static func parseString(message: String) -> SocketPacket? { - var parser = SocketGenericParser(message: message, currentIndex: 0) + var parser = SocketStringReader(message: message, currentIndex: message.startIndex) - guard let typeString = parser.read(1), type = SocketPacket.PacketType(str: typeString) + guard let type = SocketPacket.PacketType(str: parser.read(1)) else {return nil} - if parser.messageCharacters.count == 1 { + if !parser.hasNext { return SocketPacket(type: type, nsp: "/") } @@ -72,34 +72,34 @@ class SocketParser { var placeholders = -1 if type == .BinaryEvent || type == .BinaryAck { - if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) - where parser.read(1)! == "-" { + Logger.log("Got some binary", type: "SocketParser") + if let holders = Int(parser.readUntilStringOccurence("-")) { placeholders = holders } else { return nil } } + if parser.currentCharacter == "/" { namespace = parser.readUntilStringOccurence(",") ?? parser.readUntilEnd() - parser.currentIndex++ } - if parser.currentIndex >= parser.messageCharacters.count { + if !parser.hasNext { return SocketPacket(type: type, id: -1, nsp: namespace ?? "/", placeholders: placeholders) } var idString = "" - while parser.currentIndex < parser.messageCharacters.count { - if let next = parser.read(1), let int = Int(next) { + while parser.hasNext { + if let int = Int(parser.read(1)) { idString += String(int) } else { - parser.currentIndex -= 2 + parser.advanceIndexBy(-2) break } } - let d = message[message.startIndex.advancedBy(parser.currentIndex + 1)...message.startIndex.advancedBy(message.characters.count - 1)] + let d = message[parser.currentIndex.advancedBy(1)...message.endIndex.predecessor()] let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" let data = parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders] @@ -126,7 +126,7 @@ class SocketParser { Logger.log("Parsing %@", type: "SocketParser", args: message) guard let pack = parseString(message) else { - Logger.error("Parsing message", type: "SocketParser", args: message) + Logger.error("Parsing message: %@", type: "SocketParser", args: message) return } diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift new file mode 100644 index 0000000..9450461 --- /dev/null +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -0,0 +1,57 @@ +// +// SocketStringReader.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 07.09.15. +// +// + +import Foundation + +struct SocketStringReader { + let message: String + var currentIndex: String.Index + var hasNext: Bool { + return currentIndex != message.endIndex + } + + var messageCharacters: [Character] { + return Array(message.characters) + } + + var currentCharacter: String { + return String(message[currentIndex]) + } + + mutating func advanceIndexBy(n: Int) { + currentIndex = currentIndex.advancedBy(n) + } + + mutating func read(readLength: Int) -> String { + let range = Range(start: currentIndex, end: currentIndex.advancedBy(readLength)) + advanceIndexBy(readLength) + + return message.substringWithRange(range) + } + + mutating func readUntilStringOccurence(string: String) -> String { + let range = Range(start: currentIndex, end: message.endIndex) + let subString = message.substringWithRange(range) as NSString + let foundRange = subString.rangeOfString(string) + + if foundRange.length == 0 { + let restOfString = message[currentIndex...message.endIndex.predecessor()] + currentIndex = message.endIndex + + return restOfString + } + + advanceIndexBy(foundRange.location + 1) + + return subString.substringToIndex(foundRange.location) + } + + mutating func readUntilEnd() -> String { + return read(currentIndex.distanceTo(message.endIndex)) + } +} \ No newline at end of file From a91fc638f22e7e597ad3f10fc454ad2cca8c9d34 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 12 Sep 2015 17:12:12 -0400 Subject: [PATCH 44/76] remove old log message --- SocketIOClientSwift/SocketParser.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index ec47dbd..f57487e 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -72,7 +72,6 @@ class SocketParser { var placeholders = -1 if type == .BinaryEvent || type == .BinaryAck { - Logger.log("Got some binary", type: "SocketParser") if let holders = Int(parser.readUntilStringOccurence("-")) { placeholders = holders } else { From 2e9232365df3f971077c1a72982ed45e0c9cbac0 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 12 Sep 2015 17:14:30 -0400 Subject: [PATCH 45/76] remove unused property --- SocketIOClientSwift/SocketStringReader.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift index 9450461..2e90081 100644 --- a/SocketIOClientSwift/SocketStringReader.swift +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -15,10 +15,6 @@ struct SocketStringReader { return currentIndex != message.endIndex } - var messageCharacters: [Character] { - return Array(message.characters) - } - var currentCharacter: String { return String(message[currentIndex]) } From f5f2a15133e8c0f10eca883f14a5bab54973fa47 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 12 Sep 2015 21:26:09 -0400 Subject: [PATCH 46/76] tweaks to string reading --- SocketIO-iOSTests/SocketParserTest.swift | 2 +- SocketIOClientSwift/SocketEngine.swift | 3 +-- SocketIOClientSwift/SocketParser.swift | 4 ++-- SocketIOClientSwift/SocketStringReader.swift | 5 +++++ 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index beab086..df9fd1d 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -72,7 +72,7 @@ class SocketParserTest: XCTestCase { } func testGenericParser() { - var parser = SocketStringReader(message: "61-/swift,", currentIndex: "61-/swift,".startIndex) + var parser = SocketStringReader(message: "61-/swift,") XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index da090c9..3ac4341 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -484,13 +484,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate { doRequest(reqPolling) } - // Translatation of engine.io-parser#decodePayload private func parsePollingMessage(str: String) { guard str.characters.count != 1 else { return } - var reader = SocketStringReader(message: str, currentIndex: str.startIndex) + var reader = SocketStringReader(message: str) while reader.hasNext { let n = reader.readUntilStringOccurence(":") diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index f57487e..48fd29d 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -57,9 +57,8 @@ class SocketParser { } } - // Translation of socket.io-client#decodeString static func parseString(message: String) -> SocketPacket? { - var parser = SocketStringReader(message: message, currentIndex: message.startIndex) + var parser = SocketStringReader(message: message) guard let type = SocketPacket.PacketType(str: parser.read(1)) else {return nil} @@ -89,6 +88,7 @@ class SocketParser { } var idString = "" + while parser.hasNext { if let int = Int(parser.read(1)) { idString += String(int) diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift index 2e90081..95ea3de 100644 --- a/SocketIOClientSwift/SocketStringReader.swift +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -19,6 +19,11 @@ struct SocketStringReader { return String(message[currentIndex]) } + init(message: String) { + self.message = message + currentIndex = message.startIndex + } + mutating func advanceIndexBy(n: Int) { currentIndex = currentIndex.advancedBy(n) } From 108aa4b08af202bfcb6d6bedf86ccb3337f3ef94 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 13 Sep 2015 08:20:52 -0400 Subject: [PATCH 47/76] remove old debug print --- SocketIO-iOSTests/SocketParserTest.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index df9fd1d..9c0c5aa 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -84,7 +84,6 @@ class SocketParserTest: XCTestCase { let packet = SocketParser.parseString(message) let type = message.substringWithRange(Range(start: message.startIndex, end: message.startIndex.advancedBy(1))) if let packet = packet { - print(packet) XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) XCTAssertEqual(packet.nsp, validValues.0) XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) From ca67e9e47e728cb2c8063608332b3bc95359eab2 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 13 Sep 2015 13:37:43 -0400 Subject: [PATCH 48/76] use pure swift --- SocketIOClientSwift/SocketStringReader.swift | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift index 95ea3de..0201cad 100644 --- a/SocketIOClientSwift/SocketStringReader.swift +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -6,8 +6,6 @@ // // -import Foundation - struct SocketStringReader { let message: String var currentIndex: String.Index @@ -37,19 +35,17 @@ struct SocketStringReader { mutating func readUntilStringOccurence(string: String) -> String { let range = Range(start: currentIndex, end: message.endIndex) - let subString = message.substringWithRange(range) as NSString - let foundRange = subString.rangeOfString(string) - - if foundRange.length == 0 { + let subString = message.substringWithRange(range) + guard let foundRange = subString.rangeOfString(string) else { let restOfString = message[currentIndex...message.endIndex.predecessor()] currentIndex = message.endIndex return restOfString } - advanceIndexBy(foundRange.location + 1) + advanceIndexBy(message.startIndex.distanceTo(foundRange.startIndex) + 1) - return subString.substringToIndex(foundRange.location) + return subString.substringToIndex(foundRange.startIndex) } mutating func readUntilEnd() -> String { From e3ff1f434b8969d0f1328614ffdd52c3f3cec0f0 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 13 Sep 2015 13:39:51 -0400 Subject: [PATCH 49/76] add license --- SocketIOClientSwift/SocketStringReader.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift index 0201cad..9da536c 100644 --- a/SocketIOClientSwift/SocketStringReader.swift +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -4,7 +4,23 @@ // // Created by Lukas Schmidt on 07.09.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. struct SocketStringReader { let message: String From 8044d6fc1c065a5980d2c84036dec7aabd9c8589 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 13 Sep 2015 13:46:36 -0400 Subject: [PATCH 50/76] don't need to call predacessor --- SocketIOClientSwift/SocketParser.swift | 2 +- SocketIOClientSwift/SocketStringReader.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 48fd29d..896bd5b 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -98,7 +98,7 @@ class SocketParser { } } - let d = message[parser.currentIndex.advancedBy(1)...message.endIndex.predecessor()] + let d = message[parser.currentIndex.advancedBy(1)..(start: currentIndex, end: message.endIndex) let subString = message.substringWithRange(range) guard let foundRange = subString.rangeOfString(string) else { - let restOfString = message[currentIndex...message.endIndex.predecessor()] + let restOfString = message[currentIndex.. Date: Sun, 13 Sep 2015 13:56:51 -0400 Subject: [PATCH 51/76] only need to get the substring once --- SocketIOClientSwift/SocketStringReader.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift index 93caf16..d18fd49 100644 --- a/SocketIOClientSwift/SocketStringReader.swift +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -50,18 +50,16 @@ struct SocketStringReader { } mutating func readUntilStringOccurence(string: String) -> String { - let range = Range(start: currentIndex, end: message.endIndex) - let subString = message.substringWithRange(range) - guard let foundRange = subString.rangeOfString(string) else { - let restOfString = message[currentIndex.. String { From 60e014295517d9a5770b5743f81d1d59f6b89454 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 13 Sep 2015 14:05:10 -0400 Subject: [PATCH 52/76] further tweaks to stringreader --- SocketIOClientSwift/SocketStringReader.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketStringReader.swift b/SocketIOClientSwift/SocketStringReader.swift index d18fd49..e3b2d69 100644 --- a/SocketIOClientSwift/SocketStringReader.swift +++ b/SocketIOClientSwift/SocketStringReader.swift @@ -43,10 +43,10 @@ struct SocketStringReader { } mutating func read(readLength: Int) -> String { - let range = Range(start: currentIndex, end: currentIndex.advancedBy(readLength)) + let readString = message[currentIndex.. String { From 2e7be97a38bd47fa28058fc33bdaa545d806e0f8 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 14 Sep 2015 13:12:19 -0400 Subject: [PATCH 53/76] bump version --- README.md | 6 +++--- Socket.IO-Client-Swift.podspec | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ad02e4c..a9952fd 100644 --- a/README.md +++ b/README.md @@ -56,14 +56,14 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8 ##Installation Requires Swift 2/Xcode 7 -If you need Swift 1.2/Xcode 6.3/4 use v2 (Pre-Swift 2 support is no longer maintained) +If you need Swift 1.2/Xcode 6.3/4 use v2.4.5 (Pre-Swift 2 support is no longer maintained) If you need Swift 1.1/Xcode 6.2 use v1.5.2. (Pre-Swift 1.2 support is no longer maintained) Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 2.4.5 # Or latest version +github "socketio/socket.io-client-swift" ~> 3.0.0 # Or latest version ``` Run `carthage update`. @@ -82,7 +82,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 2.4.5' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 3.0.0' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 833f4c2..e3a7b4f 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.5" + s.version = "3.0.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.4.5' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v3.0.0' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 5dc0dfa9aa25ddbde1d2061d5274add2238a0745 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 14 Sep 2015 13:15:20 -0400 Subject: [PATCH 54/76] change travis icon to point to master --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9952fd..9112aea 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/socketio/socket.io-client-swift.svg?branch=swift-2)](https://travis-ci.org/socketio/socket.io-client-swift) +[![Build Status](https://travis-ci.org/socketio/socket.io-client-swift.svg?branch=master)](https://travis-ci.org/socketio/socket.io-client-swift) #Socket.IO-Client-Swift Socket.IO-client for iOS/OS X. From 55289d69a321e78706fc3d68a267751ff76c9ba2 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Mon, 14 Sep 2015 13:16:33 -0400 Subject: [PATCH 55/76] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9112aea..dd45fd2 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8 Requires Swift 2/Xcode 7 If you need Swift 1.2/Xcode 6.3/4 use v2.4.5 (Pre-Swift 2 support is no longer maintained) + If you need Swift 1.1/Xcode 6.2 use v1.5.2. (Pre-Swift 1.2 support is no longer maintained) Carthage From f818d64405fbb2c423b30b5756302c449bf6ef46 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 14 Sep 2015 15:40:13 -0400 Subject: [PATCH 56/76] fix socketio/socket.io-client-swift#177 --- SocketIOClientSwift/SocketEngine.swift | 1 + SocketIOClientSwift/SocketIOClient.swift | 2 +- SocketIOClientSwift/SocketParser.swift | 9 ++++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 3ac4341..ba3d214 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -502,6 +502,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate { } private func parseEngineData(data: NSData) { + Logger.log("Got binary data: %@", type: "SocketEngine", args: data) client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 3b3fbf3..cd52b69 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -54,7 +54,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { private var ackHandlers = SocketAckManager() private var currentAck = -1 - internal var waitingData = [SocketPacket]() + var waitingData = [SocketPacket]() /** Create a new SocketIOClient. opts can be omitted diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 896bd5b..ed4fd49 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -156,10 +156,13 @@ class SocketParser { return } - let shouldExecute = socket.waitingData[0].addData(data) - guard shouldExecute else { return } + let shouldExecute = socket.waitingData[socket.waitingData.count - 1].addData(data) - var packet = socket.waitingData.removeAtIndex(0) + guard shouldExecute else { + return + } + + var packet = socket.waitingData.removeLast() packet.fillInPlaceholders() if packet.type != .BinaryAck { From fd21ca00d327f3514066f9173f8dbbc6b5b0a67e Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 14 Sep 2015 15:44:43 -0400 Subject: [PATCH 57/76] 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 dd45fd2..4d3eb06 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 3.0.0 # Or latest version +github "socketio/socket.io-client-swift" ~> 3.0.1 # Or latest version ``` Run `carthage update`. @@ -83,7 +83,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 3.0.0' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 3.0.1' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index e3a7b4f..098b719 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 = "3.0.0" + s.version = "3.0.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 => 'v3.0.0' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v3.0.1' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From 9355fc50772c46c690840ccdeb318bc06f283a14 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Tue, 15 Sep 2015 18:27:50 -0400 Subject: [PATCH 58/76] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d3eb06..0d7b0c0 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Add this line to your `Cartfile`: github "socketio/socket.io-client-swift" ~> 3.0.1 # Or latest version ``` -Run `carthage update`. +Run `carthage update --platform ios,macosx`. Manually (iOS 7+) ----------------- From d0a57ca353268d4473b82d03c3f5b18a875467f4 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 16 Sep 2015 11:16:12 -0400 Subject: [PATCH 59/76] tweak to objective-c api --- README.md | 22 +++++++++++----------- SocketIOClientSwift/SocketIOClient.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 1 - 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 0d7b0c0..b540d59 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ socket.connect() ```objective-c SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; -[socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onEvent:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); }]; -[socket onObjectiveC:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onEvent:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { double cur = [[data objectAtIndex:0] floatValue]; [socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) { @@ -130,16 +130,16 @@ 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. `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. +1. `on(event: 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. `on(event event: 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. +9. `connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(fast 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 / diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index cd52b69..0f26629 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -417,7 +417,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** Adds a handler for an event. */ - public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { + public func on(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, callback: callback) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index e27bbe3..c32ffa4 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -30,4 +30,3 @@ 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 2f2bd490458fc09834da9738982b0b85525cdc72 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:06:09 -0400 Subject: [PATCH 60/76] fix socketio/socket.io-client-swift#181 --- SocketIOClientSwift/SocketEngine.swift | 42 +++++++++++++++----------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index ba3d214..fd9b654 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -99,6 +99,19 @@ public final class SocketEngine: NSObject, WebSocketDelegate { deinit { Logger.log("Engine is being deinit", type: logType) } + + private func checkIfMessageIsBase64Binary(var message: String) { + if message.hasPrefix("b4") { + // binary in base64 string + message.removeRange(Range(start: message.startIndex, + end: message.startIndex.advancedBy(2))) + + if let data = NSData(base64EncodedString: message, + options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { + client?.parseBinaryData(data) + } + } + } public func close(fast fast: Bool) { Logger.log("Engine is being closed. Fast: %@", type: logType, args: fast) @@ -364,19 +377,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate { } } - private func checkIfMessageIsBase64Binary(var message: String) { - if message.hasPrefix("b4") { - // binary in base64 string - message.removeRange(Range(start: message.startIndex, - end: message.startIndex.advancedBy(2))) - - if let data = NSData(base64EncodedString: message, - options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { - client?.parseBinaryData(data) - } - } - } - private func handleMessage(message: String) { client?.parseSocketMessage(message) } @@ -492,11 +492,17 @@ public final class SocketEngine: NSObject, WebSocketDelegate { var reader = SocketStringReader(message: str) while reader.hasNext { - let n = reader.readUntilStringOccurence(":") - let str = reader.read(Int(n)!) - - dispatch_async(handleQueue) { - self.parseEngineMessage(str, fromPolling: true) + if let n = Int(reader.readUntilStringOccurence(":")) { + let str = reader.read(n) + + dispatch_async(handleQueue) { + self.parseEngineMessage(str, fromPolling: true) + } + } else { + dispatch_async(handleQueue) { + self.parseEngineMessage(str, fromPolling: true) + } + break } } } From 978bd2614e8975e800b8b2686933c0d215abec0a Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:08:58 -0400 Subject: [PATCH 61/76] 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 b540d59..41a5d13 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Carthage ----------------- Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 3.0.1 # Or latest version +github "socketio/socket.io-client-swift" ~> 3.0.2 # Or latest version ``` Run `carthage update --platform ios,macosx`. @@ -83,7 +83,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' use_frameworks! -pod 'Socket.IO-Client-Swift', '~> 3.0.1' # Or latest version +pod 'Socket.IO-Client-Swift', '~> 3.0.2' # Or latest version ``` Install pods: diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 098b719..600639c 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 = "3.0.1" + s.version = "3.0.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 => 'v3.0.1' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v3.0.2' } s.source_files = "SocketIOClientSwift/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files From ba5638a109a108f0eba3a919903113ad61204414 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:09:02 -0400 Subject: [PATCH 62/76] Revert "tweak to objective-c api" This reverts commit d0a57ca353268d4473b82d03c3f5b18a875467f4. --- README.md | 22 +++++++++++----------- SocketIOClientSwift/SocketIOClient.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 1 + 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 41a5d13..c60c784 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ socket.connect() ```objective-c SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; -[socket onEvent:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); }]; -[socket onEvent:@"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) { @@ -130,16 +130,16 @@ Options Methods ------- -1. `on(event: 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. `on(event event: 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. +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. `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 timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -10. `close(fast 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. +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 / diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 0f26629..cd52b69 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -417,7 +417,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** Adds a handler for an event. */ - public func on(event event: String, callback: NormalCallbackObjectiveC) { + public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, callback: callback) diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index c32ffa4..e27bbe3 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -30,3 +30,4 @@ 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 4997294186d27dae2a544b94c2821fc591070e5b Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 09:47:02 -0400 Subject: [PATCH 63/76] clean up readme --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c60c784..d2c298b 100644 --- a/README.md +++ b/README.md @@ -130,16 +130,16 @@ 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. `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. +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. `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. +9. `connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(fast 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 / From a81f9256711394f7147e170f8d4c6298ae9abc45 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 13:33:37 -0400 Subject: [PATCH 64/76] make note of https --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2c298b..80234b1 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ Objective-C: ##API Constructors ----------- -`init(socketURL: String, opts:NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) +`init(socketURL: String, opts:NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. `convenience init(socketURL: String, options:NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. From a72f96759e96091986af3785346406d063622165 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 18:19:49 -0400 Subject: [PATCH 65/76] Adds SocketIOClient#once(event, callback) When the specified event is emitted, the handler deregisters itself. --- SocketIOClientSwift/SocketIOClient.swift | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index cd52b69..aa6fdf8 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -424,6 +424,34 @@ public final class SocketIOClient: NSObject, SocketEngineClient { handlers.append(handler) } + /** + Adds a single-use handler for an event. + */ + public func once(event: String, callback: NormalCallback) { + Logger.log("Adding once handler for event: %@", type: logType, args: event) + + let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitter? in + handlers = ContiguousArray(handlers.filter { $0 != handler }) + callback?(data, ack) + } + + handlers.append(handler) + } + + /** + Adds a single-use handler for an event. + */ + public func once(event event: String, callback: NormalCallbackObjectiveC) { + Logger.log("Adding once handler for event: %@", type: logType, args: event) + + let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitterObjectiveC? in + handlers = ContiguousArray(handlers.filter { $0 != handler }) + callback?(data, ack) + } + + handlers.append(handler) + } + /** Removes all handlers. Can be used after disconnecting to break any potential remaining retain cycles. From 9b3f84dcd0873fed7b12b94d91bcc2e30b5ec6df Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 20:33:36 -0400 Subject: [PATCH 66/76] Remove type declarations --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index aa6fdf8..c4f2e64 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,8 +430,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitter? in - handlers = ContiguousArray(handlers.filter { $0 != handler }) + let handler = SocketEventHandler(event: event) { data, ack in + self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -444,8 +444,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitterObjectiveC? in - handlers = ContiguousArray(handlers.filter { $0 != handler }) + let handler = SocketEventHandler(event: event) { data, ack in + self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From 136847fd77a8bcd92e4949efb2f6b1d2028bad9a Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 20:41:34 -0400 Subject: [PATCH 67/76] Fix "Variable used within its own initial value" error --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c4f2e64..3559c92 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,7 +430,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data, ack in + var handler: SocketEventHandler; + + handler = SocketEventHandler(event: event) { data, ack in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -444,7 +446,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data, ack in + var handler: SocketEventHandler; + + handler = SocketEventHandler(event: event) { data, ack in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From 7d26bd3ee830a807e7ab5c937226504f4ee53be8 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:00:56 -0400 Subject: [PATCH 68/76] Fix type declarations --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 3559c92..e38071c 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -432,7 +432,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; - handler = SocketEventHandler(event: event) { data, ack in + handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -448,7 +448,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; - handler = SocketEventHandler(event: event) { data, ack in + handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From f5c3a2cac9c57f17e5a7108a274e696d9af05b9a Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:08:37 -0400 Subject: [PATCH 69/76] Add strict equality and execute "callback" as non-optional --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e38071c..1151420 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -433,8 +433,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) - callback?(data, ack) + self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + callback(data, ack) } handlers.append(handler) @@ -449,8 +449,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) - callback?(data, ack) + self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + callback(data, ack) } handlers.append(handler) From fe8469cfc659850ce12dada944cf045c67f27323 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:48:09 -0400 Subject: [PATCH 70/76] Add SocketEventHandler#id to filter against --- SocketIOClientSwift/SocketEventHandler.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 05efb10..c61c4c5 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -35,6 +35,7 @@ private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) } struct SocketEventHandler { + let id = NSUUID() let event: String let callback: NormalCallback? let callBackObjectiveC: NormalCallbackObjectiveC? From aaaf9dc451cba8bfca499cde078728ba7c49b4ec Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:49:18 -0400 Subject: [PATCH 71/76] Filter against SocketEventHandler#id --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 1151420..dba36c5 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -433,7 +433,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) callback(data, ack) } @@ -449,7 +449,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) callback(data, ack) } From a9b4193fe4051a5fc9edf443c3401b20c845fe98 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 22:06:12 -0400 Subject: [PATCH 72/76] Fix "Variable 'handler' captured by a closure before being initialized" error --- SocketIOClientSwift/SocketIOClient.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index dba36c5..c9fdad0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,14 +430,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler; + var handler: SocketEventHandler?; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) callback(data, ack) } - handlers.append(handler) + handlers.append(handler!) } /** @@ -446,14 +446,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler; + var handler: SocketEventHandler?; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) callback(data, ack) } - handlers.append(handler) + handlers.append(handler!) } /** From 9a05f6043b046b2ca9aa39703f86fbfaa379ade1 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 17 Sep 2015 23:52:23 -0400 Subject: [PATCH 73/76] tweaks to once --- README.md | 2 ++ SocketIOClientSwift/SocketEventHandler.swift | 8 ++++--- SocketIOClientSwift/SocketIOClient.swift | 24 +++++++++++--------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 80234b1..9c29b6a 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,8 @@ Methods 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 / +14. `once(event: String, callback: NormalCallback)` - Adds a handler that will only be executed once. +15. `once(event event: String, callback: NormalCallbackObjectiveC)` - Adds a handler that will only be executed once. Client Events ------ diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index c61c4c5..beb88a6 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -35,19 +35,21 @@ private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) } struct SocketEventHandler { - let id = NSUUID() let event: String + let id: NSUUID let callback: NormalCallback? let callBackObjectiveC: NormalCallbackObjectiveC? - init(event: String, callback: NormalCallback) { + init(event: String, id: NSUUID = NSUUID(), callback: NormalCallback) { self.event = event + self.id = id self.callback = callback self.callBackObjectiveC = nil } - init(event: String, callback: NormalCallbackObjectiveC) { + init(event: String, id: NSUUID = NSUUID(), callback: NormalCallbackObjectiveC) { self.event = event + self.id = id self.callback = nil self.callBackObjectiveC = callback } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c9fdad0..00b328a 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,14 +430,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler?; - - handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) + let id = NSUUID() + + let handler = SocketEventHandler(event: event, id: id) {[weak self] (data, ack: AckEmitter?) in + guard let this = self else {return} + this.handlers = ContiguousArray(this.handlers.filter {$0.id != id}) callback(data, ack) } - handlers.append(handler!) + handlers.append(handler) } /** @@ -446,14 +447,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event event: String, callback: NormalCallbackObjectiveC) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - var handler: SocketEventHandler?; - - handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) + let id = NSUUID() + + let handler = SocketEventHandler(event: event, id: id) {[weak self] (data, ack: AckEmitterObjectiveC?) in + guard let this = self else {return} + this.handlers = ContiguousArray(this.handlers.filter {$0.id != id}) callback(data, ack) } - - handlers.append(handler!) + + handlers.append(handler) } /** From 99ed93038fe2ce2a191ffd02d5731d8b77f5948f Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 18 Sep 2015 09:01:03 -0400 Subject: [PATCH 74/76] update readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9c29b6a..066d7b3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ socket.connect() ##Objective-C Example ```objective-c -SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; +SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" opts:nil]; [socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); @@ -107,9 +107,9 @@ Objective-C: ##API Constructors ----------- -`init(socketURL: String, opts:NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. +`init(socketURL: String, opts: NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. -`convenience init(socketURL: String, options:NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. +`convenience init(socketURL: String, opts: NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. Options ------- From 456406416a15bc44019eca0eac197774a66449db Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 18 Sep 2015 09:02:18 -0400 Subject: [PATCH 75/76] other init doesn't exist anymore --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 066d7b3..09cf4fb 100644 --- a/README.md +++ b/README.md @@ -109,8 +109,6 @@ Constructors ----------- `init(socketURL: String, opts: NSDictionary? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values) note: If your socket.io server is secure, you need to specify `https` in your socketURL. -`convenience init(socketURL: String, opts: NSDictionary?)` - Same as above, but meant for Objective-C. See Objective-C Example. - Options ------- - `connectParams: [String: AnyObject]?` - Dictionary whose contents will be passed with the connection. From 0233bce881044cd268e89a137003e114e1f2ddc4 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 18 Sep 2015 09:27:14 -0400 Subject: [PATCH 76/76] tweaks to closing --- README.md | 2 +- SocketIOClientSwift/SocketIOClient.swift | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 09cf4fb..e7cbd56 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Methods 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 timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -10. `close(fast 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. `close()` - Closes the socket. Once a socket is closed it should not be reopened. 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 / diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 00b328a..32507fd 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -133,12 +133,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient { 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() { Logger.log("Closing socket", type: logType) reconnects = false - status = SocketIOClientStatus.Closed - engine?.close(fast: fast) + didDisconnect("Closed") } /** @@ -151,8 +150,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** 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)?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .Connected else { @@ -222,7 +221,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient { Logger.log("Disconnected: %@", type: logType, args: reason) status = .Closed - reconnects = false // Make sure the engine is actually dead. @@ -241,8 +239,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { /** Same as close */ - public func disconnect(fast fast: Bool) { - close(fast: fast) + public func disconnect() { + close() } /**