From d9559e7c59caa16e81cfe190a73b2a4121d5ab5c Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 27 May 2017 12:18:10 -0400 Subject: [PATCH 1/6] Add note about queue safety --- Source/SocketIOClient.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index a0c92aa..696acee 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -27,6 +27,8 @@ import Foundation /// The main class for SocketIOClientSwift. /// +/// **NOTE**: The client is not thread/queue safe, all interaction with the socket should be done on the `handleQueue` +/// /// Represents a socket.io-client. Most interaction with socket.io will be through this class. open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, SocketParsable { // MARK: Properties From 17bec21ad1813f5beb1d94b7a12c4ec8cae8bc06 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 28 May 2017 12:06:24 -0400 Subject: [PATCH 2/6] code style --- Source/SocketEngineSpec.swift | 4 +--- Source/SocketIOClient.swift | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 71c9dc1..fe5d781 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -155,9 +155,7 @@ extension SocketEngineSpec { return .left(mutData as Data) } else { - let str = "b4" + data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) - - return .right(str) + return .right("b4" + data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 696acee..b8e9200 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -498,7 +498,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So return handler.id } - /// Adds a single-use handler for an event. /// /// - parameter event: The event name for this handler. From 30e4f59a162b4db1e3f6eaea14d15de0cea35a48 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 28 May 2017 15:24:39 -0400 Subject: [PATCH 3/6] Allow changing the socketURL post init Fixes #470 --- Source/SocketEnginePollable.swift | 2 +- Source/SocketIOClient.swift | 31 ++++++++++++++++--------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 43bfb68..569db51 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -147,7 +147,7 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.log("Got polling response", type: "SocketEnginePolling") - if let str = String(data: data!, encoding: String.Encoding.utf8) { + if let str = String(data: data!, encoding: .utf8) { this.parsePollingMessage(str) } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index b8e9200..23b69b0 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -33,9 +33,6 @@ import Foundation open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, SocketParsable { // MARK: Properties - /// The URL of the socket.io server. This is set in the initializer. - public let socketURL: URL - /// The engine for this client. public private(set) var engine: SocketEngineSpec? @@ -78,6 +75,18 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So return engine?.sid } + /// The URL of the socket.io server. + /// + /// If changed after calling `init`, `forceNew` must be set to `true`, or it will only connect to the url set in the + /// init. + public var socketURL: URL + + var ackHandlers = SocketAckManager() + var waitingPackets = [SocketPacket]() + + private(set) var currentAck = -1 + private(set) var reconnectAttempts = -1 + private let logType = "SocketIOClient" private var anyHandler: ((SocketAnyEvent) -> Void)? @@ -85,12 +94,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So private var handlers = [SocketEventHandler]() private var reconnecting = false - private(set) var currentAck = -1 - private(set) var reconnectAttempts = -1 - - var ackHandlers = SocketAckManager() - var waitingPackets = [SocketPacket]() - // MARK: Initializers /// Type safe way to create a new SocketIOClient. `opts` can be omitted. @@ -149,13 +152,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So // MARK: Methods - private func addEngine() -> SocketEngineSpec { + private func addEngine() { DefaultSocketLogger.Logger.log("Adding engine", type: logType, args: "") engine?.client = nil engine = SocketEngine(client: self, url: socketURL, config: config) - - return engine! } /// Connect to the server. @@ -179,11 +180,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So status = .connecting if engine == nil || forceNew { - addEngine().connect() - } else { - engine?.connect() + addEngine() } + engine?.connect() + guard timeoutAfter != 0 else { return } handleQueue.asyncAfter(deadline: DispatchTime.now() + Double(timeoutAfter)) {[weak self] in From 2e7183b8deb1ca721b24accff30bafdd337893ac Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 28 May 2017 15:30:39 -0400 Subject: [PATCH 4/6] Change Void to () --- Source/SocketEnginePollable.swift | 2 +- Source/SocketIOClient.swift | 6 +++--- Source/SocketTypes.swift | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 569db51..e3e9248 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -120,7 +120,7 @@ extension SocketEnginePollable { doLongPoll(for: req) } - func doRequest(for req: URLRequest, callbackWith callback: @escaping (Data?, URLResponse?, Error?) -> Void) { + func doRequest(for req: URLRequest, callbackWith callback: @escaping (Data?, URLResponse?, Error?) -> ()) { guard polling && !closed && !invalidated && !fastUpgrade else { return } DefaultSocketLogger.Logger.log("Doing polling %@ %@", type: "SocketEnginePolling", diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 23b69b0..1a43b54 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -89,7 +89,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So private let logType = "SocketIOClient" - private var anyHandler: ((SocketAnyEvent) -> Void)? + private var anyHandler: ((SocketAnyEvent) -> ())? private var currentReconnectAttempt = 0 private var handlers = [SocketEventHandler]() private var reconnecting = false @@ -169,7 +169,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter timeoutAfter: The number of seconds after which if we are not connected we assume the connection /// has failed. Pass 0 to never timeout. /// - parameter withHandler: The handler to call when the client fails to connect. - open func connect(timeoutAfter: Int, withHandler handler: (() -> Void)?) { + open func connect(timeoutAfter: Int, withHandler handler: (() -> ())?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .connected else { @@ -524,7 +524,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Adds a handler that will be called on every event. /// /// - parameter handler: The callback that will execute whenever an event is received. - open func onAny(_ handler: @escaping (SocketAnyEvent) -> Void) { + open func onAny(_ handler: @escaping (SocketAnyEvent) -> ()) { anyHandler = handler } diff --git a/Source/SocketTypes.swift b/Source/SocketTypes.swift index 096c250..bbc1b6d 100644 --- a/Source/SocketTypes.swift +++ b/Source/SocketTypes.swift @@ -68,10 +68,10 @@ extension NSNull : SocketData { } extension String : SocketData { } /// A typealias for an ack callback. -public typealias AckCallback = ([Any]) -> Void +public typealias AckCallback = ([Any]) -> () /// A typealias for a normal callback. -public typealias NormalCallback = ([Any], SocketAckEmitter) -> Void +public typealias NormalCallback = ([Any], SocketAckEmitter) -> () typealias JSON = [String: Any] typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data]) From db9671e2df25ef18a9c9c997158cf42372b39c5b Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 28 May 2017 15:41:20 -0400 Subject: [PATCH 5/6] update websocket --- Source/WebSocket.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 34152af..f57ec3d 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -115,7 +115,7 @@ open class WebSocket : NSObject, StreamDelegate { // MARK: - Block based API. - public var onConnect: ((Void) -> Void)? + public var onConnect: (() -> Void)? public var onDisconnect: ((NSError?) -> Void)? public var onText: ((String) -> Void)? public var onData: ((Data) -> Void)? From b71348a07435289a04ce6981a272194cbb497cb1 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 29 May 2017 09:53:46 -0400 Subject: [PATCH 6/6] remove old test server --- Socket.IO-Test-Server/TestCases.js | 95 ------------------- .../acknowledgementEvents.js | 10 -- Socket.IO-Test-Server/emitEvents.js | 20 ---- Socket.IO-Test-Server/main.js | 15 --- Socket.IO-Test-Server/package.json | 14 --- Socket.IO-Test-Server/socketEventRegister.js | 13 --- 6 files changed, 167 deletions(-) delete mode 100644 Socket.IO-Test-Server/TestCases.js delete mode 100644 Socket.IO-Test-Server/acknowledgementEvents.js delete mode 100644 Socket.IO-Test-Server/emitEvents.js delete mode 100644 Socket.IO-Test-Server/main.js delete mode 100644 Socket.IO-Test-Server/package.json delete mode 100644 Socket.IO-Test-Server/socketEventRegister.js diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js deleted file mode 100644 index 1f7511f..0000000 --- a/Socket.IO-Test-Server/TestCases.js +++ /dev/null @@ -1,95 +0,0 @@ -var assert = require("assert") - -module.exports = { - basicTest: { - assert: function(inputData) { - - }, - returnData: [] - }, - testNull: { - assert: function(inputData) { - assert(!inputData) - }, - returnData: [null] - }, - testBinary: { - assert: function(inputData) { - assert.equal(inputData.toString(), "gakgakgak2") - }, - returnData: [new Buffer("gakgakgak2", "utf-8")] - }, - testArray: { - assert: function(inputData) { - assert.equal(inputData.length, 2) - assert.equal(inputData[0], "test1") - assert.equal(inputData[1], "test2") - }, - returnData: [["test3", "test4"]] - }, - testString: { - assert: function(inputData) { - assert.equal(inputData, "marco") - }, - returnData: ["polo"] - }, - testBool: { - assert: function(inputData) { - assert(!inputData) - }, - returnData: [true] - }, - testInteger: { - assert: function(inputData) { - assert.equal(inputData, 10) - }, - returnData: [20] - }, - testDouble: { - assert: function(inputData) { - assert.equal(inputData, 1.1) - }, - returnData: [1.2] - }, - testJSON: { - assert: function(inputData) { - assert.equal(inputData.name, "test") - assert.equal(inputData.nestedTest.test, "test") - assert.equal(inputData.testArray.length, 1) - }, - returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [1, 1]}] - }, - testJSONWithBuffer: { - assert: function(inputData) { - assert.equal(inputData.name, "test") - assert.equal(inputData.nestedTest.test, "test") - assert.equal(inputData.testArray.length, 1) - }, - returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [new Buffer("gakgakgak2", "utf-8"), 1]}] - },testUnicode: { - assert: function(inputData) { - assert.equal(inputData, "🚀") - }, - returnData: ["🚄"] - },testMultipleItems: { - assert: function(array, object, number, string, bool) { - assert.equal(array.length, 2) - assert.equal(array[0], "test1") - assert.equal(array[1], "test2") - assert.equal(number, 15) - assert.equal(string, "marco") - assert.equal(bool, false) - }, - returnData: [[1, 2], {test: "bob"}, 25, "polo", false] - },testMultipleItemsWithBuffer: { - assert: function(array, object, number, string, binary) { - assert.equal(array.length, 2) - assert.equal(array[0], "test1") - assert.equal(array[1], "test2") - assert.equal(number, 15) - assert.equal(string, "marco") - assert.equal(binary.toString(), "gakgakgak2") - }, - returnData: [[1, 2], {test: "bob"}, 25, "polo", new Buffer("gakgakgak2")] - } -} \ No newline at end of file diff --git a/Socket.IO-Test-Server/acknowledgementEvents.js b/Socket.IO-Test-Server/acknowledgementEvents.js deleted file mode 100644 index a4c2c9d..0000000 --- a/Socket.IO-Test-Server/acknowledgementEvents.js +++ /dev/null @@ -1,10 +0,0 @@ -function socketCallback(testKey, socket, testCase) { - return function() { - testCase.assert.apply(undefined , arguments) - var emitArguments = testCase.returnData; - var ack = arguments[arguments.length - 1] - ack.apply(socket, emitArguments) - } -} - -module.exports.socketCallback = socketCallback diff --git a/Socket.IO-Test-Server/emitEvents.js b/Socket.IO-Test-Server/emitEvents.js deleted file mode 100644 index 14f9ce5..0000000 --- a/Socket.IO-Test-Server/emitEvents.js +++ /dev/null @@ -1,20 +0,0 @@ -function socketCallback(testKey, socket, testCase) { - return function() { - testCase.assert.apply(undefined , arguments) - - var emitArguments = addArrays([testKey + "EmitReturn"], testCase.returnData) - socket.emit.apply(socket, emitArguments) - } -} - -function addArrays(firstArray, secondArray) { - var length = secondArray.length - var i; - for(i = 0; i < length; i++) { - firstArray.push(secondArray[i]) - } - - return firstArray; -} - -module.exports.socketCallback = socketCallback \ No newline at end of file diff --git a/Socket.IO-Test-Server/main.js b/Socket.IO-Test-Server/main.js deleted file mode 100644 index 4f13276..0000000 --- a/Socket.IO-Test-Server/main.js +++ /dev/null @@ -1,15 +0,0 @@ -var app = require('http').createServer() -var io = require('socket.io')(app); -app.listen(6979) - - -var acknowledgementsEvents = require("./acknowledgementEvents.js") -var emitEvents = require("./emitEvents.js") -var socketEventRegister = require("./socketEventRegister.js") - -socketEventRegister.register(io, emitEvents.socketCallback, "Emit") -socketEventRegister.register(io, acknowledgementsEvents.socketCallback, "Acknowledgement") - -var nsp = io.of("/swift") -socketEventRegister.register(nsp, emitEvents.socketCallback, "Emit") -socketEventRegister.register(nsp, acknowledgementsEvents.socketCallback, "Acknowledgement") diff --git a/Socket.IO-Test-Server/package.json b/Socket.IO-Test-Server/package.json deleted file mode 100644 index eb10dba..0000000 --- a/Socket.IO-Test-Server/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "socket.io-client-swift-test-server", - "version": "0.0.1", - "description": "A simple server to test aginst", - "main": "main.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Lukas Schmidt", - "license": "MIT", - "dependencies": { - "socket.io": "^1.3.6" - } -} diff --git a/Socket.IO-Test-Server/socketEventRegister.js b/Socket.IO-Test-Server/socketEventRegister.js deleted file mode 100644 index 9e0c208..0000000 --- a/Socket.IO-Test-Server/socketEventRegister.js +++ /dev/null @@ -1,13 +0,0 @@ -var testCases = require("./TestCases.js") - -function registerSocketForEvents(ioSocket, socketCallback, testKind) { - ioSocket.on('connection', function(socket) { - var testCase; - for(testKey in testCases) { - testCase = testCases[testKey] - socket.on((testKey + testKind), socketCallback(testKey, socket, testCase)) - } - }) -} - -module.exports.register = registerSocketForEvents \ No newline at end of file