11import Foundation
22import Functions
3+ import Get
34import GoTrue
45import PostgREST
56import Realtime
@@ -10,46 +11,44 @@ public class SupabaseClient {
1011 private let supabaseURL : URL
1112 private let supabaseKey : String
1213 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
1814
1915 /// Supabase Auth allows you to create and manage user sessions for access to data that is secured
2016 /// by access policies.
2117 public let auth : GoTrueClient
2218
2319 /// Supabase Storage allows you to manage user-generated content, such as photos or videos.
2420 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+ )
2826 }
2927
3028 /// Database client for Supabase.
3129 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,
3733 schema: schema,
38- http : self
34+ apiClientDelegate : self
3935 )
4036 }
4137
4238 /// 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+ }
4445
4546 /// Supabase Functions allows you to deploy and invoke edge functions.
4647 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
5352 )
5453 }
5554
@@ -60,8 +59,6 @@ public class SupabaseClient {
6059 /// - supabaseURL: Unique Supabase project url
6160 /// - supabaseKey: Supabase anonymous API Key
6261 /// - schema: Database schema name, defaults to `public`
63- /// - autoRefreshToken: Toggles whether `Supabase.auth` automatically refreshes auth tokens.
64- /// Defaults to `true`
6562 public init (
6663 supabaseURL: URL ,
6764 supabaseKey: String ,
@@ -72,83 +69,63 @@ public class SupabaseClient {
7269 self . supabaseKey = supabaseKey
7370 self . schema = schema
7471 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 " )
8072
8173 defaultHeaders = [
8274 " X-Client-Info " : " supabase-swift/ \( version) " ,
8375 " apikey " : supabaseKey,
8476 ]
8577
8678 auth = GoTrueClient (
87- url: authURL ,
79+ url: supabaseURL . appendingPathComponent ( " /auth/v1 " ) ,
8880 headers: defaultHeaders
8981 )
90- realtime = RealtimeClient ( endPoint: realtimeURL. absoluteString, params: defaultHeaders)
9182 }
9283
9384 public struct HTTPClient {
9485 let storage : StorageHTTPClient
95- let postgrest : PostgrestHTTPClient
96- let functions : FunctionsHTTPClient
9786
9887 public init (
99- storage: StorageHTTPClient ? = nil ,
100- postgrest: PostgrestHTTPClient ? = nil ,
101- functions: FunctionsHTTPClient ? = nil
88+ storage: StorageHTTPClient ? = nil
10289 ) {
10390 self . storage = storage ?? DefaultStorageHTTPClient ( )
104- self . postgrest = postgrest ?? DefaultPostgrestHTTPClient ( )
105- self . functions = functions ?? DefaultFunctionsHTTPClient ( )
10691 }
10792 }
10893
10994 private let httpClient : HTTPClient
11095}
11196
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+ }
115107
108+ extension SupabaseClient {
109+ func adapt( request: URLRequest ) async -> URLRequest {
116110 var request = request
117- if let accessToken = auth. session? . accessToken {
111+ if let accessToken = try ? await auth. session. accessToken {
118112 request. setValue ( " Bearer \( accessToken) " , forHTTPHeaderField: " Authorization " )
119113 }
120114 return request
121115 }
122116}
123117
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-
131118extension SupabaseClient: StorageHTTPClient {
132119 public func fetch( _ request: URLRequest) async throws -> ( Data , HTTPURLResponse ) {
133- let request = try await adapt ( request: request)
120+ let request = await adapt ( request: request)
134121 return try await httpClient. storage. fetch ( request)
135122 }
136123
137124 public func upload(
138125 _ request: URLRequest ,
139126 from data: Data
140127 ) async throws -> ( Data , HTTPURLResponse ) {
141- let request = try await adapt ( request: request)
128+ let request = await adapt ( request: request)
142129 return try await httpClient. storage. upload ( request, from: data)
143130 }
144131}
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