From dfc905d9c3b6f0ca8fed67cef31630baab85cac1 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Thu, 3 Sep 2015 08:13:40 +0200 Subject: [PATCH 01/12] refactor --- SocketIO-iOSTests/AbstractSocketTest.swift | 1 + SocketIO-iOSTests/SocketEmitTest.swift | 2 +- SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift | 2 +- SocketIO-iOSTests/SocketNamespaceEmitTest.swift | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index e5b16d5..9ade919 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -9,6 +9,7 @@ import XCTest class AbstractSocketTest: XCTestCase { + static let serverURL = "milkbartube.com:6979" static let TEST_TIMEOUT = 8.0 var socket:SocketIOClient! var testKind:TestKind? diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 56eaf53..b153d06 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -13,7 +13,7 @@ class SocketEmitTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Emit - socket = SocketIOClient(socketURL: "milkbartube.com:6979", opts: [ + socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index ca68288..99a4374 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -13,7 +13,7 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Acknowledgement - socket = SocketIOClient(socketURL: "milkbartube.com:6979", opts: [ + socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index c83a4ba..324d161 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -13,7 +13,7 @@ class SocketNamespaceEmitTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Emit - socket = SocketIOClient(socketURL: "milkbartube.com:6979", opts: [ + socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 From e238293711d00ed4a92a3d309e0066c5090ab332 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Thu, 3 Sep 2015 13:49:27 +0200 Subject: [PATCH 02/12] weak connection expection --- SocketIO-iOSTests/AbstractSocketTest.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index 9ade919..25128e0 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -20,10 +20,12 @@ class AbstractSocketTest: XCTestCase { } func openConnection() { - let expection = self.expectationWithDescription("connect") + weak var expection = self.expectationWithDescription("connect") XCTAssertTrue(socket.status == SocketIOClientStatus.NotConnected) socket.on("connect") {data, ack in - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } socket.connect() XCTAssertEqual(socket.status, SocketIOClientStatus.Connecting) From 110a6748ab4f3bdb636ac86af1555bd72a5e519c Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Thu, 3 Sep 2015 14:06:09 +0200 Subject: [PATCH 03/12] cleanup --- SocketIO-iOSTests/AbstractSocketTest.swift | 5 +---- SocketIO-iOSTests/SocketEmitTest.swift | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index 25128e0..59e1b6e 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -14,10 +14,7 @@ class AbstractSocketTest: XCTestCase { var socket:SocketIOClient! var testKind:TestKind? - override func tearDown() { - super.tearDown() - socket.close(fast: false) - } + func openConnection() { weak var expection = self.expectationWithDescription("connect") diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index b153d06..eacff7d 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -25,7 +25,6 @@ class SocketEmitTest: AbstractSocketTest { } override func tearDown() { - socket.close(fast: false) super.tearDown() } From 69b395879616d0868d22443b861df4f810c1faa0 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Thu, 3 Sep 2015 16:47:06 +0200 Subject: [PATCH 04/12] single connection --- SocketIO-iOSTests/AbstractSocketTest.swift | 37 ++++++++++--------- .../SocketAcknowledgementTest.swift | 5 ++- SocketIO-iOSTests/SocketEmitTest.swift | 17 +++++---- .../SocketNamespaceAcknowledgementTest.swift | 5 ++- .../SocketNamespaceEmitTest.swift | 5 ++- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index 59e1b6e..b21a2d4 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -1,6 +1,6 @@ // // AbstractSocketTest.swift -// Socket.IO-Client-Swift +// AbstractSocketTest.socket.IO-Client-Swift // // Created by Lukas Schmidt on 02.08.15. // @@ -11,21 +11,24 @@ import XCTest class AbstractSocketTest: XCTestCase { static let serverURL = "milkbartube.com:6979" static let TEST_TIMEOUT = 8.0 - var socket:SocketIOClient! + static var socket:SocketIOClient! +// var socket:SocketIOClient! var testKind:TestKind? - func openConnection() { + print(AbstractSocketTest.socket.status.description) + guard AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected else {return} weak var expection = self.expectationWithDescription("connect") - XCTAssertTrue(socket.status == SocketIOClientStatus.NotConnected) - socket.on("connect") {data, ack in + XCTAssertTrue(AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected) + AbstractSocketTest.socket.on("connect") {data, ack in + print("Conected") if let expection = expection { expection.fulfill() } } - socket.connect() - XCTAssertEqual(socket.status, SocketIOClientStatus.Connecting) + AbstractSocketTest.socket.connect() + XCTAssertEqual(AbstractSocketTest.socket.status, SocketIOClientStatus.Connecting) waitForExpectationsWithTimeout(AbstractSocketTest.TEST_TIMEOUT, handler: nil) } @@ -34,8 +37,8 @@ class AbstractSocketTest: XCTestCase { } func checkConnectionStatus() { - XCTAssertEqual(socket.status, SocketIOClientStatus.Connected) - XCTAssertFalse(socket.secure) + XCTAssertEqual(AbstractSocketTest.socket.status, SocketIOClientStatus.Connected) + XCTAssertFalse(AbstractSocketTest.socket.secure) } func socketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ @@ -48,8 +51,8 @@ class AbstractSocketTest: XCTestCase { } } - socket.emit(finalTestname, withItems: emitData) - socket.on(finalTestname + "Return", callback: didGetEmit) + AbstractSocketTest.socket.emit(finalTestname, withItems: emitData) + AbstractSocketTest.socket.on(finalTestname + "Return", callback: didGetEmit) waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) } @@ -65,11 +68,11 @@ class AbstractSocketTest: XCTestCase { } - socket.on(finalTestname + "Return", callback: didGetEmit) + AbstractSocketTest.socket.on(finalTestname + "Return", callback: didGetEmit) if let emitData = emitData { - socket.emit(finalTestname, emitData) + AbstractSocketTest.socket.emit(finalTestname, emitData) } else { - socket.emit(finalTestname) + AbstractSocketTest.socket.emit(finalTestname) } waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) @@ -85,7 +88,7 @@ class AbstractSocketTest: XCTestCase { } } - socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) + AbstractSocketTest.socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) } @@ -100,9 +103,9 @@ class AbstractSocketTest: XCTestCase { } var ack:OnAckCallback! if let Data = Data { - ack = socket.emitWithAck(finalTestname, Data) + ack = AbstractSocketTest.socket.emitWithAck(finalTestname, Data) } else { - ack = socket.emitWithAck(finalTestname) + ack = AbstractSocketTest.socket.emitWithAck(finalTestname) } ack(timeoutAfter: 20, callback: didGet) diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 313c372..045d32e 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -13,13 +13,16 @@ class SocketAcknowledgementTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Acknowledgement - socket = SocketIOClient(socketURL: "milkbartube.com:6979", opts: [ + if AbstractSocketTest.socket == nil { + AbstractSocketTest.socket = SocketIOClient(socketURL: "milkbartube.com:6979", opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false "path": ""]) + } + openConnection() } diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index eacff7d..958f241 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -13,14 +13,17 @@ class SocketEmitTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Emit - socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ - "reconnects": true, // default true - "reconnectAttempts": -1, // default -1 - "reconnectWait": 5, // default 10 - "forcePolling": false, - "forceWebsockets": false,// default false - "path": ""] + if AbstractSocketTest.socket == nil { + AbstractSocketTest.socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": ""] ) + } + openConnection() } diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index 99a4374..a7ae5b9 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -13,7 +13,8 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Acknowledgement - socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ + if AbstractSocketTest.socket == nil { + AbstractSocketTest.socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 @@ -21,6 +22,8 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": "", "nsp": "/swift"]) + } + openConnection() } diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index 324d161..cac2fe9 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -13,7 +13,8 @@ class SocketNamespaceEmitTest: AbstractSocketTest { override func setUp() { super.setUp() testKind = TestKind.Emit - socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ + if AbstractSocketTest.socket == nil { + AbstractSocketTest.socket = SocketIOClient(socketURL: AbstractSocketTest.serverURL, opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 @@ -21,6 +22,8 @@ class SocketNamespaceEmitTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": "", "nsp": "/swift"]) + } + openConnection() } From 0fb9be62473bc7f4b008b883809088dd9d50eba0 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Thu, 3 Sep 2015 16:52:43 +0200 Subject: [PATCH 05/12] clean debug code --- SocketIO-iOSTests/AbstractSocketTest.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index b21a2d4..62c6e7a 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -12,17 +12,16 @@ class AbstractSocketTest: XCTestCase { static let serverURL = "milkbartube.com:6979" static let TEST_TIMEOUT = 8.0 static var socket:SocketIOClient! -// var socket:SocketIOClient! var testKind:TestKind? func openConnection() { - print(AbstractSocketTest.socket.status.description) guard AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected else {return} + weak var expection = self.expectationWithDescription("connect") XCTAssertTrue(AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected) AbstractSocketTest.socket.on("connect") {data, ack in - print("Conected") + XCTAssertEqual(AbstractSocketTest.socket.status, SocketIOClientStatus.Connected) if let expection = expection { expection.fulfill() } From 2ae994a031aabcee57ece00fcf1f836b26d39fef Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 3 Sep 2015 12:08:42 -0400 Subject: [PATCH 06/12] Add travis build icon for swift-2 branch --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 57d1861..7f63b09 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/socketio/socket.io-client-swift.svg?branch=swift-2)](https://travis-ci.org/socketio/socket.io-client-swift) + #Socket.IO-Client-Swift Socket.IO-client for iOS/OS X. From 0ff4cb971350d67168c98f6e8fc3efd70d42501d Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2015 12:27:24 -0400 Subject: [PATCH 07/12] remove old check --- SocketIOClientSwift/SocketEngine.swift | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 4e0a5bf..734ddf2 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -68,7 +68,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { var socketPath = "" var urlPolling: String? var urlWebSocket: String? - var ws:WebSocket? + var ws: WebSocket? public enum PacketType: Int { case Open, Close, Ping, Pong, Message, Upgrade, Noop @@ -440,11 +440,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { waitingForPoll = false waitingForPost = false - // If cancelled we were already closing - if client == nil || reason == "cancelled" { - return - } - if !closed { client?.didError(reason) client?.engineDidClose(reason) From 8d0af14f04d796d9280607b767b4ec6277b9b779 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2015 15:10:18 -0400 Subject: [PATCH 08/12] add ability to specify custom logger --- README.md | 1 + SocketIOClientSwift/SocketEngine.swift | 50 +++++++++---------- SocketIOClientSwift/SocketIOClient.swift | 47 +++++++++-------- .../SocketIOClientStatus.swift | 1 - SocketIOClientSwift/SocketLogger.swift | 35 +++++++++---- SocketIOClientSwift/SocketParser.swift | 6 +-- 6 files changed, 80 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 7f63b09..312c7b0 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Options - `nsp: String` Default is `"/"`. Connects to a namespace. - `cookies: [NSHTTPCookie]?` An array of NSHTTPCookies. Passed during the handshake. Default is nil. - `log: Bool` If `true` socket will log debug messages. Default is false. +- `logger: SocketLogger` If you wish to implement your own logger that conforms to SocketLogger you can pass it in here. Will use the default logging defined under the protocol otherwise. - `sessionDelegate: NSURLSessionDelegate` Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil. - `path: String` - If the server uses a custom path. ex: `"/swift"`. Default is `""` - `extraHeaders: [String: String]?` - Adds custom headers to the initial request. Default is nil. diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 734ddf2..bd32394 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -25,6 +25,8 @@ import Foundation public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { + public let logType = "SocketEngine" + private typealias Probe = (msg: String, type: PacketType, data: [NSData]?) private typealias ProbeWaitQueue = [Probe] @@ -56,8 +58,6 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private var waitingForPost = false private var websocketConnected = false - let logType = "SocketEngine" - private(set) var connected = false private(set) var polling = true private(set) var websocket = false @@ -69,7 +69,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { var urlPolling: String? var urlWebSocket: String? var ws: WebSocket? - + public enum PacketType: Int { case Open, Close, Ping, Pong, Message, Upgrade, Noop @@ -98,11 +98,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } deinit { - SocketLogger.log("Engine is being deinit", client: self) + Logger.log("Engine is being deinit", client: self, altType: nil) } public func close(fast fast: Bool) { - SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast) + Logger.log("Engine is being closed. Fast: %@", client: self, altType: nil, args: fast) pingTimer?.invalidate() closed = true @@ -199,8 +199,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private func doFastUpgrade() { if waitingForPoll { - SocketLogger.err("Outstanding poll when switched to WebSockets," + - "we'll probably disconnect soon. You should report this.", client: self) + Logger.err("Outstanding poll when switched to WebSockets," + + "we'll probably disconnect soon. You should report this.", client: self, altType: nil) } sendWebSocketMessage("", withType: PacketType.Upgrade, datas: nil) @@ -240,7 +240,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { req.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData - SocketLogger.log("Doing polling request", client: self) + Logger.log("Doing polling request", client: self, altType: nil) session.dataTaskWithRequest(req) {[weak self] data, res, err in if let this = self { @@ -248,12 +248,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if this.polling { this.handlePollingFailed(err?.localizedDescription ?? "Error") } else { - SocketLogger.err(err?.localizedDescription ?? "Error", client: this) + Logger.err(err?.localizedDescription ?? "Error", client: this, altType: nil) } return } - SocketLogger.log("Got polling response", client: this) + Logger.log("Got polling response", client: this, altType: nil) if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String { dispatch_async(this.parseQueue) {[weak this] in @@ -272,7 +272,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func flushProbeWait() { - SocketLogger.log("Flushing probe wait", client: self) + Logger.log("Flushing probe wait", client: self, altType: nil) dispatch_async(emitQueue) {[weak self] in if let this = self { @@ -325,7 +325,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { waitingForPost = true - SocketLogger.log("POSTing: %@", client: self, args: postStr) + Logger.log("POSTing: %@", client: self, altType: nil, args: postStr) session.dataTaskWithRequest(req) {[weak self] data, res, err in if let this = self { @@ -412,7 +412,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } } catch { - SocketLogger.err("Error parsing open packet", client: self) + Logger.err("Error parsing open packet", client: self, altType: nil) return } @@ -448,14 +448,14 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { public func open(opts: [String: AnyObject]? = nil) { if connected { - SocketLogger.err("Tried to open while connected", client: self) + Logger.err("Tried to open while connected", client: self, altType: nil) client?.didError("Tried to open while connected") return } - SocketLogger.log("Starting engine", client: self) - SocketLogger.log("Handshaking", client: self) + Logger.log("Starting engine", client: self, altType: nil) + Logger.log("Handshaking", client: self, altType: nil) closed = false @@ -512,7 +512,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { length += chr } else { if length == "" || testLength(length, n: &n) { - SocketLogger.err("Parsing error: %@", client: self, args: str) + Logger.err("Parsing error: %@", client: self, altType: nil, args: str) handlePollingFailed("Error parsing XHR message") return } @@ -520,7 +520,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { msg = String(strArray[i+1...i+n]) if let lengthInt = Int(length) where lengthInt != msg.characters.count { - SocketLogger.err("Parsing error: %@", client: self, args: str) + Logger.err("Parsing error: %@", client: self, altType: nil, args: str) return } @@ -542,7 +542,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func parseEngineMessage(var message: String, fromPolling: Bool) { - SocketLogger.log("Got message: %@", client: self, args: message) + Logger.log("Got message: %@", client: self, altType: nil, args: message) if fromPolling { fixDoubleUTF8(&message) @@ -567,7 +567,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { case PacketType.Close: handleClose() default: - SocketLogger.log("Got unknown packet type", client: self) + Logger.log("Got unknown packet type", client: self, altType: nil) } } @@ -602,7 +602,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Only call on emitQueue private func sendPollMessage(var msg: String, withType type: PacketType, datas:[NSData]? = nil) { - SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue) + Logger.log("Sending poll: %@ as type: %@", client: self, altType: nil, args: msg, type.rawValue) doubleEncodeUTF8(&msg) let strMsg = "\(type.rawValue)\(msg)" @@ -626,7 +626,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Only call on emitQueue private func sendWebSocketMessage(str: String, withType type: PacketType, datas:[NSData]? = nil) { - SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue) + Logger.log("Sending ws: %@ as type: %@", client: self, altType: nil, args: str, type.rawValue) ws?.writeString("\(type.rawValue)\(str)") @@ -661,7 +661,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private func upgradeTransport() { if websocketConnected { - SocketLogger.log("Upgrading transport to WebSockets", client: self) + Logger.log("Upgrading transport to WebSockets", client: self, altType: nil) fastUpgrade = true sendPollMessage("", withType: PacketType.Noop) @@ -676,11 +676,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { if this.websocket { - SocketLogger.log("Writing ws: %@ has data: %@", client: this, + Logger.log("Writing ws: %@ has data: %@", client: this, altType: nil, args: msg, data == nil ? false : true) this.sendWebSocketMessage(msg, withType: type, datas: data) } else { - SocketLogger.log("Writing poll: %@ has data: %@", client: this, + Logger.log("Writing poll: %@ has data: %@", client: this, altType: nil, args: msg, data == nil ? false : true) this.sendPollMessage(msg, withType: type, datas: data) } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c8ee902..40964bf 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -32,13 +32,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var reconnectTimer: NSTimer? let reconnectAttempts: Int! - let logType = "SocketClient" var ackHandlers = SocketAckManager() var currentAck = -1 var waitingData = [SocketPacket]() public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue: dispatch_queue_t! + public let logType = "SocketClient" public let socketURL: String public private(set) var engine: SocketEngine? @@ -71,8 +71,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.connectParams = connectParams } + if let logger = opts?["logger"] as? SocketLogger { + Logger = logger + } + if let log = opts?["log"] as? Bool { - SocketLogger.log = log + Logger.log = log } if let nsp = opts?["nsp"] as? String { @@ -103,12 +107,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } deinit { - SocketLogger.log("Client is being deinit", client: self) + Logger.log("Client is being deinit", client: self, altType: nil) engine?.close(fast: true) } private func addEngine() { - SocketLogger.log("Adding engine", client: self) + Logger.log("Adding engine", client: self, altType: nil) engine = SocketEngine(client: self, opts: opts) } @@ -124,7 +128,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Pass true to fast if you're closing from a background task */ public func close(fast fast: Bool) { - SocketLogger.log("Closing socket", client: self) + Logger.log("Closing socket", client: self, altType: nil) reconnects = false status = SocketIOClientStatus.Closed @@ -147,7 +151,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return } if status == SocketIOClientStatus.Closed { - SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) + Logger.log("Warning! This socket was previously closed. This might be dangerous!", + client: self, altType: nil) } status = SocketIOClientStatus.Connecting @@ -191,7 +196,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } func didConnect() { - SocketLogger.log("Socket connected", client: self) + Logger.log("Socket connected", client: self, altType: nil) status = SocketIOClientStatus.Connected currentReconnectAttempt = 0 clearReconnectTimer() @@ -206,7 +211,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return } - SocketLogger.log("Disconnected: %@", client: self, args: reason) + Logger.log("Disconnected: %@", client: self, altType: nil, args: reason) status = SocketIOClientStatus.Closed @@ -219,7 +224,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /// error public func didError(reason: AnyObject) { - SocketLogger.err("%@", client: self, args: reason) + Logger.err("%@", client: self, altType: nil, args: reason) handleEvent("error", data: reason as? [AnyObject] ?? [reason], isInternalMessage: true) @@ -275,7 +280,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false) let str = packet.packetString - SocketLogger.log("Emitting: %@", client: self, args: str) + Logger.log("Emitting: %@", client: self, altType: nil, args: str) if packet.type == SocketPacket.PacketType.BinaryEvent { engine?.send(str, withData: packet.binary) @@ -291,7 +296,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true) let str = packet.packetString - SocketLogger.log("Emitting Ack: %@", client: this, args: str) + Logger.log("Emitting Ack: %@", client: this, altType: nil, args: str) if packet.type == SocketPacket.PacketType.BinaryAck { this.engine?.send(str, withData: packet.binary) @@ -317,8 +322,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient // Called when the socket gets an ack for something it sent func handleAck(ack: Int, data: AnyObject?) { - SocketLogger.log("Handling ack: %@ with data: %@", client: self, - args: ack, data ?? "") + Logger.log("Handling ack: %@ with data: %@", client: self, + altType: nil, args: ack, data ?? "") ackHandlers.executeAck(ack, items: (data as? [AnyObject]?) ?? (data != nil ? [data!] : nil)) @@ -334,8 +339,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // println("Should do event: \(event) with data: \(data)") - SocketLogger.log("Handling event: %@ with data: %@", client: self, - args: event, data ?? "") + Logger.log("Handling event: %@ with data: %@", client: self, + altType: nil, args: event, data ?? "") if anyHandler != nil { dispatch_async(handleQueue) {[weak self] in @@ -370,7 +375,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Joins nsp if it is not / */ public func joinNamespace() { - SocketLogger.log("Joining namespace", client: self) + Logger.log("Joining namespace", client: self, altType: nil) if nsp != "/" { engine?.send("0\(nsp)", withData: nil) @@ -389,7 +394,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Removes handler(s) */ public func off(event: String) { - SocketLogger.log("Removing handler for event: %@", client: self, args: event) + Logger.log("Removing handler for event: %@", client: self, altType: nil, args: event) handlers = ContiguousArray(handlers.filter {!($0.event == event)}) } @@ -398,7 +403,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Adds a handler for an event. */ public func on(event: String, callback: NormalCallback) { - SocketLogger.log("Adding handler for event: %@", client: self, args: event) + Logger.log("Adding handler for event: %@", client: self, altType: nil, args: event) let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) @@ -408,7 +413,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Adds a handler for an event. */ public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { - SocketLogger.log("Adding handler for event: %@", client: self, args: event) + Logger.log("Adding handler for event: %@", client: self, altType: nil, args: event) let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) @@ -462,7 +467,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private func tryReconnect() { if reconnectTimer == nil { - SocketLogger.log("Starting reconnect", client: self) + Logger.log("Starting reconnect", client: self, altType: nil) status = SocketIOClientStatus.Reconnecting @@ -490,7 +495,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return } - SocketLogger.log("Trying to reconnect", client: self) + Logger.log("Trying to reconnect", client: self, altType: nil) handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt], isInternalMessage: true) diff --git a/SocketIOClientSwift/SocketIOClientStatus.swift b/SocketIOClientSwift/SocketIOClientStatus.swift index 1817f51..0dfac8a 100644 --- a/SocketIOClientSwift/SocketIOClientStatus.swift +++ b/SocketIOClientSwift/SocketIOClientStatus.swift @@ -47,5 +47,4 @@ import Foundation } case NotConnected, Closed, Connecting, Connected, Reconnecting - } \ No newline at end of file diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 5071c02..9a3fc9a 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -24,41 +24,56 @@ import Foundation -protocol SocketLogClient { +var Logger: SocketLogger = DefaultSocketLogger(log: false) + +public protocol SocketLogClient { + /// The type of object being logged var logType: String {get} } -final class SocketLogger { - private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) - static var log = false +public protocol SocketLogger { + /// Whether to log or not + var log: Bool {get set} - private static func toCVArgType(item: AnyObject) -> CVarArgType { - return String(item) + /// Normal log messages + func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) + + /// Error Messages + func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) +} + +extension SocketLogger { + private var printQueue: dispatch_queue_t { + return dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) } - static func log(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { + public func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { if !log { return } dispatch_async(printQueue) {[type = client.logType] in - let newArgs = args.map(SocketLogger.toCVArgType) + let newArgs = args.map {String($0)} let replaced = String(format: message, arguments: newArgs) NSLog("%@: %@", altType ?? type, replaced) } } - static func err(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { + public func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { if !log { return } dispatch_async(printQueue) {[type = client.logType] in - let newArgs = args.map(SocketLogger.toCVArgType) + let newArgs = args.map {String($0)} let replaced = String(format: message, arguments: newArgs) NSLog("ERROR %@: %@", altType ?? type, replaced) } } } + +struct DefaultSocketLogger: SocketLogger { + var log: Bool +} diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index f601bcd..e06681d 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -177,7 +177,7 @@ class SocketParser { return } - SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) + Logger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) let p: SocketPacket @@ -188,7 +188,7 @@ class SocketParser { return } - SocketLogger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p.description) + Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p.description) switch p.type { case SocketPacket.PacketType.Event: @@ -210,7 +210,7 @@ class SocketParser { static func parseBinaryData(data: NSData, socket: SocketIOClient) { if socket.waitingData.count == 0 { - SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") + Logger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") return } From a147ebcd85ecd438a44bdb153bd0d8ba7351633b Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2015 15:14:25 -0400 Subject: [PATCH 09/12] Default logging won't use another dispatch queue --- SocketIOClientSwift/SocketLogger.swift | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 9a3fc9a..bd4aa47 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -43,21 +43,15 @@ public protocol SocketLogger { } extension SocketLogger { - private var printQueue: dispatch_queue_t { - return dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) - } - public func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { if !log { return } - dispatch_async(printQueue) {[type = client.logType] in - let newArgs = args.map {String($0)} - let replaced = String(format: message, arguments: newArgs) - - NSLog("%@: %@", altType ?? type, replaced) - } + let newArgs = args.map {String($0)} + let replaced = String(format: message, arguments: newArgs) + + NSLog("%@: %@", altType ?? client.logType, replaced) } public func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { @@ -65,12 +59,10 @@ extension SocketLogger { return } - dispatch_async(printQueue) {[type = client.logType] in - let newArgs = args.map {String($0)} - let replaced = String(format: message, arguments: newArgs) - - NSLog("ERROR %@: %@", altType ?? type, replaced) - } + let newArgs = args.map {String($0)} + let replaced = String(format: message, arguments: newArgs) + + NSLog("ERROR %@: %@", altType ?? client.logType, replaced) } } From d81cbd7d243f8f228f412933170037b2cf140d25 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2015 15:20:15 -0400 Subject: [PATCH 10/12] fix unsafeBitCast error --- SocketIOClientSwift/SocketLogger.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index bd4aa47..0b61bd2 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -48,7 +48,7 @@ extension SocketLogger { return } - let newArgs = args.map {String($0)} + let newArgs = args.map {arg -> CVarArgType in String(arg)} let replaced = String(format: message, arguments: newArgs) NSLog("%@: %@", altType ?? client.logType, replaced) @@ -59,7 +59,7 @@ extension SocketLogger { return } - let newArgs = args.map {String($0)} + let newArgs = args.map {arg -> CVarArgType in String(arg)} let replaced = String(format: message, arguments: newArgs) NSLog("ERROR %@: %@", altType ?? client.logType, replaced) From 13440ce6b163508942eefddcf1d2e5f9d5e22486 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2015 16:24:05 -0400 Subject: [PATCH 11/12] small tweak --- SocketIOClientSwift/SocketLogger.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 0b61bd2..af2cfe8 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -24,7 +24,7 @@ import Foundation -var Logger: SocketLogger = DefaultSocketLogger(log: false) +var Logger: SocketLogger = DefaultSocketLogger() public protocol SocketLogClient { /// The type of object being logged @@ -42,8 +42,8 @@ public protocol SocketLogger { func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) } -extension SocketLogger { - public func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { +public extension SocketLogger { + func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { if !log { return } @@ -54,7 +54,7 @@ extension SocketLogger { NSLog("%@: %@", altType ?? client.logType, replaced) } - public func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { + func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { if !log { return } @@ -67,5 +67,5 @@ extension SocketLogger { } struct DefaultSocketLogger: SocketLogger { - var log: Bool + var log = false } From d6e1510cbf6f7524e6985ceb98bbb78784494dca Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2015 23:32:48 -0400 Subject: [PATCH 12/12] update websocket library --- SocketIOClientSwift/WebSocket.swift | 30 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index 04192a4..7c8c787 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -67,7 +67,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let headerWSKeyName = "Sec-WebSocket-Key" let headerOriginName = "Origin" let headerWSAcceptName = "Sec-WebSocket-Accept" - let BUFFER_MAX = 2048 + let BUFFER_MAX = 4096 let FinMask: UInt8 = 0x80 let OpCodeMask: UInt8 = 0x0F let RSVMask: UInt8 = 0x70 @@ -133,13 +133,15 @@ public class WebSocket : NSObject, NSStreamDelegate { if isCreated { return } + unowned let weakSelf = self + dispatch_async(queue,{ - self.didDisconnect = false + weakSelf.didDisconnect = false }) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { - self.isCreated = true - self.createHTTPRequest() - self.isCreated = false + weakSelf.isCreated = true + weakSelf.createHTTPRequest() + weakSelf.isCreated = false }) } @@ -318,8 +320,8 @@ public class WebSocket : NSObject, NSStreamDelegate { let length = inputStream!.read(buffer, maxLength: BUFFER_MAX) if length > 0 { if !connected { - connected = processHTTP(buffer, bufferLen: length) - if !connected { + let status = processHTTP(buffer, bufferLen: length) + if !status { self.doDisconnect(self.errorWithDetail("Invalid HTTP upgrade", code: 1)) } } else { @@ -368,12 +370,14 @@ public class WebSocket : NSObject, NSStreamDelegate { } } if totalSize > 0 { + unowned let weakSelf = self if validateResponse(buffer, bufferLen: totalSize) { dispatch_async(queue,{ - if let connectBlock = self.onConnect { + weakSelf.connected = true + if let connectBlock = weakSelf.onConnect { connectBlock() } - self.delegate?.websocketDidConnect(self) + weakSelf.delegate?.websocketDidConnect(self) }) totalSize += 1 //skip the last \n let restSize = bufferLen - totalSize @@ -511,7 +515,7 @@ public class WebSocket : NSObject, NSStreamDelegate { data = NSData(bytes: UnsafePointer((buffer+offset)), length: Int(len)) } if receivedOpcode == OpCode.Pong.rawValue { - dispatch_async(queue,{ + dispatch_async(queue,{[unowned self] in if let pongBlock = self.onPong { pongBlock() } @@ -604,7 +608,7 @@ public class WebSocket : NSObject, NSStreamDelegate { writeError(CloseCode.Encoding.rawValue) return false } - dispatch_async(queue,{ + dispatch_async(queue,{[unowned self] in if let textBlock = self.onText { textBlock(str! as String) } @@ -612,7 +616,7 @@ public class WebSocket : NSObject, NSStreamDelegate { }) } else if response.code == .BinaryFrame { let data = response.buffer! //local copy so it is perverse for writing - dispatch_async(queue,{ + dispatch_async(queue,{[unowned self] in if let dataBlock = self.onData { dataBlock(data) } @@ -719,7 +723,7 @@ 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,{[unowned self] in self.didDisconnect = true if let disconnect = self.onDisconnect { disconnect(error)