Skip to content

Commit f62567e

Browse files
committed
Schedule session refresh when at 80% of token lifespan
1 parent 76233bb commit f62567e

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

Sources/Auth/Internal/SessionManager.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ struct SessionRefresher: Sendable {
77

88
actor SessionManager {
99
private var task: Task<Session, any Error>?
10+
private var autoRefreshTask: Task<Void, any Error>?
1011

1112
private var storage: any AuthLocalStorage {
1213
Current.configuration.localStorage
@@ -16,6 +17,29 @@ actor SessionManager {
1617
Current.sessionRefresher
1718
}
1819

20+
func scheduleSessionRefresh(_ session: Session) throws {
21+
if autoRefreshTask != nil {
22+
return
23+
}
24+
25+
autoRefreshTask = Task {
26+
defer { autoRefreshTask = nil }
27+
28+
guard let expiresAt = session.expiresAt else {
29+
return
30+
}
31+
let expiryDate = Date(timeIntervalSince1970: expiresAt)
32+
33+
let timeIntervalToExpiry = expiryDate.timeIntervalSinceNow
34+
35+
// if negative then token is expired and will refresh right away
36+
let timeIntervalToRefresh = max(timeIntervalToExpiry * 0.8, 0)
37+
38+
try await Task.sleep(nanoseconds: UInt64(timeIntervalToRefresh * 1_000_000_000))
39+
let session = try await sessionRefresher.refreshSession(session.refreshToken)
40+
}
41+
}
42+
1943
func session(shouldValidateExpiration: Bool = true) async throws -> Session {
2044
if let task {
2145
return try await task.value
@@ -42,6 +66,7 @@ actor SessionManager {
4266

4367
func update(_ session: Session) throws {
4468
try storage.storeSession(StoredSession(session: session))
69+
try scheduleSessionRefresh(session)
4570
}
4671

4772
func remove() {

0 commit comments

Comments
 (0)