@@ -7,6 +7,8 @@ internal import OSLog
77/// An Automerge-repo network provider that connects to other repositories using WebSocket.
88@AutomergeRepo
99public 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