From d811b194ebae07ec7276f7884123c7c74e9f6318 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 1 Mar 2018 10:15:28 -0500 Subject: [PATCH] Fix exclusive access issue --- Source/SocketIO/Ack/SocketAckManager.swift | 8 ++++---- Source/SocketIO/Client/SocketIOClient.swift | 2 +- Tests/TestSocketIO/SocketSideEffectTest.swift | 13 +++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Source/SocketIO/Ack/SocketAckManager.swift b/Source/SocketIO/Ack/SocketAckManager.swift index 21fb009..4679f37 100644 --- a/Source/SocketIO/Ack/SocketAckManager.swift +++ b/Source/SocketIO/Ack/SocketAckManager.swift @@ -58,20 +58,20 @@ private struct SocketAck : Hashable { } } -struct SocketAckManager { +class SocketAckManager { private var acks = Set(minimumCapacity: 1) - mutating func addAck(_ ack: Int, callback: @escaping AckCallback) { + func addAck(_ ack: Int, callback: @escaping AckCallback) { acks.insert(SocketAck(ack: ack, callback: callback)) } /// Should be called on handle queue - mutating func executeAck(_ ack: Int, with items: [Any]) { + func executeAck(_ ack: Int, with items: [Any]) { acks.remove(SocketAck(ack: ack))?.callback(items) } /// Should be called on handle queue - mutating func timeoutAck(_ ack: Int) { + func timeoutAck(_ ack: Int) { acks.remove(SocketAck(ack: ack))?.callback?([SocketAckStatus.noAck.rawValue]) } } diff --git a/Source/SocketIO/Client/SocketIOClient.swift b/Source/SocketIO/Client/SocketIOClient.swift index 76544b9..a8f12f4 100644 --- a/Source/SocketIO/Client/SocketIOClient.swift +++ b/Source/SocketIO/Client/SocketIOClient.swift @@ -75,7 +75,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec { } } - var ackHandlers = SocketAckManager() + let ackHandlers = SocketAckManager() private(set) var currentAck = -1 diff --git a/Tests/TestSocketIO/SocketSideEffectTest.swift b/Tests/TestSocketIO/SocketSideEffectTest.swift index 156fe4d..5c8a77d 100644 --- a/Tests/TestSocketIO/SocketSideEffectTest.swift +++ b/Tests/TestSocketIO/SocketSideEffectTest.swift @@ -38,6 +38,19 @@ class SocketSideEffectTest: XCTestCase { waitForExpectations(timeout: 3, handler: nil) } + func testHandleAckWithAckEmit() { + let expect = expectation(description: "handled ack") + socket.emitWithAck("test").timingOut(after: 0) {data in + XCTAssertEqual(data[0] as? String, "hello world") + + self.socket.emitWithAck("test").timingOut(after: 0) {data in} + expect.fulfill() + } + + manager.parseEngineMessage("30[\"hello world\"]") + waitForExpectations(timeout: 3, handler: nil) + } + func testHandleAck2() { let expect = expectation(description: "handled ack2") socket.emitWithAck("test").timingOut(after: 0) {data in