@idp.global/sdk 19.2.1 → 19.4.0

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.
Files changed (44) hide show
  1. package/changelog.md +58 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts_browser/classes.idpclient.js +1 -1
  4. package/dist_ts_browser/classes.idprequests.js +1 -1
  5. package/dist_ts_browser/classes.relyingpartybearerclient.d.ts +276 -0
  6. package/dist_ts_browser/classes.relyingpartybearerclient.js +591 -0
  7. package/dist_ts_browser/index.d.ts +1 -0
  8. package/dist_ts_browser/index.js +2 -1
  9. package/dist_ts_browser/plugins.js +1 -1
  10. package/dist_ts_browser/secret-delivery.js +1 -1
  11. package/dist_ts_relyingparty/classes.authorityobserver.d.ts +23 -0
  12. package/dist_ts_relyingparty/classes.authorityobserver.js +68 -13
  13. package/dist_ts_relyingparty/classes.errors.d.ts +11 -1
  14. package/dist_ts_relyingparty/classes.errors.js +6 -1
  15. package/dist_ts_relyingparty/classes.relyingpartyroutes.d.ts +74 -2
  16. package/dist_ts_relyingparty/classes.relyingpartyroutes.js +289 -14
  17. package/dist_ts_relyingparty/classes.relyingpartysessions.d.ts +209 -7
  18. package/dist_ts_relyingparty/classes.relyingpartysessions.js +734 -87
  19. package/dist_ts_relyingparty/classes.rpmodels.d.ts +71 -8
  20. package/dist_ts_relyingparty/classes.rpmodels.js +224 -10
  21. package/dist_ts_relyingparty/contract.bearer.d.ts +82 -0
  22. package/dist_ts_relyingparty/contract.bearer.js +9 -0
  23. package/dist_ts_relyingparty/helpers.bearer.d.ts +48 -0
  24. package/dist_ts_relyingparty/helpers.bearer.js +199 -0
  25. package/dist_ts_relyingparty/index.d.ts +1 -0
  26. package/dist_ts_relyingparty/index.js +2 -1
  27. package/dist_ts_relyingparty/interfaces.d.ts +122 -2
  28. package/dist_ts_relyingparty/testing.d.ts +22 -0
  29. package/dist_ts_relyingparty/testing.js +42 -1
  30. package/package.json +9 -11
  31. package/readme.md +353 -8
  32. package/ts/00_commitinfo_data.ts +1 -1
  33. package/ts_browser/classes.relyingpartybearerclient.ts +821 -0
  34. package/ts_browser/index.ts +1 -0
  35. package/ts_relyingparty/classes.authorityobserver.ts +80 -12
  36. package/ts_relyingparty/classes.errors.ts +16 -1
  37. package/ts_relyingparty/classes.relyingpartyroutes.ts +340 -16
  38. package/ts_relyingparty/classes.relyingpartysessions.ts +907 -94
  39. package/ts_relyingparty/classes.rpmodels.ts +131 -9
  40. package/ts_relyingparty/contract.bearer.ts +99 -0
  41. package/ts_relyingparty/helpers.bearer.ts +259 -0
  42. package/ts_relyingparty/index.ts +1 -0
  43. package/ts_relyingparty/interfaces.ts +144 -2
  44. package/ts_relyingparty/testing.ts +60 -0
@@ -0,0 +1,591 @@
1
+ import { RELYING_PARTY_BEARER_MESSAGE_TYPE, } from '../dist_ts_relyingparty/contract.bearer.js';
2
+ export { RELYING_PARTY_BEARER_MESSAGE_TYPE };
3
+ export class RelyingPartyBearerClientError extends Error {
4
+ code;
5
+ status;
6
+ /** the `error` the relying party answered (`TRelyingPartyBearerErrorCode`) */
7
+ answerError;
8
+ /** the `error` a delivery carried (`TRelyingPartyBearerDeliveryError`) */
9
+ deliveryError;
10
+ constructor(code, detailsArg = {}) {
11
+ super(code, detailsArg.cause !== undefined ? { cause: detailsArg.cause } : undefined);
12
+ this.code = code;
13
+ this.name = 'RelyingPartyBearerClientError';
14
+ if (detailsArg.status !== undefined)
15
+ this.status = detailsArg.status;
16
+ if (detailsArg.answerError !== undefined)
17
+ this.answerError = detailsArg.answerError;
18
+ if (detailsArg.deliveryError !== undefined)
19
+ this.deliveryError = detailsArg.deliveryError;
20
+ }
21
+ }
22
+ const DEFAULT_LOGIN_PATH_PREFIX = '/auth/';
23
+ const DEFAULT_REFRESH_SKEW_MS = 60_000;
24
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
25
+ /** Every tab of the origin waits on the lock while a section runs: two minutes at most. */
26
+ const MAX_REQUEST_TIMEOUT_MS = 120_000;
27
+ /** The life of a login attempt at the relying party (`LOGIN_ATTEMPT_MAX_AGE_SECONDS`). */
28
+ const DEFAULT_POPUP_TIMEOUT_MS = 10 * 60 * 1_000;
29
+ const DEFAULT_POPUP_FEATURES = 'popup,width=480,height=720';
30
+ const POPUP_CLOSED_POLL_MS = 500;
31
+ /** A popup posts and closes at once; its message can arrive after the opener sees it closed. */
32
+ const POPUP_CLOSED_GRACE_MS = 1_000;
33
+ /** 32 random bytes: a 43-character verifier and state (RFC 7636 §4.1). */
34
+ const RANDOM_BYTES = 32;
35
+ const DELIVERY_PARAMS = ['code', 'error', 'state'];
36
+ const base64Url = (bytesArg) => {
37
+ let binary = '';
38
+ for (const byte of bytesArg)
39
+ binary += String.fromCharCode(byte);
40
+ return globalThis.btoa(binary).replace(/\+/gu, '-').replace(/\//gu, '_').replace(/=+$/u, '');
41
+ };
42
+ const randomBase64Url = () => base64Url(globalThis.crypto.getRandomValues(new Uint8Array(RANDOM_BYTES)));
43
+ /** The S256 challenge of a verifier: BASE64URL(SHA-256(ASCII(verifier))). */
44
+ const pkceChallengeOf = async (verifierArg) => base64Url(new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifierArg))));
45
+ const isRecord = (valueArg) => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
46
+ const isText = (valueArg) => typeof valueArg === 'string' && valueArg.length > 0;
47
+ const isTime = (valueArg) => typeof valueArg === 'number' && Number.isFinite(valueArg);
48
+ /** Throws `request_failed` once a section's deadline has fired: nothing is sent or written past it. */
49
+ const inTime = (signalArg) => {
50
+ if (signalArg.aborted) {
51
+ throw new RelyingPartyBearerClientError('request_failed');
52
+ }
53
+ };
54
+ /** The one value of a parameter, or `undefined` when it is absent or repeated. */
55
+ const singleParam = (paramsArg, nameArg) => {
56
+ const values = paramsArg.getAll(nameArg);
57
+ return values.length === 1 ? values[0] : undefined;
58
+ };
59
+ /** A token answer exactly as the bearer contract says, or `null`. */
60
+ const tokenAnswerOf = (answerArg) => {
61
+ if (!isRecord(answerArg)
62
+ || answerArg.tokenType !== 'Bearer'
63
+ || !isText(answerArg.accessToken)
64
+ || !isText(answerArg.refreshToken)
65
+ || !isTime(answerArg.accessTokenExpiresAt)
66
+ || !isTime(answerArg.expiresIn)
67
+ || answerArg.expiresIn <= 0
68
+ || !isTime(answerArg.refreshTokenExpiresAt)
69
+ || !isRecord(answerArg.session)
70
+ || !isText(answerArg.session.sessionId)
71
+ || !isText(answerArg.session.principalId)
72
+ || !isTime(answerArg.session.expiresAt)) {
73
+ return null;
74
+ }
75
+ return {
76
+ tokenType: 'Bearer',
77
+ accessToken: answerArg.accessToken,
78
+ accessTokenExpiresAt: answerArg.accessTokenExpiresAt,
79
+ expiresIn: answerArg.expiresIn,
80
+ refreshToken: answerArg.refreshToken,
81
+ refreshTokenExpiresAt: answerArg.refreshTokenExpiresAt,
82
+ session: {
83
+ sessionId: answerArg.session.sessionId,
84
+ principalId: answerArg.session.principalId,
85
+ expiresAt: answerArg.session.expiresAt,
86
+ },
87
+ };
88
+ };
89
+ /**
90
+ * The browser side of bearer hand-off (`@idp.global/sdk/relyingparty`
91
+ * `bearer`): it starts a `web` or `popup` login with PKCE and a state,
92
+ * receives the delivery, claims the code once and keeps the token pair in
93
+ * the application's storage. Every refresh, logout and store of a claimed
94
+ * pair holds one Web Lock, so the tabs of an origin rotate the pair one at a
95
+ * time: inside the lock the pair is read from storage again, a pair another
96
+ * tab rotated is used as it is, and a rotated pair is stored before the lock
97
+ * is released and before its access token is handed out. Each claim and
98
+ * each section that holds the lock ends by `requestTimeoutMs`, so a hanging
99
+ * request or write never holds the other tabs. A login replaces the stored
100
+ * pair and ends that pair's session. Rotation is strict at the relying
101
+ * party: a refresh token spent once ends the session when it comes back, so
102
+ * nothing here retries a claim or a refresh.
103
+ *
104
+ * It needs the Web Locks API and Web Crypto, both of them only in a secure
105
+ * context, and has no fallback for either.
106
+ */
107
+ export class RelyingPartyBearerClient {
108
+ origin;
109
+ #paths;
110
+ #storage;
111
+ #lockName;
112
+ #refreshSkewMs;
113
+ #requestTimeoutMs;
114
+ #locks;
115
+ #fetch;
116
+ #window;
117
+ #now;
118
+ /** the states of the logins received here; a login is received once */
119
+ #receivedStates = new Set();
120
+ constructor(optionsArg) {
121
+ const origin = optionsArg?.origin;
122
+ let parsedOrigin = null;
123
+ try {
124
+ parsedOrigin = typeof origin === 'string' ? new URL(origin) : null;
125
+ }
126
+ catch {
127
+ parsedOrigin = null;
128
+ }
129
+ if (!parsedOrigin || parsedOrigin.origin !== origin || !['https:', 'http:'].includes(parsedOrigin.protocol)) {
130
+ throw new Error('origin must be the relying party\'s exact origin, such as https://app.example');
131
+ }
132
+ const prefix = optionsArg.loginPathPrefix ?? DEFAULT_LOGIN_PATH_PREFIX;
133
+ if (typeof prefix !== 'string' || !/^\/(?:[A-Za-z0-9._~-]+\/)*$/u.test(prefix)) {
134
+ throw new Error('loginPathPrefix must be a path that starts and ends with /');
135
+ }
136
+ const storage = optionsArg.storage;
137
+ if (!storage || typeof storage.get !== 'function' || typeof storage.set !== 'function' || typeof storage.clear !== 'function') {
138
+ throw new Error('storage must have get, set and clear');
139
+ }
140
+ const locks = optionsArg.locks ?? globalThis.navigator?.locks;
141
+ if (!locks || typeof locks.request !== 'function') {
142
+ throw new Error('RelyingPartyBearerClient needs the Web Locks API (navigator.locks)');
143
+ }
144
+ if (typeof globalThis.crypto?.subtle?.digest !== 'function' || typeof globalThis.crypto.getRandomValues !== 'function') {
145
+ throw new Error('RelyingPartyBearerClient needs Web Crypto (crypto.subtle), which a browser offers only in a secure context');
146
+ }
147
+ const fetchFunction = optionsArg.fetch ?? globalThis.fetch?.bind(globalThis);
148
+ if (typeof fetchFunction !== 'function') {
149
+ throw new Error('RelyingPartyBearerClient needs fetch');
150
+ }
151
+ const refreshSkewMs = optionsArg.refreshSkewMs ?? DEFAULT_REFRESH_SKEW_MS;
152
+ if (!Number.isInteger(refreshSkewMs) || refreshSkewMs < 0) {
153
+ throw new Error('refreshSkewMs must be a whole number of milliseconds');
154
+ }
155
+ // only an absent deadline takes the default: any other value that is not one throws
156
+ const requestTimeoutMs = optionsArg.requestTimeoutMs === undefined ? DEFAULT_REQUEST_TIMEOUT_MS : optionsArg.requestTimeoutMs;
157
+ if (typeof requestTimeoutMs !== 'number'
158
+ || !Number.isFinite(requestTimeoutMs)
159
+ || requestTimeoutMs <= 0
160
+ || requestTimeoutMs > MAX_REQUEST_TIMEOUT_MS) {
161
+ throw new Error(`requestTimeoutMs must be more than 0 and at most ${MAX_REQUEST_TIMEOUT_MS} milliseconds`);
162
+ }
163
+ this.origin = origin;
164
+ this.#paths = {
165
+ login: `${origin}${prefix}bearer/login`,
166
+ claim: `${origin}${prefix}bearer/claim`,
167
+ refresh: `${origin}${prefix}bearer/refresh`,
168
+ logout: `${origin}${prefix}bearer/logout`,
169
+ };
170
+ this.#storage = storage;
171
+ this.#lockName = optionsArg.lockName ?? `idp.global/relyingparty:bearer-tokens ${origin}`;
172
+ this.#refreshSkewMs = refreshSkewMs;
173
+ this.#requestTimeoutMs = requestTimeoutMs;
174
+ this.#locks = locks;
175
+ this.#fetch = fetchFunction;
176
+ this.#window = optionsArg.window ?? globalThis.window;
177
+ this.#now = optionsArg.now ?? Date.now;
178
+ }
179
+ /**
180
+ * A new login: a fresh verifier, its S256 challenge and a state, each from
181
+ * 32 random bytes, and the URL that starts it. Make a popup login before
182
+ * the click that opens it: this is async, and a browser opens a popup only
183
+ * within the user's gesture.
184
+ */
185
+ async createLogin(optionsArg) {
186
+ const { clientKind, returnTarget } = optionsArg ?? {};
187
+ if (clientKind !== 'web' && clientKind !== 'popup') {
188
+ throw new Error('a browser signs in as a web or popup client');
189
+ }
190
+ if (!isText(returnTarget)) {
191
+ throw new Error('returnTarget must name the configured return target');
192
+ }
193
+ const codeVerifier = randomBase64Url();
194
+ const state = randomBase64Url();
195
+ const url = new URL(this.#paths.login);
196
+ url.searchParams.set('client_kind', clientKind);
197
+ url.searchParams.set('return_target', returnTarget);
198
+ url.searchParams.set('code_challenge', await pkceChallengeOf(codeVerifier));
199
+ url.searchParams.set('code_challenge_method', 'S256');
200
+ url.searchParams.set('state', state);
201
+ return { clientKind, returnTarget, state, codeVerifier, url: url.href };
202
+ }
203
+ /**
204
+ * Receives a `web` login on its return target page. The delivery leaves
205
+ * the address first, before anything is checked, so neither a reload nor
206
+ * the history holds the code. A delivery whose state is not the login's is
207
+ * refused unclaimed; a code is claimed once, and a failed claim is not
208
+ * retried. The claimed pair replaces the stored one, whose session is
209
+ * ended then (`IRelyingPartyBearerLoginResult`). Answers `null` on a page
210
+ * that holds no delivery.
211
+ */
212
+ async completeRedirectLogin(loginArg) {
213
+ const window = this.requireWindow();
214
+ const url = new URL(window.location.href);
215
+ if (!DELIVERY_PARAMS.some((nameArg) => url.searchParams.has(nameArg))) {
216
+ return null;
217
+ }
218
+ const delivered = url.searchParams;
219
+ const code = singleParam(delivered, 'code');
220
+ const error = singleParam(delivered, 'error');
221
+ const state = singleParam(delivered, 'state');
222
+ const kept = new URL(url.href);
223
+ for (const name of DELIVERY_PARAMS) {
224
+ kept.searchParams.delete(name);
225
+ }
226
+ window.history.replaceState(window.history.state, '', kept.pathname + kept.search + kept.hash);
227
+ if (!loginArg || loginArg.clientKind !== 'web' || state === undefined || state !== loginArg.state) {
228
+ throw new RelyingPartyBearerClientError('state_mismatch');
229
+ }
230
+ return this.receive(loginArg, code, error);
231
+ }
232
+ /**
233
+ * Opens a `popup` login and receives what its page posts: a message is
234
+ * taken only from the relying party's origin, from this very popup, of the
235
+ * bearer message type and with the login's state; any other is ignored.
236
+ * The popup opens before this returns, so call it in the click handler
237
+ * itself, with a login made beforehand. The claimed pair replaces the
238
+ * stored one like `completeRedirectLogin`'s.
239
+ */
240
+ openPopupLogin(loginArg, optionsArg = {}) {
241
+ let window;
242
+ try {
243
+ window = this.requireWindow();
244
+ if (!loginArg || loginArg.clientKind !== 'popup') {
245
+ throw new Error('openPopupLogin needs a popup login');
246
+ }
247
+ if (this.#receivedStates.has(loginArg.state)) {
248
+ throw new RelyingPartyBearerClientError('already_received');
249
+ }
250
+ }
251
+ catch (error) {
252
+ return Promise.reject(error);
253
+ }
254
+ let popup;
255
+ try {
256
+ popup = window.open(loginArg.url, '_blank', optionsArg.windowFeatures ?? DEFAULT_POPUP_FEATURES);
257
+ }
258
+ catch (error) {
259
+ return Promise.reject(error);
260
+ }
261
+ if (!popup) {
262
+ return Promise.reject(new RelyingPartyBearerClientError('popup_blocked'));
263
+ }
264
+ return this.receivePopup(window, popup, loginArg, optionsArg);
265
+ }
266
+ /**
267
+ * An access token to send right now, or `null` when there is no session.
268
+ * One that is about to end is rotated first, by one tab for all of them.
269
+ */
270
+ async accessToken() {
271
+ const stored = await this.#storage.get();
272
+ if (!stored) {
273
+ return null;
274
+ }
275
+ if (this.isFresh(stored)) {
276
+ return stored.accessToken;
277
+ }
278
+ return (await this.rotate(stored.refreshToken, null))?.accessToken ?? null;
279
+ }
280
+ /**
281
+ * Rotates the pair now — after the relying party refused
282
+ * `rejectedAccessTokenArg`, say — unless another tab already did, and
283
+ * answers the pair to use: `null` once the session is over, which clears
284
+ * the storage. A relying party that cannot refresh right now
285
+ * (`authority_unavailable`) keeps the pair as it is; try again later.
286
+ */
287
+ async refresh(rejectedAccessTokenArg) {
288
+ const stored = await this.#storage.get();
289
+ if (!stored) {
290
+ return null;
291
+ }
292
+ return this.rotate(stored.refreshToken, rejectedAccessTokenArg ?? null);
293
+ }
294
+ /**
295
+ * Clears the storage and then ends the session at the relying party with
296
+ * the pair it held, and answers whether that ended a live session. When the
297
+ * relying party cannot be reached, refuses or gives no answer by
298
+ * `requestTimeoutMs`, the call throws `session_not_revoked` with that
299
+ * failure as its `cause`: this device is signed out, and the session may
300
+ * live on at the relying party until it expires, so tell the user they are
301
+ * signed out on this device only. A deadline that fires before the storage
302
+ * is cleared throws `request_failed`, and the pair stays.
303
+ */
304
+ async logout() {
305
+ let cleared = false;
306
+ const notRevoked = (errorArg) => new RelyingPartyBearerClientError('session_not_revoked', { cause: errorArg });
307
+ return this.#locks.request(this.#lockName, () => this.withDeadline(async (signalArg) => {
308
+ const current = await this.#storage.get();
309
+ if (!current) {
310
+ return false;
311
+ }
312
+ inTime(signalArg);
313
+ await this.#storage.clear({ signal: signalArg });
314
+ cleared = true;
315
+ try {
316
+ return await this.endSessionOf(current, signalArg);
317
+ }
318
+ catch (error) {
319
+ throw notRevoked(error);
320
+ }
321
+ }, () => {
322
+ // once the pair is cleared this device is signed out, whatever the request still does
323
+ const failure = new RelyingPartyBearerClientError('request_failed');
324
+ throw cleared ? notRevoked(failure) : failure;
325
+ }));
326
+ }
327
+ requireWindow() {
328
+ if (!this.#window) {
329
+ throw new Error('the login receivers of RelyingPartyBearerClient need a window');
330
+ }
331
+ return this.#window;
332
+ }
333
+ isFresh(storedArg) {
334
+ const lifetimeMs = storedArg.expiresIn * 1_000;
335
+ const skewMs = Math.min(this.#refreshSkewMs, lifetimeMs / 2);
336
+ return this.#now() < storedArg.receivedAt + lifetimeMs - skewMs;
337
+ }
338
+ /** Takes a delivery for its login, once, claims its code and stores the pair in place of the one before. */
339
+ async receive(loginArg, codeArg, errorArg) {
340
+ if (this.#receivedStates.has(loginArg.state)) {
341
+ throw new RelyingPartyBearerClientError('already_received');
342
+ }
343
+ this.#receivedStates.add(loginArg.state);
344
+ if (errorArg !== undefined) {
345
+ throw new RelyingPartyBearerClientError(isText(errorArg) && codeArg === undefined ? 'login_failed' : 'unexpected_answer', {
346
+ ...(isText(errorArg) ? { deliveryError: errorArg } : {}),
347
+ });
348
+ }
349
+ if (!isText(codeArg)) {
350
+ throw new RelyingPartyBearerClientError('unexpected_answer');
351
+ }
352
+ // the claim touches no stored pair, so it holds no lock, only its own deadline; a failed one leaves the stored pair as it was
353
+ const answer = tokenAnswerOf(await this.withDeadline((signalArg) => this.post(this.#paths.claim, { code: codeArg, codeVerifier: loginArg.codeVerifier }, {}, signalArg)));
354
+ if (!answer) {
355
+ throw new RelyingPartyBearerClientError('unexpected_answer', { status: 200 });
356
+ }
357
+ return this.replacePair({ ...answer, receivedAt: this.#now() });
358
+ }
359
+ /**
360
+ * Stores a claimed pair in place of the stored one and then ends the
361
+ * session of that one with its tokens, held here, through the logout
362
+ * route. Both run under the lock a refresh holds, so no tab rotates the
363
+ * replaced pair meanwhile. A session that cannot be ended is the result's
364
+ * `previous_session_not_revoked`, neither thrown nor dropped: the new pair
365
+ * is stored by then.
366
+ */
367
+ replacePair(tokensArg) {
368
+ /** what the login answers if the deadline fires now: nothing before the pair is stored */
369
+ let atDeadline = null;
370
+ const notRevoked = (errorArg) => ({
371
+ tokens: tokensArg,
372
+ previousSession: 'previous_session_not_revoked',
373
+ previousSessionError: errorArg instanceof RelyingPartyBearerClientError
374
+ ? errorArg
375
+ : new RelyingPartyBearerClientError('unexpected_answer', { cause: errorArg }),
376
+ });
377
+ return this.#locks.request(this.#lockName, () => this.withDeadline(async (signalArg) => {
378
+ const previous = await this.#storage.get();
379
+ inTime(signalArg);
380
+ await this.#storage.set(tokensArg, { signal: signalArg });
381
+ if (!previous) {
382
+ return { tokens: tokensArg, previousSession: 'no_previous_session' };
383
+ }
384
+ if (previous.session.sessionId === tokensArg.session.sessionId) {
385
+ return { tokens: tokensArg, previousSession: 'same_session' };
386
+ }
387
+ atDeadline = notRevoked(new RelyingPartyBearerClientError('request_failed'));
388
+ try {
389
+ await this.endSessionOf(previous, signalArg);
390
+ return { tokens: tokensArg, previousSession: 'previous_session_ended' };
391
+ }
392
+ catch (error) {
393
+ return notRevoked(error);
394
+ }
395
+ }, () => {
396
+ // past its write the login stands; only the end of the previous session is cut short
397
+ if (!atDeadline) {
398
+ throw new RelyingPartyBearerClientError('request_failed');
399
+ }
400
+ return atDeadline;
401
+ }));
402
+ }
403
+ receivePopup(windowArg, popupArg, loginArg, optionsArg) {
404
+ return new Promise((resolve, reject) => {
405
+ const cleanups = [];
406
+ let settled = false;
407
+ const settle = (actionArg) => {
408
+ if (settled) {
409
+ return;
410
+ }
411
+ settled = true;
412
+ for (const cleanup of cleanups) {
413
+ cleanup();
414
+ }
415
+ actionArg();
416
+ };
417
+ const fail = (errorArg) => settle(() => reject(errorArg));
418
+ const onMessage = (eventArg) => {
419
+ const data = eventArg?.data;
420
+ if (eventArg?.origin !== this.origin
421
+ || eventArg.source !== popupArg
422
+ || !isRecord(data)
423
+ || data.type !== RELYING_PARTY_BEARER_MESSAGE_TYPE
424
+ || data.state !== loginArg.state) {
425
+ return;
426
+ }
427
+ settle(() => {
428
+ this.receive(loginArg, data.code, data.error).then(resolve, reject);
429
+ });
430
+ };
431
+ windowArg.addEventListener('message', onMessage);
432
+ cleanups.push(() => windowArg.removeEventListener('message', onMessage));
433
+ const timeout = setTimeout(() => fail(new RelyingPartyBearerClientError('popup_timeout')), optionsArg.timeoutMs ?? DEFAULT_POPUP_TIMEOUT_MS);
434
+ cleanups.push(() => clearTimeout(timeout));
435
+ let closedGrace;
436
+ const closedPoll = setInterval(() => {
437
+ if (popupArg.closed && closedGrace === undefined) {
438
+ closedGrace = setTimeout(() => fail(new RelyingPartyBearerClientError('popup_closed')), POPUP_CLOSED_GRACE_MS);
439
+ }
440
+ }, POPUP_CLOSED_POLL_MS);
441
+ cleanups.push(() => {
442
+ clearInterval(closedPoll);
443
+ if (closedGrace !== undefined) {
444
+ clearTimeout(closedGrace);
445
+ }
446
+ });
447
+ const signal = optionsArg.signal;
448
+ if (signal) {
449
+ if (signal.aborted) {
450
+ fail(signal.reason);
451
+ return;
452
+ }
453
+ const onAbort = () => fail(signal.reason);
454
+ signal.addEventListener('abort', onAbort, { once: true });
455
+ cleanups.push(() => signal.removeEventListener('abort', onAbort));
456
+ }
457
+ });
458
+ }
459
+ /**
460
+ * One rotation under the lock. The pair is read again inside it: one
461
+ * whose refresh token is no longer `seenRefreshTokenArg`, or whose access
462
+ * token is no longer `rejectedAccessTokenArg`, was rotated already and is
463
+ * used as it is. A rotated pair is stored before the lock is released. The
464
+ * whole section has one deadline: past it, the lock is released with
465
+ * `request_failed` and an answer that still arrives is dropped unstored.
466
+ */
467
+ rotate(seenRefreshTokenArg, rejectedAccessTokenArg) {
468
+ return this.#locks.request(this.#lockName, () => this.withDeadline(async (signalArg) => {
469
+ const current = await this.#storage.get();
470
+ if (!current) {
471
+ return null;
472
+ }
473
+ if (current.refreshToken !== seenRefreshTokenArg
474
+ || (rejectedAccessTokenArg !== null && current.accessToken !== rejectedAccessTokenArg)) {
475
+ return current;
476
+ }
477
+ let answer;
478
+ try {
479
+ answer = tokenAnswerOf(await this.post(this.#paths.refresh, { refreshToken: current.refreshToken }, {}, signalArg));
480
+ }
481
+ catch (error) {
482
+ if (error instanceof RelyingPartyBearerClientError && error.answerError === 'invalid_bearer_grant') {
483
+ // the session is over: this pair opens nothing any more
484
+ inTime(signalArg);
485
+ await this.#storage.clear({ signal: signalArg });
486
+ return null;
487
+ }
488
+ throw error;
489
+ }
490
+ if (!answer) {
491
+ throw new RelyingPartyBearerClientError('unexpected_answer', { status: 200 });
492
+ }
493
+ const stored = { ...answer, receivedAt: this.#now() };
494
+ inTime(signalArg);
495
+ await this.#storage.set(stored, { signal: signalArg });
496
+ return stored;
497
+ }));
498
+ }
499
+ /** Ends the session of a pair through the logout route and answers whether that ended a live one. */
500
+ async endSessionOf(pairArg, signalArg) {
501
+ const answer = await this.post(this.#paths.logout, { refreshToken: pairArg.refreshToken }, { authorization: `Bearer ${pairArg.accessToken}` }, signalArg);
502
+ if (!isRecord(answer) || typeof answer.endedLiveSession !== 'boolean') {
503
+ throw new RelyingPartyBearerClientError('unexpected_answer', { status: 200 });
504
+ }
505
+ return answer.endedLiveSession;
506
+ }
507
+ /**
508
+ * Runs one operation, a claim or a section that holds the lock, under
509
+ * `requestTimeoutMs`. When the deadline fires, the section's signal aborts
510
+ * its request and its storage write and keeps it from writing anything
511
+ * more (`inTime`), and the call answers `onDeadlineArg()` at once, so the
512
+ * lock is released whatever the request or the storage still does.
513
+ */
514
+ async withDeadline(sectionArg, onDeadlineArg = () => {
515
+ throw new RelyingPartyBearerClientError('request_failed');
516
+ }) {
517
+ const controller = new AbortController();
518
+ let timer;
519
+ const deadline = new Promise((resolve, reject) => {
520
+ timer = setTimeout(() => {
521
+ controller.abort(new RelyingPartyBearerClientError('request_failed'));
522
+ try {
523
+ resolve(onDeadlineArg());
524
+ }
525
+ catch (error) {
526
+ reject(error);
527
+ }
528
+ }, this.#requestTimeoutMs);
529
+ });
530
+ const section = sectionArg(controller.signal);
531
+ // past the deadline the section's own end, its aborted request among them, has nobody left to answer
532
+ section.catch(() => undefined);
533
+ try {
534
+ return await Promise.race([section, deadline]);
535
+ }
536
+ finally {
537
+ clearTimeout(timer);
538
+ }
539
+ }
540
+ /**
541
+ * A bearer API call: JSON in, JSON out, no cookie, no cache, no redirect.
542
+ * With `signalArg` none is sent past the deadline and an answer that
543
+ * arrives after it counts as none.
544
+ */
545
+ async post(urlArg, bodyArg, headersArg = {}, signalArg) {
546
+ if (signalArg) {
547
+ inTime(signalArg);
548
+ }
549
+ let response;
550
+ try {
551
+ response = await this.#fetch(urlArg, {
552
+ method: 'POST',
553
+ headers: { 'content-type': 'application/json', ...headersArg },
554
+ body: JSON.stringify(bodyArg),
555
+ credentials: 'omit',
556
+ cache: 'no-store',
557
+ redirect: 'error',
558
+ referrerPolicy: 'no-referrer',
559
+ ...(signalArg ? { signal: signalArg } : {}),
560
+ });
561
+ }
562
+ catch (error) {
563
+ throw new RelyingPartyBearerClientError('request_failed', { cause: error });
564
+ }
565
+ let answer;
566
+ try {
567
+ answer = await response.json();
568
+ }
569
+ catch {
570
+ // the parse error is not kept: its message quotes the body
571
+ answer = undefined;
572
+ if (signalArg) {
573
+ inTime(signalArg);
574
+ }
575
+ if (response.status === 200) {
576
+ throw new RelyingPartyBearerClientError('unexpected_answer', { status: 200 });
577
+ }
578
+ }
579
+ if (signalArg) {
580
+ inTime(signalArg);
581
+ }
582
+ if (response.status !== 200) {
583
+ throw new RelyingPartyBearerClientError('request_refused', {
584
+ status: response.status,
585
+ ...(isRecord(answer) && isText(answer.error) ? { answerError: answer.error } : {}),
586
+ });
587
+ }
588
+ return answer;
589
+ }
590
+ }
591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWx5aW5ncGFydHliZWFyZXJjbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19icm93c2VyL2NsYXNzZXMucmVseWluZ3BhcnR5YmVhcmVyY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQ0FBaUMsR0FHbEMsTUFBTSx1Q0FBdUMsQ0FBQztBQVkvQyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQztBQXdKN0MsTUFBTSxPQUFPLDZCQUE4QixTQUFRLEtBQUs7SUFRcEMsSUFBSTtJQVBOLE1BQU0sQ0FBVTtJQUNoQyw4RUFBOEU7SUFDOUQsV0FBVyxDQUFVO0lBQ3JDLDBFQUEwRTtJQUMxRCxhQUFhLENBQVU7SUFFdkMsWUFDa0IsSUFBd0MsRUFDeEQsVUFBVSxHQUF1RixFQUFFO1FBRW5HLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBSHRFLElBQUk7UUFJcEIsSUFBSSxDQUFDLElBQUksR0FBRywrQkFBK0IsQ0FBQztRQUM1QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNyRSxJQUFJLFVBQVUsQ0FBQyxXQUFXLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNwRixJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUFFRCxNQUFNLHlCQUF5QixHQUFHLFFBQVEsQ0FBQztBQUMzQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0s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
@@ -1,3 +1,4 @@
1
1
  export * from './classes.idpclient.js';
2
2
  export * from './classes.idprequests.js';
3
3
  export * from './secret-delivery.js';
4
+ export * from './classes.relyingpartybearerclient.js';
@@ -1,4 +1,5 @@
1
1
  export * from './classes.idpclient.js';
2
2
  export * from './classes.idprequests.js';
3
3
  export * from './secret-delivery.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19icm93c2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLHNCQUFzQixDQUFDIn0=
4
+ export * from './classes.relyingpartybearerclient.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19icm93c2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsdUNBQXVDLENBQUMifQ==
@@ -12,4 +12,4 @@ import * as smarttime from '@push.rocks/smarttime';
12
12
  import * as smarturl from '@push.rocks/smarturl';
13
13
  import * as webstore from '@push.rocks/webstore';
14
14
  export { smartjson, smartjwtWeb, smartpromise, smartrx, smarttime, smarturl, webstore };
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2Jyb3dzZXIvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUV6QixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxzQkFBc0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFFN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMifQ==
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2Jyb3dzZXIvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUV6QixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxzQkFBc0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFFN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMifQ==