@atproto/oauth-client-browser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE.txt +7 -0
  2. package/dist/browser-oauth-client.d.ts +58 -0
  3. package/dist/browser-oauth-client.d.ts.map +1 -0
  4. package/dist/browser-oauth-client.js +353 -0
  5. package/dist/browser-oauth-client.js.map +1 -0
  6. package/dist/browser-oauth-database.d.ts +61 -0
  7. package/dist/browser-oauth-database.d.ts.map +1 -0
  8. package/dist/browser-oauth-database.js +175 -0
  9. package/dist/browser-oauth-database.js.map +1 -0
  10. package/dist/browser-runtime-implementation.d.ts +10 -0
  11. package/dist/browser-runtime-implementation.d.ts.map +1 -0
  12. package/dist/browser-runtime-implementation.js +56 -0
  13. package/dist/browser-runtime-implementation.js.map +1 -0
  14. package/dist/disposable-polyfill/index.d.ts +1 -0
  15. package/dist/disposable-polyfill/index.d.ts.map +1 -0
  16. package/dist/disposable-polyfill/index.js +11 -0
  17. package/dist/disposable-polyfill/index.js.map +1 -0
  18. package/dist/errors.d.ts +9 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +20 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +31 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/indexed-db/db-index.d.ts +12 -0
  27. package/dist/indexed-db/db-index.d.ts.map +1 -0
  28. package/dist/indexed-db/db-index.js +49 -0
  29. package/dist/indexed-db/db-index.js.map +1 -0
  30. package/dist/indexed-db/db-object-store.d.ts +17 -0
  31. package/dist/indexed-db/db-object-store.d.ts.map +1 -0
  32. package/dist/indexed-db/db-object-store.js +47 -0
  33. package/dist/indexed-db/db-object-store.js.map +1 -0
  34. package/dist/indexed-db/db-transaction.d.ts +13 -0
  35. package/dist/indexed-db/db-transaction.d.ts.map +1 -0
  36. package/dist/indexed-db/db-transaction.js +60 -0
  37. package/dist/indexed-db/db-transaction.js.map +1 -0
  38. package/dist/indexed-db/db.d.ts +17 -0
  39. package/dist/indexed-db/db.d.ts.map +1 -0
  40. package/dist/indexed-db/db.js +114 -0
  41. package/dist/indexed-db/db.js.map +1 -0
  42. package/dist/indexed-db/index.d.ts +6 -0
  43. package/dist/indexed-db/index.d.ts.map +1 -0
  44. package/dist/indexed-db/index.js +22 -0
  45. package/dist/indexed-db/index.js.map +1 -0
  46. package/dist/indexed-db/schema.d.ts +3 -0
  47. package/dist/indexed-db/schema.d.ts.map +1 -0
  48. package/dist/indexed-db/schema.js +3 -0
  49. package/dist/indexed-db/schema.js.map +1 -0
  50. package/dist/indexed-db/util.d.ts +2 -0
  51. package/dist/indexed-db/util.d.ts.map +1 -0
  52. package/dist/indexed-db/util.js +24 -0
  53. package/dist/indexed-db/util.js.map +1 -0
  54. package/dist/indexed-db-store.d.ts +18 -0
  55. package/dist/indexed-db-store.d.ts.map +1 -0
  56. package/dist/indexed-db-store.js +68 -0
  57. package/dist/indexed-db-store.js.map +1 -0
  58. package/dist/util.d.ts +18 -0
  59. package/dist/util.d.ts.map +1 -0
  60. package/dist/util.js +19 -0
  61. package/dist/util.js.map +1 -0
  62. package/package.json +72 -0
package/LICENSE.txt ADDED
@@ -0,0 +1,7 @@
1
+ Dual MIT/Apache-2.0 License
2
+
3
+ Copyright (c) 2022-2024 Bluesky PBC, and Contributors
4
+
5
+ Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
6
+
7
+ Downstream projects and end users may chose either license individually, or both together, at their discretion. The motivation for this dual-licensing is the additional software patent assurance provided by Apache 2.0.
@@ -0,0 +1,58 @@
1
+ /// <reference types="node" />
2
+ import { HandleResolver } from '@atproto-labs/handle-resolver';
3
+ import { AuthorizeOptions, OAuthAgent, OAuthClient, Session, TokenSet } from '@atproto/oauth-client';
4
+ import { OAuthClientId, OAuthClientMetadataInput, OAuthResponseMode } from '@atproto/oauth-types';
5
+ import { DatabaseStore } from './browser-oauth-database.js';
6
+ export type BrowserOAuthClientOptions = {
7
+ clientMetadata?: OAuthClientMetadataInput;
8
+ handleResolver?: HandleResolver | string | URL;
9
+ responseMode?: OAuthResponseMode;
10
+ plcDirectoryUrl?: string | URL;
11
+ crypto?: typeof globalThis.crypto;
12
+ fetch?: typeof globalThis.fetch;
13
+ };
14
+ type EventDetails = {
15
+ updated: TokenSet;
16
+ deleted: {
17
+ sub: string;
18
+ };
19
+ };
20
+ type CustomEventListener<T extends keyof EventDetails = keyof EventDetails> = (event: CustomEvent<EventDetails[T]>) => void;
21
+ type WrappedSessionStore = Disposable & DatabaseStore<Session>;
22
+ export type BrowserOAuthClientLoadOptions = Omit<BrowserOAuthClientOptions, 'clientMetadata'> & {
23
+ clientId: OAuthClientId;
24
+ signal?: AbortSignal;
25
+ };
26
+ export declare class BrowserOAuthClient extends OAuthClient {
27
+ static load({ clientId, ...options }: BrowserOAuthClientLoadOptions): Promise<BrowserOAuthClient>;
28
+ readonly sessionStore: WrappedSessionStore;
29
+ private readonly eventTarget;
30
+ private readonly database;
31
+ constructor({ clientMetadata, handleResolver, responseMode, plcDirectoryUrl, crypto, fetch, }?: BrowserOAuthClientOptions);
32
+ addEventListener<T extends keyof EventDetails>(type: T, callback: CustomEventListener<T> | null, options?: AddEventListenerOptions | boolean): void;
33
+ removeEventListener(type: string, callback: CustomEventListener | null, options?: EventListenerOptions | boolean): void;
34
+ restoreAll(): Promise<{
35
+ [k: string]: OAuthAgent;
36
+ }>;
37
+ init(sub?: string, refresh?: boolean): Promise<{
38
+ agent: OAuthAgent;
39
+ state: string | null;
40
+ } | {
41
+ agent: OAuthAgent;
42
+ } | undefined>;
43
+ signIn(input: string, options?: AuthorizeOptions & {
44
+ signal?: AbortSignal;
45
+ }): Promise<OAuthAgent>;
46
+ signInRedirect(input: string, options?: AuthorizeOptions): Promise<never>;
47
+ signInPopup(input: string, options?: Omit<AuthorizeOptions, 'state'> & {
48
+ signal?: AbortSignal;
49
+ }): Promise<OAuthAgent>;
50
+ private readCallbackParams;
51
+ signInCallback(): Promise<{
52
+ agent: OAuthAgent;
53
+ state: string | null;
54
+ } | null>;
55
+ [Symbol.asyncDispose](): Promise<void>;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=browser-oauth-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-oauth-client.d.ts","sourceRoot":"","sources":["../src/browser-oauth-client.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EACL,gBAAgB,EAChB,UAAU,EAEV,WAAW,EACX,OAAO,EACP,QAAQ,EACT,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EAKlB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAEL,aAAa,EACd,MAAM,6BAA6B,CAAA;AAKpC,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,CAAC,EAAE,wBAAwB,CAAA;IACzC,cAAc,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,GAAG,CAAA;IAC9C,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAE9B,MAAM,CAAC,EAAE,OAAO,UAAU,CAAC,MAAM,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAChC,CAAA;AAED,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,QAAQ,CAAA;IACjB,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CACzB,CAAA;AAED,KAAK,mBAAmB,CAAC,CAAC,SAAS,MAAM,YAAY,GAAG,MAAM,YAAY,IAAI,CAC5E,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAChC,IAAI,CAAA;AA8BT,KAAK,mBAAmB,GAAG,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;AA6C9D,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,yBAAyB,EACzB,gBAAgB,CACjB,GAAG;IACF,QAAQ,EAAE,aAAa,CAAA;IACvB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,CAAA;AAED,qBAAa,kBAAmB,SAAQ,WAAW;WACpC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,6BAA6B;IAsCzE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAA;IAE1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAEnC,EACV,cAAc,EACd,cAAsC,EAEtC,YAAyB,EACzB,eAAyC,EACzC,MAA0B,EAC1B,KAAwB,GACzB,GAAE,yBAA8B;IAyCjC,gBAAgB,CAAC,CAAC,SAAS,MAAM,YAAY,EAC3C,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO;IAK7C,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO;IASpC,UAAU;;;IASV,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;;;;;;IAUpC,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GAAG;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE;IASjD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAWxD,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnE,OAAO,CAAC,UAAU,CAAC;IA+EtB,OAAO,CAAC,kBAAkB;IAuBpB,cAAc;;;;IAwFd,CAAC,MAAM,CAAC,YAAY,CAAC;CAK5B"}
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrowserOAuthClient = void 0;
4
+ const oauth_client_1 = require("@atproto/oauth-client");
5
+ const oauth_types_1 = require("@atproto/oauth-types");
6
+ const browser_oauth_database_js_1 = require("./browser-oauth-database.js");
7
+ const browser_runtime_implementation_js_1 = require("./browser-runtime-implementation.js");
8
+ const errors_js_1 = require("./errors.js");
9
+ const util_js_1 = require("./util.js");
10
+ const initEvent = (type, detail) => new CustomEvent(type, { detail, cancelable: false, bubbles: false });
11
+ const NAMESPACE = `@@atproto/oauth-client-browser`;
12
+ //- Popup channel
13
+ const POPUP_CHANNEL_NAME = `${NAMESPACE}(popup-channel)`;
14
+ const POPUP_STATE_PREFIX = `${NAMESPACE}(popup-state):`;
15
+ //- Deleted channel
16
+ const deletedChannel = new BroadcastChannel(`${NAMESPACE}(deleted-channel)`);
17
+ const wrapSessionStore = (dbStore, eventTarget) => {
18
+ const store = {
19
+ getKeys: async () => {
20
+ return dbStore.getKeys();
21
+ },
22
+ get: async (sub) => {
23
+ return dbStore.get(sub);
24
+ },
25
+ set: async (sub, session) => {
26
+ await dbStore.set(sub, session);
27
+ eventTarget.dispatchEvent(initEvent('updated', session.tokenSet));
28
+ },
29
+ del: async (sub) => {
30
+ await dbStore.del(sub);
31
+ deletedChannel.postMessage(sub);
32
+ eventTarget.dispatchEvent(initEvent('deleted', { sub }));
33
+ },
34
+ clear: async () => {
35
+ await dbStore.clear?.();
36
+ },
37
+ [Symbol.dispose]: () => {
38
+ deletedChannel.removeEventListener('message', onMessage);
39
+ },
40
+ };
41
+ const onMessage = (event) => {
42
+ // Listen for "deleted" events from other windows. The content will already
43
+ // have been deleted from the store so we only need to notify the listeners.
44
+ if (event.source !== window) {
45
+ const sub = event.data;
46
+ eventTarget.dispatchEvent(initEvent('deleted', { sub }));
47
+ }
48
+ };
49
+ deletedChannel.addEventListener('message', onMessage);
50
+ return store;
51
+ };
52
+ class BrowserOAuthClient extends oauth_client_1.OAuthClient {
53
+ static async load({ clientId, ...options }) {
54
+ if ((0, oauth_types_1.isOAuthClientIdLoopback)(clientId)) {
55
+ return new BrowserOAuthClient({
56
+ clientMetadata: (0, oauth_types_1.atprotoLoopbackClientMetadata)(clientId),
57
+ ...options,
58
+ });
59
+ }
60
+ else if ((0, oauth_types_1.isOAuthClientIdDiscoverable)(clientId)) {
61
+ const fetch = options?.fetch ?? globalThis.fetch;
62
+ const request = new Request(clientId, {
63
+ redirect: 'error',
64
+ signal: options.signal,
65
+ });
66
+ const response = await fetch(request);
67
+ if (response.status !== 200) {
68
+ throw new TypeError(`Failed to fetch client metadata: ${response.status}`);
69
+ }
70
+ const mime = response.headers.get('content-type')?.split(';')[0].trim();
71
+ if (mime !== 'application/json') {
72
+ throw new TypeError(`Invalid content type: ${mime}`);
73
+ }
74
+ const json = await response.json();
75
+ options.signal?.throwIfAborted();
76
+ return new BrowserOAuthClient({
77
+ clientMetadata: oauth_types_1.oauthClientMetadataSchema.parse(json),
78
+ ...options,
79
+ });
80
+ }
81
+ else {
82
+ throw new TypeError(`Invalid client id: ${clientId}`);
83
+ }
84
+ }
85
+ constructor({ clientMetadata, handleResolver = 'https://bsky.social',
86
+ // "fragment" is safer as it is not sent to the server
87
+ responseMode = 'fragment', plcDirectoryUrl = 'https://plc.directory', crypto = globalThis.crypto, fetch = globalThis.fetch, } = {}) {
88
+ const database = new browser_oauth_database_js_1.BrowserOAuthDatabase();
89
+ const eventTarget = new EventTarget();
90
+ const sessionStore = wrapSessionStore(database.getSessionStore(), eventTarget);
91
+ super({
92
+ clientMetadata: clientMetadata == null
93
+ ? (0, oauth_types_1.atprotoLoopbackClientMetadata)((0, util_js_1.buildLoopbackClientId)(window.location))
94
+ : clientMetadata,
95
+ responseMode,
96
+ fetch,
97
+ runtimeImplementation: new browser_runtime_implementation_js_1.BrowserRuntimeImplementation(crypto),
98
+ plcDirectoryUrl,
99
+ handleResolver,
100
+ sessionStore,
101
+ stateStore: database.getStateStore(),
102
+ didCache: database.getDidCache(),
103
+ handleCache: database.getHandleCache(),
104
+ dpopNonceCache: database.getDpopNonceCache(),
105
+ authorizationServerMetadataCache: database.getAuthorizationServerMetadataCache(),
106
+ protectedResourceMetadataCache: database.getProtectedResourceMetadataCache(),
107
+ });
108
+ Object.defineProperty(this, "sessionStore", {
109
+ enumerable: true,
110
+ configurable: true,
111
+ writable: true,
112
+ value: void 0
113
+ });
114
+ Object.defineProperty(this, "eventTarget", {
115
+ enumerable: true,
116
+ configurable: true,
117
+ writable: true,
118
+ value: void 0
119
+ });
120
+ Object.defineProperty(this, "database", {
121
+ enumerable: true,
122
+ configurable: true,
123
+ writable: true,
124
+ value: void 0
125
+ });
126
+ this.sessionStore = sessionStore;
127
+ this.eventTarget = eventTarget;
128
+ this.database = database;
129
+ fixLocation(this.clientMetadata);
130
+ }
131
+ addEventListener(type, callback, options) {
132
+ this.eventTarget.addEventListener(type, callback, options);
133
+ }
134
+ removeEventListener(type, callback, options) {
135
+ this.eventTarget.removeEventListener(type, callback, options);
136
+ }
137
+ async restoreAll() {
138
+ const subs = await this.sessionStore.getKeys();
139
+ return Object.fromEntries(await Promise.all(subs.map(async (sub) => [sub, await this.restore(sub, false)])));
140
+ }
141
+ async init(sub, refresh) {
142
+ const signInResult = await this.signInCallback();
143
+ if (signInResult) {
144
+ return signInResult;
145
+ }
146
+ else if (sub) {
147
+ const agent = await this.restore(sub, refresh);
148
+ return { agent };
149
+ }
150
+ }
151
+ async signIn(input, options) {
152
+ if (options?.display === 'popup') {
153
+ return this.signInPopup(input, options);
154
+ }
155
+ else {
156
+ return this.signInRedirect(input, options);
157
+ }
158
+ }
159
+ async signInRedirect(input, options) {
160
+ const url = await this.authorize(input, options);
161
+ window.location.href = url.href;
162
+ // back-forward cache
163
+ return new Promise((resolve, reject) => {
164
+ setTimeout(() => reject(new Error('User navigated back')), 5e3);
165
+ });
166
+ }
167
+ async signInPopup(input, options) {
168
+ // Open new window asap to prevent popup busting by browsers
169
+ const popupFeatures = 'width=600,height=600,menubar=no,toolbar=no';
170
+ let popup = window.open('about:blank', '_blank', popupFeatures);
171
+ const stateKey = `${Math.random().toString(36).slice(2)}`;
172
+ const url = await this.authorize(input, {
173
+ ...options,
174
+ state: `${POPUP_STATE_PREFIX}${stateKey}`,
175
+ display: options?.display ?? 'popup',
176
+ });
177
+ options?.signal?.throwIfAborted();
178
+ if (popup) {
179
+ popup.window.location.href = url.href;
180
+ }
181
+ else {
182
+ popup = window.open(url.href, '_blank', popupFeatures);
183
+ }
184
+ popup?.focus();
185
+ return new Promise((resolve, reject) => {
186
+ const popupChannel = new BroadcastChannel(POPUP_CHANNEL_NAME);
187
+ const cleanup = () => {
188
+ clearTimeout(timeout);
189
+ popupChannel.removeEventListener('message', onMessage);
190
+ popupChannel.close();
191
+ options?.signal?.removeEventListener('abort', cancel);
192
+ popup?.close();
193
+ };
194
+ const cancel = () => {
195
+ // @TODO: Store fact that the request was cancelled, allowing any
196
+ // callback (e.g. in the popup) to revoke the session or credentials.
197
+ reject(new Error(options?.signal?.aborted ? 'Aborted' : 'Timeout'));
198
+ cleanup();
199
+ };
200
+ options?.signal?.addEventListener('abort', cancel);
201
+ const timeout = setTimeout(cancel, 5 * 60e3);
202
+ const onMessage = async ({ data }) => {
203
+ if (data.key !== stateKey)
204
+ return;
205
+ if (!('result' in data))
206
+ return;
207
+ // Send acknowledgment to popup window
208
+ popupChannel.postMessage({ key: stateKey, ack: true });
209
+ cleanup();
210
+ const { result } = data;
211
+ if (result.status === 'fulfilled') {
212
+ const sub = result.value;
213
+ try {
214
+ options?.signal?.throwIfAborted();
215
+ resolve(await this.restore(sub));
216
+ }
217
+ catch (err) {
218
+ reject(err);
219
+ void this.revoke(sub);
220
+ }
221
+ }
222
+ else {
223
+ const { message, params } = result.reason;
224
+ reject(new oauth_client_1.OAuthCallbackError(new URLSearchParams(params), message));
225
+ }
226
+ };
227
+ popupChannel.addEventListener('message', onMessage);
228
+ });
229
+ }
230
+ readCallbackParams() {
231
+ const params = this.responseMode === 'fragment'
232
+ ? new URLSearchParams(location.hash.slice(1))
233
+ : new URLSearchParams(location.search);
234
+ // Only if the current URL contains a valid oauth response params
235
+ if (!params.has('state') || !(params.has('code') || params.has('error'))) {
236
+ return null;
237
+ }
238
+ const matchesLocation = (url) => location.origin === url.origin && location.pathname === url.pathname;
239
+ const redirectUrls = this.clientMetadata.redirect_uris.map((uri) => new URL(uri));
240
+ // Only if the current URL is one of the redirect_uris
241
+ if (!redirectUrls.some(matchesLocation))
242
+ return null;
243
+ return params;
244
+ }
245
+ async signInCallback() {
246
+ const params = this.readCallbackParams();
247
+ // Not a (valid) OAuth redirect
248
+ if (!params)
249
+ return null;
250
+ // Replace the current history entry without the params (this will prevent
251
+ // the following code to run again if the user refreshes the page)
252
+ history.replaceState(null, '', location.pathname);
253
+ const sendResult = (message) => {
254
+ const popupChannel = new BroadcastChannel(POPUP_CHANNEL_NAME);
255
+ return new Promise((resolve) => {
256
+ const cleanup = (result) => {
257
+ clearTimeout(timer);
258
+ popupChannel.removeEventListener('message', onMessage);
259
+ popupChannel.close();
260
+ resolve(result);
261
+ };
262
+ const onTimeout = () => {
263
+ cleanup(false);
264
+ };
265
+ const onMessage = ({ data }) => {
266
+ if ('ack' in data && message.key === data.key)
267
+ cleanup(true);
268
+ };
269
+ popupChannel.addEventListener('message', onMessage);
270
+ popupChannel.postMessage(message);
271
+ // Receiving of "ack" should be very fast, giving it 500 ms anyway
272
+ const timer = setTimeout(onTimeout, 500);
273
+ });
274
+ };
275
+ return this.callback(params)
276
+ .then(async (result) => {
277
+ if (result.state?.startsWith(POPUP_STATE_PREFIX)) {
278
+ const receivedByParent = await sendResult({
279
+ key: result.state.slice(POPUP_STATE_PREFIX.length),
280
+ result: {
281
+ status: 'fulfilled',
282
+ value: result.agent.sub,
283
+ },
284
+ });
285
+ // Revoke the credentials if the parent window was closed
286
+ if (!receivedByParent)
287
+ await result.agent.signOut();
288
+ throw new errors_js_1.LoginContinuedInParentWindowError(); // signInPopup
289
+ }
290
+ return result;
291
+ })
292
+ .catch(async (err) => {
293
+ if (err instanceof oauth_client_1.OAuthCallbackError &&
294
+ err.state?.startsWith(POPUP_STATE_PREFIX)) {
295
+ await sendResult({
296
+ key: err.state.slice(POPUP_STATE_PREFIX.length),
297
+ result: {
298
+ status: 'rejected',
299
+ reason: {
300
+ message: err.message,
301
+ params: Array.from(err.params.entries()),
302
+ },
303
+ },
304
+ });
305
+ throw new errors_js_1.LoginContinuedInParentWindowError(); // signInPopup
306
+ }
307
+ // Most probable cause at this point is that the "state" parameter is
308
+ // invalid.
309
+ throw err;
310
+ })
311
+ .catch((err) => {
312
+ if (err instanceof errors_js_1.LoginContinuedInParentWindowError) {
313
+ // parent will also try to close the popup
314
+ window.close();
315
+ }
316
+ throw err;
317
+ });
318
+ }
319
+ async [Symbol.asyncDispose]() {
320
+ // TODO This should be implemented using a DisposableStack
321
+ await this.sessionStore[Symbol.dispose]();
322
+ await this.database[Symbol.asyncDispose]();
323
+ }
324
+ }
325
+ exports.BrowserOAuthClient = BrowserOAuthClient;
326
+ /**
327
+ * Since "localhost" is often used either in IP mode or in hostname mode,
328
+ * and because the redirect uris must use the IP mode, we need to make sure
329
+ * that the current location url is not using "localhost".
330
+ *
331
+ * This is required for the IndexedDB to work properly. Indeed, the IndexedDB
332
+ * is shared by origin, so we must ensure to be on the same origin as the
333
+ * redirect uris.
334
+ */
335
+ function fixLocation(clientMetadata) {
336
+ if (clientMetadata.client_id !== 'http://localhost/')
337
+ return;
338
+ if (window.location.hostname !== 'localhost')
339
+ return;
340
+ const locationUrl = new URL(window.location.href);
341
+ for (const uri of clientMetadata.redirect_uris) {
342
+ const url = new URL(uri);
343
+ if (url.port === locationUrl.port &&
344
+ url.protocol === locationUrl.protocol &&
345
+ (url.hostname === '127.0.0.1' || url.hostname === '[::1]')) {
346
+ window.location.hostname = url.hostname;
347
+ // Prevent APP from loading on the wrong hostname
348
+ throw new Error('Redirecting to loopback IP...');
349
+ }
350
+ }
351
+ throw new Error(`Please use the loopback IP address instead of ${locationUrl}`);
352
+ }
353
+ //# sourceMappingURL=browser-oauth-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-oauth-client.js","sourceRoot":"","sources":["../src/browser-oauth-client.ts"],"names":[],"mappings":";;;AACA,wDAO8B;AAC9B,sDAQ6B;AAE7B,2EAGoC;AACpC,2FAAkF;AAClF,2CAA+D;AAC/D,uCAAiD;AAqBjD,MAAM,SAAS,GAAG,CAChB,IAAO,EACP,MAAuB,EACvB,EAAE,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;AAEzE,MAAM,SAAS,GAAG,gCAAgC,CAAA;AAElD,iBAAiB;AAEjB,MAAM,kBAAkB,GAAG,GAAG,SAAS,iBAAiB,CAAA;AACxD,MAAM,kBAAkB,GAAG,GAAG,SAAS,gBAAgB,CAAA;AAcvD,mBAAmB;AAEnB,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAC,GAAG,SAAS,mBAAmB,CAAC,CAAA;AAG5E,MAAM,gBAAgB,GAAG,CACvB,OAA+B,EAC/B,WAAwB,EACxB,EAAE;IACF,MAAM,KAAK,GAAwB;QACjC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACjB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAE/B,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;QACnE,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACjB,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAE/B,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAA;QACzB,CAAC;QACD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE;YACrB,cAAc,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC1D,CAAC;KACF,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,KAA2B,EAAE,EAAE;QAChD,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAA;YACtB,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC,CAAA;IAED,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAErD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAUD,MAAa,kBAAmB,SAAQ,0BAAW;IACjD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAiC;QACvE,IAAI,IAAA,qCAAuB,EAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,kBAAkB,CAAC;gBAC5B,cAAc,EAAE,IAAA,2CAA6B,EAAC,QAAQ,CAAC;gBACvD,GAAG,OAAO;aACX,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,IAAA,yCAA2B,EAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAA;YAChD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE;gBACpC,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAA;YAErC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,SAAS,CACjB,oCAAoC,QAAQ,CAAC,MAAM,EAAE,CACtD,CAAA;YACH,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACvE,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAChC,MAAM,IAAI,SAAS,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAA;YACtD,CAAC;YAED,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAE3C,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;YAEhC,OAAO,IAAI,kBAAkB,CAAC;gBAC5B,cAAc,EAAE,uCAAyB,CAAC,KAAK,CAAC,IAAI,CAAC;gBACrD,GAAG,OAAO;aACX,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,SAAS,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAOD,YAAY,EACV,cAAc,EACd,cAAc,GAAG,qBAAqB;IACtC,sDAAsD;IACtD,YAAY,GAAG,UAAU,EACzB,eAAe,GAAG,uBAAuB,EACzC,MAAM,GAAG,UAAU,CAAC,MAAM,EAC1B,KAAK,GAAG,UAAU,CAAC,KAAK,MACK,EAAE;QAC/B,MAAM,QAAQ,GAAG,IAAI,gDAAoB,EAAE,CAAA;QAE3C,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;QACrC,MAAM,YAAY,GAAG,gBAAgB,CACnC,QAAQ,CAAC,eAAe,EAAE,EAC1B,WAAW,CACZ,CAAA;QAED,KAAK,CAAC;YACJ,cAAc,EACZ,cAAc,IAAI,IAAI;gBACpB,CAAC,CAAC,IAAA,2CAA6B,EAC3B,IAAA,+BAAqB,EAAC,MAAM,CAAC,QAAQ,CAAC,CACvC;gBACH,CAAC,CAAC,cAAc;YACpB,YAAY;YACZ,KAAK;YACL,qBAAqB,EAAE,IAAI,gEAA4B,CAAC,MAAM,CAAC;YAC/D,eAAe;YACf,cAAc;YACd,YAAY;YACZ,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;YAEpC,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;YAChC,WAAW,EAAE,QAAQ,CAAC,cAAc,EAAE;YACtC,cAAc,EAAE,QAAQ,CAAC,iBAAiB,EAAE;YAC5C,gCAAgC,EAC9B,QAAQ,CAAC,mCAAmC,EAAE;YAChD,8BAA8B,EAC5B,QAAQ,CAAC,iCAAiC,EAAE;SAC/C,CAAC,CAAA;QA5CK;;;;;WAAiC;QAEzB;;;;;WAAwB;QACxB;;;;;WAA8B;QA2C7C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAEhC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAClC,CAAC;IAED,gBAAgB,CACd,IAAO,EACP,QAAuC,EACvC,OAA2C;QAE3C,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAyB,EAAE,OAAO,CAAC,CAAA;IAC7E,CAAC;IAED,mBAAmB,CACjB,IAAY,EACZ,QAAoC,EACpC,OAAwC;QAExC,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAClC,IAAI,EACJ,QAAyB,EACzB,OAAO,CACR,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAA;QAC9C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAU,CAAC,CACxE,CACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAY,EAAE,OAAiB;QACxC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;QAChD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAA;QACrB,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAC9C,OAAO,EAAE,KAAK,EAAE,CAAA;QAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAAqD;QAErD,IAAI,OAAO,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,OAA0B;QAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAEhD,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QAE/B,qBAAqB;QACrB,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5C,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,KAAa,EACb,OAAoE;QAEpE,4DAA4D;QAC5D,MAAM,aAAa,GAAG,4CAA4C,CAAA;QAClE,IAAI,KAAK,GAAkB,MAAM,CAAC,IAAI,CACpC,aAAa,EACb,QAAQ,EACR,aAAa,CACd,CAAA;QAED,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAEzD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YACtC,GAAG,OAAO;YACV,KAAK,EAAE,GAAG,kBAAkB,GAAG,QAAQ,EAAE;YACzC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO;SACrC,CAAC,CAAA;QAEF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QAEjC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;QACxD,CAAC;QAED,KAAK,EAAE,KAAK,EAAE,CAAA;QAEd,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;YAE7D,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,YAAY,CAAC,OAAO,CAAC,CAAA;gBACrB,YAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBACtD,YAAY,CAAC,KAAK,EAAE,CAAA;gBACpB,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBACrD,KAAK,EAAE,KAAK,EAAE,CAAA;YAChB,CAAC,CAAA;YAED,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,iEAAiE;gBACjE,qEAAqE;gBAErE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;gBACnE,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;YAED,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAElD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YAE5C,MAAM,SAAS,GAAG,KAAK,EAAE,EAAE,IAAI,EAAkC,EAAE,EAAE;gBACnE,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ;oBAAE,OAAM;gBACjC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;oBAAE,OAAM;gBAE/B,sCAAsC;gBACtC,YAAY,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;gBAEtD,OAAO,EAAE,CAAA;gBAET,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;gBACvB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;oBACxB,IAAI,CAAC;wBACH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;wBACjC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;oBAClC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,GAAG,CAAC,CAAA;wBACX,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;oBACvB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAA;oBACzC,MAAM,CAAC,IAAI,iCAAkB,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;gBACtE,CAAC;YACH,CAAC,CAAA;YAED,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,MAAM,GACV,IAAI,CAAC,YAAY,KAAK,UAAU;YAC9B,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAE1C,iEAAiE;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,eAAe,GAAG,CAAC,GAAQ,EAAE,EAAE,CACnC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAAA;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,CACxD,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CACtB,CAAA;QAED,sDAAsD;QACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;YAAE,OAAO,IAAI,CAAA;QAEpD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAExC,+BAA+B;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,0EAA0E;QAC1E,kEAAkE;QAClE,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEjD,MAAM,UAAU,GAAG,CAAC,OAA+B,EAAE,EAAE;YACrD,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;YAE7D,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;gBACtC,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,EAAE;oBAClC,YAAY,CAAC,KAAK,CAAC,CAAA;oBACnB,YAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;oBACtD,YAAY,CAAC,KAAK,EAAE,CAAA;oBACpB,OAAO,CAAC,MAAM,CAAC,CAAA;gBACjB,CAAC,CAAA;gBAED,MAAM,SAAS,GAAG,GAAG,EAAE;oBACrB,OAAO,CAAC,KAAK,CAAC,CAAA;gBAChB,CAAC,CAAA;gBAED,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,EAAkC,EAAE,EAAE;oBAC7D,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;wBAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAC9D,CAAC,CAAA;gBAED,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBACnD,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;gBACjC,kEAAkE;gBAClE,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;YAC1C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;aACzB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACrB,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACjD,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC;oBACxC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC;oBAClD,MAAM,EAAE;wBACN,MAAM,EAAE,WAAW;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;qBACxB;iBACF,CAAC,CAAA;gBAEF,yDAAyD;gBACzD,IAAI,CAAC,gBAAgB;oBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;gBAEnD,MAAM,IAAI,6CAAiC,EAAE,CAAA,CAAC,cAAc;YAC9D,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACnB,IACE,GAAG,YAAY,iCAAkB;gBACjC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,kBAAkB,CAAC,EACzC,CAAC;gBACD,MAAM,UAAU,CAAC;oBACf,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC;oBAC/C,MAAM,EAAE;wBACN,MAAM,EAAE,UAAU;wBAClB,MAAM,EAAE;4BACN,OAAO,EAAE,GAAG,CAAC,OAAO;4BACpB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;yBACzC;qBACF;iBACF,CAAC,CAAA;gBAEF,MAAM,IAAI,6CAAiC,EAAE,CAAA,CAAC,cAAc;YAC9D,CAAC;YAED,qEAAqE;YACrE,WAAW;YACX,MAAM,GAAG,CAAA;QACX,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,IAAI,GAAG,YAAY,6CAAiC,EAAE,CAAC;gBACrD,0CAA0C;gBAC1C,MAAM,CAAC,KAAK,EAAE,CAAA;YAChB,CAAC;YAED,MAAM,GAAG,CAAA;QACX,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,0DAA0D;QAC1D,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;IAC5C,CAAC;CACF;AAhWD,gDAgWC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,cAAwC;IAC3D,IAAI,cAAc,CAAC,SAAS,KAAK,mBAAmB;QAAE,OAAM;IAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW;QAAE,OAAM;IAEpD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAEjD,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,IACE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;YAC7B,GAAG,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ;YACrC,CAAC,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,EAC1D,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;YAEvC,iDAAiD;YACjD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iDAAiD,WAAW,EAAE,CAC/D,CAAA;AACH,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { ResolvedHandle } from '@atproto-labs/handle-resolver';
2
+ import { SimpleStore, Value } from '@atproto-labs/simple-store';
3
+ import { DidDocument } from '@atproto/did';
4
+ import { InternalStateData, Session, TokenSet } from '@atproto/oauth-client';
5
+ import { OAuthAuthorizationServerMetadata, OAuthProtectedResourceMetadata } from '@atproto/oauth-types';
6
+ import { DBObjectStore } from './indexed-db/index.js';
7
+ type Item<V> = {
8
+ value: V;
9
+ expiresAt?: string;
10
+ };
11
+ type EncodedKey = {
12
+ keyId: string;
13
+ keyPair: CryptoKeyPair;
14
+ };
15
+ export type Schema = {
16
+ state: Item<{
17
+ dpopKey: EncodedKey;
18
+ iss: string;
19
+ nonce: string;
20
+ verifier?: string;
21
+ appState?: string;
22
+ }>;
23
+ session: Item<{
24
+ dpopKey: EncodedKey;
25
+ tokenSet: TokenSet;
26
+ }>;
27
+ didCache: Item<DidDocument>;
28
+ dpopNonceCache: Item<string>;
29
+ handleCache: Item<ResolvedHandle>;
30
+ authorizationServerMetadataCache: Item<OAuthAuthorizationServerMetadata>;
31
+ protectedResourceMetadataCache: Item<OAuthProtectedResourceMetadata>;
32
+ };
33
+ export type DatabaseStore<V extends Value> = SimpleStore<string, V> & {
34
+ getKeys: () => Promise<string[]>;
35
+ };
36
+ export type BrowserOAuthDatabaseOptions = {
37
+ name?: string;
38
+ durability?: 'strict' | 'relaxed';
39
+ cleanupInterval?: number;
40
+ };
41
+ export declare class BrowserOAuthDatabase {
42
+ #private;
43
+ constructor(options?: BrowserOAuthDatabaseOptions);
44
+ protected run<N extends keyof Schema, R>(storeName: N, mode: 'readonly' | 'readwrite', fn: (s: DBObjectStore<Schema[N]>) => R | Promise<R>): Promise<R>;
45
+ protected createStore<N extends keyof Schema, V extends Value>(name: N, { encode, decode, expiresAt, }: {
46
+ encode: (value: V) => Schema[N]['value'] | PromiseLike<Schema[N]['value']>;
47
+ decode: (encoded: Schema[N]['value']) => V | PromiseLike<V>;
48
+ expiresAt: (value: V) => null | Date;
49
+ }): DatabaseStore<V>;
50
+ getSessionStore(): DatabaseStore<Session>;
51
+ getStateStore(): DatabaseStore<InternalStateData>;
52
+ getDpopNonceCache(): undefined | DatabaseStore<string>;
53
+ getDidCache(): undefined | DatabaseStore<DidDocument>;
54
+ getHandleCache(): undefined | DatabaseStore<ResolvedHandle>;
55
+ getAuthorizationServerMetadataCache(): undefined | DatabaseStore<OAuthAuthorizationServerMetadata>;
56
+ getProtectedResourceMetadataCache(): undefined | DatabaseStore<OAuthProtectedResourceMetadata>;
57
+ cleanup(): Promise<void>;
58
+ [Symbol.asyncDispose](): Promise<void>;
59
+ }
60
+ export {};
61
+ //# sourceMappingURL=browser-oauth-database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-oauth-database.d.ts","sourceRoot":"","sources":["../src/browser-oauth-database.ts"],"names":[],"mappings":"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"}