1
1
import Foundation
2
2
import Functions
3
+ import Get
3
4
import GoTrue
4
5
import PostgREST
5
6
import Realtime
@@ -10,46 +11,44 @@ public class SupabaseClient {
10
11
private let supabaseURL : URL
11
12
private let supabaseKey : String
12
13
private let schema : String
13
- private let restURL : URL
14
- private let realtimeURL : URL
15
- private let authURL : URL
16
- private let storageURL : URL
17
- private let functionsURL : URL
18
14
19
15
/// Supabase Auth allows you to create and manage user sessions for access to data that is secured
20
16
/// by access policies.
21
17
public let auth : GoTrueClient
22
18
23
19
/// Supabase Storage allows you to manage user-generated content, such as photos or videos.
24
20
public var storage : SupabaseStorageClient {
25
- var headers : [ String : String ] = defaultHeaders
26
- headers [ " Authorization " ] = " Bearer \( auth. session? . accessToken ?? supabaseKey) "
27
- return SupabaseStorageClient ( url: storageURL. absoluteString, headers: headers, http: self )
21
+ SupabaseStorageClient (
22
+ url: supabaseURL. appendingPathComponent ( " /storage/v1 " ) . absoluteString,
23
+ headers: defaultHeaders,
24
+ http: self
25
+ )
28
26
}
29
27
30
28
/// Database client for Supabase.
31
29
public var database : PostgrestClient {
32
- var headers : [ String : String ] = defaultHeaders
33
- headers [ " Authorization " ] = " Bearer \( auth. session? . accessToken ?? supabaseKey) "
34
- return PostgrestClient (
35
- url: restURL. absoluteString,
36
- headers: headers,
30
+ PostgrestClient (
31
+ url: supabaseURL. appendingPathComponent ( " /rest/v1 " ) ,
32
+ headers: defaultHeaders,
37
33
schema: schema,
38
- http : self
34
+ apiClientDelegate : self
39
35
)
40
36
}
41
37
42
38
/// Realtime client for Supabase
43
- public var realtime : RealtimeClient
39
+ public var realtime : RealtimeClient {
40
+ RealtimeClient (
41
+ endPoint: supabaseURL. appendingPathComponent ( " /realtime/v1 " ) . absoluteString,
42
+ params: defaultHeaders
43
+ )
44
+ }
44
45
45
46
/// Supabase Functions allows you to deploy and invoke edge functions.
46
47
public var functions : FunctionsClient {
47
- var headers : [ String : String ] = defaultHeaders
48
- headers [ " Authorization " ] = " Bearer \( auth. session? . accessToken ?? supabaseKey) "
49
- return FunctionsClient (
50
- url: functionsURL,
51
- headers: headers,
52
- http: self
48
+ FunctionsClient (
49
+ url: supabaseURL. appendingPathComponent ( " /functions/v1 " ) ,
50
+ headers: defaultHeaders,
51
+ apiClientDelegate: self
53
52
)
54
53
}
55
54
@@ -60,8 +59,6 @@ public class SupabaseClient {
60
59
/// - supabaseURL: Unique Supabase project url
61
60
/// - supabaseKey: Supabase anonymous API Key
62
61
/// - schema: Database schema name, defaults to `public`
63
- /// - autoRefreshToken: Toggles whether `Supabase.auth` automatically refreshes auth tokens.
64
- /// Defaults to `true`
65
62
public init (
66
63
supabaseURL: URL ,
67
64
supabaseKey: String ,
@@ -72,83 +69,63 @@ public class SupabaseClient {
72
69
self . supabaseKey = supabaseKey
73
70
self . schema = schema
74
71
self . httpClient = httpClient
75
- restURL = supabaseURL. appendingPathComponent ( " /rest/v1 " )
76
- realtimeURL = supabaseURL. appendingPathComponent ( " /realtime/v1 " )
77
- authURL = supabaseURL. appendingPathComponent ( " /auth/v1 " )
78
- storageURL = supabaseURL. appendingPathComponent ( " /storage/v1 " )
79
- functionsURL = supabaseURL. appendingPathComponent ( " /functions/v1 " )
80
72
81
73
defaultHeaders = [
82
74
" X-Client-Info " : " supabase-swift/ \( version) " ,
83
75
" apikey " : supabaseKey,
84
76
]
85
77
86
78
auth = GoTrueClient (
87
- url: authURL ,
79
+ url: supabaseURL . appendingPathComponent ( " /auth/v1 " ) ,
88
80
headers: defaultHeaders
89
81
)
90
- realtime = RealtimeClient ( endPoint: realtimeURL. absoluteString, params: defaultHeaders)
91
82
}
92
83
93
84
public struct HTTPClient {
94
85
let storage : StorageHTTPClient
95
- let postgrest : PostgrestHTTPClient
96
- let functions : FunctionsHTTPClient
97
86
98
87
public init (
99
- storage: StorageHTTPClient ? = nil ,
100
- postgrest: PostgrestHTTPClient ? = nil ,
101
- functions: FunctionsHTTPClient ? = nil
88
+ storage: StorageHTTPClient ? = nil
102
89
) {
103
90
self . storage = storage ?? DefaultStorageHTTPClient ( )
104
- self . postgrest = postgrest ?? DefaultPostgrestHTTPClient ( )
105
- self . functions = functions ?? DefaultFunctionsHTTPClient ( )
106
91
}
107
92
}
108
93
109
94
private let httpClient : HTTPClient
110
95
}
111
96
112
- extension SupabaseClient {
113
- func adapt( request: URLRequest ) async throws -> URLRequest {
114
- try ? await auth. refreshCurrentSessionIfNeeded ( )
97
+ extension SupabaseClient : APIClientDelegate {
98
+ public func client( _: APIClient , willSendRequest request: inout URLRequest ) async throws {
99
+ if let session = try ? await auth. session {
100
+ request. setValue (
101
+ " \( session. tokenType) \( session. accessToken) " ,
102
+ forHTTPHeaderField: " Authorization "
103
+ )
104
+ }
105
+ }
106
+ }
115
107
108
+ extension SupabaseClient {
109
+ func adapt( request: URLRequest ) async -> URLRequest {
116
110
var request = request
117
- if let accessToken = auth. session? . accessToken {
111
+ if let accessToken = try ? await auth. session. accessToken {
118
112
request. setValue ( " Bearer \( accessToken) " , forHTTPHeaderField: " Authorization " )
119
113
}
120
114
return request
121
115
}
122
116
}
123
117
124
- extension SupabaseClient : PostgrestHTTPClient {
125
- public func execute( _ request: URLRequest ) async throws -> ( Data , HTTPURLResponse ) {
126
- let request = try await adapt ( request: request)
127
- return try await httpClient. postgrest. execute ( request)
128
- }
129
- }
130
-
131
118
extension SupabaseClient: StorageHTTPClient {
132
119
public func fetch( _ request: URLRequest) async throws -> ( Data , HTTPURLResponse ) {
133
- let request = try await adapt ( request: request)
120
+ let request = await adapt ( request: request)
134
121
return try await httpClient. storage. fetch ( request)
135
122
}
136
123
137
124
public func upload(
138
125
_ request: URLRequest ,
139
126
from data: Data
140
127
) async throws -> ( Data , HTTPURLResponse ) {
141
- let request = try await adapt ( request: request)
128
+ let request = await adapt ( request: request)
142
129
return try await httpClient. storage. upload ( request, from: data)
143
130
}
144
131
}
145
-
146
- extension SupabaseClient : FunctionsHTTPClient {
147
- public func execute(
148
- _ request: URLRequest ,
149
- client: FunctionsClient
150
- ) async throws -> ( Data , HTTPURLResponse ) {
151
- let request = try await adapt ( request: request)
152
- return try await httpClient. functions. execute ( request, client: client)
153
- }
154
- }
0 commit comments