@plumile/auth 0.1.106

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Plumile and its affiliates.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @plumile/auth
2
+
3
+ Short-lived access token helpers with configurable refresh endpoints and Relay transport integration.
@@ -0,0 +1,32 @@
1
+ export type BuiltInAuthRefreshFailureReason = 'NETWORK_ERROR' | 'TIMEOUT' | 'INVALID_RESPONSE' | 'INVALID_ACCESS_TOKEN' | 'REFRESH_IN_COOLDOWN' | 'SESSION_EXPIRED' | 'CREDENTIALS_REJECTED';
2
+ export type AuthRefreshFailureReason = BuiltInAuthRefreshFailureReason | (string & {});
3
+ export type AuthRefreshState = {
4
+ status: 'anonymous';
5
+ } | {
6
+ status: 'refreshing';
7
+ previousExpiresAtMs?: number;
8
+ } | {
9
+ status: 'authenticated';
10
+ expiresAtMs: number;
11
+ } | {
12
+ status: 'temporarily_unavailable';
13
+ reason: AuthRefreshFailureReason;
14
+ retryAtMs?: number;
15
+ previousExpiresAtMs?: number;
16
+ } | {
17
+ status: 'session_expired';
18
+ reason: AuthRefreshFailureReason;
19
+ };
20
+ export interface AuthRefreshFailure {
21
+ reason: AuthRefreshFailureReason;
22
+ retryable: boolean;
23
+ clearSession: boolean;
24
+ retryAfterMs?: number;
25
+ status?: number;
26
+ message?: string;
27
+ }
28
+ export declare class AuthRefreshError extends Error {
29
+ readonly failure: AuthRefreshFailure;
30
+ constructor(failure: AuthRefreshFailure);
31
+ }
32
+ //# sourceMappingURL=authRefreshState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authRefreshState.d.ts","sourceRoot":"","sources":["../../src/authRefreshState.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,+BAA+B,GACvC,eAAe,GACf,SAAS,GACT,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,iBAAiB,GACjB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,wBAAwB,GAChC,+BAA+B,GAC/B,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChD;IACE,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GACD;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,OAAO,EAAE,kBAAkB,CAAC;gBAEzB,OAAO,EAAE,kBAAkB;CAK/C"}
@@ -0,0 +1,9 @@
1
+ export class AuthRefreshError extends Error {
2
+ failure;
3
+ constructor(failure) {
4
+ super(failure.message ?? failure.reason);
5
+ this.name = 'AuthRefreshError';
6
+ this.failure = failure;
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aFJlZnJlc2hTdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoUmVmcmVzaFN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtDQSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsS0FBSztJQUN6QixPQUFPLENBQXFCO0lBRTVDLFlBQW1CLE9BQTJCO1FBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEJ1aWx0SW5BdXRoUmVmcmVzaEZhaWx1cmVSZWFzb24gPVxuICB8ICdORVRXT1JLX0VSUk9SJ1xuICB8ICdUSU1FT1VUJ1xuICB8ICdJTlZBTElEX1JFU1BPTlNFJ1xuICB8ICdJTlZBTElEX0FDQ0VTU19UT0tFTidcbiAgfCAnUkVGUkVTSF9JTl9DT09MRE9XTidcbiAgfCAnU0VTU0lPTl9FWFBJUkVEJ1xuICB8ICdDUkVERU5USUFMU19SRUpFQ1RFRCc7XG5cbmV4cG9ydCB0eXBlIEF1dGhSZWZyZXNoRmFpbHVyZVJlYXNvbiA9XG4gIHwgQnVpbHRJbkF1dGhSZWZyZXNoRmFpbHVyZVJlYXNvblxuICB8IChzdHJpbmcgJiB7fSk7XG5cbmV4cG9ydCB0eXBlIEF1dGhSZWZyZXNoU3RhdGUgPVxuICB8IHsgc3RhdHVzOiAnYW5vbnltb3VzJyB9XG4gIHwgeyBzdGF0dXM6ICdyZWZyZXNoaW5nJzsgcHJldmlvdXNFeHBpcmVzQXRNcz86IG51bWJlciB9XG4gIHwgeyBzdGF0dXM6ICdhdXRoZW50aWNhdGVkJzsgZXhwaXJlc0F0TXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgc3RhdHVzOiAndGVtcG9yYXJpbHlfdW5hdmFpbGFibGUnO1xuICAgICAgcmVhc29uOiBBdXRoUmVmcmVzaEZhaWx1cmVSZWFzb247XG4gICAgICByZXRyeUF0TXM/OiBudW1iZXI7XG4gICAgICBwcmV2aW91c0V4cGlyZXNBdE1zPzogbnVtYmVyO1xuICAgIH1cbiAgfCB7IHN0YXR1czogJ3Nlc3Npb25fZXhwaXJlZCc7IHJlYXNvbjogQXV0aFJlZnJlc2hGYWlsdXJlUmVhc29uIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFJlZnJlc2hGYWlsdXJlIHtcbiAgcmVhc29uOiBBdXRoUmVmcmVzaEZhaWx1cmVSZWFzb247XG4gIHJldHJ5YWJsZTogYm9vbGVhbjtcbiAgY2xlYXJTZXNzaW9uOiBib29sZWFuO1xuICByZXRyeUFmdGVyTXM/OiBudW1iZXI7XG4gIHN0YXR1cz86IG51bWJlcjtcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhSZWZyZXNoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBmYWlsdXJlOiBBdXRoUmVmcmVzaEZhaWx1cmU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGZhaWx1cmU6IEF1dGhSZWZyZXNoRmFpbHVyZSkge1xuICAgIHN1cGVyKGZhaWx1cmUubWVzc2FnZSA/PyBmYWlsdXJlLnJlYXNvbik7XG4gICAgdGhpcy5uYW1lID0gJ0F1dGhSZWZyZXNoRXJyb3InO1xuICAgIHRoaXMuZmFpbHVyZSA9IGZhaWx1cmU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './authRefreshState.js';
2
+ export * from './refreshTokenClient.js';
3
+ export * from './shortAccessToken.js';
4
+ export * from './relay.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './authRefreshState.js';
2
+ export * from './refreshTokenClient.js';
3
+ export * from './shortAccessToken.js';
4
+ export * from './relay.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1dGhSZWZyZXNoU3RhdGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWZyZXNoVG9rZW5DbGllbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zaG9ydEFjY2Vzc1Rva2VuLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVsYXkuanMnO1xuIl19
@@ -0,0 +1,28 @@
1
+ import type { AuthRefreshFailure } from './authRefreshState.js';
2
+ export interface RefreshTokenClientSuccess {
3
+ ok: true;
4
+ accessToken: string;
5
+ expiresAtMs?: number;
6
+ }
7
+ export interface RefreshTokenClientFailure {
8
+ ok: false;
9
+ failure: AuthRefreshFailure;
10
+ }
11
+ export type RefreshTokenClientResult = RefreshTokenClientSuccess | RefreshTokenClientFailure;
12
+ export type RefreshTokenSuccessParser = (body: unknown, response: Response) => RefreshTokenClientSuccess | null;
13
+ export type RefreshTokenFailureParser = (body: unknown, response: Response) => AuthRefreshFailure | null;
14
+ export interface RefreshTokenClientOptions {
15
+ endpoint: string | URL;
16
+ timeoutMs?: number;
17
+ credentials?: RequestCredentials;
18
+ fetchImpl?: typeof fetch;
19
+ requestInit?: RequestInit | (() => RequestInit | Promise<RequestInit>);
20
+ parseSuccessBody?: RefreshTokenSuccessParser;
21
+ parseFailureBody?: RefreshTokenFailureParser;
22
+ }
23
+ export declare const DEFAULT_REFRESH_TIMEOUT_MS = 10000;
24
+ export declare function parseRetryAfterMs(response: Response): number | undefined;
25
+ export declare function parseDefaultRefreshSuccessBody(body: unknown): RefreshTokenClientSuccess | null;
26
+ export declare function parseDefaultRefreshFailureBody(body: unknown, response: Response): AuthRefreshFailure | null;
27
+ export declare function requestShortAccessToken(options: RefreshTokenClientOptions): Promise<RefreshTokenClientResult>;
28
+ //# sourceMappingURL=refreshTokenClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshTokenClient.d.ts","sourceRoot":"","sources":["../../src/refreshTokenClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,MAAM,wBAAwB,GAChC,yBAAyB,GACzB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,KACf,yBAAyB,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,KACf,kBAAkB,GAAG,IAAI,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACvE,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;CAC9C;AAED,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAYjD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAiBxE;AAKD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,GACZ,yBAAyB,GAAG,IAAI,CAgClC;AAKD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,GACjB,kBAAkB,GAAG,IAAI,CAgC3B;AAiDD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAmDnC"}
@@ -0,0 +1,148 @@
1
+ export const DEFAULT_REFRESH_TIMEOUT_MS = 10_000;
2
+ function isRecord(value) {
3
+ return value != null && typeof value === 'object';
4
+ }
5
+ export function parseRetryAfterMs(response) {
6
+ const value = response.headers.get('Retry-After');
7
+ if (value == null || value.trim() === '') {
8
+ return undefined;
9
+ }
10
+ const seconds = Number(value);
11
+ if (Number.isFinite(seconds) && seconds >= 0) {
12
+ return seconds * 1000;
13
+ }
14
+ const dateMs = Date.parse(value);
15
+ if (Number.isFinite(dateMs)) {
16
+ return Math.max(0, dateMs - Date.now());
17
+ }
18
+ return undefined;
19
+ }
20
+ export function parseDefaultRefreshSuccessBody(body) {
21
+ if (!isRecord(body)) {
22
+ return null;
23
+ }
24
+ if (body.status === 'SUCCESS' &&
25
+ typeof body.access_token === 'string' &&
26
+ body.access_token !== '') {
27
+ let expiresAtMs;
28
+ if (typeof body.expires_at_ms === 'number' &&
29
+ Number.isFinite(body.expires_at_ms)) {
30
+ expiresAtMs = body.expires_at_ms;
31
+ }
32
+ return {
33
+ ok: true,
34
+ accessToken: body.access_token,
35
+ expiresAtMs,
36
+ };
37
+ }
38
+ if (typeof body.access_token === 'string' && body.access_token !== '') {
39
+ return {
40
+ ok: true,
41
+ accessToken: body.access_token,
42
+ };
43
+ }
44
+ return null;
45
+ }
46
+ export function parseDefaultRefreshFailureBody(body, response) {
47
+ if (isRecord(body) &&
48
+ body.status === 'ERROR' &&
49
+ typeof body.reason === 'string' &&
50
+ typeof body.retryable === 'boolean' &&
51
+ typeof body.clear_session === 'boolean') {
52
+ let message;
53
+ if (typeof body.message === 'string') {
54
+ message = body.message;
55
+ }
56
+ return {
57
+ reason: body.reason,
58
+ retryable: body.retryable,
59
+ clearSession: body.clear_session,
60
+ retryAfterMs: parseRetryAfterMs(response),
61
+ status: response.status,
62
+ message,
63
+ };
64
+ }
65
+ if (response.status === 401 || response.status === 403) {
66
+ return {
67
+ reason: 'CREDENTIALS_REJECTED',
68
+ retryable: false,
69
+ clearSession: true,
70
+ status: response.status,
71
+ };
72
+ }
73
+ return null;
74
+ }
75
+ async function readJson(response) {
76
+ return response.json().catch(() => {
77
+ return null;
78
+ });
79
+ }
80
+ function failure(reason, options = {}) {
81
+ return {
82
+ ok: false,
83
+ failure: {
84
+ reason,
85
+ retryable: options.retryable ?? true,
86
+ clearSession: options.clearSession ?? false,
87
+ retryAfterMs: options.retryAfterMs,
88
+ status: options.status,
89
+ message: options.message,
90
+ },
91
+ };
92
+ }
93
+ async function resolveRequestInit(value) {
94
+ if (value == null) {
95
+ return {};
96
+ }
97
+ if (typeof value === 'function') {
98
+ return value();
99
+ }
100
+ return value;
101
+ }
102
+ export async function requestShortAccessToken(options) {
103
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
104
+ const timeoutMs = options.timeoutMs ?? DEFAULT_REFRESH_TIMEOUT_MS;
105
+ const controller = new AbortController();
106
+ const timeout = setTimeout(() => {
107
+ controller.abort();
108
+ }, timeoutMs);
109
+ try {
110
+ const extraInit = await resolveRequestInit(options.requestInit);
111
+ const response = await fetchImpl(options.endpoint, {
112
+ ...extraInit,
113
+ method: extraInit.method ?? 'POST',
114
+ credentials: extraInit.credentials ?? options.credentials ?? 'include',
115
+ signal: controller.signal,
116
+ });
117
+ const body = await readJson(response);
118
+ if (response.ok) {
119
+ const success = (options.parseSuccessBody ?? parseDefaultRefreshSuccessBody)(body, response);
120
+ if (success != null) {
121
+ return success;
122
+ }
123
+ return failure('INVALID_RESPONSE', { status: response.status });
124
+ }
125
+ const parsedFailure = (options.parseFailureBody ?? parseDefaultRefreshFailureBody)(body, response);
126
+ if (parsedFailure != null) {
127
+ return {
128
+ ok: false,
129
+ failure: parsedFailure,
130
+ };
131
+ }
132
+ return failure('INVALID_RESPONSE', {
133
+ retryAfterMs: parseRetryAfterMs(response),
134
+ status: response.status,
135
+ });
136
+ }
137
+ catch (error) {
138
+ let reason = 'NETWORK_ERROR';
139
+ if (error instanceof Error && error.name === 'AbortError') {
140
+ reason = 'TIMEOUT';
141
+ }
142
+ return failure(reason);
143
+ }
144
+ finally {
145
+ clearTimeout(timeout);
146
+ }
147
+ }
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaFRva2VuQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlZnJlc2hUb2tlbkNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF3Q0EsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDO0FBS2pELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUNwRCxDQUFDO0FBS0QsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFFBQWtCO0lBQ2xELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDekMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUtELE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsSUFBYTtJQUViLElBQUksQ0FB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dHlwZSB7XG4gIEF1dGhSZWZyZXNoRmFpbHVyZSxcbiAgQXV0aFJlZnJlc2hGYWlsdXJlUmVhc29uLFxufSBmcm9tICcuL2F1dGhSZWZyZXNoU3RhdGUuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZnJlc2hUb2tlbkNsaWVudFN1Y2Nlc3Mge1xuICBvazogdHJ1ZTtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0F0TXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVmcmVzaFRva2VuQ2xpZW50RmFpbHVyZSB7XG4gIG9rOiBmYWxzZTtcbiAgZmFpbHVyZTogQXV0aFJlZnJlc2hGYWlsdXJlO1xufVxuXG5leHBvcnQgdHlwZSBSZWZyZXNoVG9rZW5DbGllbnRSZXN1bHQgPVxuICB8IFJlZnJlc2hUb2tlbkNsaWVudFN1Y2Nlc3NcbiAgfCBSZWZyZXNoVG9rZW5DbGllbnRGYWlsdXJlO1xuXG5leHBvcnQgdHlwZSBSZWZyZXNoVG9rZW5TdWNjZXNzUGFyc2VyID0gKFxuICBib2R5OiB1bmtub3duLFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4pID0+IFJlZnJlc2hUb2tlbkNsaWVudFN1Y2Nlc3MgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBSZWZyZXNoVG9rZW5GYWlsdXJlUGFyc2VyID0gKFxuICBib2R5OiB1bmtub3duLFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4pID0+IEF1dGhSZWZyZXNoRmFpbHVyZSB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVmcmVzaFRva2VuQ2xpZW50T3B0aW9ucyB7XG4gIGVuZHBvaW50OiBzdHJpbmcgfCBVUkw7XG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgY3JlZGVudGlhbHM/OiBSZXF1ZXN0Q3JlZGVudGlhbHM7XG4gIGZldGNoSW1wbD86IHR5cGVvZiBmZXRjaDtcbiAgcmVxdWVzdEluaXQ/OiBSZXF1ZXN0SW5pdCB8ICgoKSA9PiBSZXF1ZXN0SW5pdCB8IFByb21pc2U8UmVxdWVzdEluaXQ+KTtcbiAgcGFyc2VTdWNjZXNzQm9keT86IFJlZnJlc2hUb2tlblN1Y2Nlc3NQYXJzZXI7XG4gIHBhcnNlRmFpbHVyZUJvZHk/OiBSZWZyZXNoVG9rZW5GYWlsdXJlUGFyc2VyO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUZSRVNIX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlck1zKHJlc3BvbnNlOiBSZXNwb25zZSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJyk7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcih2YWx1ZSk7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vjb25kcykgJiYgc2Vjb25kcyA+PSAwKSB7XG4gICAgcmV0dXJuIHNlY29uZHMgKiAxMDAwO1xuICB9XG5cbiAgY29uc3QgZGF0ZU1zID0gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoZGF0ZU1zKSkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBkYXRlTXMgLSBEYXRlLm5vdygpKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVmYXVsdFJlZnJlc2hTdWNjZXNzQm9keShcbiAgYm9keTogdW5rbm93bixcbik6IFJlZnJlc2hUb2tlbkNsaWVudFN1Y2Nlc3MgfCBudWxsIHtcbiAgaWYgKCFpc1JlY29yZChib2R5KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIGJvZHkuc3RhdHVzID09PSAnU1VDQ0VTUycgJiZcbiAgICB0eXBlb2YgYm9keS5hY2Nlc3NfdG9rZW4gPT09ICdzdHJpbmcnICYmXG4gICAgYm9keS5hY2Nlc3NfdG9rZW4gIT09ICcnXG4gICkge1xuICAgIGxldCBleHBpcmVzQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBib2R5LmV4cGlyZXNfYXRfbXMgPT09ICdudW1iZXInICYmXG4gICAgICBOdW1iZXIuaXNGaW5pdGUoYm9keS5leHBpcmVzX2F0X21zKVxuICAgICkge1xuICAgICAgZXhwaXJlc0F0TXMgPSBib2R5LmV4cGlyZXNfYXRfbXM7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvazogdHJ1ZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBib2R5LmFjY2Vzc190b2tlbixcbiAgICAgIGV4cGlyZXNBdE1zLFxuICAgIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGJvZHkuYWNjZXNzX3Rva2VuID09PSAnc3RyaW5nJyAmJiBib2R5LmFjY2Vzc190b2tlbiAhPT0gJycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHRydWUsXG4gICAgICBhY2Nlc3NUb2tlbjogYm9keS5hY2Nlc3NfdG9rZW4sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlZmF1bHRSZWZyZXNoRmFpbHVyZUJvZHkoXG4gIGJvZHk6IHVua25vd24sXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbik6IEF1dGhSZWZyZXNoRmFpbHVyZSB8IG51bGwge1xuICBpZiAoXG4gICAgaXNSZWNvcmQoYm9keSkgJiZcbiAgICBib2R5LnN0YXR1cyA9PT0gJ0VSUk9SJyAmJlxuICAgIHR5cGVvZiBib2R5LnJlYXNvbiA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgYm9keS5yZXRyeWFibGUgPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBib2R5LmNsZWFyX3Nlc3Npb24gPT09ICdib29sZWFuJ1xuICApIHtcbiAgICBsZXQgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgYm9keS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZSA9IGJvZHkubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYXNvbjogYm9keS5yZWFzb24sXG4gICAgICByZXRyeWFibGU6IGJvZHkucmV0cnlhYmxlLFxuICAgICAgY2xlYXJTZXNzaW9uOiBib2R5LmNsZWFyX3Nlc3Npb24sXG4gICAgICByZXRyeUFmdGVyTXM6IHBhcnNlUmV0cnlBZnRlck1zKHJlc3BvbnNlKSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYXNvbjogJ0NSRURFTlRJQUxTX1JFSkVDVEVEJyxcbiAgICAgIHJldHJ5YWJsZTogZmFsc2UsXG4gICAgICBjbGVhclNlc3Npb246IHRydWUsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEpzb24ocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4ge1xuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBmYWlsdXJlKFxuICByZWFzb246IEF1dGhSZWZyZXNoRmFpbHVyZVJlYXNvbixcbiAgb3B0aW9uczogUGFydGlhbDxBdXRoUmVmcmVzaEZhaWx1cmU+ID0ge30sXG4pOiBSZWZyZXNoVG9rZW5DbGllbnRGYWlsdXJlIHtcbiAgcmV0dXJuIHtcbiAgICBvazogZmFsc2UsXG4gICAgZmFpbHVyZToge1xuICAgICAgcmVhc29uLFxuICAgICAgcmV0cnlhYmxlOiBvcHRpb25zLnJldHJ5YWJsZSA/PyB0cnVlLFxuICAgICAgY2xlYXJTZXNzaW9uOiBvcHRpb25zLmNsZWFyU2Vzc2lvbiA/PyBmYWxzZSxcbiAgICAgIHJldHJ5QWZ0ZXJNczogb3B0aW9ucy5yZXRyeUFmdGVyTXMsXG4gICAgICBzdGF0dXM6IG9wdGlvbnMuc3RhdHVzLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlcXVlc3RJbml0KFxuICB2YWx1ZTogUmVmcmVzaFRva2VuQ2xpZW50T3B0aW9uc1sncmVxdWVzdEluaXQnXSxcbik6IFByb21pc2U8UmVxdWVzdEluaXQ+IHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWx1ZSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFNob3J0QWNjZXNzVG9rZW4oXG4gIG9wdGlvbnM6IFJlZnJlc2hUb2tlbkNsaWVudE9wdGlvbnMsXG4pOiBQcm9taXNlPFJlZnJlc2hUb2tlbkNsaWVudFJlc3VsdD4ge1xuICBjb25zdCBmZXRjaEltcGwgPSBvcHRpb25zLmZldGNoSW1wbCA/PyBnbG9iYWxUaGlzLmZldGNoO1xuICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyBERUZBVUxUX1JFRlJFU0hfVElNRU9VVF9NUztcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgdGltZW91dE1zKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGV4dHJhSW5pdCA9IGF3YWl0IHJlc29sdmVSZXF1ZXN0SW5pdChvcHRpb25zLnJlcXVlc3RJbml0KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoSW1wbChvcHRpb25zLmVuZHBvaW50LCB7XG4gICAgICAuLi5leHRyYUluaXQsXG4gICAgICBtZXRob2Q6IGV4dHJhSW5pdC5tZXRob2QgPz8gJ1BPU1QnLFxuICAgICAgY3JlZGVudGlhbHM6IGV4dHJhSW5pdC5jcmVkZW50aWFscyA/PyBvcHRpb25zLmNyZWRlbnRpYWxzID8/ICdpbmNsdWRlJyxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRKc29uKHJlc3BvbnNlKTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IChcbiAgICAgICAgb3B0aW9ucy5wYXJzZVN1Y2Nlc3NCb2R5ID8/IHBhcnNlRGVmYXVsdFJlZnJlc2hTdWNjZXNzQm9keVxuICAgICAgKShib2R5LCByZXNwb25zZSk7XG4gICAgICBpZiAoc3VjY2VzcyAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhaWx1cmUoJ0lOVkFMSURfUkVTUE9OU0UnLCB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZEZhaWx1cmUgPSAoXG4gICAgICBvcHRpb25zLnBhcnNlRmFpbHVyZUJvZHkgPz8gcGFyc2VEZWZhdWx0UmVmcmVzaEZhaWx1cmVCb2R5XG4gICAgKShib2R5LCByZXNwb25zZSk7XG4gICAgaWYgKHBhcnNlZEZhaWx1cmUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICBmYWlsdXJlOiBwYXJzZWRGYWlsdXJlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFpbHVyZSgnSU5WQUxJRF9SRVNQT05TRScsIHtcbiAgICAgIHJldHJ5QWZ0ZXJNczogcGFyc2VSZXRyeUFmdGVyTXMocmVzcG9uc2UpLFxuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbGV0IHJlYXNvbjogQXV0aFJlZnJlc2hGYWlsdXJlUmVhc29uID0gJ05FVFdPUktfRVJST1InO1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgcmVhc29uID0gJ1RJTUVPVVQnO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZShyZWFzb24pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,25 @@
1
+ import { type ShortAccessTokenAuthConfig } from './shortAccessToken.js';
2
+ export interface RelayReconnectOptions {
3
+ reason?: string;
4
+ }
5
+ export interface RelayEnvironmentConfiguration {
6
+ httpUrl?: string;
7
+ wsUrl?: string;
8
+ getDataId?: (fieldValue: unknown, typeName: string) => string | null;
9
+ getAuthHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
10
+ }
11
+ export interface ConfigureShortAccessTokenRelayEnvironmentInput {
12
+ httpUrl: string;
13
+ wsUrl: string;
14
+ refreshEndpoint: string | URL;
15
+ auth?: Omit<ShortAccessTokenAuthConfig, 'refreshEndpoint'>;
16
+ getDataId?: (fieldValue: unknown, typeName: string) => string | null;
17
+ configureRelayEnvironment: (options: RelayEnvironmentConfiguration) => void;
18
+ reconnectRelayWebSocket: (options?: RelayReconnectOptions) => void;
19
+ }
20
+ export interface ShortAccessTokenRelayEnvironment {
21
+ resetRelayTransport: () => void;
22
+ dispose: () => void;
23
+ }
24
+ export declare function configureShortAccessTokenRelayEnvironment(input: ConfigureShortAccessTokenRelayEnvironmentInput): ShortAccessTokenRelayEnvironment;
25
+ //# sourceMappingURL=relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,0BAA0B,EAChC,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrE,cAAc,CAAC,EAAE,MACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,8CAA8C;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;IAC3D,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrE,yBAAyB,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAC5E,uBAAuB,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,gCAAgC;IAC/C,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAKD,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,8CAA8C,GACpD,gCAAgC,CAmClC"}
@@ -0,0 +1,27 @@
1
+ import { addShortAccessTokenListener, configureShortAccessTokenAuth, getShortAccessTokenAuthHeaders, installShortAccessTokenGraphqlRetry, } from './shortAccessToken.js';
2
+ const AUTH_REFRESHED_RECONNECT_REASON = 'auth_refreshed';
3
+ export function configureShortAccessTokenRelayEnvironment(input) {
4
+ const { httpUrl, wsUrl, refreshEndpoint, auth, getDataId, configureRelayEnvironment, reconnectRelayWebSocket, } = input;
5
+ configureShortAccessTokenAuth({
6
+ ...auth,
7
+ refreshEndpoint,
8
+ });
9
+ installShortAccessTokenGraphqlRetry(httpUrl);
10
+ configureRelayEnvironment({
11
+ httpUrl,
12
+ wsUrl,
13
+ getDataId,
14
+ getAuthHeaders: getShortAccessTokenAuthHeaders,
15
+ });
16
+ const resetRelayTransport = () => {
17
+ reconnectRelayWebSocket({ reason: AUTH_REFRESHED_RECONNECT_REASON });
18
+ };
19
+ const unsubscribe = addShortAccessTokenListener(() => {
20
+ resetRelayTransport();
21
+ });
22
+ return {
23
+ resetRelayTransport,
24
+ dispose: unsubscribe,
25
+ };
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVsYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDJCQUEyQixFQUMzQiw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLG1DQUFtQyxHQUVwQyxNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE1BQU0sK0JBQStCLEdBQUcsZ0JBQWdCLENBQUM7QUFpQ3pELE1BQU0sVUFBVSx5Q0FBeUMsQ0FDdkQsS0FBcUQ7SUFFckQsTUFBTSxFQUNKLE9BQU8sRUFDUCxLQUFLLEVBQ0wsZUFBZSxFQUNmLElBQUksRUFDSixTQUFTLEVBQ1QseUJBQXlCLEVBQ3pCLHVCQUF1QixHQUN4QixHQUFHLEtBQUssQ0FBQztJQUVWLDZCQUE2QixDQUFDO1FBQzVCLEdBQUcsSUFBSTtRQUNQLGVBQWU7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsbUNBQW1DLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MseUJBQXlCLENBQUM7UUFDeEIsT0FBTztRQUNQLEtBQUs7UUFDTCxTQUFTO1FBQ1QsY0FBYyxFQUFFLDhCQUE4QjtLQUMvQyxDQUFDLENBQUM7SUFFSCxNQUFNLG1CQUFtQixHQUFHLEdBQVMsRUFBRTtRQUNyQyx1QkFBdUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDO0lBRUYsTUFBTSxXQUFXLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxFQUFFO1FBQ25ELG1CQUFtQixFQUFFLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsbUJBQW1CO1FBQ25CLE9BQU8sRUFBRSxXQUFXO0tBQ3JCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWRkU2hvcnRBY2Nlc3NUb2tlbkxpc3RlbmVyLFxuICBjb25maWd1cmVTaG9ydEFjY2Vzc1Rva2VuQXV0aCxcbiAgZ2V0U2hvcnRBY2Nlc3NUb2tlbkF1dGhIZWFkZXJzLFxuICBpbnN0YWxsU2hvcnRBY2Nlc3NUb2tlbkdyYXBocWxSZXRyeSxcbiAgdHlwZSBTaG9ydEFjY2Vzc1Rva2VuQXV0aENvbmZpZyxcbn0gZnJvbSAnLi9zaG9ydEFjY2Vzc1Rva2VuLmpzJztcblxuY29uc3QgQVVUSF9SRUZSRVNIRURfUkVDT05ORUNUX1JFQVNPTiA9ICdhdXRoX3JlZnJlc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXlSZWNvbm5lY3RPcHRpb25zIHtcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF5RW52aXJvbm1lbnRDb25maWd1cmF0aW9uIHtcbiAgaHR0cFVybD86IHN0cmluZztcbiAgd3NVcmw/OiBzdHJpbmc7XG4gIGdldERhdGFJZD86IChmaWVsZFZhbHVlOiB1bmtub3duLCB0eXBlTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCBudWxsO1xuICBnZXRBdXRoSGVhZGVycz86ICgpID0+XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgfCBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ3VyZVNob3J0QWNjZXNzVG9rZW5SZWxheUVudmlyb25tZW50SW5wdXQge1xuICBodHRwVXJsOiBzdHJpbmc7XG4gIHdzVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hFbmRwb2ludDogc3RyaW5nIHwgVVJMO1xuICBhdXRoPzogT21pdDxTaG9ydEFjY2Vzc1Rva2VuQXV0aENvbmZpZywgJ3JlZnJlc2hFbmRwb2ludCc+O1xuICBnZXREYXRhSWQ/OiAoZmllbGRWYWx1ZTogdW5rbm93biwgdHlwZU5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbDtcbiAgY29uZmlndXJlUmVsYXlFbnZpcm9ubWVudDogKG9wdGlvbnM6IFJlbGF5RW52aXJvbm1lbnRDb25maWd1cmF0aW9uKSA9PiB2b2lkO1xuICByZWNvbm5lY3RSZWxheVdlYlNvY2tldDogKG9wdGlvbnM/OiBSZWxheVJlY29ubmVjdE9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hvcnRBY2Nlc3NUb2tlblJlbGF5RW52aXJvbm1lbnQge1xuICByZXNldFJlbGF5VHJhbnNwb3J0OiAoKSA9PiB2b2lkO1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTaG9ydEFjY2Vzc1Rva2VuUmVsYXlFbnZpcm9ubWVudChcbiAgaW5wdXQ6IENvbmZpZ3VyZVNob3J0QWNjZXNzVG9rZW5SZWxheUVudmlyb25tZW50SW5wdXQsXG4pOiBTaG9ydEFjY2Vzc1Rva2VuUmVsYXlFbnZpcm9ubWVudCB7XG4gIGNvbnN0IHtcbiAgICBodHRwVXJsLFxuICAgIHdzVXJsLFxuICAgIHJlZnJlc2hFbmRwb2ludCxcbiAgICBhdXRoLFxuICAgIGdldERhdGFJZCxcbiAgICBjb25maWd1cmVSZWxheUVudmlyb25tZW50LFxuICAgIHJlY29ubmVjdFJlbGF5V2ViU29ja2V0LFxuICB9ID0gaW5wdXQ7XG5cbiAgY29uZmlndXJlU2hvcnRBY2Nlc3NUb2tlbkF1dGgoe1xuICAgIC4uLmF1dGgsXG4gICAgcmVmcmVzaEVuZHBvaW50LFxuICB9KTtcbiAgaW5zdGFsbFNob3J0QWNjZXNzVG9rZW5HcmFwaHFsUmV0cnkoaHR0cFVybCk7XG4gIGNvbmZpZ3VyZVJlbGF5RW52aXJvbm1lbnQoe1xuICAgIGh0dHBVcmwsXG4gICAgd3NVcmwsXG4gICAgZ2V0RGF0YUlkLFxuICAgIGdldEF1dGhIZWFkZXJzOiBnZXRTaG9ydEFjY2Vzc1Rva2VuQXV0aEhlYWRlcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc2V0UmVsYXlUcmFuc3BvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgcmVjb25uZWN0UmVsYXlXZWJTb2NrZXQoeyByZWFzb246IEFVVEhfUkVGUkVTSEVEX1JFQ09OTkVDVF9SRUFTT04gfSk7XG4gIH07XG5cbiAgY29uc3QgdW5zdWJzY3JpYmUgPSBhZGRTaG9ydEFjY2Vzc1Rva2VuTGlzdGVuZXIoKCkgPT4ge1xuICAgIHJlc2V0UmVsYXlUcmFuc3BvcnQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByZXNldFJlbGF5VHJhbnNwb3J0LFxuICAgIGRpc3Bvc2U6IHVuc3Vic2NyaWJlLFxuICB9O1xufVxuIl19
@@ -0,0 +1,40 @@
1
+ import { type AuthRefreshFailureReason, type AuthRefreshState } from './authRefreshState.js';
2
+ import { type RefreshTokenFailureParser, type RefreshTokenSuccessParser } from './refreshTokenClient.js';
3
+ interface CachedAccessToken {
4
+ token: string;
5
+ expiresAtMs: number;
6
+ }
7
+ export type ShortAccessTokenEvent = 'refreshed' | 'cleared';
8
+ export type ShortAccessTokenListener = (event: ShortAccessTokenEvent) => void;
9
+ export type AuthRefreshStateListener = (state: AuthRefreshState) => void;
10
+ export type LogoutResponseMatcher = (payload: unknown, response: Response) => boolean;
11
+ export interface ShortAccessTokenAuthConfig {
12
+ refreshEndpoint: string | URL;
13
+ refreshTimeoutMs?: number;
14
+ refreshCredentials?: RequestCredentials;
15
+ refreshFetch?: typeof fetch;
16
+ refreshRequestInit?: RequestInit | (() => RequestInit | Promise<RequestInit>);
17
+ parseRefreshSuccessBody?: RefreshTokenSuccessParser;
18
+ parseRefreshFailureBody?: RefreshTokenFailureParser;
19
+ refreshSkewMs?: number;
20
+ maxBackoffDelayMs?: number;
21
+ logoutResponseMatcher?: LogoutResponseMatcher;
22
+ }
23
+ export declare function readJwtExpiresAtMs(token: string): number | null;
24
+ declare function isTokenUsable(token: CachedAccessToken, nowMs?: number): boolean;
25
+ export declare function configureShortAccessTokenAuth(nextConfig: ShortAccessTokenAuthConfig): void;
26
+ export declare function clearShortAccessToken(): void;
27
+ export declare function addShortAccessTokenListener(listener: ShortAccessTokenListener): () => void;
28
+ export declare function addAuthRefreshStateListener(listener: AuthRefreshStateListener): () => void;
29
+ export declare function getAuthRefreshState(): AuthRefreshState;
30
+ export declare function refreshShortAccessToken(): Promise<string>;
31
+ export declare function getShortAccessToken(): Promise<string>;
32
+ export declare function getShortAccessTokenAuthHeaders(): Promise<Record<string, string>>;
33
+ export declare function installShortAccessTokenGraphqlRetry(graphqlPath?: string): void;
34
+ export type { AuthRefreshFailureReason, AuthRefreshState };
35
+ export declare const __test: {
36
+ isTokenUsable: typeof isTokenUsable;
37
+ resetForTests(): void;
38
+ resetGraphqlRetryForTests(): void;
39
+ };
40
+ //# sourceMappingURL=shortAccessToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortAccessToken.d.ts","sourceRoot":"","sources":["../../src/shortAccessToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,yBAAyB,CAAC;AAEjC,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAC9E,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,KACf,OAAO,CAAC;AAEb,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,KAAK,CAAC;IAC5B,kBAAkB,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9E,uBAAuB,CAAC,EAAE,yBAAyB,CAAC;IACpD,uBAAuB,CAAC,EAAE,yBAAyB,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C;AAmCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe/D;AAmBD,iBAAS,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,SAAa,GAAG,OAAO,CAE5E;AAkDD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,0BAA0B,GACrC,IAAI,CAIN;AAKD,wBAAgB,qBAAqB,IAAI,IAAI,CAK5C;AAqLD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,GACjC,MAAM,IAAI,CAKZ;AAKD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,GACjC,MAAM,IAAI,CAKZ;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAKD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAM/D;AAKD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE3D;AAKD,wBAAsB,8BAA8B,IAAI,OAAO,CAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB,CASA;AAgFD,wBAAgB,mCAAmC,CACjD,WAAW,SAAiB,GAC3B,IAAI,CA0CN;AAED,YAAY,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,CAAC;AAE3D,eAAO,MAAM,MAAM;;qBAEA,IAAI;iCAYQ,IAAI;CAMlC,CAAC"}
@@ -0,0 +1,359 @@
1
+ import { AuthRefreshError, } from './authRefreshState.js';
2
+ import { requestShortAccessToken, } from './refreshTokenClient.js';
3
+ const DEFAULT_REFRESH_ENDPOINT = '/auth/refresh';
4
+ const DEFAULT_REFRESH_SKEW_MS = 60_000;
5
+ const DEFAULT_MAX_BACKOFF_DELAY_MS = 60_000;
6
+ let config = {
7
+ refreshEndpoint: DEFAULT_REFRESH_ENDPOINT,
8
+ };
9
+ let cachedAccessToken = null;
10
+ let refreshPromise = null;
11
+ let refreshTimer = null;
12
+ let installedFetchWrapper = null;
13
+ let failureCount = 0;
14
+ let retryAtMs = 0;
15
+ let authRefreshState = { status: 'anonymous' };
16
+ const listeners = new Set();
17
+ const stateListeners = new Set();
18
+ function decodeBase64Url(value) {
19
+ const normalized = value.replace(/-/g, '+').replace(/_/g, '/');
20
+ const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');
21
+ return globalThis.atob(padded);
22
+ }
23
+ export function readJwtExpiresAtMs(token) {
24
+ const [, payload] = token.split('.');
25
+ if (payload == null || payload === '') {
26
+ return null;
27
+ }
28
+ try {
29
+ const decoded = JSON.parse(decodeBase64Url(payload));
30
+ if (typeof decoded.exp !== 'number' || !Number.isFinite(decoded.exp)) {
31
+ return null;
32
+ }
33
+ return decoded.exp * 1000;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function getRefreshSkewMs() {
40
+ return config.refreshSkewMs ?? DEFAULT_REFRESH_SKEW_MS;
41
+ }
42
+ function getMaxBackoffDelayMs() {
43
+ return config.maxBackoffDelayMs ?? DEFAULT_MAX_BACKOFF_DELAY_MS;
44
+ }
45
+ function isTokenUsable(token, nowMs = Date.now()) {
46
+ return token.expiresAtMs - getRefreshSkewMs() > nowMs;
47
+ }
48
+ function emit(event) {
49
+ listeners.forEach((listener) => {
50
+ listener(event);
51
+ });
52
+ }
53
+ function emitState(state) {
54
+ authRefreshState = state;
55
+ stateListeners.forEach((listener) => {
56
+ listener(state);
57
+ });
58
+ }
59
+ function clearRefreshTimer() {
60
+ if (refreshTimer != null) {
61
+ clearTimeout(refreshTimer);
62
+ refreshTimer = null;
63
+ }
64
+ }
65
+ function clearCachedToken() {
66
+ cachedAccessToken = null;
67
+ clearRefreshTimer();
68
+ }
69
+ function resetFailureBackoff() {
70
+ failureCount = 0;
71
+ retryAtMs = 0;
72
+ }
73
+ export function configureShortAccessTokenAuth(nextConfig) {
74
+ config = {
75
+ ...nextConfig,
76
+ };
77
+ }
78
+ export function clearShortAccessToken() {
79
+ clearCachedToken();
80
+ resetFailureBackoff();
81
+ emitState({ status: 'anonymous' });
82
+ emit('cleared');
83
+ }
84
+ function scheduleRefresh(token) {
85
+ clearRefreshTimer();
86
+ const delayMs = Math.max(0, token.expiresAtMs - getRefreshSkewMs() - Date.now());
87
+ refreshTimer = setTimeout(() => {
88
+ refreshShortAccessTokenInternal({ force: true }).catch(() => {
89
+ });
90
+ }, delayMs);
91
+ }
92
+ function nextBackoffDelayMs(failure) {
93
+ if (failure.retryAfterMs != null) {
94
+ return failure.retryAfterMs;
95
+ }
96
+ if (failureCount <= 0) {
97
+ return 2_000;
98
+ }
99
+ if (failureCount === 1) {
100
+ return 5_000;
101
+ }
102
+ if (failureCount === 2) {
103
+ return 15_000;
104
+ }
105
+ if (failureCount === 3) {
106
+ return 30_000;
107
+ }
108
+ return getMaxBackoffDelayMs();
109
+ }
110
+ function applyRefreshFailure(failure) {
111
+ if (failure.clearSession) {
112
+ clearCachedToken();
113
+ retryAtMs = Number.POSITIVE_INFINITY;
114
+ emitState({
115
+ status: 'session_expired',
116
+ reason: failure.reason,
117
+ });
118
+ emit('cleared');
119
+ throw new AuthRefreshError(failure);
120
+ }
121
+ let retryAtMsForState;
122
+ if (failure.retryable) {
123
+ retryAtMs = Date.now() + nextBackoffDelayMs(failure);
124
+ retryAtMsForState = retryAtMs;
125
+ }
126
+ else {
127
+ retryAtMs = Number.POSITIVE_INFINITY;
128
+ }
129
+ failureCount += 1;
130
+ emitState({
131
+ status: 'temporarily_unavailable',
132
+ reason: failure.reason,
133
+ retryAtMs: retryAtMsForState,
134
+ previousExpiresAtMs: cachedAccessToken?.expiresAtMs,
135
+ });
136
+ throw new AuthRefreshError(failure);
137
+ }
138
+ function getRefreshClientOptions() {
139
+ return {
140
+ endpoint: config.refreshEndpoint,
141
+ timeoutMs: config.refreshTimeoutMs,
142
+ credentials: config.refreshCredentials,
143
+ fetchImpl: config.refreshFetch,
144
+ requestInit: config.refreshRequestInit,
145
+ parseSuccessBody: config.parseRefreshSuccessBody,
146
+ parseFailureBody: config.parseRefreshFailureBody,
147
+ };
148
+ }
149
+ async function requestAccessToken() {
150
+ const result = await requestShortAccessToken(getRefreshClientOptions());
151
+ if (!result.ok) {
152
+ return applyRefreshFailure(result.failure);
153
+ }
154
+ const expiresAtMs = result.expiresAtMs ?? readJwtExpiresAtMs(result.accessToken);
155
+ if (expiresAtMs == null) {
156
+ return applyRefreshFailure({
157
+ reason: 'INVALID_ACCESS_TOKEN',
158
+ retryable: true,
159
+ clearSession: false,
160
+ });
161
+ }
162
+ resetFailureBackoff();
163
+ return {
164
+ token: result.accessToken,
165
+ expiresAtMs,
166
+ };
167
+ }
168
+ function assertRefreshAllowed() {
169
+ if (authRefreshState.status === 'session_expired') {
170
+ throw new AuthRefreshError({
171
+ reason: 'SESSION_EXPIRED',
172
+ retryable: false,
173
+ clearSession: true,
174
+ });
175
+ }
176
+ if (Date.now() < retryAtMs) {
177
+ throw new AuthRefreshError({
178
+ reason: 'REFRESH_IN_COOLDOWN',
179
+ retryable: true,
180
+ clearSession: false,
181
+ retryAfterMs: retryAtMs - Date.now(),
182
+ });
183
+ }
184
+ }
185
+ async function refreshShortAccessTokenInternal(options) {
186
+ if (options?.force !== true &&
187
+ cachedAccessToken != null &&
188
+ isTokenUsable(cachedAccessToken)) {
189
+ return cachedAccessToken.token;
190
+ }
191
+ assertRefreshAllowed();
192
+ if (refreshPromise != null) {
193
+ return (await refreshPromise).token;
194
+ }
195
+ emitState({
196
+ status: 'refreshing',
197
+ previousExpiresAtMs: cachedAccessToken?.expiresAtMs,
198
+ });
199
+ refreshPromise = requestAccessToken();
200
+ try {
201
+ cachedAccessToken = await refreshPromise;
202
+ scheduleRefresh(cachedAccessToken);
203
+ emitState({
204
+ status: 'authenticated',
205
+ expiresAtMs: cachedAccessToken.expiresAtMs,
206
+ });
207
+ emit('refreshed');
208
+ return cachedAccessToken.token;
209
+ }
210
+ finally {
211
+ refreshPromise = null;
212
+ }
213
+ }
214
+ export function addShortAccessTokenListener(listener) {
215
+ listeners.add(listener);
216
+ return () => {
217
+ listeners.delete(listener);
218
+ };
219
+ }
220
+ export function addAuthRefreshStateListener(listener) {
221
+ stateListeners.add(listener);
222
+ return () => {
223
+ stateListeners.delete(listener);
224
+ };
225
+ }
226
+ export function getAuthRefreshState() {
227
+ return authRefreshState;
228
+ }
229
+ export async function refreshShortAccessToken() {
230
+ if (authRefreshState.status === 'session_expired') {
231
+ resetFailureBackoff();
232
+ emitState({ status: 'anonymous' });
233
+ }
234
+ return refreshShortAccessTokenInternal({ force: true });
235
+ }
236
+ export async function getShortAccessToken() {
237
+ return refreshShortAccessTokenInternal();
238
+ }
239
+ export async function getShortAccessTokenAuthHeaders() {
240
+ try {
241
+ const token = await getShortAccessToken();
242
+ return {
243
+ Authorization: `Bearer ${token}`,
244
+ };
245
+ }
246
+ catch {
247
+ return {};
248
+ }
249
+ }
250
+ function isGraphqlRequest(input, graphqlPath) {
251
+ let url;
252
+ if (typeof input === 'string') {
253
+ url = input;
254
+ }
255
+ else if (input instanceof URL) {
256
+ url = input.toString();
257
+ }
258
+ else {
259
+ url = input.url;
260
+ }
261
+ if (url === graphqlPath) {
262
+ return true;
263
+ }
264
+ try {
265
+ return new URL(url, globalThis.location.origin).pathname === graphqlPath;
266
+ }
267
+ catch {
268
+ return false;
269
+ }
270
+ }
271
+ function asRecord(value) {
272
+ if (value != null && typeof value === 'object') {
273
+ return value;
274
+ }
275
+ return null;
276
+ }
277
+ function defaultLogoutResponseMatcher(payload) {
278
+ const data = asRecord(asRecord(payload)?.data);
279
+ const logout = asRecord(data?.logout);
280
+ const logoutPayload = asRecord(logout?.payload);
281
+ return (logout?.loggedOut === true ||
282
+ logoutPayload?.loggedOut === true ||
283
+ logout?.status === 'SUCCESS');
284
+ }
285
+ async function clearAfterLogoutResponse(response, input, graphqlPath) {
286
+ if (!response.ok || !isGraphqlRequest(input, graphqlPath)) {
287
+ return;
288
+ }
289
+ const payload = await response
290
+ .clone()
291
+ .json()
292
+ .catch(() => {
293
+ return null;
294
+ });
295
+ const matcher = config.logoutResponseMatcher ?? defaultLogoutResponseMatcher;
296
+ if (matcher(payload, response)) {
297
+ clearShortAccessToken();
298
+ }
299
+ }
300
+ export function installShortAccessTokenGraphqlRetry(graphqlPath = '/api/graphql') {
301
+ if (typeof globalThis.fetch !== 'function') {
302
+ return;
303
+ }
304
+ if (installedFetchWrapper != null) {
305
+ installedFetchWrapper.graphqlPath = graphqlPath;
306
+ return;
307
+ }
308
+ const originalFetch = globalThis.fetch.bind(globalThis);
309
+ installedFetchWrapper = {
310
+ graphqlPath,
311
+ originalFetch,
312
+ };
313
+ globalThis.fetch = async (input, init) => {
314
+ const activeWrapper = installedFetchWrapper;
315
+ const activeGraphqlPath = activeWrapper?.graphqlPath ?? graphqlPath;
316
+ const response = await originalFetch(input, init);
317
+ if (response.status !== 401 ||
318
+ !isGraphqlRequest(input, activeGraphqlPath)) {
319
+ await clearAfterLogoutResponse(response, input, activeGraphqlPath);
320
+ return response;
321
+ }
322
+ try {
323
+ const token = await refreshShortAccessTokenInternal({ force: true });
324
+ const headers = new Headers(init?.headers);
325
+ headers.set('Authorization', `Bearer ${token}`);
326
+ const retryResponse = await originalFetch(input, {
327
+ ...init,
328
+ headers,
329
+ });
330
+ await clearAfterLogoutResponse(retryResponse, input, activeGraphqlPath);
331
+ return retryResponse;
332
+ }
333
+ catch {
334
+ return response;
335
+ }
336
+ };
337
+ }
338
+ export const __test = {
339
+ isTokenUsable,
340
+ resetForTests() {
341
+ clearCachedToken();
342
+ resetFailureBackoff();
343
+ authRefreshState = { status: 'anonymous' };
344
+ config = {
345
+ refreshEndpoint: DEFAULT_REFRESH_ENDPOINT,
346
+ };
347
+ if (installedFetchWrapper != null) {
348
+ globalThis.fetch = installedFetchWrapper.originalFetch;
349
+ installedFetchWrapper = null;
350
+ }
351
+ },
352
+ resetGraphqlRetryForTests() {
353
+ if (installedFetchWrapper != null) {
354
+ globalThis.fetch = installedFetchWrapper.originalFetch;
355
+ installedFetchWrapper = null;
356
+ }
357
+ },
358
+ };
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcnRBY2Nlc3NUb2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaG9ydEFjY2Vzc1Rva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsR0FJakIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsdUJBQXVCLEdBSXhCLE1BQU0seUJBQXlCLENBQUM7QUE2QmpDLE1BQU0sd0JBQXdCLEdBQUcsZUFBZSxDQUFDO0FBQ2pELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDLElBQUksTUFBTSxHQUErQjtJQUN2QyxlQUFlLEVBQUUsd0JBQXdCO0NBQzFDLENBQUM7QUFDRixJQUFJLGlCQUFpQixHQUE2QixJQUFJLENBQUM7QUFDdkQsSUFBSSxjQUFjLEdBQXNDLElBQUksQ0FBQztBQUM3RCxJQUFJLFlBQVksR0FBeUMsSUFBSSxDQUFDO0FBQzlELElBQUkscUJBQXFCLEdBR2QsSUFBSSxDQUFDO0FBQ2hCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxnQkFBZ0IsR0FBcUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFFakUsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7QUFDdEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7QUFLM0QsU0FBUyxlQUFlLENBQUMsS0FBYTtJQUNwQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMs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WUFDbEMsVUFBVSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxhQUFhLENBQUM7WUFDdkQscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1dGhSZWZyZXNoRXJyb3IsXG4gIHR5cGUgQXV0aFJlZnJlc2hGYWlsdXJlLFxuICB0eXBlIEF1dGhSZWZyZXNoRmFpbHVyZVJlYXNvbixcbiAgdHlwZSBBdXRoUmVmcmVzaFN0YXRlLFxufSBmcm9tICcuL2F1dGhSZWZyZXNoU3RhdGUuanMnO1xuaW1wb3J0IHtcbiAgcmVxdWVzdFNob3J0QWNjZXNzVG9rZW4sXG4gIHR5cGUgUmVmcmVzaFRva2VuQ2xpZW50T3B0aW9ucyxcbiAgdHlwZSBSZWZyZXNoVG9rZW5GYWlsdXJlUGFyc2VyLFxuICB0eXBlIFJlZnJlc2hUb2tlblN1Y2Nlc3NQYXJzZXIsXG59IGZyb20gJy4vcmVmcmVzaFRva2VuQ2xpZW50LmpzJztcblxuaW50ZXJmYWNlIENhY2hlZEFjY2Vzc1Rva2VuIHtcbiAgdG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0F0TXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2hvcnRBY2Nlc3NUb2tlbkV2ZW50ID0gJ3JlZnJlc2hlZCcgfCAnY2xlYXJlZCc7XG5leHBvcnQgdHlwZSBTaG9ydEFjY2Vzc1Rva2VuTGlzdGVuZXIgPSAoZXZlbnQ6IFNob3J0QWNjZXNzVG9rZW5FdmVudCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEF1dGhSZWZyZXNoU3RhdGVMaXN0ZW5lciA9IChzdGF0ZTogQXV0aFJlZnJlc2hTdGF0ZSkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgTG9nb3V0UmVzcG9uc2VNYXRjaGVyID0gKFxuICBwYXlsb2FkOiB1bmtub3duLFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hvcnRBY2Nlc3NUb2tlbkF1dGhDb25maWcge1xuICByZWZyZXNoRW5kcG9pbnQ6IHN0cmluZyB8IFVSTDtcbiAgcmVmcmVzaFRpbWVvdXRNcz86IG51bWJlcjtcbiAgcmVmcmVzaENyZWRlbnRpYWxzPzogUmVxdWVzdENyZWRlbnRpYWxzO1xuICByZWZyZXNoRmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIHJlZnJlc2hSZXF1ZXN0SW5pdD86IFJlcXVlc3RJbml0IHwgKCgpID0+IFJlcXVlc3RJbml0IHwgUHJvbWlzZTxSZXF1ZXN0SW5pdD4pO1xuICBwYXJzZVJlZnJlc2hTdWNjZXNzQm9keT86IFJlZnJlc2hUb2tlblN1Y2Nlc3NQYXJzZXI7XG4gIHBhcnNlUmVmcmVzaEZhaWx1cmVCb2R5PzogUmVmcmVzaFRva2VuRmFpbHVyZVBhcnNlcjtcbiAgcmVmcmVzaFNrZXdNcz86IG51bWJlcjtcbiAgbWF4QmFja29mZkRlbGF5TXM/OiBudW1iZXI7XG4gIGxvZ291dFJlc3BvbnNlTWF0Y2hlcj86IExvZ291dFJlc3BvbnNlTWF0Y2hlcjtcbn1cblxuY29uc3QgREVGQVVMVF9SRUZSRVNIX0VORFBPSU5UID0gJy9hdXRoL3JlZnJlc2gnO1xuY29uc3QgREVGQVVMVF9SRUZSRVNIX1NLRVdfTVMgPSA2MF8wMDA7XG5jb25zdCBERUZBVUxUX01BWF9CQUNLT0ZGX0RFTEFZX01TID0gNjBfMDAwO1xuXG5sZXQgY29uZmlnOiBTaG9ydEFjY2Vzc1Rva2VuQXV0aENvbmZpZyA9IHtcbiAgcmVmcmVzaEVuZHBvaW50OiBERUZBVUxUX1JFRlJFU0hfRU5EUE9JTlQsXG59O1xubGV0IGNhY2hlZEFjY2Vzc1Rva2VuOiBDYWNoZWRBY2Nlc3NUb2tlbiB8IG51bGwgPSBudWxsO1xubGV0IHJlZnJlc2hQcm9taXNlOiBQcm9taXNlPENhY2hlZEFjY2Vzc1Rva2VuPiB8IG51bGwgPSBudWxsO1xubGV0IHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbmxldCBpbnN0YWxsZWRGZXRjaFdyYXBwZXI6IHtcbiAgZ3JhcGhxbFBhdGg6IHN0cmluZztcbiAgb3JpZ2luYWxGZXRjaDogdHlwZW9mIGZldGNoO1xufSB8IG51bGwgPSBudWxsO1xubGV0IGZhaWx1cmVDb3VudCA9IDA7XG5sZXQgcmV0cnlBdE1zID0gMDtcbmxldCBhdXRoUmVmcmVzaFN0YXRlOiBBdXRoUmVmcmVzaFN0YXRlID0geyBzdGF0dXM6ICdhbm9ueW1vdXMnIH07XG5cbmNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8U2hvcnRBY2Nlc3NUb2tlbkxpc3RlbmVyPigpO1xuY29uc3Qgc3RhdGVMaXN0ZW5lcnMgPSBuZXcgU2V0PEF1dGhSZWZyZXNoU3RhdGVMaXN0ZW5lcj4oKTtcblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBkZWNvZGVCYXNlNjRVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICBjb25zdCBwYWRkZWQgPSBub3JtYWxpemVkLnBhZEVuZChNYXRoLmNlaWwobm9ybWFsaXplZC5sZW5ndGggLyA0KSAqIDQsICc9Jyk7XG4gIHJldHVybiBnbG9iYWxUaGlzLmF0b2IocGFkZGVkKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEp3dEV4cGlyZXNBdE1zKHRva2VuOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgWywgcGF5bG9hZF0gPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAocGF5bG9hZCA9PSBudWxsIHx8IHBheWxvYWQgPT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKGRlY29kZUJhc2U2NFVybChwYXlsb2FkKSkgYXMgeyBleHA/OiB1bmtub3duIH07XG4gICAgaWYgKHR5cGVvZiBkZWNvZGVkLmV4cCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0Zpbml0ZShkZWNvZGVkLmV4cCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb2RlZC5leHAgKiAxMDAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGdldFJlZnJlc2hTa2V3TXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNvbmZpZy5yZWZyZXNoU2tld01zID8/IERFRkFVTFRfUkVGUkVTSF9TS0VXX01TO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGdldE1heEJhY2tvZmZEZWxheU1zKCk6IG51bWJlciB7XG4gIHJldHVybiBjb25maWcubWF4QmFja29mZkRlbGF5TXMgPz8gREVGQVVMVF9NQVhfQkFDS09GRl9ERUxBWV9NUztcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBpc1Rva2VuVXNhYmxlKHRva2VuOiBDYWNoZWRBY2Nlc3NUb2tlbiwgbm93TXMgPSBEYXRlLm5vdygpKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5leHBpcmVzQXRNcyAtIGdldFJlZnJlc2hTa2V3TXMoKSA+IG5vd01zO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGVtaXQoZXZlbnQ6IFNob3J0QWNjZXNzVG9rZW5FdmVudCk6IHZvaWQge1xuICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICBsaXN0ZW5lcihldmVudCk7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdGF0ZShzdGF0ZTogQXV0aFJlZnJlc2hTdGF0ZSk6IHZvaWQge1xuICBhdXRoUmVmcmVzaFN0YXRlID0gc3RhdGU7XG4gIHN0YXRlTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgbGlzdGVuZXIoc3RhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBjbGVhclJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgaWYgKHJlZnJlc2hUaW1lciAhPSBudWxsKSB7XG4gICAgY2xlYXJUaW1lb3V0KHJlZnJlc2hUaW1lcik7XG4gICAgcmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQ2FjaGVkVG9rZW4oKTogdm9pZCB7XG4gIGNhY2hlZEFjY2Vzc1Rva2VuID0gbnVsbDtcbiAgY2xlYXJSZWZyZXNoVGltZXIoKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiByZXNldEZhaWx1cmVCYWNrb2ZmKCk6IHZvaWQge1xuICBmYWlsdXJlQ291bnQgPSAwO1xuICByZXRyeUF0TXMgPSAwO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTaG9ydEFjY2Vzc1Rva2VuQXV0aChcbiAgbmV4dENvbmZpZzogU2hvcnRBY2Nlc3NUb2tlbkF1dGhDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uZmlnID0ge1xuICAgIC4uLm5leHRDb25maWcsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU2hvcnRBY2Nlc3NUb2tlbigpOiB2b2lkIHtcbiAgY2xlYXJDYWNoZWRUb2tlbigpO1xuICByZXNldEZhaWx1cmVCYWNrb2ZmKCk7XG4gIGVtaXRTdGF0ZSh7IHN0YXR1czogJ2Fub255bW91cycgfSk7XG4gIGVtaXQoJ2NsZWFyZWQnKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBzY2hlZHVsZVJlZnJlc2godG9rZW46IENhY2hlZEFjY2Vzc1Rva2VuKTogdm9pZCB7XG4gIGNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1heChcbiAgICAwLFxuICAgIHRva2VuLmV4cGlyZXNBdE1zIC0gZ2V0UmVmcmVzaFNrZXdNcygpIC0gRGF0ZS5ub3coKSxcbiAgKTtcbiAgcmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAtLSBEZWZlcnJlZCB0aW1lciBjYWxsYmFjay5cbiAgICByZWZyZXNoU2hvcnRBY2Nlc3NUb2tlbkludGVybmFsKHsgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gVGhlIHN0YXRlIG1hY2hpbmUgcmVjb3JkcyBzY2hlZHVsZWQgcmVmcmVzaCBmYWlsdXJlcy5cbiAgICB9KTtcbiAgfSwgZGVsYXlNcyk7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gbmV4dEJhY2tvZmZEZWxheU1zKGZhaWx1cmU6IEF1dGhSZWZyZXNoRmFpbHVyZSk6IG51bWJlciB7XG4gIGlmIChmYWlsdXJlLnJldHJ5QWZ0ZXJNcyAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUucmV0cnlBZnRlck1zO1xuICB9XG5cbiAgaWYgKGZhaWx1cmVDb3VudCA8PSAwKSB7XG4gICAgcmV0dXJuIDJfMDAwO1xuICB9XG4gIGlmIChmYWlsdXJlQ291bnQgPT09IDEpIHtcbiAgICByZXR1cm4gNV8wMDA7XG4gIH1cbiAgaWYgKGZhaWx1cmVDb3VudCA9PT0gMikge1xuICAgIHJldHVybiAxNV8wMDA7XG4gIH1cbiAgaWYgKGZhaWx1cmVDb3VudCA9PT0gMykge1xuICAgIHJldHVybiAzMF8wMDA7XG4gIH1cbiAgcmV0dXJuIGdldE1heEJhY2tvZmZEZWxheU1zKCk7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gYXBwbHlSZWZyZXNoRmFpbHVyZShmYWlsdXJlOiBBdXRoUmVmcmVzaEZhaWx1cmUpOiBuZXZlciB7XG4gIGlmIChmYWlsdXJlLmNsZWFyU2Vzc2lvbikge1xuICAgIGNsZWFyQ2FjaGVkVG9rZW4oKTtcbiAgICByZXRyeUF0TXMgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgZW1pdFN0YXRlKHtcbiAgICAgIHN0YXR1czogJ3Nlc3Npb25fZXhwaXJlZCcsXG4gICAgICByZWFzb246IGZhaWx1cmUucmVhc29uLFxuICAgIH0pO1xuICAgIGVtaXQoJ2NsZWFyZWQnKTtcbiAgICB0aHJvdyBuZXcgQXV0aFJlZnJlc2hFcnJvcihmYWlsdXJlKTtcbiAgfVxuXG4gIGxldCByZXRyeUF0TXNGb3JTdGF0ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoZmFpbHVyZS5yZXRyeWFibGUpIHtcbiAgICByZXRyeUF0TXMgPSBEYXRlLm5vdygpICsgbmV4dEJhY2tvZmZEZWxheU1zKGZhaWx1cmUpO1xuICAgIHJldHJ5QXRNc0ZvclN0YXRlID0gcmV0cnlBdE1zO1xuICB9IGVsc2Uge1xuICAgIHJldHJ5QXRNcyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgfVxuICBmYWlsdXJlQ291bnQgKz0gMTtcbiAgZW1pdFN0YXRlKHtcbiAgICBzdGF0dXM6ICd0ZW1wb3JhcmlseV91bmF2YWlsYWJsZScsXG4gICAgcmVhc29uOiBmYWlsdXJlLnJlYXNvbixcbiAgICByZXRyeUF0TXM6IHJldHJ5QXRNc0ZvclN0YXRlLFxuICAgIHByZXZpb3VzRXhwaXJlc0F0TXM6IGNhY2hlZEFjY2Vzc1Rva2VuPy5leHBpcmVzQXRNcyxcbiAgfSk7XG5cbiAgdGhyb3cgbmV3IEF1dGhSZWZyZXNoRXJyb3IoZmFpbHVyZSk7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0UmVmcmVzaENsaWVudE9wdGlvbnMoKTogUmVmcmVzaFRva2VuQ2xpZW50T3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgZW5kcG9pbnQ6IGNvbmZpZy5yZWZyZXNoRW5kcG9pbnQsXG4gICAgdGltZW91dE1zOiBjb25maWcucmVmcmVzaFRpbWVvdXRNcyxcbiAgICBjcmVkZW50aWFsczogY29uZmlnLnJlZnJlc2hDcmVkZW50aWFscyxcbiAgICBmZXRjaEltcGw6IGNvbmZpZy5yZWZyZXNoRmV0Y2gsXG4gICAgcmVxdWVzdEluaXQ6IGNvbmZpZy5yZWZyZXNoUmVxdWVzdEluaXQsXG4gICAgcGFyc2VTdWNjZXNzQm9keTogY29uZmlnLnBhcnNlUmVmcmVzaFN1Y2Nlc3NCb2R5LFxuICAgIHBhcnNlRmFpbHVyZUJvZHk6IGNvbmZpZy5wYXJzZVJlZnJlc2hGYWlsdXJlQm9keSxcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0QWNjZXNzVG9rZW4oKTogUHJvbWlzZTxDYWNoZWRBY2Nlc3NUb2tlbj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0U2hvcnRBY2Nlc3NUb2tlbihnZXRSZWZyZXNoQ2xpZW50T3B0aW9ucygpKTtcbiAgaWYgKCFyZXN1bHQub2spIHtcbiAgICByZXR1cm4gYXBwbHlSZWZyZXNoRmFpbHVyZShyZXN1bHQuZmFpbHVyZSk7XG4gIH1cblxuICBjb25zdCBleHBpcmVzQXRNcyA9XG4gICAgcmVzdWx0LmV4cGlyZXNBdE1zID8/IHJlYWRKd3RFeHBpcmVzQXRNcyhyZXN1bHQuYWNjZXNzVG9rZW4pO1xuICBpZiAoZXhwaXJlc0F0TXMgPT0gbnVsbCkge1xuICAgIHJldHVybiBhcHBseVJlZnJlc2hGYWlsdXJlKHtcbiAgICAgIHJlYXNvbjogJ0lOVkFMSURfQUNDRVNTX1RPS0VOJyxcbiAgICAgIHJldHJ5YWJsZTogdHJ1ZSxcbiAgICAgIGNsZWFyU2Vzc2lvbjogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICByZXNldEZhaWx1cmVCYWNrb2ZmKCk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICBleHBpcmVzQXRNcyxcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBhc3NlcnRSZWZyZXNoQWxsb3dlZCgpOiB2b2lkIHtcbiAgaWYgKGF1dGhSZWZyZXNoU3RhdGUuc3RhdHVzID09PSAnc2Vzc2lvbl9leHBpcmVkJykge1xuICAgIHRocm93IG5ldyBBdXRoUmVmcmVzaEVycm9yKHtcbiAgICAgIHJlYXNvbjogJ1NFU1NJT05fRVhQSVJFRCcsXG4gICAgICByZXRyeWFibGU6IGZhbHNlLFxuICAgICAgY2xlYXJTZXNzaW9uOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKERhdGUubm93KCkgPCByZXRyeUF0TXMpIHtcbiAgICB0aHJvdyBuZXcgQXV0aFJlZnJlc2hFcnJvcih7XG4gICAgICByZWFzb246ICdSRUZSRVNIX0lOX0NPT0xET1dOJyxcbiAgICAgIHJldHJ5YWJsZTogdHJ1ZSxcbiAgICAgIGNsZWFyU2Vzc2lvbjogZmFsc2UsXG4gICAgICByZXRyeUFmdGVyTXM6IHJldHJ5QXRNcyAtIERhdGUubm93KCksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoU2hvcnRBY2Nlc3NUb2tlbkludGVybmFsKG9wdGlvbnM/OiB7XG4gIGZvcmNlPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoXG4gICAgb3B0aW9ucz8uZm9yY2UgIT09IHRydWUgJiZcbiAgICBjYWNoZWRBY2Nlc3NUb2tlbiAhPSBudWxsICYmXG4gICAgaXNUb2tlblVzYWJsZShjYWNoZWRBY2Nlc3NUb2tlbilcbiAgKSB7XG4gICAgcmV0dXJuIGNhY2hlZEFjY2Vzc1Rva2VuLnRva2VuO1xuICB9XG5cbiAgYXNzZXJ0UmVmcmVzaEFsbG93ZWQoKTtcblxuICBpZiAocmVmcmVzaFByb21pc2UgIT0gbnVsbCkge1xuICAgIHJldHVybiAoYXdhaXQgcmVmcmVzaFByb21pc2UpLnRva2VuO1xuICB9XG5cbiAgZW1pdFN0YXRlKHtcbiAgICBzdGF0dXM6ICdyZWZyZXNoaW5nJyxcbiAgICBwcmV2aW91c0V4cGlyZXNBdE1zOiBjYWNoZWRBY2Nlc3NUb2tlbj8uZXhwaXJlc0F0TXMsXG4gIH0pO1xuXG4gIHJlZnJlc2hQcm9taXNlID0gcmVxdWVzdEFjY2Vzc1Rva2VuKCk7XG4gIHRyeSB7XG4gICAgY2FjaGVkQWNjZXNzVG9rZW4gPSBhd2FpdCByZWZyZXNoUHJvbWlzZTtcbiAgICBzY2hlZHVsZVJlZnJlc2goY2FjaGVkQWNjZXNzVG9rZW4pO1xuICAgIGVtaXRTdGF0ZSh7XG4gICAgICBzdGF0dXM6ICdhdXRoZW50aWNhdGVkJyxcbiAgICAgIGV4cGlyZXNBdE1zOiBjYWNoZWRBY2Nlc3NUb2tlbi5leHBpcmVzQXRNcyxcbiAgICB9KTtcbiAgICBlbWl0KCdyZWZyZXNoZWQnKTtcbiAgICByZXR1cm4gY2FjaGVkQWNjZXNzVG9rZW4udG9rZW47XG4gIH0gZmluYWxseSB7XG4gICAgcmVmcmVzaFByb21pc2UgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFNob3J0QWNjZXNzVG9rZW5MaXN0ZW5lcihcbiAgbGlzdGVuZXI6IFNob3J0QWNjZXNzVG9rZW5MaXN0ZW5lcixcbik6ICgpID0+IHZvaWQge1xuICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQXV0aFJlZnJlc2hTdGF0ZUxpc3RlbmVyKFxuICBsaXN0ZW5lcjogQXV0aFJlZnJlc2hTdGF0ZUxpc3RlbmVyLFxuKTogKCkgPT4gdm9pZCB7XG4gIHN0YXRlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgc3RhdGVMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aFJlZnJlc2hTdGF0ZSgpOiBBdXRoUmVmcmVzaFN0YXRlIHtcbiAgcmV0dXJuIGF1dGhSZWZyZXNoU3RhdGU7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hTaG9ydEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChhdXRoUmVmcmVzaFN0YXRlLnN0YXR1cyA9PT0gJ3Nlc3Npb25fZXhwaXJlZCcpIHtcbiAgICByZXNldEZhaWx1cmVCYWNrb2ZmKCk7XG4gICAgZW1pdFN0YXRlKHsgc3RhdHVzOiAnYW5vbnltb3VzJyB9KTtcbiAgfVxuICByZXR1cm4gcmVmcmVzaFNob3J0QWNjZXNzVG9rZW5JbnRlcm5hbCh7IGZvcmNlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaG9ydEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiByZWZyZXNoU2hvcnRBY2Nlc3NUb2tlbkludGVybmFsKCk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNob3J0QWNjZXNzVG9rZW5BdXRoSGVhZGVycygpOiBQcm9taXNlPFxuICBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldFNob3J0QWNjZXNzVG9rZW4oKTtcbiAgICByZXR1cm4ge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gaXNHcmFwaHFsUmVxdWVzdChcbiAgaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLFxuICBncmFwaHFsUGF0aDogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIGxldCB1cmw6IHN0cmluZztcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICB1cmwgPSBpbnB1dDtcbiAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHVybCA9IGlucHV0LnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdXJsID0gaW5wdXQudXJsO1xuICB9XG4gIGlmICh1cmwgPT09IGdyYXBocWxQYXRoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwsIGdsb2JhbFRoaXMubG9jYXRpb24ub3JpZ2luKS5wYXRobmFtZSA9PT0gZ3JhcGhxbFBhdGg7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGFzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBkZWZhdWx0TG9nb3V0UmVzcG9uc2VNYXRjaGVyKHBheWxvYWQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YSA9IGFzUmVjb3JkKGFzUmVjb3JkKHBheWxvYWQpPy5kYXRhKTtcbiAgY29uc3QgbG9nb3V0ID0gYXNSZWNvcmQoZGF0YT8ubG9nb3V0KTtcbiAgY29uc3QgbG9nb3V0UGF5bG9hZCA9IGFzUmVjb3JkKGxvZ291dD8ucGF5bG9hZCk7XG5cbiAgcmV0dXJuIChcbiAgICBsb2dvdXQ/LmxvZ2dlZE91dCA9PT0gdHJ1ZSB8fFxuICAgIGxvZ291dFBheWxvYWQ/LmxvZ2dlZE91dCA9PT0gdHJ1ZSB8fFxuICAgIGxvZ291dD8uc3RhdHVzID09PSAnU1VDQ0VTUydcbiAgKTtcbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGVhckFmdGVyTG9nb3V0UmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLFxuICBncmFwaHFsUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcmVzcG9uc2Uub2sgfHwgIWlzR3JhcGhxbFJlcXVlc3QoaW5wdXQsIGdyYXBocWxQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZVxuICAgIC5jbG9uZSgpXG4gICAgLmpzb24oKVxuICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgY29uc3QgbWF0Y2hlciA9IGNvbmZpZy5sb2dvdXRSZXNwb25zZU1hdGNoZXIgPz8gZGVmYXVsdExvZ291dFJlc3BvbnNlTWF0Y2hlcjtcblxuICBpZiAobWF0Y2hlcihwYXlsb2FkLCByZXNwb25zZSkpIHtcbiAgICBjbGVhclNob3J0QWNjZXNzVG9rZW4oKTtcbiAgfVxufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsU2hvcnRBY2Nlc3NUb2tlbkdyYXBocWxSZXRyeShcbiAgZ3JhcGhxbFBhdGggPSAnL2FwaS9ncmFwaHFsJyxcbik6IHZvaWQge1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5zdGFsbGVkRmV0Y2hXcmFwcGVyICE9IG51bGwpIHtcbiAgICBpbnN0YWxsZWRGZXRjaFdyYXBwZXIuZ3JhcGhxbFBhdGggPSBncmFwaHFsUGF0aDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbEZldGNoID0gZ2xvYmFsVGhpcy5mZXRjaC5iaW5kKGdsb2JhbFRoaXMpO1xuICBpbnN0YWxsZWRGZXRjaFdyYXBwZXIgPSB7XG4gICAgZ3JhcGhxbFBhdGgsXG4gICAgb3JpZ2luYWxGZXRjaCxcbiAgfTtcblxuICBnbG9iYWxUaGlzLmZldGNoID0gYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG4gICAgY29uc3QgYWN0aXZlV3JhcHBlciA9IGluc3RhbGxlZEZldGNoV3JhcHBlcjtcbiAgICBjb25zdCBhY3RpdmVHcmFwaHFsUGF0aCA9IGFjdGl2ZVdyYXBwZXI/LmdyYXBocWxQYXRoID8/IGdyYXBocWxQYXRoO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb3JpZ2luYWxGZXRjaChpbnB1dCwgaW5pdCk7XG4gICAgaWYgKFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDEgfHxcbiAgICAgICFpc0dyYXBocWxSZXF1ZXN0KGlucHV0LCBhY3RpdmVHcmFwaHFsUGF0aClcbiAgICApIHtcbiAgICAgIGF3YWl0IGNsZWFyQWZ0ZXJMb2dvdXRSZXNwb25zZShyZXNwb25zZSwgaW5wdXQsIGFjdGl2ZUdyYXBocWxQYXRoKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCByZWZyZXNoU2hvcnRBY2Nlc3NUb2tlbkludGVybmFsKHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgICAgIGNvbnN0IHJldHJ5UmVzcG9uc2UgPSBhd2FpdCBvcmlnaW5hbEZldGNoKGlucHV0LCB7XG4gICAgICAgIC4uLmluaXQsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGNsZWFyQWZ0ZXJMb2dvdXRSZXNwb25zZShyZXRyeVJlc3BvbnNlLCBpbnB1dCwgYWN0aXZlR3JhcGhxbFBhdGgpO1xuICAgICAgcmV0dXJuIHJldHJ5UmVzcG9uc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgdHlwZSB7IEF1dGhSZWZyZXNoRmFpbHVyZVJlYXNvbiwgQXV0aFJlZnJlc2hTdGF0ZSB9O1xuXG5leHBvcnQgY29uc3QgX190ZXN0ID0ge1xuICBpc1Rva2VuVXNhYmxlLFxuICByZXNldEZvclRlc3RzKCk6IHZvaWQge1xuICAgIGNsZWFyQ2FjaGVkVG9rZW4oKTtcbiAgICByZXNldEZhaWx1cmVCYWNrb2ZmKCk7XG4gICAgYXV0aFJlZnJlc2hTdGF0ZSA9IHsgc3RhdHVzOiAnYW5vbnltb3VzJyB9O1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIHJlZnJlc2hFbmRwb2ludDogREVGQVVMVF9SRUZSRVNIX0VORFBPSU5ULFxuICAgIH07XG4gICAgaWYgKGluc3RhbGxlZEZldGNoV3JhcHBlciAhPSBudWxsKSB7XG4gICAgICBnbG9iYWxUaGlzLmZldGNoID0gaW5zdGFsbGVkRmV0Y2hXcmFwcGVyLm9yaWdpbmFsRmV0Y2g7XG4gICAgICBpbnN0YWxsZWRGZXRjaFdyYXBwZXIgPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgcmVzZXRHcmFwaHFsUmV0cnlGb3JUZXN0cygpOiB2b2lkIHtcbiAgICBpZiAoaW5zdGFsbGVkRmV0Y2hXcmFwcGVyICE9IG51bGwpIHtcbiAgICAgIGdsb2JhbFRoaXMuZmV0Y2ggPSBpbnN0YWxsZWRGZXRjaFdyYXBwZXIub3JpZ2luYWxGZXRjaDtcbiAgICAgIGluc3RhbGxlZEZldGNoV3JhcHBlciA9IG51bGw7XG4gICAgfVxuICB9LFxufTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2024.d.ts","../../../node_modules/typescript/lib/lib.es2025.d.ts","../../../node_modules/typescript/lib/lib.esnext.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../../node_modules/typescript/lib/lib.es2025.collection.d.ts","../../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../../node_modules/typescript/lib/lib.es2025.intl.d.ts","../../../node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../../node_modules/typescript/lib/lib.es2025.promise.d.ts","../../../node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.date.d.ts","../../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.error.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../../node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/typescript/lib/lib.esnext.full.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/tslib/modules/index.d.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@types/react/index.d.ts","../../../node_modules/@types/react/jsx-runtime.d.ts","../src/authRefreshState.ts","../src/refreshTokenClient.ts","../src/shortAccessToken.ts","../src/relay.ts","../src/index.ts"],"fileIdsList":[[96,97],[98],[94],[95,99],[95,99,100,101,102,103],[95,99,100],[95,99,102],[95,99,100,101]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"f13f4b465c99041e912db5c44129a94588e1aafee35a50eab51044833f50b4ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"ef4a897cd2a3f91000c10264e400b3667c7e51e1b7365f03b62e8081dc53bde6","impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"363fc57a10ffae190ae00febe8fe532098dd58d2d90a9a4af3c739036452dd0c","signature":"710d8c74e3096b17c6dd5198c2ce67ce15eafabd5bd13d24a8f6da81e503ea58"},{"version":"23f034eff989c2b3758561a027f2f11c902d6525b6fb7f6b99beae2071033f75","signature":"7ce7be6676ec4219faab53f38d81df0276e1f52ceb931200e816986e269f137f"},{"version":"a01c43aca0f6a2a21808ebd9849bfa59f1326737612bbf2af9ca24a320e9f069","signature":"f1c70d00706549382ce8fd757324e05bbe6a6eba4c137df423cedf99e4e1544a"},{"version":"ea4b96e59ba87d45f5dc1760b142649c24dc1487a5b49e4248a7005a66ca2eef","signature":"8a120423e615390c75770c9d4c55424791defde175f9f933596d994d5cd6e120"},"1f34aed68105919823c4f64b8cc5627f6c8cdbf52722e5662246a1e9e58e8008"],"root":[[100,104]],"options":{"allowJs":true,"composite":true,"declaration":true,"declarationMap":true,"importHelpers":true,"inlineSourceMap":true,"inlineSources":true,"jsx":4,"module":99,"noEmitHelpers":true,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./esm","removeComments":true,"rootDir":"../src","skipLibCheck":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[98,1],[99,2],[95,3],[100,4],[104,5],[101,6],[103,7],[102,8]],"latestChangedDtsFile":"./esm/index.d.ts","version":"6.0.3"}
@@ -0,0 +1,32 @@
1
+ export type BuiltInAuthRefreshFailureReason = 'NETWORK_ERROR' | 'TIMEOUT' | 'INVALID_RESPONSE' | 'INVALID_ACCESS_TOKEN' | 'REFRESH_IN_COOLDOWN' | 'SESSION_EXPIRED' | 'CREDENTIALS_REJECTED';
2
+ export type AuthRefreshFailureReason = BuiltInAuthRefreshFailureReason | (string & {});
3
+ export type AuthRefreshState = {
4
+ status: 'anonymous';
5
+ } | {
6
+ status: 'refreshing';
7
+ previousExpiresAtMs?: number;
8
+ } | {
9
+ status: 'authenticated';
10
+ expiresAtMs: number;
11
+ } | {
12
+ status: 'temporarily_unavailable';
13
+ reason: AuthRefreshFailureReason;
14
+ retryAtMs?: number;
15
+ previousExpiresAtMs?: number;
16
+ } | {
17
+ status: 'session_expired';
18
+ reason: AuthRefreshFailureReason;
19
+ };
20
+ export interface AuthRefreshFailure {
21
+ reason: AuthRefreshFailureReason;
22
+ retryable: boolean;
23
+ clearSession: boolean;
24
+ retryAfterMs?: number;
25
+ status?: number;
26
+ message?: string;
27
+ }
28
+ export declare class AuthRefreshError extends Error {
29
+ readonly failure: AuthRefreshFailure;
30
+ constructor(failure: AuthRefreshFailure);
31
+ }
32
+ //# sourceMappingURL=authRefreshState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authRefreshState.d.ts","sourceRoot":"","sources":["../../src/authRefreshState.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,+BAA+B,GACvC,eAAe,GACf,SAAS,GACT,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,iBAAiB,GACjB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,wBAAwB,GAChC,+BAA+B,GAC/B,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChD;IACE,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GACD;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,OAAO,EAAE,kBAAkB,CAAC;gBAEzB,OAAO,EAAE,kBAAkB;CAK/C"}
@@ -0,0 +1,5 @@
1
+ export * from './authRefreshState.js';
2
+ export * from './refreshTokenClient.js';
3
+ export * from './shortAccessToken.js';
4
+ export * from './relay.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { AuthRefreshFailure } from './authRefreshState.js';
2
+ export interface RefreshTokenClientSuccess {
3
+ ok: true;
4
+ accessToken: string;
5
+ expiresAtMs?: number;
6
+ }
7
+ export interface RefreshTokenClientFailure {
8
+ ok: false;
9
+ failure: AuthRefreshFailure;
10
+ }
11
+ export type RefreshTokenClientResult = RefreshTokenClientSuccess | RefreshTokenClientFailure;
12
+ export type RefreshTokenSuccessParser = (body: unknown, response: Response) => RefreshTokenClientSuccess | null;
13
+ export type RefreshTokenFailureParser = (body: unknown, response: Response) => AuthRefreshFailure | null;
14
+ export interface RefreshTokenClientOptions {
15
+ endpoint: string | URL;
16
+ timeoutMs?: number;
17
+ credentials?: RequestCredentials;
18
+ fetchImpl?: typeof fetch;
19
+ requestInit?: RequestInit | (() => RequestInit | Promise<RequestInit>);
20
+ parseSuccessBody?: RefreshTokenSuccessParser;
21
+ parseFailureBody?: RefreshTokenFailureParser;
22
+ }
23
+ export declare const DEFAULT_REFRESH_TIMEOUT_MS = 10000;
24
+ export declare function parseRetryAfterMs(response: Response): number | undefined;
25
+ export declare function parseDefaultRefreshSuccessBody(body: unknown): RefreshTokenClientSuccess | null;
26
+ export declare function parseDefaultRefreshFailureBody(body: unknown, response: Response): AuthRefreshFailure | null;
27
+ export declare function requestShortAccessToken(options: RefreshTokenClientOptions): Promise<RefreshTokenClientResult>;
28
+ //# sourceMappingURL=refreshTokenClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshTokenClient.d.ts","sourceRoot":"","sources":["../../src/refreshTokenClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,MAAM,wBAAwB,GAChC,yBAAyB,GACzB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,KACf,yBAAyB,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,KACf,kBAAkB,GAAG,IAAI,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACvE,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;CAC9C;AAED,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAYjD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAiBxE;AAKD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,GACZ,yBAAyB,GAAG,IAAI,CAgClC;AAKD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,GACjB,kBAAkB,GAAG,IAAI,CAgC3B;AAiDD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAmDnC"}
@@ -0,0 +1,25 @@
1
+ import { type ShortAccessTokenAuthConfig } from './shortAccessToken.js';
2
+ export interface RelayReconnectOptions {
3
+ reason?: string;
4
+ }
5
+ export interface RelayEnvironmentConfiguration {
6
+ httpUrl?: string;
7
+ wsUrl?: string;
8
+ getDataId?: (fieldValue: unknown, typeName: string) => string | null;
9
+ getAuthHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
10
+ }
11
+ export interface ConfigureShortAccessTokenRelayEnvironmentInput {
12
+ httpUrl: string;
13
+ wsUrl: string;
14
+ refreshEndpoint: string | URL;
15
+ auth?: Omit<ShortAccessTokenAuthConfig, 'refreshEndpoint'>;
16
+ getDataId?: (fieldValue: unknown, typeName: string) => string | null;
17
+ configureRelayEnvironment: (options: RelayEnvironmentConfiguration) => void;
18
+ reconnectRelayWebSocket: (options?: RelayReconnectOptions) => void;
19
+ }
20
+ export interface ShortAccessTokenRelayEnvironment {
21
+ resetRelayTransport: () => void;
22
+ dispose: () => void;
23
+ }
24
+ export declare function configureShortAccessTokenRelayEnvironment(input: ConfigureShortAccessTokenRelayEnvironmentInput): ShortAccessTokenRelayEnvironment;
25
+ //# sourceMappingURL=relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,0BAA0B,EAChC,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrE,cAAc,CAAC,EAAE,MACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,8CAA8C;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;IAC3D,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrE,yBAAyB,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAC5E,uBAAuB,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,gCAAgC;IAC/C,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAKD,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,8CAA8C,GACpD,gCAAgC,CAmClC"}
@@ -0,0 +1,40 @@
1
+ import { type AuthRefreshFailureReason, type AuthRefreshState } from './authRefreshState.js';
2
+ import { type RefreshTokenFailureParser, type RefreshTokenSuccessParser } from './refreshTokenClient.js';
3
+ interface CachedAccessToken {
4
+ token: string;
5
+ expiresAtMs: number;
6
+ }
7
+ export type ShortAccessTokenEvent = 'refreshed' | 'cleared';
8
+ export type ShortAccessTokenListener = (event: ShortAccessTokenEvent) => void;
9
+ export type AuthRefreshStateListener = (state: AuthRefreshState) => void;
10
+ export type LogoutResponseMatcher = (payload: unknown, response: Response) => boolean;
11
+ export interface ShortAccessTokenAuthConfig {
12
+ refreshEndpoint: string | URL;
13
+ refreshTimeoutMs?: number;
14
+ refreshCredentials?: RequestCredentials;
15
+ refreshFetch?: typeof fetch;
16
+ refreshRequestInit?: RequestInit | (() => RequestInit | Promise<RequestInit>);
17
+ parseRefreshSuccessBody?: RefreshTokenSuccessParser;
18
+ parseRefreshFailureBody?: RefreshTokenFailureParser;
19
+ refreshSkewMs?: number;
20
+ maxBackoffDelayMs?: number;
21
+ logoutResponseMatcher?: LogoutResponseMatcher;
22
+ }
23
+ export declare function readJwtExpiresAtMs(token: string): number | null;
24
+ declare function isTokenUsable(token: CachedAccessToken, nowMs?: number): boolean;
25
+ export declare function configureShortAccessTokenAuth(nextConfig: ShortAccessTokenAuthConfig): void;
26
+ export declare function clearShortAccessToken(): void;
27
+ export declare function addShortAccessTokenListener(listener: ShortAccessTokenListener): () => void;
28
+ export declare function addAuthRefreshStateListener(listener: AuthRefreshStateListener): () => void;
29
+ export declare function getAuthRefreshState(): AuthRefreshState;
30
+ export declare function refreshShortAccessToken(): Promise<string>;
31
+ export declare function getShortAccessToken(): Promise<string>;
32
+ export declare function getShortAccessTokenAuthHeaders(): Promise<Record<string, string>>;
33
+ export declare function installShortAccessTokenGraphqlRetry(graphqlPath?: string): void;
34
+ export type { AuthRefreshFailureReason, AuthRefreshState };
35
+ export declare const __test: {
36
+ isTokenUsable: typeof isTokenUsable;
37
+ resetForTests(): void;
38
+ resetGraphqlRetryForTests(): void;
39
+ };
40
+ //# sourceMappingURL=shortAccessToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortAccessToken.d.ts","sourceRoot":"","sources":["../../src/shortAccessToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,yBAAyB,CAAC;AAEjC,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAC9E,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,KACf,OAAO,CAAC;AAEb,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,KAAK,CAAC;IAC5B,kBAAkB,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9E,uBAAuB,CAAC,EAAE,yBAAyB,CAAC;IACpD,uBAAuB,CAAC,EAAE,yBAAyB,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C;AAmCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe/D;AAmBD,iBAAS,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,SAAa,GAAG,OAAO,CAE5E;AAkDD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,0BAA0B,GACrC,IAAI,CAIN;AAKD,wBAAgB,qBAAqB,IAAI,IAAI,CAK5C;AAqLD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,GACjC,MAAM,IAAI,CAKZ;AAKD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,GACjC,MAAM,IAAI,CAKZ;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAKD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAM/D;AAKD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE3D;AAKD,wBAAsB,8BAA8B,IAAI,OAAO,CAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB,CASA;AAgFD,wBAAgB,mCAAmC,CACjD,WAAW,SAAiB,GAC3B,IAAI,CA0CN;AAED,YAAY,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,CAAC;AAE3D,eAAO,MAAM,MAAM;;qBAEA,IAAI;iCAYQ,IAAI;CAMlC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@plumile/auth",
3
+ "version": "0.1.106",
4
+ "description": "Short-lived access token helpers for Plumile applications",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "main": "lib/esm/index.js",
8
+ "module": "lib/esm/index.js",
9
+ "types": "lib/types/index.d.ts",
10
+ "typings": "lib/types/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./lib/types/index.d.ts",
14
+ "import": "./lib/esm/index.js",
15
+ "default": "./lib/esm/index.js"
16
+ },
17
+ "./authRefreshState.js": {
18
+ "types": "./lib/types/authRefreshState.d.ts",
19
+ "import": "./lib/esm/authRefreshState.js",
20
+ "default": "./lib/esm/authRefreshState.js"
21
+ },
22
+ "./refreshTokenClient.js": {
23
+ "types": "./lib/types/refreshTokenClient.d.ts",
24
+ "import": "./lib/esm/refreshTokenClient.js",
25
+ "default": "./lib/esm/refreshTokenClient.js"
26
+ },
27
+ "./shortAccessToken.js": {
28
+ "types": "./lib/types/shortAccessToken.d.ts",
29
+ "import": "./lib/esm/shortAccessToken.js",
30
+ "default": "./lib/esm/shortAccessToken.js"
31
+ },
32
+ "./relay.js": {
33
+ "types": "./lib/types/relay.d.ts",
34
+ "import": "./lib/esm/relay.js",
35
+ "default": "./lib/esm/relay.js"
36
+ },
37
+ "./package.json": "./package.json"
38
+ },
39
+ "sideEffects": false,
40
+ "author": "Olivier Hardy <olivier@plumile.com>",
41
+ "homepage": "https://gitlab.com/plumile/js/-/tree/main/packages/auth",
42
+ "scripts": {
43
+ "build:package": "./tools/build-package.sh",
44
+ "build:package:esm": "tsc --build tsconfig.esm.json",
45
+ "build:package:types": "tsc --build tsconfig.types.json",
46
+ "check:build-package": "tsc --noEmit",
47
+ "clean": "rimraf lib && rimraf *.tsbuildinfo",
48
+ "test:build-package": "./tools/test-build-package.sh"
49
+ },
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://gitlab.com/plumile/js",
53
+ "directory": "packages/auth"
54
+ },
55
+ "bugs": {
56
+ "url": "https://gitlab.com/plumile/js/-/issues"
57
+ },
58
+ "keywords": [
59
+ "auth",
60
+ "jwt",
61
+ "relay",
62
+ "typescript"
63
+ ],
64
+ "engines": {
65
+ "node": ">=21.0.0",
66
+ "npm": ">=8.0.0"
67
+ },
68
+ "dependencies": {
69
+ "tslib": "^2.8.1"
70
+ },
71
+ "devDependencies": {
72
+ "rimraf": "6.1.3",
73
+ "typescript": "6.0.3"
74
+ },
75
+ "files": [
76
+ "lib",
77
+ "README.md"
78
+ ],
79
+ "publishConfig": {
80
+ "access": "public"
81
+ }
82
+ }