@grest-ts/oauth 0.0.0-stage → 0.0.89

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -2
  3. package/dist/src/_dedupCheck.d.ts +2 -0
  4. package/dist/src/_dedupCheck.d.ts.map +1 -0
  5. package/dist/src/_dedupCheck.js +28 -0
  6. package/dist/src/_dedupCheck.js.map +1 -0
  7. package/dist/src/browser/GGOAuthClient.d.ts +50 -0
  8. package/dist/src/browser/GGOAuthClient.d.ts.map +1 -0
  9. package/dist/src/browser/GGOAuthClient.js +152 -0
  10. package/dist/src/browser/GGOAuthClient.js.map +1 -0
  11. package/dist/src/index-browser.d.ts +6 -0
  12. package/dist/src/index-browser.d.ts.map +1 -0
  13. package/dist/src/index-browser.js +4 -0
  14. package/dist/src/index-browser.js.map +1 -0
  15. package/dist/src/index-node.d.ts +8 -0
  16. package/dist/src/index-node.d.ts.map +1 -0
  17. package/dist/src/index-node.js +5 -0
  18. package/dist/src/index-node.js.map +1 -0
  19. package/dist/src/node/GGOAuthServer.d.ts +72 -0
  20. package/dist/src/node/GGOAuthServer.d.ts.map +1 -0
  21. package/dist/src/node/GGOAuthServer.js +417 -0
  22. package/dist/src/node/GGOAuthServer.js.map +1 -0
  23. package/dist/src/node/store/DynamoOAuthStore.d.ts +28 -0
  24. package/dist/src/node/store/DynamoOAuthStore.d.ts.map +1 -0
  25. package/dist/src/node/store/DynamoOAuthStore.js +78 -0
  26. package/dist/src/node/store/DynamoOAuthStore.js.map +1 -0
  27. package/dist/src/node/store/GGOAuthStore.d.ts +18 -0
  28. package/dist/src/node/store/GGOAuthStore.d.ts.map +1 -0
  29. package/dist/src/node/store/GGOAuthStore.js +16 -0
  30. package/dist/src/node/store/GGOAuthStore.js.map +1 -0
  31. package/dist/src/node/store/InMemoryOAuthStore.d.ts +16 -0
  32. package/dist/src/node/store/InMemoryOAuthStore.d.ts.map +1 -0
  33. package/dist/src/node/store/InMemoryOAuthStore.js +44 -0
  34. package/dist/src/node/store/InMemoryOAuthStore.js.map +1 -0
  35. package/dist/src/shared/interactionContract.d.ts +77 -0
  36. package/dist/src/shared/interactionContract.d.ts.map +1 -0
  37. package/dist/src/shared/interactionContract.js +34 -0
  38. package/dist/src/shared/interactionContract.js.map +1 -0
  39. package/dist/src/tsconfig.json +18 -0
  40. package/dist/tsconfig.publish.tsbuildinfo +1 -0
  41. package/package.json +71 -4
  42. package/src/_dedupCheck.ts +29 -0
  43. package/src/browser/GGOAuthClient.test.ts +76 -0
  44. package/src/browser/GGOAuthClient.ts +187 -0
  45. package/src/index-browser.ts +5 -0
  46. package/src/index-node.ts +7 -0
  47. package/src/node/GGOAuthServer.test.ts +389 -0
  48. package/src/node/GGOAuthServer.ts +485 -0
  49. package/src/node/store/DynamoOAuthStore.ts +93 -0
  50. package/src/node/store/GGOAuthStore.ts +41 -0
  51. package/src/node/store/InMemoryOAuthStore.ts +54 -0
  52. package/src/shared/interactionContract.ts +39 -0
  53. package/src/tsconfig.json +18 -0
@@ -0,0 +1,417 @@
1
+ import { createECDH, createHash, hkdfSync, randomBytes } from "node:crypto";
2
+ import Provider, { errors as oidcErrors } from "oidc-provider";
3
+ import { NOT_FOUND } from "@grest-ts/schema";
4
+ import { toOidcAdapter } from "./store/GGOAuthStore.js";
5
+ const BASE = "/oauth";
6
+ const OIDC_SCOPES = ["openid", "offline_access"];
7
+ const TICKET = "GGOAuthTicket";
8
+ // Claims resolved during a refresh before the presented token was consumed (see rotateRefreshToken).
9
+ const prefetchedClaims = new WeakMap();
10
+ // OAuth 2.1 authorization server on a GGHttpServer. Protocol (PKCE, DCR, CIMD, resource indicators,
11
+ // RFC 9207 iss, refresh rotation + reuse revocation, revocation, discovery) is panva oidc-provider;
12
+ // this class owns the grest-ts seams: mounting, storage, token claims and the login/consent handoff.
13
+ export class GGOAuthServer {
14
+ _provider;
15
+ _callback;
16
+ _firstParty;
17
+ options;
18
+ constructor(options) {
19
+ this.options = options;
20
+ }
21
+ get firstParty() {
22
+ this._firstParty ??= new Map((this.options.firstPartyClients?.() ?? []).map(c => [c.clientId, c]));
23
+ return this._firstParty;
24
+ }
25
+ mount(server) {
26
+ const handle = async (req, res) => {
27
+ const path = new URL(req.url ?? "/", "http://x").pathname;
28
+ const interaction = path.match(/^\/oauth\/interaction\/([^/]+)(\/complete)?$/);
29
+ if (interaction && req.method === "GET") {
30
+ if (interaction[2])
31
+ return this.finishInteraction(req, res, interaction[1]);
32
+ const found = await this.provider().Interaction.find(interaction[1]);
33
+ if (!found) {
34
+ res.writeHead(400, { "content-type": "text/plain" });
35
+ res.end("Sign-in request expired");
36
+ return;
37
+ }
38
+ const firstParty = this.firstParty.has(String(found.params.client_id));
39
+ res.writeHead(303, { location: this.options.interactionUrl(interaction[1], { redirectUri: String(found.params.redirect_uri), firstParty }) });
40
+ res.end();
41
+ return;
42
+ }
43
+ this._callback ??= this.provider().callback();
44
+ await this._callback(req, res);
45
+ };
46
+ for (const method of ["GET", "POST"])
47
+ server.registerRoute(method, `${BASE}/*`, handle, "GGOAuthServer");
48
+ server.registerRoute("GET", "/.well-known/openid-configuration", handle, "GGOAuthServer");
49
+ server.registerRoute("GET", "/.well-known/oauth-authorization-server", handle, "GGOAuthServer");
50
+ server.announce(`${BASE}/`, "GGOAuthServer");
51
+ server.announce("/.well-known/openid-configuration", "GGOAuthServer");
52
+ server.announce("/.well-known/oauth-authorization-server", "GGOAuthServer");
53
+ }
54
+ // Serves `path` as an OAuth-protected resource: requests without a valid token for `resource` get
55
+ // 401 + `WWW-Authenticate: Bearer resource_metadata=…`, and its RFC 9728 metadata is published —
56
+ // the discovery handshake MCP clients run before signing in.
57
+ protect(server, resource, path, handle) {
58
+ const metadataPath = `/.well-known/oauth-protected-resource${path}`;
59
+ server.registerRoute("GET", metadataPath, async (_req, res) => {
60
+ res.writeHead(200, { "content-type": "application/json" });
61
+ res.end(JSON.stringify({
62
+ resource: resource.resource(),
63
+ authorization_servers: [this.options.issuer()],
64
+ scopes_supported: resource.scopes,
65
+ bearer_methods_supported: ["header"],
66
+ }));
67
+ }, "GGOAuthServer");
68
+ const guarded = async (req, res) => {
69
+ const auth = req.headers.authorization;
70
+ const token = auth?.toLowerCase().startsWith("bearer ")
71
+ ? await resource.accessToken.verify(auth.slice(7)).catch(() => undefined)
72
+ : undefined;
73
+ if (!token) {
74
+ const metadataUrl = `${new URL(resource.resource()).origin}${metadataPath}`;
75
+ res.writeHead(401, {
76
+ "www-authenticate": `Bearer resource_metadata="${metadataUrl}", scope="${resource.scopes.join(" ")}"${auth ? `, error="invalid_token"` : ""}`,
77
+ });
78
+ res.end();
79
+ return;
80
+ }
81
+ await handle(req, res, token);
82
+ };
83
+ for (const method of ["GET", "POST", "DELETE"])
84
+ server.registerRoute(method, path, guarded, "GGOAuthServer");
85
+ server.announce(path, "GGOAuthServer");
86
+ server.announce(metadataPath, "GGOAuthServer");
87
+ }
88
+ // Implementation of GGOAuthInteractionContract; `subject` reads the signed-in user from the app's wire.
89
+ interactionApi(subject) {
90
+ return {
91
+ get: async ({ uid }) => this.describeInteraction(uid),
92
+ approve: async ({ uid }) => ({ redirectUrl: await this.approve(uid, subject()) }),
93
+ deny: async ({ uid }) => ({ redirectUrl: await this.ticket(await this.findInteraction(uid), { error: "access_denied", error_description: "The user denied the request" }) }),
94
+ };
95
+ }
96
+ listGrants = async (subject) => {
97
+ const p = this.provider();
98
+ const grants = await Promise.all((await this.options.store.listIdsByAccount("Grant", subject)).map(id => p.Grant.find(id)));
99
+ return await Promise.all(grants
100
+ .filter(g => g?.clientId && g.accountId === subject)
101
+ .map(async (g) => ({
102
+ grantId: g.jti,
103
+ clientId: g.clientId,
104
+ // A client metadata document may be unreachable; the grant must still be listed (and revocable).
105
+ clientName: String((await p.Client.find(g.clientId).catch(() => undefined))?.clientName ?? g.clientId),
106
+ createdAt: (g.iat ?? 0) * 1000,
107
+ })));
108
+ };
109
+ // Kills the grant's refresh tokens and codes now; already-issued access tokens live out their TTL.
110
+ revokeGrant = async (subject, grantId) => {
111
+ const grant = await this.provider().Grant.find(grantId);
112
+ if (!grant || grant.accountId !== subject)
113
+ throw new NOT_FOUND();
114
+ await this.options.store.revokeByGrantId(grantId);
115
+ // The grant row carries its id as jti, not grantId, so revokeByGrantId leaves it.
116
+ await this.options.store.destroy("Grant", grantId);
117
+ };
118
+ // "Log out everywhere": every grant and login session of the subject.
119
+ revokeAll = async (subject) => {
120
+ const store = this.options.store;
121
+ const [grantIds, sessionIds] = await Promise.all([store.listIdsByAccount("Grant", subject), store.listIdsByAccount("Session", subject)]);
122
+ await Promise.all([
123
+ ...grantIds.map(id => Promise.all([store.revokeByGrantId(id), store.destroy("Grant", id)])),
124
+ ...sessionIds.map(id => store.destroy("Session", id)),
125
+ ]);
126
+ };
127
+ async describeInteraction(uid) {
128
+ const interaction = await this.findInteraction(uid);
129
+ const clientId = String(interaction.params.client_id);
130
+ const client = await this.provider().Client.find(clientId);
131
+ if (!client)
132
+ throw new NOT_FOUND({ debugMessage: "Unknown OAuth client" });
133
+ const hosts = [...new Set((client.redirectUris ?? []).map(u => new URL(u).host))];
134
+ return {
135
+ uid,
136
+ client: {
137
+ clientId,
138
+ name: this.firstParty.get(clientId)?.name ?? String(client.clientName ?? clientId),
139
+ firstParty: this.firstParty.has(clientId),
140
+ redirectHosts: hosts,
141
+ loopbackOnly: hosts.length > 0 && hosts.every(h => /^(localhost|127\.0\.0\.1|\[::1\])(:\d+)?$/.test(h)),
142
+ },
143
+ scopes: requestedScopes(interaction.params),
144
+ resource: this.requestedResource(interaction.params, clientId).resource(),
145
+ };
146
+ }
147
+ async approve(uid, subject) {
148
+ const p = this.provider();
149
+ const interaction = await this.findInteraction(uid);
150
+ const clientId = String(interaction.params.client_id);
151
+ const existing = interaction.grantId ? await p.Grant.find(interaction.grantId) : undefined;
152
+ const grant = existing?.accountId === subject ? existing : new p.Grant({ accountId: subject, clientId });
153
+ this.grantRequested(grant, interaction.params);
154
+ const grantId = await grant.save();
155
+ return this.ticket(interaction, { login: { accountId: subject }, consent: { grantId } });
156
+ }
157
+ async findInteraction(uid) {
158
+ const interaction = await this.provider().Interaction.find(uid);
159
+ if (!interaction)
160
+ throw new NOT_FOUND({ debugMessage: "Unknown or expired OAuth interaction" });
161
+ return interaction;
162
+ }
163
+ // The result is applied only when the browser that started the flow (it holds the interaction
164
+ // cookie) follows the redirect: a user approving someone else's flow can't hand them a code.
165
+ async ticket(interaction, result) {
166
+ const uid = interaction.uid;
167
+ const id = randomBytes(24).toString("base64url");
168
+ await this.options.store.upsert(TICKET, id, { uid, result }, 120);
169
+ // Back to the origin the browser started on (its interaction cookie lives there) — but only a
170
+ // known one: returnTo comes from the request's Host, which a client can set to its own server.
171
+ const started = new URL(interaction.returnTo).origin;
172
+ const known = [this.options.issuer(), ...(this.options.origins?.() ?? [])].map(o => new URL(o).origin);
173
+ return `${known.includes(started) ? started : known[0]}${BASE}/interaction/${uid}/complete?ticket=${id}`;
174
+ }
175
+ async finishInteraction(req, res, uid) {
176
+ const id = new URL(req.url ?? "/", "http://x").searchParams.get("ticket") ?? "";
177
+ const ticket = id ? await this.options.store.find(TICKET, id) : undefined;
178
+ if (id)
179
+ await this.options.store.destroy(TICKET, id);
180
+ if (!ticket || ticket.uid !== uid) {
181
+ res.writeHead(400, { "content-type": "text/plain" });
182
+ res.end("Invalid or expired sign-in link");
183
+ return;
184
+ }
185
+ try {
186
+ await this.provider().interactionFinished(req, res, ticket.result, { mergeWithLastSubmission: false });
187
+ }
188
+ catch (err) {
189
+ if (!(err instanceof oidcErrors.SessionNotFound))
190
+ throw err;
191
+ res.writeHead(400, { "content-type": "text/plain" });
192
+ res.end("This sign-in was started in another browser");
193
+ }
194
+ }
195
+ grantRequested(grant, params) {
196
+ const requested = requestedScopes(params);
197
+ const oidc = requested.filter(s => OIDC_SCOPES.includes(s));
198
+ if (oidc.length)
199
+ grant.addOIDCScope(oidc.join(" "));
200
+ const resource = this.requestedResource(params, String(grant.clientId));
201
+ const resourceScopes = requested.filter(s => resource.scopes.includes(s));
202
+ if (resourceScopes.length)
203
+ grant.addResourceScope(resource.resource(), resourceScopes.join(" "));
204
+ }
205
+ requestedResource(params, clientId) {
206
+ const indicator = typeof params.resource === "string" ? params.resource : undefined;
207
+ return (indicator && this.resource(indicator)) || this.defaultResource(clientId);
208
+ }
209
+ resource(indicator) {
210
+ return this.options.resources.find(r => r.resource() === indicator);
211
+ }
212
+ clientOf(ctx) {
213
+ const client = ctx.oidc.client;
214
+ return { clientId: client.clientId, name: this.firstParty.get(client.clientId)?.name ?? String(client.clientName ?? client.clientId) };
215
+ }
216
+ usableResource(indicator, clientId) {
217
+ const resource = this.resource(indicator);
218
+ if (!resource)
219
+ throw new oidcErrors.InvalidTarget();
220
+ if (resource.firstPartyOnly && !this.firstParty.has(clientId))
221
+ throw new oidcErrors.InvalidTarget("resource not available to this client");
222
+ return resource;
223
+ }
224
+ defaultResource(clientId) {
225
+ const firstParty = this.firstParty.has(clientId);
226
+ return this.options.resources.find(r => firstParty || !r.firstPartyOnly) ?? this.options.resources[0];
227
+ }
228
+ provider() {
229
+ if (this._provider)
230
+ return this._provider;
231
+ const o = this.options;
232
+ const refreshTtlSec = o.refreshTtlSec ?? 30 * 24 * 3600;
233
+ const firstParty = this.firstParty;
234
+ const config = {
235
+ adapter: toOidcAdapter(o.store),
236
+ jwks: { keys: [deriveEs256Jwk(o.secret())] },
237
+ cookies: { keys: [hkdf(o.secret(), "@grest-ts/oauth cookies").toString("base64url")] },
238
+ clients: [...firstParty.values()].map(c => ({
239
+ client_id: c.clientId,
240
+ client_name: c.name,
241
+ redirect_uris: c.redirectUris,
242
+ post_logout_redirect_uris: c.postLogoutRedirectUris ?? [],
243
+ token_endpoint_auth_method: "none",
244
+ grant_types: ["authorization_code", "refresh_token"],
245
+ response_types: ["code"],
246
+ application_type: "web",
247
+ })),
248
+ clientDefaults: {
249
+ grant_types: ["authorization_code", "refresh_token"],
250
+ response_types: ["code"],
251
+ token_endpoint_auth_method: "none",
252
+ id_token_signed_response_alg: "ES256",
253
+ // Undeclared = native: CLI clients (e.g. Claude Code's metadata document) redirect to a
254
+ // loopback address on a per-run port, which oidc-provider only port-matches for native.
255
+ application_type: "native",
256
+ },
257
+ routes: {
258
+ authorization: `${BASE}/authorize`, token: `${BASE}/token`, registration: `${BASE}/register`,
259
+ jwks: `${BASE}/jwks`, revocation: `${BASE}/revoke`, end_session: `${BASE}/logout`, userinfo: `${BASE}/userinfo`,
260
+ introspection: `${BASE}/introspect`, pushed_authorization_request: `${BASE}/par`, code_verification: `${BASE}/device`,
261
+ device_authorization: `${BASE}/device/auth`, backchannel_authentication: `${BASE}/backchannel`, challenge: `${BASE}/challenge`,
262
+ },
263
+ interactions: { url: (_ctx, interaction) => `${BASE}/interaction/${interaction.uid}` },
264
+ scopes: OIDC_SCOPES,
265
+ responseTypes: ["code"],
266
+ pkce: { required: () => true },
267
+ features: {
268
+ devInteractions: { enabled: false },
269
+ revocation: { enabled: true },
270
+ registration: { enabled: !!o.dynamicRegistration },
271
+ ...(o.clientIdMetadataDocument ? { clientIdMetadataDocument: {
272
+ enabled: true,
273
+ ack: "draft-02",
274
+ allowFetch: async (_ctx, clientId) => o.clientIdMetadataDocument.allowedHosts().includes(new URL(clientId).hostname),
275
+ } } : {}),
276
+ rpInitiatedLogout: {
277
+ enabled: true,
278
+ // Skip the provider's "do you want to sign out?" page. `logout=yes` is that page's
279
+ // button value: without it only the requesting client is signed out, not the session.
280
+ logoutSource: async (ctx, form) => {
281
+ if (!form.includes("</form>"))
282
+ throw new Error("GGOAuthServer: oidc-provider's logout form changed; can't confirm logout");
283
+ // Any page can link here; only a first-party client's own page (its redirect origin as
284
+ // Referer) skips the confirmation click.
285
+ const client = ctx.oidc.client && firstParty.get(ctx.oidc.client.clientId);
286
+ const referer = URL.parse(ctx.get("referer"))?.origin;
287
+ if (client && referer && client.redirectUris.some(u => new URL(u).origin === referer)) {
288
+ const confirmed = form.replace("</form>", `<input type="hidden" name="logout" value="yes"/></form>`);
289
+ ctx.body = `<!DOCTYPE html><html><body>${confirmed}<script>document.forms[0].submit()</script></body></html>`;
290
+ return;
291
+ }
292
+ ctx.body = `<!DOCTYPE html><html><body>${form.replace("</form>", `<button name="logout" value="yes">Sign out</button></form>`)}</body></html>`;
293
+ },
294
+ },
295
+ resourceIndicators: {
296
+ enabled: true,
297
+ defaultResource: (_ctx, client) => this.defaultResource(client.clientId).resource(),
298
+ useGrantedResource: () => true,
299
+ getResourceServerInfo: (_ctx, indicator, client) => {
300
+ const resource = this.usableResource(indicator, client.clientId);
301
+ const jws = resource.accessToken.signer.jwsKey?.();
302
+ if (!jws)
303
+ throw new Error("GGOAuthServer: a resource's accessToken signer must implement jwsKey() (e.g. HmacSigner)");
304
+ return {
305
+ scope: resource.scopes.join(" "),
306
+ audience: resource.accessToken.audience ?? indicator,
307
+ accessTokenTTL: Math.floor(resource.accessToken.accessTtlMs / 1000),
308
+ accessTokenFormat: "jwt",
309
+ jwt: { sign: { alg: jws.alg, key: Buffer.from(jws.key) } },
310
+ };
311
+ },
312
+ },
313
+ },
314
+ // First-party clients never see a consent screen: an existing login session is enough.
315
+ loadExistingGrant: async (ctx) => {
316
+ const client = ctx.oidc.client;
317
+ const session = ctx.oidc.session;
318
+ const grantId = ctx.oidc.result?.consent?.grantId || session.grantIdFor(client.clientId);
319
+ if (grantId)
320
+ return ctx.oidc.provider.Grant.find(grantId);
321
+ if (!firstParty.has(client.clientId) || !session.accountId)
322
+ return undefined;
323
+ const grant = new ctx.oidc.provider.Grant({ accountId: session.accountId, clientId: client.clientId });
324
+ this.grantRequested(grant, ctx.oidc.params);
325
+ await grant.save();
326
+ session.ensureClientContainer(client.clientId);
327
+ session.grantIdFor(client.clientId, grant.jti);
328
+ return grant;
329
+ },
330
+ // MCP clients don't reliably request offline_access; every code-flow client gets a refresh token.
331
+ issueRefreshToken: async (_ctx, client) => client.grantTypeAllowed("refresh_token"),
332
+ // Only first-party sign-ins end with the login session: signing out of the app must not
333
+ // disconnect the other apps the user connected (revoked explicitly instead).
334
+ expiresWithSession: async (ctx) => firstParty.has(ctx.oidc.client.clientId),
335
+ // Runs before the presented refresh token is consumed. Resolve the claims here, so a failure
336
+ // (store/IdP down) leaves it redeemable — after consumption, the client's retry is reuse and
337
+ // revokes the grant.
338
+ rotateRefreshToken: async (ctx) => {
339
+ const rt = ctx.oidc.entities.RefreshToken;
340
+ const clientId = String(rt.clientId);
341
+ // Which resource the new access token will be for, as oidc-provider resolves it (the
342
+ // request's resource first, then the granted one), validated now rather than after consume.
343
+ const granted = [rt.resource ?? []].flat();
344
+ const requested = ctx.oidc.params?.resource;
345
+ if (typeof requested === "string" && !granted.includes(requested))
346
+ throw new oidcErrors.InvalidTarget();
347
+ const indicator = typeof requested === "string" ? requested : granted.length === 1 ? granted[0] : undefined;
348
+ const resource = indicator ? this.usableResource(indicator, clientId) : this.defaultResource(clientId);
349
+ const claims = await resource.claims(String(rt.accountId), this.clientOf(ctx));
350
+ if (!claims)
351
+ throw new oidcErrors.InvalidGrant("subject is no longer valid");
352
+ prefetchedClaims.set(ctx, { resource: resource.resource(), claims });
353
+ return true;
354
+ },
355
+ extraTokenClaims: async (_ctx, token) => {
356
+ if (token.kind !== "AccessToken")
357
+ return undefined;
358
+ const at = token;
359
+ const resource = this.resource(at.resourceServer?.identifier());
360
+ if (!resource)
361
+ return undefined;
362
+ const prefetched = prefetchedClaims.get(_ctx);
363
+ const claims = prefetched?.resource === resource.resource() ? prefetched.claims : await resource.claims(String(at.accountId), this.clientOf(_ctx));
364
+ if (!claims)
365
+ throw new oidcErrors.InvalidGrant("subject is no longer valid");
366
+ return { data: resource.accessToken.encodeClaims(claims) };
367
+ },
368
+ findAccount: async (_ctx, sub) => ({ accountId: sub, claims: async () => ({ sub }) }),
369
+ ttl: {
370
+ AccessToken: (_ctx, token) => {
371
+ const resource = this.resource(token.resourceServer?.identifier());
372
+ return resource ? Math.floor(resource.accessToken.accessTtlMs / 1000) : 600;
373
+ },
374
+ AuthorizationCode: 60,
375
+ Interaction: 30 * 60,
376
+ Session: o.sessionTtlSec ?? 30 * 24 * 3600,
377
+ Grant: 365 * 24 * 3600,
378
+ RefreshToken: (ctx, token) => {
379
+ const rotated = ctx?.oidc.entities.RotatedRefreshToken;
380
+ return rotated && !token.isSenderConstrained() ? rotated.remainingTTL : refreshTtlSec;
381
+ },
382
+ },
383
+ renderError: async (ctx, out) => {
384
+ ctx.type = "text/plain";
385
+ ctx.body = `${out.error}: ${out.error_description ?? ""}`;
386
+ },
387
+ };
388
+ const provider = new Provider(o.issuer(), config);
389
+ provider.proxy = !!o.proxy;
390
+ // Resource scopes aren't OIDC scopes, so the provider leaves them out of its metadata.
391
+ provider.use(async (ctx, next) => {
392
+ await next();
393
+ if (ctx.oidc?.route === "discovery")
394
+ ctx.body.scopes_supported = [...OIDC_SCOPES, ...new Set(o.resources.flatMap(r => r.scopes))];
395
+ });
396
+ this._provider = provider;
397
+ return provider;
398
+ }
399
+ }
400
+ function requestedScopes(params) {
401
+ return String(params.scope ?? "").split(" ").filter(Boolean);
402
+ }
403
+ function hkdf(secret, info) {
404
+ return Buffer.from(hkdfSync("sha256", secret, "", info, 32));
405
+ }
406
+ // Deterministic, so every instance publishes the same key without distributing a key file.
407
+ function deriveEs256Jwk(secret) {
408
+ const d = hkdf(secret, "@grest-ts/oauth es256");
409
+ const ecdh = createECDH("prime256v1");
410
+ ecdh.setPrivateKey(d);
411
+ const point = ecdh.getPublicKey();
412
+ const x = point.subarray(1, 33).toString("base64url");
413
+ const y = point.subarray(33).toString("base64url");
414
+ const kid = createHash("sha256").update(x + y).digest("base64url").slice(0, 16);
415
+ return { kty: "EC", crv: "P-256", d: d.toString("base64url"), x, y, alg: "ES256", use: "sig", kid };
416
+ }
417
+ //# sourceMappingURL=GGOAuthServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGOAuthServer.js","sourceRoot":"","sources":["../../../src/node/GGOAuthServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,aAAa,CAAA;AAEzE,OAAO,QAAQ,EAAE,EAAC,MAAM,IAAI,UAAU,EAAuE,MAAM,eAAe,CAAA;AAClI,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAI1C,OAAO,EAAC,aAAa,EAAoB,MAAM,sBAAsB,CAAA;AAuDrE,MAAM,IAAI,GAAG,QAAQ,CAAA;AACrB,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;AAChD,MAAM,MAAM,GAAG,eAAe,CAAA;AAC9B,qGAAqG;AACrG,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAA8C,CAAA;AAIlF,oGAAoG;AACpG,oGAAoG;AACpG,qGAAqG;AACrG,MAAM,OAAO,aAAa;IAEd,SAAS,CAAsB;IAC/B,SAAS,CAA8C;IACvD,WAAW,CAAkD;IACpD,OAAO,CAAsB;IAE9C,YAAY,OAA6B;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,IAAY,UAAU;QAClB,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAClG,OAAO,IAAI,CAAC,WAAW,CAAA;IAC3B,CAAC;IAEM,KAAK,CAAC,MAAoB;QAC7B,MAAM,MAAM,GAAG,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAA;YACzD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC9E,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACtC,IAAI,WAAW,CAAC,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC3E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpE,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,cAAc,EAAE,YAAY,EAAC,CAAC,CAAA;oBAClD,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;oBAClC,OAAM;gBACV,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;gBACtE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,UAAU,EAAC,CAAC,EAAC,CAAC,CAAA;gBACzI,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACV,CAAC;YACD,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAA;YAC7C,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAClC,CAAC,CAAA;QACD,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAU;YAAE,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAA;QACjH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,mCAAmC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAA;QACzF,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,yCAAyC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAA;QAE/F,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,EAAE,eAAe,CAAC,CAAA;QAC5C,MAAM,CAAC,QAAQ,CAAC,mCAAmC,EAAE,eAAe,CAAC,CAAA;QACrE,MAAM,CAAC,QAAQ,CAAC,yCAAyC,EAAE,eAAe,CAAC,CAAA;IAC/E,CAAC;IAED,kGAAkG;IAClG,iGAAiG;IACjG,6DAA6D;IACtD,OAAO,CACV,MAAoB,EACpB,QAA4B,EAC5B,IAAY,EACZ,MAA+F;QAE/F,MAAM,YAAY,GAAG,wCAAwC,IAAI,EAAE,CAAA;QACnE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC1D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,cAAc,EAAE,kBAAkB,EAAC,CAAC,CAAA;YACxD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;gBAC7B,qBAAqB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC9C,gBAAgB,EAAE,QAAQ,CAAC,MAAM;gBACjC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;aACvC,CAAC,CAAC,CAAA;QACP,CAAC,EAAE,eAAe,CAAC,CAAA;QACnB,MAAM,OAAO,GAAG,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;YAChE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAA;YACtC,MAAM,KAAK,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBACnD,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;gBACzE,CAAC,CAAC,SAAS,CAAA;YACf,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,WAAW,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,YAAY,EAAE,CAAA;gBAC3E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACf,kBAAkB,EAAE,6BAA6B,WAAW,aAAa,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE;iBAChJ,CAAC,CAAA;gBACF,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACV,CAAC;YACD,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QACjC,CAAC,CAAA;QACD,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAU;YAAE,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;QACrH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;IAClD,CAAC;IAED,wGAAwG;IACjG,cAAc,CAAC,OAAqB;QACvC,OAAO;YACH,GAAG,EAAE,KAAK,EAAE,EAAC,GAAG,EAAC,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,EAAC,GAAG,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,WAAW,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAC,CAAC;YAC7E,IAAI,EAAE,KAAK,EAAE,EAAC,GAAG,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,WAAW,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAC,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,6BAA6B,EAAC,CAAC,EAAC,CAAC;SACzK,CAAA;IACL,CAAC;IAEM,UAAU,GAAG,KAAK,EAAE,OAAe,EAA8F,EAAE;QACtI,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3H,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC;aACnD,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE,CAAC,CAAC;YACb,OAAO,EAAE,CAAE,CAAC,GAAG;YACf,QAAQ,EAAE,CAAE,CAAC,QAAS;YACtB,iGAAiG;YACjG,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAE,CAAC,QAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,IAAI,CAAE,CAAC,QAAQ,CAAC;YACzG,SAAS,EAAE,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI;SAClC,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC,CAAA;IAED,mGAAmG;IAC5F,WAAW,GAAG,KAAK,EAAE,OAAe,EAAE,OAAe,EAAiB,EAAE;QAC3E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO;YAAE,MAAM,IAAI,SAAS,EAAE,CAAA;QAChE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QACjD,kFAAkF;QAClF,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACtD,CAAC,CAAA;IAED,sEAAsE;IAC/D,SAAS,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;QACxI,MAAM,OAAO,CAAC,GAAG,CAAC;YACd,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3F,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;SACxD,CAAC,CAAA;IACN,CAAC,CAAA;IAEO,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,SAAS,CAAC,EAAC,YAAY,EAAE,sBAAsB,EAAC,CAAC,CAAA;QACxE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjF,OAAO;YACH,GAAG;YACH,MAAM,EAAE;gBACJ,QAAQ;gBACR,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC;gBAClF,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACzC,aAAa,EAAE,KAAK;gBACpB,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,2CAA2C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC1G;YACD,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC;YAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;SAC5E,CAAA;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,OAAe;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QACzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1F,MAAM,KAAK,GAAG,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAC,CAAC,CAAA;QACtG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,EAAC,SAAS,EAAE,OAAO,EAAC,EAAE,OAAO,EAAE,EAAC,OAAO,EAAC,EAAC,CAAC,CAAA;IACtF,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,GAAW;QACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,SAAS,CAAC,EAAC,YAAY,EAAE,sCAAsC,EAAC,CAAC,CAAA;QAC7F,OAAO,WAAW,CAAA;IACtB,CAAC;IAED,8FAA8F;IAC9F,6FAA6F;IACrF,KAAK,CAAC,MAAM,CAAC,WAAkD,EAAE,MAA0B;QAC/F,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAA;QAC3B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAChD,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAC,GAAG,EAAE,MAAM,EAAkB,EAAE,GAAG,CAAC,CAAA;QAChF,8FAA8F;QAC9F,+FAA+F;QAC/F,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAA;QACpD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACtG,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,gBAAgB,GAAG,oBAAoB,EAAE,EAAE,CAAA;IAC5G,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,GAAoB,EAAE,GAAmB,EAAE,GAAW;QAClF,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC/E,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAuB,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/F,IAAI,EAAE;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,cAAc,EAAE,YAAY,EAAC,CAAC,CAAA;YAClD,GAAG,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;YAC1C,OAAM;QACV,CAAC;QACD,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,EAAC,uBAAuB,EAAE,KAAK,EAAC,CAAC,CAAA;QACxG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC,eAAe,CAAC;gBAAE,MAAM,GAAG,CAAA;YAC3D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,cAAc,EAAE,YAAY,EAAC,CAAC,CAAA;YAClD,GAAG,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;QAC1D,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,KAAsC,EAAE,MAA+B;QAC1F,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;QACvE,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACzE,IAAI,cAAc,CAAC,MAAM;YAAE,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpG,CAAC;IAEO,iBAAiB,CAAC,MAA+B,EAAE,QAAgB;QACvE,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QACnF,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IACpF,CAAC;IAEO,QAAQ,CAAC,SAA6B;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC,CAAA;IACvE,CAAC;IAEO,QAAQ,CAAC,GAAuB;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAO,CAAA;QAC/B,OAAO,EAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAC,CAAA;IACxI,CAAC;IAEO,cAAc,CAAC,SAAiB,EAAE,QAAgB;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,CAAA;QACnD,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC,uCAAuC,CAAC,CAAA;QAC1I,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,eAAe,CAAC,QAAgB;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACzG,CAAC;IAEO,QAAQ;QACZ,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;QACtB,MAAM,aAAa,GAAG,CAAC,CAAC,aAAa,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAElC,MAAM,MAAM,GAAkB;YAC1B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,EAAC,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC;YAC1C,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAC;YACpF,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxC,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,WAAW,EAAE,CAAC,CAAC,IAAI;gBACnB,aAAa,EAAE,CAAC,CAAC,YAAY;gBAC7B,yBAAyB,EAAE,CAAC,CAAC,sBAAsB,IAAI,EAAE;gBACzD,0BAA0B,EAAE,MAAM;gBAClC,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;gBACpD,cAAc,EAAE,CAAC,MAAM,CAAC;gBACxB,gBAAgB,EAAE,KAAK;aAC1B,CAAC,CAAC;YACH,cAAc,EAAE;gBACZ,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;gBACpD,cAAc,EAAE,CAAC,MAAM,CAAC;gBACxB,0BAA0B,EAAE,MAAM;gBAClC,4BAA4B,EAAE,OAAO;gBACrC,wFAAwF;gBACxF,wFAAwF;gBACxF,gBAAgB,EAAE,QAAQ;aAC7B;YACD,MAAM,EAAE;gBACJ,aAAa,EAAE,GAAG,IAAI,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,WAAW;gBAC5F,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,WAAW;gBAC/G,aAAa,EAAE,GAAG,IAAI,aAAa,EAAE,4BAA4B,EAAE,GAAG,IAAI,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAI,SAAS;gBACrH,oBAAoB,EAAE,GAAG,IAAI,cAAc,EAAE,0BAA0B,EAAE,GAAG,IAAI,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,YAAY;aACjI;YACD,YAAY,EAAE,EAAC,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,GAAG,IAAI,gBAAgB,WAAW,CAAC,GAAG,EAAE,EAAC;YACpF,MAAM,EAAE,WAAW;YACnB,aAAa,EAAE,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,EAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAC;YAC5B,QAAQ,EAAE;gBACN,eAAe,EAAE,EAAC,OAAO,EAAE,KAAK,EAAC;gBACjC,UAAU,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBAC3B,YAAY,EAAE,EAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAC;gBAChD,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAC,wBAAwB,EAAE;wBACxD,OAAO,EAAE,IAAI;wBACb,GAAG,EAAE,UAAU;wBACf,UAAU,EAAE,KAAK,EAAE,IAAa,EAAE,QAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAyB,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;qBACzI,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACR,iBAAiB,EAAE;oBACf,OAAO,EAAE,IAAI;oBACb,mFAAmF;oBACnF,sFAAsF;oBACtF,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;wBAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;4BAAE,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;wBAC1H,uFAAuF;wBACvF,yCAAyC;wBACzC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;wBAC1E,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAA;wBACrD,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;4BACpF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,yDAAyD,CAAC,CAAA;4BACpG,GAAG,CAAC,IAAI,GAAG,8BAA8B,SAAS,2DAA2D,CAAA;4BAC7G,OAAM;wBACV,CAAC;wBACD,GAAG,CAAC,IAAI,GAAG,8BAA8B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,4DAA4D,CAAC,gBAAgB,CAAA;oBAClJ,CAAC;iBACJ;gBACD,kBAAkB,EAAE;oBAChB,OAAO,EAAE,IAAI;oBACb,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;oBACnF,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI;oBAC9B,qBAAqB,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;wBAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;wBAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAA;wBAClD,IAAI,CAAC,GAAG;4BAAE,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAA;wBACrH,OAAO;4BACH,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;4BAChC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS;4BACpD,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;4BACnE,iBAAiB,EAAE,KAAK;4BACxB,GAAG,EAAE,EAAC,IAAI,EAAE,EAAC,GAAG,EAAE,GAAG,CAAC,GAAc,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAC,EAAC;yBACpE,CAAA;oBACL,CAAC;iBACJ;aACJ;YACD,uFAAuF;YACvF,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAO,CAAA;gBAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAQ,CAAA;gBACjC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBACxF,IAAI,OAAO;oBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACzD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;oBAAE,OAAO,SAAS,CAAA;gBAC5E,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAC,CAAC,CAAA;gBACpG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAiC,CAAC,CAAA;gBACtE,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;gBAClB,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBAC9C,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC9C,OAAO,KAAK,CAAA;YAChB,CAAC;YACD,kGAAkG;YAClG,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC;YACnF,wFAAwF;YACxF,6EAA6E;YAC7E,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC;YAC5E,6FAA6F;YAC7F,6FAA6F;YAC7F,qBAAqB;YACrB,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAa,CAAA;gBAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;gBACpC,qFAAqF;gBACrF,4FAA4F;gBAC5F,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAc,CAAA;gBACtD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAA;gBAC3C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAAE,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,CAAA;gBACvG,MAAM,SAAS,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC3G,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;gBACtG,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC9E,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAA;gBAC5E,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAC,CAAC,CAAA;gBAClE,OAAO,IAAI,CAAA;YACf,CAAC;YACD,gBAAgB,EAAE,KAAK,EAAE,IAAwB,EAAE,KAAK,EAAE,EAAE;gBACxD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;oBAAE,OAAO,SAAS,CAAA;gBAClD,MAAM,EAAE,GAAG,KAA8C,CAAA;gBACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC,CAAA;gBAC/D,IAAI,CAAC,QAAQ;oBAAE,OAAO,SAAS,CAAA;gBAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC7C,MAAM,MAAM,GAAG,UAAU,EAAE,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;gBAClJ,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAA;gBAC5E,OAAO,EAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,EAAC,CAAA;YAC5D,CAAC;YACD,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC;YACjF,GAAG,EAAE;gBACD,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC,CAAA;oBAClE,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;gBAC/E,CAAC;gBACD,iBAAiB,EAAE,EAAE;gBACrB,WAAW,EAAE,EAAE,GAAG,EAAE;gBACpB,OAAO,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;gBAC1C,KAAK,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI;gBACtB,YAAY,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBACzB,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAA;oBACtD,OAAO,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAA;gBACzF,CAAC;aACJ;YACD,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5B,GAAG,CAAC,IAAI,GAAG,YAAY,CAAA;gBACvB,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAA;YAC7D,CAAC;SACJ,CAAA;QACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;QACjD,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC1B,uFAAuF;QACvF,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,EAAE,CAAA;YACZ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW;gBAAG,GAAG,CAAC,IAAqC,CAAC,gBAAgB,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACvK,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,OAAO,QAAQ,CAAA;IACnB,CAAC;CACJ;AAGD,SAAS,eAAe,CAAC,MAA+B;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,IAAI,CAAC,MAAc,EAAE,IAAY;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,2FAA2F;AAC3F,SAAS,cAAc,CAAC,MAAc;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACrC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IACjC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IACrD,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/E,OAAO,EAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,CAAA;AACrG,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type GGDynamoDb, GGDynamoDbTable } from "@grest-ts/db-dynamodb";
2
+ import type { GGOAuthPayload, GGOAuthStore } from "./GGOAuthStore";
3
+ declare const IsOAuthRow: import("@grest-ts/schema").ObjectSchema<{
4
+ pk: string;
5
+ model: string;
6
+ id: string;
7
+ payload: string;
8
+ grantId?: string | undefined;
9
+ uid?: string | undefined;
10
+ accountId?: string | undefined;
11
+ consumedAt?: number | undefined;
12
+ expiresAtSec?: number | undefined;
13
+ }>;
14
+ type OAuthRow = typeof IsOAuthRow.infer;
15
+ export declare class DynamoOAuthStore extends GGDynamoDbTable<OAuthRow, "pk"> implements GGOAuthStore {
16
+ constructor(db: GGDynamoDb, tableName: string);
17
+ upsert: (model: string, id: string, payload: GGOAuthPayload, expiresInSec: number | undefined) => Promise<void>;
18
+ find: (model: string, id: string) => Promise<GGOAuthPayload | undefined>;
19
+ findByUid: (model: string, uid: string) => Promise<GGOAuthPayload | undefined>;
20
+ consume: (model: string, id: string) => Promise<void>;
21
+ destroy: (model: string, id: string) => Promise<void>;
22
+ revokeByGrantId: (grantId: string) => Promise<void>;
23
+ listIdsByAccount: (model: string, accountId: string) => Promise<string[]>;
24
+ private payloadOf;
25
+ private live;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=DynamoOAuthStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoOAuthStore.d.ts","sourceRoot":"","sources":["../../../../src/node/store/DynamoOAuthStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,UAAU,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAA;AAEtE,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAEhE,QAAA,MAAM,UAAU;;;;;;;;;;EAad,CAAA;AACF,KAAK,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,CAAA;AASvC,qBAAa,gBAAiB,SAAQ,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAE,YAAW,YAAY;gBAE7E,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM;IAItC,MAAM,GAAU,OAAO,MAAM,EAAE,IAAI,MAAM,EAAE,SAAS,cAAc,EAAE,cAAc,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,IAAI,CAAC,CAW1H;IAEM,IAAI,GAAU,OAAO,MAAM,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAoD;IAEjI,SAAS,GAAU,OAAO,MAAM,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CACyD;IAE5I,OAAO,GAAU,OAAO,MAAM,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAahE;IAEM,OAAO,GAAU,OAAO,MAAM,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;IAGM,eAAe,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAO9D;IAEM,gBAAgB,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5B;IAEzD,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,IAAI;CAGf"}
@@ -0,0 +1,78 @@
1
+ import { IsNumber, IsObject, IsString } from "@grest-ts/schema";
2
+ import { GGDynamoDbTable } from "@grest-ts/db-dynamodb";
3
+ import { errors as oidcErrors } from "oidc-provider";
4
+ const IsOAuthRow = IsObject({
5
+ pk: IsString.nonEmpty,
6
+ model: IsString.nonEmpty,
7
+ id: IsString.nonEmpty,
8
+ // oidc-provider's payload as JSON: opaque, nested, may hold undefined values.
9
+ payload: IsString,
10
+ grantId: IsString.orUndefined,
11
+ uid: IsString.orUndefined,
12
+ accountId: IsString.orUndefined,
13
+ /** Epoch seconds; set once (conditional write), so only one of two concurrent redemptions wins. */
14
+ consumedAt: IsNumber.min(0).orUndefined,
15
+ /** Epoch seconds; drives DynamoDB TTL. TTL deletion lags, so reads check it too. */
16
+ expiresAtSec: IsNumber.min(0).orUndefined,
17
+ });
18
+ // Table to create (TTL attribute `expiresAtSec`): HASH `pk` (S), plus GSIs projecting ALL —
19
+ // `grantId-index` (grantId), `uid-index` (uid), `accountId-index` (accountId).
20
+ // accountId is written only for the models looked up by account, so the index stays small: every
21
+ // spent refresh token is kept until expiry (reuse detection) and would otherwise land in it.
22
+ const BY_ACCOUNT = new Set(["Grant", "Session"]);
23
+ const REDEEMABLE = new Set(["AuthorizationCode", "RefreshToken"]);
24
+ export class DynamoOAuthStore extends GGDynamoDbTable {
25
+ constructor(db, tableName) {
26
+ super(db, tableName, IsOAuthRow, "pk");
27
+ }
28
+ upsert = async (model, id, payload, expiresInSec) => {
29
+ await this.put({
30
+ pk: `${model}#${id}`,
31
+ model,
32
+ id,
33
+ payload: JSON.stringify(payload),
34
+ grantId: payload.grantId,
35
+ uid: payload.uid,
36
+ accountId: BY_ACCOUNT.has(model) ? payload.accountId : undefined,
37
+ expiresAtSec: expiresInSec ? Math.floor(Date.now() / 1000) + expiresInSec : undefined,
38
+ });
39
+ };
40
+ find = async (model, id) => this.payloadOf(await this.get(`${model}#${id}`));
41
+ findByUid = async (model, uid) => this.payloadOf(await this.queryOne("uid-index", "uid = :uid", { ":uid": uid, ":model": model }, { filter: "#m = :model", names: { "#m": "model" } }));
42
+ consume = async (model, id) => {
43
+ const row = await this.get(`${model}#${id}`);
44
+ if (!row) {
45
+ // A code or refresh token revoked since it was read (e.g. the app was disconnected) must not be redeemed.
46
+ if (REDEEMABLE.has(model))
47
+ throw new oidcErrors.InvalidGrant(`${model} revoked`);
48
+ return;
49
+ }
50
+ const consumedAt = Math.floor(Date.now() / 1000);
51
+ const payload = JSON.stringify({ ...JSON.parse(row.payload), consumed: consumedAt });
52
+ // attribute_exists(pk): a row revoked meanwhile stays gone instead of being re-created.
53
+ if (!await this.putConditional({ ...row, payload, consumedAt }, "attribute_exists(pk) AND attribute_not_exists(consumedAt)")) {
54
+ throw new oidcErrors.InvalidGrant(`${model} already used`);
55
+ }
56
+ };
57
+ destroy = async (model, id) => {
58
+ await this.delete(`${model}#${id}`);
59
+ };
60
+ // A long-lived grant accumulates one spent refresh token per rotation (kept for reuse detection), so page.
61
+ revokeByGrantId = async (grantId) => {
62
+ let cursor;
63
+ do {
64
+ const page = await this.queryPage("grantId-index", "grantId = :g", { ":g": grantId }, { cursor, limit: 100 });
65
+ await Promise.all(page.items.map(row => this.delete(row.pk)));
66
+ cursor = page.cursor;
67
+ } while (cursor);
68
+ };
69
+ listIdsByAccount = async (model, accountId) => (await this.query("accountId-index", "accountId = :a", { ":a": accountId, ":model": model }, { filter: "#m = :model", names: { "#m": "model" } }))
70
+ .filter(row => this.live(row)).map(row => row.id);
71
+ payloadOf(row) {
72
+ return row && this.live(row) ? JSON.parse(row.payload) : undefined;
73
+ }
74
+ live(row) {
75
+ return row.expiresAtSec === undefined || row.expiresAtSec > Date.now() / 1000;
76
+ }
77
+ }
78
+ //# sourceMappingURL=DynamoOAuthStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoOAuthStore.js","sourceRoot":"","sources":["../../../../src/node/store/DynamoOAuthStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AdapterConstructor } from "oidc-provider";
2
+ export type GGOAuthPayload = Record<string, unknown> & {
3
+ grantId?: string;
4
+ uid?: string;
5
+ accountId?: string;
6
+ consumed?: number;
7
+ };
8
+ export interface GGOAuthStore {
9
+ upsert(model: string, id: string, payload: GGOAuthPayload, expiresInSec: number | undefined): Promise<void>;
10
+ find(model: string, id: string): Promise<GGOAuthPayload | undefined>;
11
+ findByUid(model: string, uid: string): Promise<GGOAuthPayload | undefined>;
12
+ consume(model: string, id: string): Promise<void>;
13
+ destroy(model: string, id: string): Promise<void>;
14
+ revokeByGrantId(grantId: string): Promise<void>;
15
+ listIdsByAccount(model: string, accountId: string): Promise<string[]>;
16
+ }
17
+ export declare function toOidcAdapter(store: GGOAuthStore): AdapterConstructor;
18
+ //# sourceMappingURL=GGOAuthStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGOAuthStore.d.ts","sourceRoot":"","sources":["../../../../src/node/store/GGOAuthStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAA;AAIrD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3G,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAA;IACpE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAA;IAI1E,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CACxE;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,kBAAkB,CAarE"}
@@ -0,0 +1,16 @@
1
+ // oidc-provider's adapter shape: `new Adapter(modelName)` per model.
2
+ export function toOidcAdapter(store) {
3
+ return class GGOAuthAdapter {
4
+ model;
5
+ constructor(model) { this.model = model; }
6
+ upsert = (id, payload, expiresIn) => store.upsert(this.model, id, payload, expiresIn);
7
+ find = (id) => store.find(this.model, id);
8
+ findByUid = (uid) => store.findByUid(this.model, uid);
9
+ // Device flow is never enabled.
10
+ findByUserCode = async () => undefined;
11
+ consume = (id) => store.consume(this.model, id);
12
+ destroy = (id) => store.destroy(this.model, id);
13
+ revokeByGrantId = (grantId) => store.revokeByGrantId(grantId);
14
+ };
15
+ }
16
+ //# sourceMappingURL=GGOAuthStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGOAuthStore.js","sourceRoot":"","sources":["../../../../src/node/store/GGOAuthStore.ts"],"names":[],"mappings":"AA0BA,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC7C,OAAO,MAAM,cAAc;QACN,KAAK,CAAQ;QAC9B,YAAY,KAAa,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA,CAAC,CAAC;QACjD,MAAM,GAAG,CAAC,EAAU,EAAE,OAAuB,EAAE,SAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACtH,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACjD,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC7D,gCAAgC;QAChC,cAAc,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAA;QACtC,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACvD,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACvD,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;KACxE,CAAA;AACL,CAAC"}