Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions Sources/StreamCore/WebSocket/Client/WebSocketClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,14 @@

public weak var connectionStateDelegate: ConnectionStateDelegate?

public var connectRequest: URLRequest?
public var connectRequest: URLRequest? {
get { _connectRequest.value }
set { _connectRequest.value = newValue }
}

private let _connectRequest = AllocatedUnfairLock<URLRequest?>(nil)

Check warning on line 43 in Sources/StreamCore/WebSocket/Client/WebSocketClient.swift

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this constant "_connectRequest" to match the regular expression ^[a-z][a-zA-Z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-core-swift&issues=AZrfkGz55rruRdmgIJKS&open=AZrfkGz55rruRdmgIJKS&pullRequest=42

var requiresAuth: Bool
let requiresAuth: Bool
/// If true, health check event is processed by the event notification center before setting connection status to connected, otherwise the order is reversed.
/// Compatibility reasons for chat which has to set it to true.
let healthCheckBeforeConnected: Bool
Expand Down Expand Up @@ -89,7 +94,7 @@
self.sessionConfiguration = sessionConfiguration
self.webSocketClientType = webSocketClientType
self.eventDecoder = eventDecoder
self.connectRequest = connectRequest
self._connectRequest.value = connectRequest
self.eventNotificationCenter = eventNotificationCenter
self.healthCheckBeforeConnected = healthCheckBeforeConnected
self.requiresAuth = requiresAuth
Expand Down Expand Up @@ -123,7 +128,9 @@
}

guard let connectRequest else { return }
engine = createEngineIfNeeded(for: connectRequest)
engineQueue.sync {
engine = createEngineIfNeeded(for: connectRequest)
}

connectionState = .connecting

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import Foundation
import XCTest

final class WebSocketPingController_Mock: WebSocketPingController, @unchecked Sendable {
var connectionStateDidChange_connectionStates: [WebSocketConnectionState] = []
var pongReceivedCount = 0
@Atomic var connectionStateDidChange_connectionStates: [WebSocketConnectionState] = []
@Atomic var pongReceivedCount = 0

override func connectionStateDidChange(_ connectionState: WebSocketConnectionState) {
connectionStateDidChange_connectionStates.append(connectionState)
_connectionStateDidChange_connectionStates.mutate { $0.append(connectionState) }
super.connectionStateDidChange(connectionState)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,15 @@ final class WebSocketClient_Tests: XCTestCase, @unchecked Sendable {
// Assert completion called
wait(for: [expectation], timeout: defaultTimeout)
}

func test_recreatingEngineConcurrently() {
DispatchQueue.concurrentPerform(iterations: 10000, execute: { _ in
guard let url = URL(string: "ws:///\(String.unique)") else { return }
self.webSocketClient.connectRequest = URLRequest(url: url)
self.webSocketClient.initialize()
self.webSocketClient.connect()
})
}
}

private final class HealthCheckEvent: @unchecked Sendable, Event, Codable, Hashable {
Expand Down