* Refresh the current session
()
| 101 | * Refresh the current session |
| 102 | */ |
| 103 | async refresh(): Promise<boolean> { |
| 104 | const refreshToken = this.store.getRefreshToken() |
| 105 | if (!refreshToken) { |
| 106 | console.warn("No refresh token available") |
| 107 | return false |
| 108 | } |
| 109 | |
| 110 | try { |
| 111 | const response = await fetch(`${this.getApiUrl()}/api/auth/desktop/refresh`, { |
| 112 | method: "POST", |
| 113 | headers: { "Content-Type": "application/json" }, |
| 114 | body: JSON.stringify({ refreshToken }), |
| 115 | }) |
| 116 | |
| 117 | if (!response.ok) { |
| 118 | console.error("Refresh failed:", response.status) |
| 119 | // If refresh fails, clear auth and require re-login |
| 120 | if (response.status === 401) { |
| 121 | this.logout() |
| 122 | } |
| 123 | return false |
| 124 | } |
| 125 | |
| 126 | const data = await response.json() |
| 127 | |
| 128 | const authData: AuthData = { |
| 129 | token: data.token, |
| 130 | refreshToken: data.refreshToken, |
| 131 | expiresAt: data.expiresAt, |
| 132 | user: data.user, |
| 133 | } |
| 134 | |
| 135 | this.store.save(authData) |
| 136 | this.scheduleRefresh() |
| 137 | |
| 138 | // Notify callback about token refresh (so cookie can be updated) |
| 139 | if (this.onTokenRefresh) { |
| 140 | this.onTokenRefresh(authData) |
| 141 | } |
| 142 | |
| 143 | return true |
| 144 | } catch (error) { |
| 145 | console.error("Refresh error:", error) |
| 146 | return false |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | /** |
| 151 | * Schedule token refresh before expiration |
no test coverage detected