Skip to content

Fixed buid errors - #52 #53

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.5
// swift-tools-version:5.7
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription
Expand All @@ -19,14 +19,11 @@ let package = Package(
),
],
dependencies: [
.package(url: "https://github.com/supabase-community/gotrue-swift", from: "0.0.7"),
.package(url: "https://github.com/supabase-community/gotrue-swift", from: "0.1.0"),
.package(url: "https://github.com/supabase-community/storage-swift.git", branch: "main"),
.package(url: "https://github.com/supabase-community/realtime-swift.git", from: "0.0.1"),
.package(
url: "https://github.com/supabase-community/postgrest-swift",
branch: "master"
),
.package(url: "https://github.com/supabase-community/functions-swift", branch: "main"),
.package(url: "https://github.com/supabase-community/postgrest-swift", from: "1.0.0"),
.package(url: "https://github.com/supabase-community/functions-swift", from: "0.2.0"),
],
targets: [
.target(
Expand All @@ -37,6 +34,14 @@ let package = Package(
.product(name: "Realtime", package: "realtime-swift"),
.product(name: "PostgREST", package: "postgrest-swift"),
.product(name: "Functions", package: "functions-swift"),
],
swiftSettings: [
.unsafeFlags(
[
"-warn-concurrency",
"-enable-actor-data-race-checks",
]
)
]
),
]
Expand Down
97 changes: 37 additions & 60 deletions Sources/Supabase/SupabaseClient.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Foundation
import Functions
import Get
import GoTrue
import PostgREST
import Realtime
Expand All @@ -10,46 +11,44 @@ public class SupabaseClient {
private let supabaseURL: URL
private let supabaseKey: String
private let schema: String
private let restURL: URL
private let realtimeURL: URL
private let authURL: URL
private let storageURL: URL
private let functionsURL: URL

/// Supabase Auth allows you to create and manage user sessions for access to data that is secured
/// by access policies.
public let auth: GoTrueClient

/// Supabase Storage allows you to manage user-generated content, such as photos or videos.
public var storage: SupabaseStorageClient {
var headers: [String: String] = defaultHeaders
headers["Authorization"] = "Bearer \(auth.session?.accessToken ?? supabaseKey)"
return SupabaseStorageClient(url: storageURL.absoluteString, headers: headers, http: self)
SupabaseStorageClient(
url: supabaseURL.appendingPathComponent("/storage/v1").absoluteString,
headers: defaultHeaders,
http: self
)
}

/// Database client for Supabase.
public var database: PostgrestClient {
var headers: [String: String] = defaultHeaders
headers["Authorization"] = "Bearer \(auth.session?.accessToken ?? supabaseKey)"
return PostgrestClient(
url: restURL.absoluteString,
headers: headers,
PostgrestClient(
url: supabaseURL.appendingPathComponent("/rest/v1"),
headers: defaultHeaders,
schema: schema,
http: self
apiClientDelegate: self
)
}

/// Realtime client for Supabase
public var realtime: RealtimeClient
public var realtime: RealtimeClient {
RealtimeClient(
endPoint: supabaseURL.appendingPathComponent("/realtime/v1").absoluteString,
params: defaultHeaders
)
}

/// Supabase Functions allows you to deploy and invoke edge functions.
public var functions: FunctionsClient {
var headers: [String: String] = defaultHeaders
headers["Authorization"] = "Bearer \(auth.session?.accessToken ?? supabaseKey)"
return FunctionsClient(
url: functionsURL,
headers: headers,
http: self
FunctionsClient(
url: supabaseURL.appendingPathComponent("/functions/v1"),
headers: defaultHeaders,
apiClientDelegate: self
)
}

Expand All @@ -60,8 +59,6 @@ public class SupabaseClient {
/// - supabaseURL: Unique Supabase project url
/// - supabaseKey: Supabase anonymous API Key
/// - schema: Database schema name, defaults to `public`
/// - autoRefreshToken: Toggles whether `Supabase.auth` automatically refreshes auth tokens.
/// Defaults to `true`
public init(
supabaseURL: URL,
supabaseKey: String,
Expand All @@ -72,83 +69,63 @@ public class SupabaseClient {
self.supabaseKey = supabaseKey
self.schema = schema
self.httpClient = httpClient
restURL = supabaseURL.appendingPathComponent("/rest/v1")
realtimeURL = supabaseURL.appendingPathComponent("/realtime/v1")
authURL = supabaseURL.appendingPathComponent("/auth/v1")
storageURL = supabaseURL.appendingPathComponent("/storage/v1")
functionsURL = supabaseURL.appendingPathComponent("/functions/v1")

defaultHeaders = [
"X-Client-Info": "supabase-swift/\(version)",
"apikey": supabaseKey,
]

auth = GoTrueClient(
url: authURL,
url: supabaseURL.appendingPathComponent("/auth/v1"),
headers: defaultHeaders
)
realtime = RealtimeClient(endPoint: realtimeURL.absoluteString, params: defaultHeaders)
}

public struct HTTPClient {
let storage: StorageHTTPClient
let postgrest: PostgrestHTTPClient
let functions: FunctionsHTTPClient

public init(
storage: StorageHTTPClient? = nil,
postgrest: PostgrestHTTPClient? = nil,
functions: FunctionsHTTPClient? = nil
storage: StorageHTTPClient? = nil
) {
self.storage = storage ?? DefaultStorageHTTPClient()
self.postgrest = postgrest ?? DefaultPostgrestHTTPClient()
self.functions = functions ?? DefaultFunctionsHTTPClient()
}
}

private let httpClient: HTTPClient
}

extension SupabaseClient {
func adapt(request: URLRequest) async throws -> URLRequest {
try? await auth.refreshCurrentSessionIfNeeded()
extension SupabaseClient: APIClientDelegate {
public func client(_: APIClient, willSendRequest request: inout URLRequest) async throws {
if let session = try? await auth.session {
request.setValue(
"\(session.tokenType) \(session.accessToken)",
forHTTPHeaderField: "Authorization"
)
}
}
}

extension SupabaseClient {
func adapt(request: URLRequest) async -> URLRequest {
var request = request
if let accessToken = auth.session?.accessToken {
if let accessToken = try? await auth.session.accessToken {
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
}
return request
}
}

extension SupabaseClient: PostgrestHTTPClient {
public func execute(_ request: URLRequest) async throws -> (Data, HTTPURLResponse) {
let request = try await adapt(request: request)
return try await httpClient.postgrest.execute(request)
}
}

extension SupabaseClient: StorageHTTPClient {
public func fetch(_ request: URLRequest) async throws -> (Data, HTTPURLResponse) {
let request = try await adapt(request: request)
let request = await adapt(request: request)
return try await httpClient.storage.fetch(request)
}

public func upload(
_ request: URLRequest,
from data: Data
) async throws -> (Data, HTTPURLResponse) {
let request = try await adapt(request: request)
let request = await adapt(request: request)
return try await httpClient.storage.upload(request, from: data)
}
}

extension SupabaseClient: FunctionsHTTPClient {
public func execute(
_ request: URLRequest,
client: FunctionsClient
) async throws -> (Data, HTTPURLResponse) {
let request = try await adapt(request: request)
return try await httpClient.functions.execute(request, client: client)
}
}