Skip to content

Commit b9f167d

Browse files
authored
WebSocketProvider accepts an URLRequest to connect (#122)
1 parent e8847e2 commit b9f167d

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

Sources/AutomergeRepo/Networking/Providers/WebSocketProvider.swift

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ internal import OSLog
77
/// An Automerge-repo network provider that connects to other repositories using WebSocket.
88
@AutomergeRepo
99
public final class WebSocketProvider: NetworkProvider {
10+
public typealias NetworkConnectionEndpoint = URL
11+
1012
/// The name of this provider.
1113
public let name = "WebSocket"
1214

@@ -22,7 +24,7 @@ public final class WebSocketProvider: NetworkProvider {
2224
var ongoingReceiveMessageTask: Task<Void, any Error>?
2325
var config: WebSocketProviderConfiguration
2426
// reconnection logic variables
25-
var endpoint: URL?
27+
var endpoint: URLRequest?
2628
var peered: Bool
2729

2830
private let _statePublisher: CurrentValueSubject<WebSocketProviderState, Never> =
@@ -49,7 +51,16 @@ public final class WebSocketProvider: NetworkProvider {
4951
}
5052

5153
/// Initiate an outgoing connection.
54+
///
55+
/// Create a default `URLRequest` and create a WebSocket connection with it.
5256
public func connect(to url: URL) async throws {
57+
try await connect(to: URLRequest(url: url))
58+
}
59+
60+
/// Initiate an outgoing connection.
61+
///
62+
/// Create a WebSocket connection with the provided `URLRequest`.
63+
public func connect(to request: URLRequest) async throws {
5364
if peered {
5465
Logger.websocket.error("Attempting to connect while already peered")
5566
throw Errors.NetworkProviderError(msg: "Attempting to connect while already peered")
@@ -60,13 +71,13 @@ public final class WebSocketProvider: NetworkProvider {
6071
throw Errors.NetworkProviderError(msg: "Attempting to connect before connected to a delegate")
6172
}
6273

63-
if try await attemptConnect(to: url) {
64-
if config.logLevel.canTrace() {
74+
if try await attemptConnect(to: request) {
75+
if config.logLevel.canTrace(), let url = request.url {
6576
Logger.websocket.trace("WEBSOCKET: connected to \(url)")
6677
}
67-
endpoint = url
78+
endpoint = request
6879
} else {
69-
if config.logLevel.canTrace() {
80+
if config.logLevel.canTrace(), let url = request.url {
7081
Logger.websocket.trace("WEBSOCKET: failed to connect to \(url)")
7182
}
7283
return
@@ -200,15 +211,16 @@ public final class WebSocketProvider: NetworkProvider {
200211
}
201212

202213
// Returns a `true` on success OR throws an error (log the error, but can retry)
203-
func attemptConnect(to url: URL?) async throws -> Bool {
214+
private func attemptConnect(to request: URLRequest?) async throws -> Bool {
204215
precondition(peered == false)
205-
guard let url,
216+
guard let request,
217+
let url = request.url,
206218
let peerId,
207219
let delegate
208220
else {
209221
if config.logLevel.canTrace() {
210222
Logger.websocket.trace("Pre-requisites not available for attemptConnect, returning nil")
211-
Logger.websocket.trace("URL: \(String(describing: url))")
223+
Logger.websocket.trace("URL: \(String(describing: request?.url))")
212224
Logger.websocket.trace("PeerID: \(String(describing: self.peerId))")
213225
Logger.websocket.trace("Delegate: \(String(describing: self.delegate))")
214226
}
@@ -217,7 +229,6 @@ public final class WebSocketProvider: NetworkProvider {
217229

218230
// establish the WebSocket connection
219231

220-
let request = URLRequest(url: url)
221232
let webSocketTask = URLSession.shared.webSocketTask(with: request)
222233
if config.logLevel.canTrace() {
223234
Logger.websocket.trace("WEBSOCKET: Activating websocket to \(url, privacy: .public)")
@@ -258,7 +269,7 @@ public final class WebSocketProvider: NetworkProvider {
258269
peeredConnections = [peerConnectionDetails]
259270
// these need to be set _before_ we send the delegate message that we're
260271
// peered, because that process in turn (can trigger/triggers) a sync
261-
endpoint = url
272+
endpoint = request
262273
self.webSocketTask = webSocketTask
263274

264275
await delegate.receiveEvent(event: .ready(payload: peerConnectionDetails))

0 commit comments

Comments
 (0)