@astram/frontend-core 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/accountService.d.ts +10 -3
- package/dist/auth/accountService.d.ts.map +1 -1
- package/dist/auth/accountService.js +70 -14
- package/dist/auth/accountService.js.map +1 -1
- package/dist/auth/authService.d.ts +5 -2
- package/dist/auth/authService.d.ts.map +1 -1
- package/dist/auth/authService.js +2 -2
- package/dist/auth/authService.js.map +1 -1
- package/dist/http/refreshingHttp.d.ts +23 -4
- package/dist/http/refreshingHttp.d.ts.map +1 -1
- package/dist/http/refreshingHttp.js +54 -3
- package/dist/http/refreshingHttp.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,15 +6,22 @@
|
|
|
6
6
|
* unchanged on web today and React Native next.
|
|
7
7
|
*
|
|
8
8
|
* Framework account routes (server-side, framework-owned, bearer-authenticated):
|
|
9
|
-
* POST /account/change-password { currentPassword, newPassword } → 204 | 401 | 422 | 501
|
|
9
|
+
* POST /account/change-password { currentPassword, newPassword } → 204 | 400 | 401 | 422 | 429 | 501 | 503
|
|
10
10
|
* GET /account/mfa/devices → 200 { devices, mfaEnabled } | 401 | 501
|
|
11
11
|
* POST /account/mfa/devices/begin { name? } → 200 { deviceId, otpauthUri, secret } | 401 | 501
|
|
12
12
|
* POST /account/mfa/devices/confirm { deviceId, code } → 200 { recoveryCodes? } | 400 | 401 | 404 | 501
|
|
13
13
|
* PATCH /account/mfa/devices/:id/rename { name } → 200 { device } | 401 | 404 | 422 | 501
|
|
14
|
-
* DELETE /account/mfa/devices/:id { code } → 204 | 400 | 401 | 404 | 501
|
|
15
|
-
* POST /account/mfa/recovery-codes/regenerate { code } → 200 { recoveryCodes } | 400 | 401 | 501
|
|
14
|
+
* DELETE /account/mfa/devices/:id { code } → 204 | 400 | 401 | 404 | 429 | 501 | 503
|
|
15
|
+
* POST /account/mfa/recovery-codes/regenerate { code } → 200 { recoveryCodes } | 400 | 401 | 429 | 501 | 503
|
|
16
16
|
* PATCH /account/profile { name?, email? } → 200 { …profile } | 401 | 422 | 501
|
|
17
17
|
*
|
|
18
|
+
* Every method maps 429 (too many attempts — change-password spends the account's login
|
|
19
|
+
* budget, the code-gated MFA routes its MFA budget) to "Too many attempts…" and 503 (a
|
|
20
|
+
* server dependency could not answer; retrying later is safe) to "temporarily
|
|
21
|
+
* unavailable" (Phase 9 #12). 401 always means the session is missing or expired: the
|
|
22
|
+
* refresh wrapper retries it once after a refresh, so no route uses 401 for a wrong
|
|
23
|
+
* password or code.
|
|
24
|
+
*
|
|
18
25
|
* Every method resolves to a plain result object (never throws), so views stay dumb.
|
|
19
26
|
* A device `secret` is only ever returned by `beginMfaDevice` (the caller's own, for a
|
|
20
27
|
* QR); the display list/rename shapes never carry a secret.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountService.d.ts","sourceRoot":"","sources":["../../src/auth/accountService.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accountService.d.ts","sourceRoot":"","sources":["../../src/auth/accountService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/** Shown on a 429: the account's attempt budget is spent (Phase 9 #12). */
|
|
2
|
+
const ACCOUNT_TOO_MANY_ATTEMPTS_MESSAGE = 'Too many attempts. Please wait a few minutes and try again.';
|
|
3
|
+
/** Shown on a 503: the server's limiter / replay guard could not answer (Phase 9 #12). */
|
|
4
|
+
const ACCOUNT_SERVICE_UNAVAILABLE_MESSAGE = 'The service is temporarily unavailable. Please try again shortly.';
|
|
5
|
+
/**
|
|
6
|
+
* The statuses every account route can answer regardless of method (Phase 9 #12):
|
|
7
|
+
* 429 — too many attempts (change-password shares the login budget; the code-gated MFA
|
|
8
|
+
* routes share the MFA budget); 503 — a transient server dependency (Redis) could not
|
|
9
|
+
* answer, retrying later is safe. `null` for any other status.
|
|
10
|
+
*/
|
|
11
|
+
function busyOrUnavailable(status) {
|
|
12
|
+
if (status === 429)
|
|
13
|
+
return { ok: false, status, error: ACCOUNT_TOO_MANY_ATTEMPTS_MESSAGE };
|
|
14
|
+
if (status === 503)
|
|
15
|
+
return { ok: false, status, error: ACCOUNT_SERVICE_UNAVAILABLE_MESSAGE };
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
1
18
|
export function createAccountService(http) {
|
|
2
19
|
return {
|
|
3
20
|
/**
|
|
@@ -5,22 +22,32 @@ export function createAccountService(http) {
|
|
|
5
22
|
* password, writes the new one, and revokes the user's OTHER sessions (the
|
|
6
23
|
* current session stays alive). Resolves to:
|
|
7
24
|
* { ok: true } — changed (204)
|
|
8
|
-
* { ok: false, status, error } —
|
|
9
|
-
*
|
|
25
|
+
* { ok: false, status, error } — 400 (current incorrect; 401 from older
|
|
26
|
+
* servers), 422 (weak new password),
|
|
27
|
+
* 429 (too many attempts — the account's
|
|
28
|
+
* login budget, shared with sign-in),
|
|
29
|
+
* 501 (not available), 503 (try again
|
|
30
|
+
* shortly), or other.
|
|
10
31
|
* @param accessToken the caller's bearer access token
|
|
11
32
|
*/
|
|
12
33
|
async changePassword(accessToken, currentPassword, newPassword) {
|
|
13
34
|
const r = await http.post('/account/change-password', { currentPassword, newPassword }, { bearerToken: accessToken });
|
|
14
35
|
if (r.status === 204)
|
|
15
36
|
return { ok: true };
|
|
16
|
-
|
|
17
|
-
|
|
37
|
+
// Phase 9 #3: guard ≥ the Phase 9 release answers a wrong current password with 400.
|
|
38
|
+
// An older server still uses 401 (which the refresh wrapper also retries once).
|
|
39
|
+
if (r.status === 400 || r.status === 401)
|
|
40
|
+
return { ok: false, status: r.status, error: 'Current password is incorrect.' };
|
|
18
41
|
if (r.status === 422) {
|
|
19
42
|
return { ok: false, status: 422, error: 'New password does not meet the requirements.' };
|
|
20
43
|
}
|
|
21
44
|
if (r.status === 501)
|
|
22
45
|
return { ok: false, status: 501, error: 'Password change is not available.' };
|
|
23
|
-
return
|
|
46
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
47
|
+
ok: false,
|
|
48
|
+
status: r.status,
|
|
49
|
+
error: 'Could not change password.',
|
|
50
|
+
});
|
|
24
51
|
},
|
|
25
52
|
/**
|
|
26
53
|
* List the signed-in user's CONFIRMED authenticator devices (multi-device
|
|
@@ -46,7 +73,11 @@ export function createAccountService(http) {
|
|
|
46
73
|
if (r.status === 501) {
|
|
47
74
|
return { ok: false, status: 501, error: 'Two-factor authentication is not available.' };
|
|
48
75
|
}
|
|
49
|
-
return
|
|
76
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
77
|
+
ok: false,
|
|
78
|
+
status: r.status,
|
|
79
|
+
error: 'Could not load your two-factor devices.',
|
|
80
|
+
});
|
|
50
81
|
},
|
|
51
82
|
/**
|
|
52
83
|
* Begin enrolling a NEW authenticator device. The server mints a fresh secret and
|
|
@@ -75,7 +106,11 @@ export function createAccountService(http) {
|
|
|
75
106
|
if (r.status === 501) {
|
|
76
107
|
return { ok: false, status: 501, error: 'Two-factor authentication is not available.' };
|
|
77
108
|
}
|
|
78
|
-
return
|
|
109
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
110
|
+
ok: false,
|
|
111
|
+
status: r.status,
|
|
112
|
+
error: 'Could not start two-factor setup.',
|
|
113
|
+
});
|
|
79
114
|
},
|
|
80
115
|
/**
|
|
81
116
|
* Confirm a pending device by presenting a live code from it. On success the server
|
|
@@ -109,7 +144,11 @@ export function createAccountService(http) {
|
|
|
109
144
|
if (r.status === 501) {
|
|
110
145
|
return { ok: false, status: 501, error: 'Two-factor authentication is not available.' };
|
|
111
146
|
}
|
|
112
|
-
return
|
|
147
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
148
|
+
ok: false,
|
|
149
|
+
status: r.status,
|
|
150
|
+
error: 'Could not confirm two-factor setup.',
|
|
151
|
+
});
|
|
113
152
|
},
|
|
114
153
|
/**
|
|
115
154
|
* Rename one of the signed-in user's devices (cosmetic — no code required). On
|
|
@@ -134,7 +173,11 @@ export function createAccountService(http) {
|
|
|
134
173
|
if (r.status === 501) {
|
|
135
174
|
return { ok: false, status: 501, error: 'Two-factor authentication is not available.' };
|
|
136
175
|
}
|
|
137
|
-
return
|
|
176
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
177
|
+
ok: false,
|
|
178
|
+
status: r.status,
|
|
179
|
+
error: 'Could not rename the device.',
|
|
180
|
+
});
|
|
138
181
|
},
|
|
139
182
|
/**
|
|
140
183
|
* Remove one of the signed-in user's devices. Requires proof — a current TOTP code
|
|
@@ -142,7 +185,7 @@ export function createAccountService(http) {
|
|
|
142
185
|
* device turns MFA off (and wipes recovery codes). Resolves to:
|
|
143
186
|
* { ok: true } — removed (204)
|
|
144
187
|
* { ok: false, status, error } — 400 (wrong code), 404 (unknown/not owned), 401,
|
|
145
|
-
* 501, other
|
|
188
|
+
* 429 (too many attempts), 501, 503, other
|
|
146
189
|
* @param code a TOTP or recovery code (proof)
|
|
147
190
|
*/
|
|
148
191
|
async removeMfaDevice(accessToken, deviceId, code) {
|
|
@@ -163,14 +206,19 @@ export function createAccountService(http) {
|
|
|
163
206
|
if (r.status === 501) {
|
|
164
207
|
return { ok: false, status: 501, error: 'Two-factor authentication is not available.' };
|
|
165
208
|
}
|
|
166
|
-
return
|
|
209
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
210
|
+
ok: false,
|
|
211
|
+
status: r.status,
|
|
212
|
+
error: 'Could not remove the device.',
|
|
213
|
+
});
|
|
167
214
|
},
|
|
168
215
|
/**
|
|
169
216
|
* Regenerate the account's recovery codes (replacing the old set). Requires MFA to be
|
|
170
217
|
* enabled and proof — a current TOTP from any device OR an existing recovery code. The
|
|
171
218
|
* fresh codes are returned ONCE. Resolves to:
|
|
172
219
|
* { ok: true, recoveryCodes } — regenerated (200)
|
|
173
|
-
* { ok: false, status, error } — 400 (MFA off / wrong code), 401,
|
|
220
|
+
* { ok: false, status, error } — 400 (MFA off / wrong code), 401,
|
|
221
|
+
* 429 (too many attempts), 501, 503, other
|
|
174
222
|
* @param code a TOTP or recovery code (proof)
|
|
175
223
|
*/
|
|
176
224
|
async regenerateRecoveryCodes(accessToken, code) {
|
|
@@ -191,7 +239,11 @@ export function createAccountService(http) {
|
|
|
191
239
|
if (r.status === 501) {
|
|
192
240
|
return { ok: false, status: 501, error: 'Two-factor authentication is not available.' };
|
|
193
241
|
}
|
|
194
|
-
return
|
|
242
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
243
|
+
ok: false,
|
|
244
|
+
status: r.status,
|
|
245
|
+
error: 'Could not regenerate recovery codes.',
|
|
246
|
+
});
|
|
195
247
|
},
|
|
196
248
|
/**
|
|
197
249
|
* Edit the signed-in user's own display profile (name and/or email). Only the
|
|
@@ -215,7 +267,11 @@ export function createAccountService(http) {
|
|
|
215
267
|
if (r.status === 501) {
|
|
216
268
|
return { ok: false, status: 501, error: 'Profile editing is not available.' };
|
|
217
269
|
}
|
|
218
|
-
return
|
|
270
|
+
return (busyOrUnavailable(r.status) ?? {
|
|
271
|
+
ok: false,
|
|
272
|
+
status: r.status,
|
|
273
|
+
error: 'Could not update your profile.',
|
|
274
|
+
});
|
|
219
275
|
},
|
|
220
276
|
};
|
|
221
277
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountService.js","sourceRoot":"","sources":["../../src/auth/accountService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accountService.js","sourceRoot":"","sources":["../../src/auth/accountService.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Verbatim TS port of astram3/shared/src/auth/authService.js — logic, routes, and
|
|
18
18
|
* every result branch are unchanged; only types were added.
|
|
19
19
|
*/
|
|
20
|
-
import type { HttpClient } from '../http/types.js';
|
|
20
|
+
import type { AbortSignalLike, HttpClient } from '../http/types.js';
|
|
21
21
|
import type { Session, SessionTokens } from './session.js';
|
|
22
22
|
/** Shape of a display profile returned by GET /auth/me. */
|
|
23
23
|
export interface AuthProfile {
|
|
@@ -113,7 +113,10 @@ export type ResetPasswordResult = {
|
|
|
113
113
|
export interface AuthService {
|
|
114
114
|
login(identityHint: string, password: string): Promise<LoginResult>;
|
|
115
115
|
completeMfa(challengeToken: string, code: string, factor?: string): Promise<CompleteMfaResult>;
|
|
116
|
-
|
|
116
|
+
/** `opts.signal` (additive) is forwarded to the transport so a hung refresh can be aborted. */
|
|
117
|
+
refresh(refreshToken: string, opts?: {
|
|
118
|
+
signal?: AbortSignalLike;
|
|
119
|
+
}): Promise<RefreshResult>;
|
|
117
120
|
logout(sessionId: string | undefined): Promise<LogoutResult>;
|
|
118
121
|
me(accessToken: string): Promise<MeResult>;
|
|
119
122
|
requestReset(identityHint: string): Promise<RequestResetResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/authService.js
CHANGED
|
@@ -58,8 +58,8 @@ export function createAuthService(http) {
|
|
|
58
58
|
return { ok: false, error: 'Incorrect or expired code.' };
|
|
59
59
|
},
|
|
60
60
|
/** Rotate the session's tokens with a refresh token. */
|
|
61
|
-
async refresh(refreshToken) {
|
|
62
|
-
const r = await http.post('/auth/refresh', { refreshToken });
|
|
61
|
+
async refresh(refreshToken, opts) {
|
|
62
|
+
const r = await http.post('/auth/refresh', { refreshToken }, opts?.signal ? { signal: opts.signal } : undefined);
|
|
63
63
|
const data = r.data;
|
|
64
64
|
if (r.ok && data?.session && data?.tokens) {
|
|
65
65
|
return { ok: true, session: data.session, tokens: data.tokens };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authService.js","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"authService.js","sourceRoot":"","sources":["../../src/auth/authService.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
* - Refresh rejected (401/4xx) ⇒ the stored session is cleared and `onSessionExpired`
|
|
16
16
|
* runs once. Refresh unavailable (503 / unreachable) ⇒ NO logout: the session is kept
|
|
17
17
|
* (the server did not spend the token) and the outage status is returned, so the next
|
|
18
|
-
* request may try again.
|
|
18
|
+
* request may try again. A refresh that does not settle within `refreshTimeoutMs`
|
|
19
|
+
* (default 15 s) is aborted and counts as that outage, so it never holds the lock forever.
|
|
19
20
|
* - The stored session was replaced by a DIFFERENT session (re-login in another tab) ⇒
|
|
20
21
|
* the 401 is returned as-is: no refresh, no retry under someone else's token, no logout.
|
|
21
22
|
* The same holds if the store changes WHILE the refresh is in flight (a logout mid-refresh):
|
|
@@ -25,7 +26,7 @@
|
|
|
25
26
|
* every tab reads the same tokens); the lock manager is injectable (tests, React Native).
|
|
26
27
|
* Never throws: failures resolve to the uniform {@link HttpResponse} shape.
|
|
27
28
|
*/
|
|
28
|
-
import type { HttpClient } from './types.js';
|
|
29
|
+
import type { AbortSignalLike, HttpClient } from './types.js';
|
|
29
30
|
import type { SessionState, SessionStore } from '../auth/session.js';
|
|
30
31
|
import type { RefreshResult } from '../auth/authService.js';
|
|
31
32
|
/** The Web Locks name every tab of the app shares for the refresh critical section. */
|
|
@@ -37,8 +38,12 @@ export interface LockManagerLike {
|
|
|
37
38
|
export interface RefreshingHttpOptions {
|
|
38
39
|
/** The real transport. Refresh calls should go through this one, not the wrapper. */
|
|
39
40
|
readonly http: HttpClient;
|
|
40
|
-
/**
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Spends a refresh token, e.g. `(rt, o) => createAuthService(http).refresh(rt, o)`.
|
|
43
|
+
* The second argument carries an abort `signal` (fired on the refresh timeout); forward
|
|
44
|
+
* it to the HTTP call. A one-argument function is still accepted.
|
|
45
|
+
*/
|
|
46
|
+
readonly refresh: (refreshToken: string, opts?: RefreshCallOpts) => Promise<RefreshResult>;
|
|
42
47
|
/** Where the session lives; re-read inside the lock, written on rotate/expiry. */
|
|
43
48
|
readonly store: SessionStore;
|
|
44
49
|
/** New session state after a rotation (this tab's or another tab's). Update app state here. */
|
|
@@ -49,6 +54,20 @@ export interface RefreshingHttpOptions {
|
|
|
49
54
|
readonly locks?: LockManagerLike | null;
|
|
50
55
|
/** Lock name; defaults to {@link REFRESH_LOCK_NAME}. */
|
|
51
56
|
readonly lockName?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Upper bound on one refresh call, in ms (default {@link DEFAULT_REFRESH_TIMEOUT_MS}).
|
|
59
|
+
* On expiry the signal passed to `refresh` is aborted and the refresh counts as an
|
|
60
|
+
* outage (session kept, `status: 0`), so a hung `/auth/refresh` never holds the
|
|
61
|
+
* cross-tab lock forever — even if `refresh` ignores the signal.
|
|
62
|
+
*/
|
|
63
|
+
readonly refreshTimeoutMs?: number;
|
|
64
|
+
}
|
|
65
|
+
/** Default {@link RefreshingHttpOptions.refreshTimeoutMs}. */
|
|
66
|
+
export declare const DEFAULT_REFRESH_TIMEOUT_MS = 15000;
|
|
67
|
+
/** What `createRefreshingHttp` hands the injected `refresh` (additive second argument). */
|
|
68
|
+
export interface RefreshCallOpts {
|
|
69
|
+
/** Aborted when the refresh timeout fires; forward it to the HTTP call. */
|
|
70
|
+
readonly signal?: AbortSignalLike;
|
|
52
71
|
}
|
|
53
72
|
export declare function createRefreshingHttp(options: RefreshingHttpOptions): HttpClient;
|
|
54
73
|
//# sourceMappingURL=refreshingHttp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refreshingHttp.d.ts","sourceRoot":"","sources":["../../src/http/refreshingHttp.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"refreshingHttp.d.ts","sourceRoot":"","sources":["../../src/http/refreshingHttp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,qBAAqB;IACpC,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3F,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,+FAA+F;IAC/F,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACrD,+FAA+F;IAC/F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IACvC,0FAA0F;IAC1F,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC;AA4ED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,UAAU,CAoK/E"}
|
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
/** The Web Locks name every tab of the app shares for the refresh critical section. */
|
|
2
2
|
export const REFRESH_LOCK_NAME = 'astram-refresh';
|
|
3
|
+
/** Default {@link RefreshingHttpOptions.refreshTimeoutMs}. */
|
|
4
|
+
export const DEFAULT_REFRESH_TIMEOUT_MS = 15_000;
|
|
5
|
+
/** A real AbortController when the platform has one (fetch needs a native signal). */
|
|
6
|
+
function newAbort() {
|
|
7
|
+
const Ctor = globalThis.AbortController;
|
|
8
|
+
if (typeof Ctor !== 'function')
|
|
9
|
+
return { abort: () => undefined };
|
|
10
|
+
const c = new Ctor();
|
|
11
|
+
return { signal: c.signal, abort: () => c.abort() };
|
|
12
|
+
}
|
|
13
|
+
const TIMED_OUT = Symbol('refresh-timeout');
|
|
14
|
+
/**
|
|
15
|
+
* Run `call` with an abort signal, racing a timer: whichever settles first wins. The
|
|
16
|
+
* timer aborts the signal and resolves {@link TIMED_OUT}, so a call that ignores its
|
|
17
|
+
* signal still releases the caller. The timer is always cleared.
|
|
18
|
+
*/
|
|
19
|
+
function withTimeout(ms, call) {
|
|
20
|
+
const host = globalThis;
|
|
21
|
+
const ctl = newAbort();
|
|
22
|
+
if (typeof host.setTimeout !== 'function')
|
|
23
|
+
return call(ctl.signal);
|
|
24
|
+
let timer;
|
|
25
|
+
const timeout = new Promise((resolve) => {
|
|
26
|
+
timer = host.setTimeout(() => {
|
|
27
|
+
ctl.abort();
|
|
28
|
+
resolve(TIMED_OUT);
|
|
29
|
+
}, ms);
|
|
30
|
+
});
|
|
31
|
+
return Promise.race([call(ctl.signal), timeout]).finally(() => {
|
|
32
|
+
host.clearTimeout?.(timer);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
3
35
|
/** How many access-token → session-id pairs to remember (tokens rotate every ~15 min). */
|
|
4
36
|
const MAX_KNOWN_TOKENS = 8;
|
|
5
37
|
function defaultLocks() {
|
|
@@ -16,6 +48,9 @@ function safely(fn) {
|
|
|
16
48
|
/* app callbacks are best-effort; never break the HTTP result */
|
|
17
49
|
}
|
|
18
50
|
}
|
|
51
|
+
function nonEmpty(v) {
|
|
52
|
+
return typeof v === 'string' && v.length > 0;
|
|
53
|
+
}
|
|
19
54
|
/** Retryable statuses: unreachable, rate-limited, server/store outage. */
|
|
20
55
|
function isTransient(status) {
|
|
21
56
|
return status === 0 || status === 429 || status >= 500;
|
|
@@ -24,6 +59,11 @@ export function createRefreshingHttp(options) {
|
|
|
24
59
|
const { http, refresh, store } = options;
|
|
25
60
|
const lockName = options.lockName ?? REFRESH_LOCK_NAME;
|
|
26
61
|
const locks = options.locks === undefined ? defaultLocks() : options.locks;
|
|
62
|
+
const timeoutMs = typeof options.refreshTimeoutMs === 'number' &&
|
|
63
|
+
Number.isFinite(options.refreshTimeoutMs) &&
|
|
64
|
+
options.refreshTimeoutMs > 0
|
|
65
|
+
? options.refreshTimeoutMs
|
|
66
|
+
: DEFAULT_REFRESH_TIMEOUT_MS;
|
|
27
67
|
// access token → session id it belonged to, learned when a request first carries it.
|
|
28
68
|
// Lets a late 401 tell "my session was rotated by another tab" (adopt its tokens) from
|
|
29
69
|
// "someone else signed in here" (never retry under their token).
|
|
@@ -90,7 +130,11 @@ export function createRefreshingHttp(options) {
|
|
|
90
130
|
return expire();
|
|
91
131
|
let r;
|
|
92
132
|
try {
|
|
93
|
-
|
|
133
|
+
const settled = await withTimeout(timeoutMs, (signal) => refresh(refreshToken, signal ? { signal } : {}));
|
|
134
|
+
// Timed out: an outage, not a rejection — keep the session and release the lock.
|
|
135
|
+
if (settled === TIMED_OUT)
|
|
136
|
+
return { kind: 'unavailable', status: 0 };
|
|
137
|
+
r = settled;
|
|
94
138
|
}
|
|
95
139
|
catch {
|
|
96
140
|
return { kind: 'unavailable', status: 0 };
|
|
@@ -102,12 +146,19 @@ export function createRefreshingHttp(options) {
|
|
|
102
146
|
const after = load();
|
|
103
147
|
if (after?.tokens?.refreshToken !== refreshToken)
|
|
104
148
|
return { kind: 'superseded' };
|
|
149
|
+
// A 200 without a session id or both tokens is a server bug. The spent refresh token
|
|
150
|
+
// cannot be retried (reuse detection would revoke the family), so treat it as a
|
|
151
|
+
// rejected refresh: store nothing from it, clear the session, send the user to login.
|
|
152
|
+
// Never persist `session: undefined` — the cross-tab adopt check needs the session id.
|
|
105
153
|
const nextAccess = r.tokens?.accessToken;
|
|
106
|
-
|
|
154
|
+
const nextRefresh = r.tokens?.refreshToken;
|
|
155
|
+
const nextSessionId = r.session?.sessionId;
|
|
156
|
+
if (!nonEmpty(nextAccess) || !nonEmpty(nextRefresh) || !nonEmpty(nextSessionId)) {
|
|
107
157
|
return expire();
|
|
158
|
+
}
|
|
108
159
|
const next = { ...after, session: r.session, tokens: r.tokens };
|
|
109
160
|
save(next); // before the lock is released, so a waiting tab sees the rotation
|
|
110
|
-
remember(nextAccess,
|
|
161
|
+
remember(nextAccess, nextSessionId);
|
|
111
162
|
safely(() => options.onRefreshed?.(next));
|
|
112
163
|
return { kind: 'rotated', accessToken: nextAccess };
|
|
113
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refreshingHttp.js","sourceRoot":"","sources":["../../src/http/refreshingHttp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refreshingHttp.js","sourceRoot":"","sources":["../../src/http/refreshingHttp.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { HttpClient, HttpResponse, RequestOpts, AbortSignalLike } from './http/types.js';
|
|
2
|
-
export { createRefreshingHttp, REFRESH_LOCK_NAME } from './http/refreshingHttp.js';
|
|
3
|
-
export type { RefreshingHttpOptions, LockManagerLike } from './http/refreshingHttp.js';
|
|
2
|
+
export { createRefreshingHttp, REFRESH_LOCK_NAME, DEFAULT_REFRESH_TIMEOUT_MS, } from './http/refreshingHttp.js';
|
|
3
|
+
export type { RefreshingHttpOptions, LockManagerLike, RefreshCallOpts, } from './http/refreshingHttp.js';
|
|
4
4
|
export * from './auth/index.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE9F,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE9F,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Token refresh over any HttpClient: single-flight, retry once, cross-tab lock (#12).
|
|
2
|
-
export { createRefreshingHttp, REFRESH_LOCK_NAME } from './http/refreshingHttp.js';
|
|
2
|
+
export { createRefreshingHttp, REFRESH_LOCK_NAME, DEFAULT_REFRESH_TIMEOUT_MS, } from './http/refreshingHttp.js';
|
|
3
3
|
export * from './auth/index.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,sFAAsF;AACtF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,sFAAsF;AACtF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAMlC,cAAc,iBAAiB,CAAC"}
|