Skip to content

Commit aef8a9d

Browse files
committed
fix(auth): remove session in case token refresh fails
1 parent a18e671 commit aef8a9d

File tree

1 file changed

+30
-22
lines changed

1 file changed

+30
-22
lines changed

Sources/Auth/Internal/SessionManager.swift

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -55,42 +55,50 @@ private actor LiveSessionManager {
5555

5656
func refreshSession(_ refreshToken: String) async throws -> Session {
5757
try await SupabaseLoggerTaskLocal.$additionalContext.withValue(
58-
merging: ["refreshID": .string(UUID().uuidString)]
58+
merging: ["refresh_id": .string(UUID().uuidString)]
5959
) {
6060
try await trace(using: logger) {
6161
if let inFlightRefreshTask {
62-
logger?.debug("refresh already in flight")
62+
logger?.debug("Refresh already in flight")
6363
return try await inFlightRefreshTask.value
6464
}
6565

6666
inFlightRefreshTask = Task {
67-
logger?.debug("refresh task started")
67+
logger?.debug("Refresh task started")
6868

6969
defer {
7070
inFlightRefreshTask = nil
71-
logger?.debug("refresh task ended")
71+
logger?.debug("Refresh task ended")
7272
}
7373

74-
let session = try await api.execute(
75-
HTTPRequest(
76-
url: configuration.url.appendingPathComponent("token"),
77-
method: .post,
78-
query: [
79-
URLQueryItem(name: "grant_type", value: "refresh_token"),
80-
],
81-
body: configuration.encoder.encode(
82-
UserCredentials(refreshToken: refreshToken)
74+
do {
75+
let session = try await api.execute(
76+
HTTPRequest(
77+
url: configuration.url.appendingPathComponent("token"),
78+
method: .post,
79+
query: [
80+
URLQueryItem(name: "grant_type", value: "refresh_token"),
81+
],
82+
body: configuration.encoder.encode(
83+
UserCredentials(refreshToken: refreshToken)
84+
)
8385
)
8486
)
85-
)
86-
.decoded(as: Session.self, decoder: configuration.decoder)
87+
.decoded(as: Session.self, decoder: configuration.decoder)
8788

88-
update(session)
89-
eventEmitter.emit(.tokenRefreshed, session: session)
89+
update(session)
90+
eventEmitter.emit(.tokenRefreshed, session: session)
9091

91-
await scheduleNextTokenRefresh(session)
92+
await scheduleNextTokenRefresh(session)
9293

93-
return session
94+
return session
95+
} catch {
96+
logger?.debug("Failed to refresh token: \(error)")
97+
remove()
98+
eventEmitter.emit(.signedOut, session: nil)
99+
100+
throw error
101+
}
94102
}
95103

96104
return try await inFlightRefreshTask!.value
@@ -114,12 +122,12 @@ private actor LiveSessionManager {
114122
merging: ["caller": .string("\(caller)")]
115123
) {
116124
guard configuration.autoRefreshToken else {
117-
logger?.debug("auto refresh token disabled")
125+
logger?.debug("Auto refresh token disabled")
118126
return
119127
}
120128

121129
guard scheduledNextRefreshTask == nil else {
122-
logger?.debug("refresh task already scheduled")
130+
logger?.debug("Refresh task already scheduled")
123131
return
124132
}
125133

@@ -133,7 +141,7 @@ private actor LiveSessionManager {
133141
// if expiresIn < 0, it will refresh right away.
134142
let timeToRefresh = max(expiresIn * 0.9, 0)
135143

136-
logger?.debug("scheduled next token refresh in: \(timeToRefresh)s")
144+
logger?.debug("Scheduled next token refresh in: \(timeToRefresh)s")
137145

138146
try? await Task.sleep(nanoseconds: NSEC_PER_SEC * UInt64(timeToRefresh))
139147

0 commit comments

Comments
 (0)