Skip to content

Commit ec4378c

Browse files
committed
Handling reconnect scenarios properly when socket is hung
1 parent d031afd commit ec4378c

File tree

6 files changed

+49
-6
lines changed

6 files changed

+49
-6
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,5 @@ Socket.IO-Test-Server/node_modules/*
5050
.idea/
5151
docs/docsets/
5252
docs/undocumented.json
53+
54+
.swiftpm

Source/SocketIO/Client/SocketIOClient.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
150150

151151
manager.handleQueue.asyncAfter(deadline: DispatchTime.now() + timeoutAfter) {[weak self] in
152152
guard let this = self, this.status == .connecting || this.status == .notConnected else { return }
153-
153+
DefaultSocketLogger.Logger.log("Timeout: Socket not connected, so setting to disconnected", type: this.logType)
154+
154155
this.status = .disconnected
155156
this.leaveNamespace()
156157

Source/SocketIO/Manager/SocketManager.swift

+2-3
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ open class SocketManager: NSObject, SocketManagerSpec, SocketParsable, SocketDat
132132
private(set) var reconnectAttempts = -1
133133

134134
private var _config: SocketIOClientConfiguration
135-
private var currentReconnectAttempt = 0
135+
internal var currentReconnectAttempt = 0
136136
private var reconnecting = false
137137

138138
// MARK: Initializers
@@ -186,9 +186,8 @@ open class SocketManager: NSObject, SocketManagerSpec, SocketParsable, SocketDat
186186
///
187187
/// Override if you wish to attach a custom `SocketEngineSpec`.
188188
open func connect() {
189-
guard !status.active else {
189+
if status == .connected || (status == .connecting && currentReconnectAttempt == 0) {
190190
DefaultSocketLogger.Logger.log("Tried connecting an already active socket", type: SocketManager.logType)
191-
192191
return
193192
}
194193

Tests/TestSocketIO/SocketAckManagerTest.swift

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ class SocketAckManagerTest : XCTestCase {
2828

2929
func testManagerTimeoutAck() {
3030
let callbackExpection = expectation(description: "Manager should timeout ack with noAck status")
31-
let itemsArray = ["Hi", "ho"]
3231

3332
func callback(_ items: [Any]) {
3433
XCTAssertEqual(items.count, 1, "Timed out ack should have one value")

Tests/TestSocketIO/SocketMangerTest.swift

+42
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,44 @@ class SocketMangerTest : XCTestCase {
6060
waitForExpectations(timeout: 0.3)
6161
}
6262

63+
func testManagerDoesNotCallConnectWhenConnectingWithLessThanOneReconnect() {
64+
setUpSockets()
65+
66+
let expect = expectation(description: "The manager should not call connect on the engine")
67+
expect.isInverted = true
68+
69+
let engine = TestEngine(client: manager, url: manager.socketURL, options: nil)
70+
71+
engine.onConnect = {
72+
expect.fulfill()
73+
}
74+
manager.setTestStatus(.connecting)
75+
manager.setCurrentReconnect(currentReconnect: 0)
76+
manager.engine = engine
77+
78+
manager.connect()
79+
80+
waitForExpectations(timeout: 0.3)
81+
}
82+
83+
func testManagerCallConnectWhenConnectingAndMoreThanOneReconnect() {
84+
setUpSockets()
85+
86+
let expect = expectation(description: "The manager should call connect on the engine")
87+
let engine = TestEngine(client: manager, url: manager.socketURL, options: nil)
88+
89+
engine.onConnect = {
90+
expect.fulfill()
91+
}
92+
manager.setTestStatus(.connecting)
93+
manager.setCurrentReconnect(currentReconnect: 1)
94+
manager.engine = engine
95+
96+
manager.connect()
97+
98+
waitForExpectations(timeout: 0.8)
99+
}
100+
63101
func testManagerCallsDisconnect() {
64102
setUpSockets()
65103

@@ -154,6 +192,10 @@ public enum ManagerExpectation: String {
154192
}
155193

156194
public class TestManager: SocketManager {
195+
public func setCurrentReconnect(currentReconnect: Int) {
196+
self.currentReconnectAttempt = currentReconnect
197+
}
198+
157199
public override func disconnect() {
158200
setTestStatus(.disconnected)
159201
}

Tests/TestSocketIO/SocketSideEffectTest.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ class TestEngine: SocketEngineSpec {
487487
private(set) var ws: WebSocket? = nil
488488
private(set) var version = SocketIOVersion.three
489489

490-
fileprivate var onConnect: (() -> ())?
490+
internal var onConnect: (() -> ())?
491491

492492
required init(client: SocketEngineClient, url: URL, options: [String: Any]?) {
493493
self.client = client

0 commit comments

Comments
 (0)