Skip to content

Commit 8a2bbb4

Browse files
authored
Fix rare crash in WebSocketClient when updating the engine (#3888)
1 parent 955f978 commit 8a2bbb4

File tree

3 files changed

+16
-5
lines changed

3 files changed

+16
-5
lines changed

Sources/StreamChat/WebSocketClient/WebSocketClient.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ class WebSocketClient {
121121
}
122122

123123
do {
124-
engine = try createEngineIfNeeded(for: endpoint)
124+
try engineQueue.sync {
125+
self.engine = try createEngineIfNeeded(for: endpoint)
126+
}
125127
} catch {
126128
return
127129
}

TestTools/StreamChatTestTools/SpyPattern/Spy/RequestEncoder_Spy.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ final class RequestEncoder_Spy: RequestEncoder, Spy {
1313

1414
weak var connectionDetailsProviderDelegate: ConnectionDetailsProviderDelegate?
1515

16-
var encodeRequest: Result<URLRequest, Error>? = .success(URLRequest(url: .unique()))
17-
var onEncodeRequestCall: (() -> Void)?
18-
var encodeRequest_endpoints: [AnyEndpoint] = []
19-
var encodeRequest_completion: ((Result<URLRequest, Error>) -> Void)?
16+
@Atomic var encodeRequest: Result<URLRequest, Error>? = .success(URLRequest(url: .unique()))
17+
@Atomic var onEncodeRequestCall: (() -> Void)?
18+
@Atomic var encodeRequest_endpoints: [AnyEndpoint] = []
19+
@Atomic var encodeRequest_completion: ((Result<URLRequest, Error>) -> Void)?
2020

2121
func encodeRequest<ResponsePayload>(
2222
for endpoint: Endpoint<ResponsePayload>,

Tests/StreamChatTests/WebSocketClient/WebSocketClient_Tests.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,15 @@ final class WebSocketClient_Tests: XCTestCase {
378378
self.webSocketClient.connectEndpoint = .webSocketConnect(userInfo: UserInfo(id: "user_\(index)"))
379379
})
380380
}
381+
382+
func test_recreatingEngineConcurrently() {
383+
DispatchQueue.concurrentPerform(iterations: 100, execute: { _ in
384+
self.webSocketClient.initialize()
385+
// Change mocked request so that connect recreates the engine
386+
requestEncoder.encodeRequest = .success(.init(url: .unique()))
387+
self.webSocketClient.connect()
388+
})
389+
}
381390

382391
// MARK: - Event handling tests
383392

0 commit comments

Comments
 (0)