@@ -10,6 +10,41 @@ import OpenAPIURLSession
10
10
11
11
let version = Helpers . version
12
12
13
+ /// A ClientTransport implementation that adapts the old Fetch api.
14
+ struct FetchTransportAdapter : ClientTransport {
15
+ let fetch : FunctionsClient . FetchHandler
16
+
17
+ init ( fetch: @escaping FunctionsClient . FetchHandler ) {
18
+ self . fetch = fetch
19
+ }
20
+
21
+ func send(
22
+ _ request: HTTPTypes . HTTPRequest ,
23
+ body: HTTPBody ? ,
24
+ baseURL: URL ,
25
+ operationID: String
26
+ ) async throws -> ( HTTPTypes . HTTPResponse , HTTPBody ? ) {
27
+ guard var urlRequest = URLRequest ( httpRequest: request) else {
28
+ throw URLError ( . badURL)
29
+ }
30
+
31
+ if let body {
32
+ urlRequest. httpBody = try await Data ( collecting: body, upTo: . max)
33
+ }
34
+
35
+ let ( data, response) = try await fetch ( urlRequest)
36
+
37
+ guard let httpURLResponse = response as? HTTPURLResponse ,
38
+ let httpResponse = httpURLResponse. httpResponse
39
+ else {
40
+ throw URLError ( . badServerResponse)
41
+ }
42
+
43
+ let body = HTTPBody ( data)
44
+ return ( httpResponse, body)
45
+ }
46
+ }
47
+
13
48
/// An actor representing a client for invoking functions.
14
49
public final class FunctionsClient : Sendable {
15
50
/// Fetch handler used to make requests.
@@ -34,9 +69,7 @@ public final class FunctionsClient: Sendable {
34
69
}
35
70
36
71
private let client : Client
37
- private let http : any HTTPClientType
38
72
private let mutableState = LockIsolated ( MutableState ( ) )
39
- private let sessionConfiguration : URLSessionConfiguration
40
73
41
74
var headers : HTTPFields {
42
75
mutableState. headers
@@ -50,62 +83,51 @@ public final class FunctionsClient: Sendable {
50
83
/// - region: The Region to invoke the functions in.
51
84
/// - logger: SupabaseLogger instance to use.
52
85
/// - fetch: The fetch handler used to make requests. (Default: URLSession.shared.data(for:))
86
+ @available ( * , deprecated, message: " Fetch handler is deprecated, use init with `transport` instead. " )
53
87
@_disfavoredOverload
54
88
public convenience init (
55
89
url: URL ,
56
90
headers: [ String : String ] = [ : ] ,
57
91
region: String ? = nil ,
58
92
logger: ( any SupabaseLogger ) ? = nil ,
59
- fetch: @escaping FetchHandler = { try await URLSession . shared . data ( for : $0 ) }
93
+ fetch: @escaping FetchHandler
60
94
) {
61
95
self . init (
62
96
url: url,
63
97
headers: headers,
64
98
region: region,
65
99
logger: logger,
66
- fetch: fetch,
67
- sessionConfiguration: . default
100
+ client: Client ( serverURL: url, transport: FetchTransportAdapter ( fetch: fetch) )
68
101
)
69
102
}
70
103
71
- convenience init (
104
+ @_disfavoredOverload
105
+ public convenience init (
72
106
url: URL ,
73
107
headers: [ String : String ] = [ : ] ,
74
108
region: String ? = nil ,
75
109
logger: ( any SupabaseLogger ) ? = nil ,
76
- fetch: @escaping FetchHandler = { try await URLSession . shared. data ( for: $0) } ,
77
- sessionConfiguration: URLSessionConfiguration
110
+ transport: ( any ClientTransport ) ? = nil
78
111
) {
79
- var interceptors : [ any HTTPClientInterceptor ] = [ ]
80
- if let logger {
81
- interceptors. append ( LoggerInterceptor ( logger: logger) )
82
- }
83
-
84
- let http = HTTPClient ( fetch: fetch, interceptors: interceptors)
85
-
86
112
self . init (
87
113
url: url,
88
114
headers: headers,
89
115
region: region,
90
- http: http,
91
- client: Client ( serverURL: url, transport: URLSessionTransport ( ) ) ,
92
- sessionConfiguration: sessionConfiguration
116
+ logger: logger,
117
+ client: Client ( serverURL: url, transport: transport ?? URLSessionTransport ( ) )
93
118
)
94
119
}
95
120
96
121
init (
97
122
url: URL ,
98
- headers: [ String : String ] ,
99
- region: String ? ,
100
- http: any HTTPClientType ,
101
- client: Client ,
102
- sessionConfiguration: URLSessionConfiguration = . default
123
+ headers: [ String : String ] = [ : ] ,
124
+ region: String ? = nil ,
125
+ logger: ( any SupabaseLogger ) ? = nil ,
126
+ client: Client
103
127
) {
104
128
self . url = url
105
129
self . region = region
106
- self . http = http
107
130
self . client = client
108
- self . sessionConfiguration = sessionConfiguration
109
131
110
132
mutableState. withValue {
111
133
$0. headers = HTTPFields ( headers)
@@ -123,14 +145,38 @@ public final class FunctionsClient: Sendable {
123
145
/// - region: The Region to invoke the functions in.
124
146
/// - logger: SupabaseLogger instance to use.
125
147
/// - fetch: The fetch handler used to make requests. (Default: URLSession.shared.data(for:))
148
+
149
+ @available ( * , deprecated, message: " Fetch handler is deprecated, use init with `transport` instead. " )
150
+ public convenience init (
151
+ url: URL ,
152
+ headers: [ String : String ] = [ : ] ,
153
+ region: FunctionRegion ? = nil ,
154
+ logger: ( any SupabaseLogger ) ? = nil ,
155
+ fetch: @escaping FetchHandler
156
+ ) {
157
+ self . init (
158
+ url: url,
159
+ headers: headers,
160
+ region: region? . rawValue,
161
+ logger: logger,
162
+ fetch: fetch
163
+ )
164
+ }
165
+
126
166
public convenience init (
127
167
url: URL ,
128
168
headers: [ String : String ] = [ : ] ,
129
169
region: FunctionRegion ? = nil ,
130
170
logger: ( any SupabaseLogger ) ? = nil ,
131
- fetch : @escaping FetchHandler = { try await URLSession . shared . data ( for : $0 ) }
171
+ transport : ( any ClientTransport ) ? = nil
132
172
) {
133
- self . init ( url: url, headers: headers, region: region? . rawValue, logger: logger, fetch: fetch)
173
+ self . init (
174
+ url: url,
175
+ headers: headers,
176
+ region: region? . rawValue,
177
+ logger: logger,
178
+ transport: transport
179
+ )
134
180
}
135
181
136
182
/// Updates the authorization header.
0 commit comments