@@ -7,6 +7,7 @@ struct SessionRefresher: Sendable {
77
88actor 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