11import Foundation
22@_exported import Functions
3- import Get
43@_exported import GoTrue
54@_exported import PostgREST
65@_exported import Realtime
76@_exported import SupabaseStorage
87
98/// Supabase Client.
109public class SupabaseClient {
10+ let options : SupabaseClientOptions
1111 let supabaseURL : URL
1212 let supabaseKey : String
1313 let storageURL : URL
@@ -16,28 +16,36 @@ public class SupabaseClient {
1616 let authURL : URL
1717 let functionsURL : URL
1818
19- let schema : String
20-
2119 /// Supabase Auth allows you to create and manage user sessions for access to data that is secured
2220 /// by access policies.
23- public let auth : GoTrueClient
21+ public var auth : GoTrueClient {
22+ GoTrueClient (
23+ url: authURL,
24+ headers: defaultHeaders,
25+ localStorage: options. auth. storage,
26+ fetch: fetch
27+ )
28+ }
2429
2530 /// Supabase Storage allows you to manage user-generated content, such as photos or videos.
2631 public var storage : SupabaseStorageClient {
2732 SupabaseStorageClient (
2833 url: storageURL. absoluteString,
2934 headers: defaultHeaders,
30- http: self
35+ session: StorageHTTPSession (
36+ fetch: fetch,
37+ upload: upload
38+ )
3139 )
3240 }
3341
3442 /// Database client for Supabase.
3543 public var database : PostgrestClient {
3644 PostgrestClient (
3745 url: databaseURL,
46+ schema: options. db. schema,
3847 headers: defaultHeaders,
39- schema: schema,
40- apiClientDelegate: self
48+ fetch: fetch
4149 )
4250 }
4351
@@ -54,11 +62,14 @@ public class SupabaseClient {
5462 FunctionsClient (
5563 url: functionsURL,
5664 headers: defaultHeaders,
57- apiClientDelegate : self
65+ fetch : fetch
5866 )
5967 }
6068
6169 private( set) var defaultHeaders : [ String : String ]
70+ private var session : URLSession {
71+ options. global. session
72+ }
6273
6374 /// Create a new client.
6475 public init (
@@ -73,63 +84,33 @@ public class SupabaseClient {
7384 databaseURL = supabaseURL. appendingPathComponent ( " /rest/v1 " )
7485 realtimeURL = supabaseURL. appendingPathComponent ( " /realtime/v1 " )
7586 functionsURL = supabaseURL. appendingPathComponent ( " /functions/v1 " )
76-
77- schema = options. db. schema
78- httpClient = options. global. httpClient
87+ self . options = options
7988
8089 defaultHeaders = [
8190 " X-Client-Info " : " supabase-swift/ \( version) " ,
8291 " Authorization " : " Bearer \( supabaseKey) " ,
8392 " apikey " : supabaseKey,
8493 ] . merging ( options. global. headers) { _, new in new }
85-
86- auth = GoTrueClient (
87- url: authURL,
88- headers: defaultHeaders,
89- localStorage: options. auth. storage
90- )
9194 }
9295
93- public struct HTTPClient {
94- let storage : StorageHTTPClient
95-
96- public init (
97- storage: StorageHTTPClient ? = nil
98- ) {
99- self . storage = storage ?? DefaultStorageHTTPClient ( )
100- }
96+ @Sendable
97+ private func fetch( _ request: URLRequest ) async throws -> ( Data , URLResponse ) {
98+ try await session. data ( for: adapt ( request: request) )
10199 }
102100
103- private let httpClient : HTTPClient
104- }
105-
106- extension SupabaseClient : APIClientDelegate {
107- public func client ( _ : APIClient , willSendRequest request : inout URLRequest ) async throws {
108- request = await adapt ( request: request)
101+ @ Sendable
102+ private func upload (
103+ _ request : URLRequest ,
104+ from data : Data
105+ ) async throws -> ( Data , URLResponse ) {
106+ try await session . upload ( for : adapt ( request: request) , from : data )
109107 }
110- }
111108
112- extension SupabaseClient {
113- func adapt( request: URLRequest ) async -> URLRequest {
109+ private func adapt( request: URLRequest ) async -> URLRequest {
114110 var request = request
115111 if let accessToken = try ? await auth. session. accessToken {
116112 request. setValue ( " Bearer \( accessToken) " , forHTTPHeaderField: " Authorization " )
117113 }
118114 return request
119115 }
120116}
121-
122- extension SupabaseClient: StorageHTTPClient {
123- public func fetch( _ request: URLRequest) async throws -> ( Data , HTTPURLResponse ) {
124- let request = await adapt ( request: request)
125- return try await httpClient. storage. fetch ( request)
126- }
127-
128- public func upload(
129- _ request: URLRequest ,
130- from data: Data
131- ) async throws -> ( Data , HTTPURLResponse ) {
132- let request = await adapt ( request: request)
133- return try await httpClient. storage. upload ( request, from: data)
134- }
135- }
0 commit comments