Skip to content

Commit b691653

Browse files
committed
feat: migrate from SupabaseLogger to swift-log
BREAKING CHANGE: Drop SupabaseLogger in favor of swift-log dependency - Add swift-log dependency to Package.swift - Replace SupabaseLogger protocol with Logger typealias from swift-log - Update all modules to use swift-log Logger interface - Remove old SupabaseLogMessage and SupabaseLogLevel types - Update configuration types to use Logger instead of SupabaseLogger - Remove SupabaseLoggerTaskLocal usage from SessionManager - Simplify OSLogSupabaseLogger (placeholder for future OSLog integration) - Remove AuthClientLoggerDecorator (will be reimplemented later) This migration standardizes logging across the Swift ecosystem and provides better integration with Swift logging tools and frameworks. Migration Guide: - Replace any SupabaseLogger usage with Logger from swift-log - Update logging calls to use swift-log's standard interface - Configure swift-log handlers as needed for your application
1 parent b3a5024 commit b691653

18 files changed

+145
-259
lines changed

Package.resolved

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ let package = Package(
2626
dependencies: [
2727
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.9.0"),
2828
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0"..<"4.0.0"),
29+
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
2930
.package(url: "https://github.com/pointfreeco/swift-clocks", from: "1.0.0"),
3031
.package(url: "https://github.com/pointfreeco/swift-concurrency-extras", from: "1.1.0"),
3132
.package(url: "https://github.com/pointfreeco/swift-custom-dump", from: "1.3.2"),
@@ -40,6 +41,7 @@ let package = Package(
4041
.product(name: "Alamofire", package: "Alamofire"),
4142
.product(name: "ConcurrencyExtras", package: "swift-concurrency-extras"),
4243
.product(name: "Clocks", package: "swift-clocks"),
44+
.product(name: "Logging", package: "swift-log"),
4345
.product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay"),
4446
]
4547
),
@@ -55,6 +57,7 @@ let package = Package(
5557
dependencies: [
5658
.product(name: "ConcurrencyExtras", package: "swift-concurrency-extras"),
5759
.product(name: "Crypto", package: "swift-crypto"),
60+
.product(name: "Logging", package: "swift-log"),
5861
"Helpers",
5962
]
6063
),

Sources/Auth/AuthClient.swift

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Alamofire
22
import ConcurrencyExtras
33
import Foundation
4+
import Logging
45

56
#if canImport(AuthenticationServices)
67
import AuthenticationServices
@@ -20,16 +21,7 @@ import Foundation
2021

2122
typealias AuthClientID = Int
2223

23-
struct AuthClientLoggerDecorator: SupabaseLogger {
24-
let clientID: AuthClientID
25-
let decoratee: any SupabaseLogger
26-
27-
func log(message: SupabaseLogMessage) {
28-
var message = message
29-
message.additionalContext["client_id"] = .integer(clientID)
30-
decoratee.log(message: message)
31-
}
32-
}
24+
// Note: AuthClientLoggerDecorator removed for now - will be reimplemented in a future update
3325

3426
public actor AuthClient {
3527
private static let globalClientID = LockIsolated(0)
@@ -48,7 +40,7 @@ public actor AuthClient {
4840
nonisolated private var eventEmitter: AuthStateChangeEventEmitter {
4941
Dependencies[clientID].eventEmitter
5042
}
51-
nonisolated private var logger: (any SupabaseLogger)? {
43+
nonisolated private var logger: SupabaseLogger? {
5244
Dependencies[clientID].configuration.logger
5345
}
5446
nonisolated private var sessionStorage: SessionStorage { Dependencies[clientID].sessionStorage }
@@ -119,9 +111,7 @@ public actor AuthClient {
119111
codeVerifierStorage: .live(clientID: clientID),
120112
sessionStorage: .live(clientID: clientID),
121113
sessionManager: .live(clientID: clientID),
122-
logger: configuration.logger.map {
123-
AuthClientLoggerDecorator(clientID: clientID, decoratee: $0)
124-
}
114+
logger: configuration.logger
125115
)
126116

127117
Task { @MainActor in observeAppLifecycleChanges() }

Sources/Auth/AuthClientConfiguration.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ extension AuthClient {
3737
public let localStorage: any AuthLocalStorage
3838

3939
/// Custom SupabaseLogger implementation used to inspecting log messages from the Auth library.
40-
public let logger: (any SupabaseLogger)?
40+
public let logger: SupabaseLogger?
4141
public let encoder: JSONEncoder
4242
public let decoder: JSONDecoder
4343

@@ -68,7 +68,7 @@ extension AuthClient {
6868
redirectToURL: URL? = nil,
6969
storageKey: String? = nil,
7070
localStorage: any AuthLocalStorage,
71-
logger: (any SupabaseLogger)? = nil,
71+
logger: SupabaseLogger? = nil,
7272
encoder: JSONEncoder = AuthClient.Configuration.jsonEncoder,
7373
decoder: JSONDecoder = AuthClient.Configuration.jsonDecoder,
7474
session: Alamofire.Session = .default,
@@ -111,7 +111,7 @@ extension AuthClient {
111111
redirectToURL: URL? = nil,
112112
storageKey: String? = nil,
113113
localStorage: any AuthLocalStorage,
114-
logger: (any SupabaseLogger)? = nil,
114+
logger: SupabaseLogger? = nil,
115115
encoder: JSONEncoder = AuthClient.Configuration.jsonEncoder,
116116
decoder: JSONDecoder = AuthClient.Configuration.jsonDecoder,
117117
session: Alamofire.Session = .default,

Sources/Auth/Internal/Dependencies.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct Dependencies: Sendable {
1515

1616
var urlOpener: URLOpener = .live
1717
var pkce: PKCE = .live
18-
var logger: (any SupabaseLogger)?
18+
var logger: SupabaseLogger?
1919

2020
var encoder: JSONEncoder { configuration.encoder }
2121
var decoder: JSONDecoder { configuration.decoder }

Sources/Auth/Internal/EventEmitter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Foundation
33

44
struct AuthStateChangeEventEmitter {
55
var emitter = EventEmitter<(AuthChangeEvent, Session?)?>(initialEvent: nil, emitsLastEventWhenAttaching: false)
6-
var logger: (any SupabaseLogger)?
6+
var logger: SupabaseLogger?
77

88
func attach(_ listener: @escaping AuthStateChangeListener) -> ObservationToken {
99
emitter.attach { event in

Sources/Auth/Internal/SessionManager.swift

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private actor LiveSessionManager {
2828
private var configuration: AuthClient.Configuration { Dependencies[clientID].configuration }
2929
private var sessionStorage: SessionStorage { Dependencies[clientID].sessionStorage }
3030
private var eventEmitter: AuthStateChangeEventEmitter { Dependencies[clientID].eventEmitter }
31-
private var logger: (any SupabaseLogger)? { Dependencies[clientID].logger }
31+
private var logger: SupabaseLogger? { Dependencies[clientID].logger }
3232
private var api: APIClient { Dependencies[clientID].api }
3333

3434
private var inFlightRefreshTask: Task<Session, any Error>?
@@ -57,43 +57,36 @@ private actor LiveSessionManager {
5757
}
5858

5959
func refreshSession(_ refreshToken: String) async throws -> Session {
60-
try await SupabaseLoggerTaskLocal.$additionalContext.withValue(
61-
merging: [
62-
"refresh_id": .string(UUID().uuidString),
63-
"refresh_token": .string(refreshToken),
64-
]
65-
) {
66-
try await trace(using: logger) {
67-
if let inFlightRefreshTask {
68-
logger?.debug("Refresh already in flight")
69-
return try await inFlightRefreshTask.value
70-
}
71-
72-
inFlightRefreshTask = Task {
73-
logger?.debug("Refresh task started")
60+
try await trace(using: logger) {
61+
if let inFlightRefreshTask {
62+
logger?.debug("Refresh already in flight")
63+
return try await inFlightRefreshTask.value
64+
}
7465

75-
defer {
76-
inFlightRefreshTask = nil
77-
logger?.debug("Refresh task ended")
78-
}
66+
inFlightRefreshTask = Task {
67+
logger?.debug("Refresh task started")
7968

80-
let session = try await api.execute(
81-
configuration.url.appendingPathComponent("token"),
82-
method: .post,
83-
query: ["grant_type": "refresh_token"],
84-
body: UserCredentials(refreshToken: refreshToken)
85-
)
86-
.serializingDecodable(Session.self, decoder: configuration.decoder)
87-
.value
69+
defer {
70+
inFlightRefreshTask = nil
71+
logger?.debug("Refresh task ended")
72+
}
8873

89-
update(session)
90-
eventEmitter.emit(.tokenRefreshed, session: session)
74+
let session = try await api.execute(
75+
configuration.url.appendingPathComponent("token"),
76+
method: .post,
77+
query: ["grant_type": "refresh_token"],
78+
body: UserCredentials(refreshToken: refreshToken)
79+
)
80+
.serializingDecodable(Session.self, decoder: configuration.decoder)
81+
.value
9182

92-
return session
93-
}
83+
update(session)
84+
eventEmitter.emit(.tokenRefreshed, session: session)
9485

95-
return try await inFlightRefreshTask!.value
86+
return session
9687
}
88+
89+
return try await inFlightRefreshTask!.value
9790
}
9891
}
9992

Sources/Auth/Internal/SessionStorage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ extension SessionStorage {
2626
Dependencies[clientID].configuration.localStorage
2727
}
2828

29-
var logger: (any SupabaseLogger)? {
29+
var logger: SupabaseLogger? {
3030
Dependencies[clientID].configuration.logger
3131
}
3232

Sources/Functions/FunctionsClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public final class FunctionsClient: Sendable {
4848
url: URL,
4949
headers: [String: String] = [:],
5050
region: String? = nil,
51-
logger: (any SupabaseLogger)? = nil,
51+
logger: SupabaseLogger? = nil,
5252
session: Alamofire.Session = .default
5353
) {
5454
self.init(
@@ -89,7 +89,7 @@ public final class FunctionsClient: Sendable {
8989
url: URL,
9090
headers: [String: String] = [:],
9191
region: FunctionRegion? = nil,
92-
logger: (any SupabaseLogger)? = nil,
92+
logger: SupabaseLogger? = nil,
9393
session: Alamofire.Session = .default
9494
) {
9595
self.init(url: url, headers: headers, region: region?.rawValue, session: session)
Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,5 @@
11
import Foundation
2+
import Logging
23

3-
#if canImport(OSLog)
4-
import OSLog
5-
6-
/// A SupabaseLogger implementation that logs to OSLog.
7-
///
8-
/// This logger maps Supabase log levels to appropriate OSLog levels:
9-
/// - `.verbose` → `.info`
10-
/// - `.debug` → `.debug`
11-
/// - `.warning` → `.notice`
12-
/// - `.error` → `.error`
13-
///
14-
/// ## Usage
15-
///
16-
/// ```swift
17-
/// let supabaseLogger = OSLogSupabaseLogger()
18-
///
19-
/// // Use with Supabase client
20-
/// let supabase = SupabaseClient(
21-
/// supabaseURL: url,
22-
/// supabaseKey: key,
23-
/// options: .init(global: .init(logger: supabaseLogger))
24-
/// )
25-
/// ```
26-
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
27-
public struct OSLogSupabaseLogger: SupabaseLogger {
28-
private let logger: Logger
29-
30-
/// Creates a new OSLog-based logger with a provided Logger instance.
31-
///
32-
/// - Parameter logger: The OSLog Logger instance to use for logging.
33-
public init(
34-
_ logger: Logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "", category: "Supabase")
35-
) {
36-
self.logger = logger
37-
}
38-
39-
public func log(message: SupabaseLogMessage) {
40-
let logMessage = message.description
41-
42-
switch message.level {
43-
case .verbose:
44-
logger.info("\(logMessage, privacy: .public)")
45-
case .debug:
46-
logger.debug("\(logMessage, privacy: .public)")
47-
case .warning:
48-
logger.notice("\(logMessage, privacy: .public)")
49-
case .error:
50-
logger.error("\(logMessage, privacy: .public)")
51-
}
52-
}
53-
}
54-
#endif
4+
// Note: OSLogHandler implementation will be added in a future update
5+
// For now, users can use swift-log's built-in handlers or create their own

0 commit comments

Comments
 (0)