@portel/photon 1.22.0 → 1.23.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.
- package/README.md +19 -8
- package/dist/a2ui/mapper.d.ts +40 -0
- package/dist/a2ui/mapper.d.ts.map +1 -0
- package/dist/a2ui/mapper.js +286 -0
- package/dist/a2ui/mapper.js.map +1 -0
- package/dist/a2ui/types.d.ts +129 -0
- package/dist/a2ui/types.d.ts.map +1 -0
- package/dist/a2ui/types.js +20 -0
- package/dist/a2ui/types.js.map +1 -0
- package/dist/ag-ui/adapter.d.ts +9 -1
- package/dist/ag-ui/adapter.d.ts.map +1 -1
- package/dist/ag-ui/adapter.js +33 -16
- package/dist/ag-ui/adapter.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-daemon.d.ts +18 -0
- package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-daemon.js +118 -0
- package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -0
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +34 -34
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
- package/dist/auto-ui/bridge/renderers.js +371 -0
- package/dist/auto-ui/bridge/renderers.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +38 -1
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/auto-ui/types.d.ts +19 -0
- package/dist/auto-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/types.js.map +1 -1
- package/dist/beam.bundle.js +757 -107
- package/dist/beam.bundle.js.map +4 -4
- package/dist/cli/commands/beam.d.ts.map +1 -1
- package/dist/cli/commands/beam.js +2 -0
- package/dist/cli/commands/beam.js.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +2 -0
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +92 -3
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/host.d.ts.map +1 -1
- package/dist/cli/commands/host.js +9 -1
- package/dist/cli/commands/host.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +7 -3
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +4 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/maker.d.ts +8 -0
- package/dist/cli/commands/maker.d.ts.map +1 -1
- package/dist/cli/commands/maker.js +113 -46
- package/dist/cli/commands/maker.js.map +1 -1
- package/dist/cli/commands/marketplace.d.ts.map +1 -1
- package/dist/cli/commands/marketplace.js +7 -1
- package/dist/cli/commands/marketplace.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +10 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +215 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/package.d.ts.map +1 -1
- package/dist/cli/commands/package.js +33 -15
- package/dist/cli/commands/package.js.map +1 -1
- package/dist/cli/commands/ps.d.ts +16 -0
- package/dist/cli/commands/ps.d.ts.map +1 -0
- package/dist/cli/commands/ps.js +267 -0
- package/dist/cli/commands/ps.js.map +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +7 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +14 -4
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/context-store.d.ts +4 -4
- package/dist/context-store.d.ts.map +1 -1
- package/dist/context-store.js +20 -17
- package/dist/context-store.js.map +1 -1
- package/dist/context.d.ts +5 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +68 -14
- package/dist/context.js.map +1 -1
- package/dist/daemon/client.d.ts +60 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +76 -0
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/execution-history-sqlite.d.ts +50 -0
- package/dist/daemon/execution-history-sqlite.d.ts.map +1 -0
- package/dist/daemon/execution-history-sqlite.js +165 -0
- package/dist/daemon/execution-history-sqlite.js.map +1 -0
- package/dist/daemon/execution-history.d.ts +78 -0
- package/dist/daemon/execution-history.d.ts.map +1 -0
- package/dist/daemon/execution-history.js +246 -0
- package/dist/daemon/execution-history.js.map +1 -0
- package/dist/daemon/hot-reload-state.d.ts +27 -0
- package/dist/daemon/hot-reload-state.d.ts.map +1 -0
- package/dist/daemon/hot-reload-state.js +48 -0
- package/dist/daemon/hot-reload-state.js.map +1 -0
- package/dist/daemon/protocol.d.ts +5 -1
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +13 -0
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/registry-keys.d.ts +88 -0
- package/dist/daemon/registry-keys.d.ts.map +1 -0
- package/dist/daemon/registry-keys.js +91 -0
- package/dist/daemon/registry-keys.js.map +1 -0
- package/dist/daemon/server.js +1521 -186
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-resolver.d.ts +28 -0
- package/dist/daemon/session-resolver.d.ts.map +1 -0
- package/dist/daemon/session-resolver.js +41 -0
- package/dist/daemon/session-resolver.js.map +1 -0
- package/dist/data-migration.js +20 -9
- package/dist/data-migration.js.map +1 -1
- package/dist/loader.d.ts +22 -8
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +214 -94
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +9 -5
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/namespace-migration.d.ts.map +1 -1
- package/dist/namespace-migration.js +28 -23
- package/dist/namespace-migration.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +57 -8
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/serv/auth/auth-store.d.ts +155 -0
- package/dist/serv/auth/auth-store.d.ts.map +1 -0
- package/dist/serv/auth/auth-store.js +240 -0
- package/dist/serv/auth/auth-store.js.map +1 -0
- package/dist/serv/auth/endpoints.d.ts +113 -0
- package/dist/serv/auth/endpoints.d.ts.map +1 -0
- package/dist/serv/auth/endpoints.js +1005 -0
- package/dist/serv/auth/endpoints.js.map +1 -0
- package/dist/serv/auth/http-adapter.d.ts +60 -0
- package/dist/serv/auth/http-adapter.d.ts.map +1 -0
- package/dist/serv/auth/http-adapter.js +235 -0
- package/dist/serv/auth/http-adapter.js.map +1 -0
- package/dist/serv/auth/jwt.d.ts +92 -6
- package/dist/serv/auth/jwt.d.ts.map +1 -1
- package/dist/serv/auth/jwt.js +226 -24
- package/dist/serv/auth/jwt.js.map +1 -1
- package/dist/serv/auth/oauth-sqlite-stores.d.ts +48 -0
- package/dist/serv/auth/oauth-sqlite-stores.d.ts.map +1 -0
- package/dist/serv/auth/oauth-sqlite-stores.js +212 -0
- package/dist/serv/auth/oauth-sqlite-stores.js.map +1 -0
- package/dist/serv/auth/sqlite-stores.d.ts +85 -0
- package/dist/serv/auth/sqlite-stores.d.ts.map +1 -0
- package/dist/serv/auth/sqlite-stores.js +446 -0
- package/dist/serv/auth/sqlite-stores.js.map +1 -0
- package/dist/serv/auth/well-known.d.ts +54 -1
- package/dist/serv/auth/well-known.d.ts.map +1 -1
- package/dist/serv/auth/well-known.js +166 -17
- package/dist/serv/auth/well-known.js.map +1 -1
- package/dist/serv/index.d.ts +45 -2
- package/dist/serv/index.d.ts.map +1 -1
- package/dist/serv/index.js +65 -1
- package/dist/serv/index.js.map +1 -1
- package/dist/serv/types/index.d.ts +80 -0
- package/dist/serv/types/index.d.ts.map +1 -1
- package/dist/serv/types/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +61 -6
- package/dist/server.js.map +1 -1
- package/dist/shared/announce-context.d.ts +51 -0
- package/dist/shared/announce-context.d.ts.map +1 -0
- package/dist/shared/announce-context.js +73 -0
- package/dist/shared/announce-context.js.map +1 -0
- package/dist/shared/audit-sqlite.d.ts +63 -0
- package/dist/shared/audit-sqlite.d.ts.map +1 -0
- package/dist/shared/audit-sqlite.js +187 -0
- package/dist/shared/audit-sqlite.js.map +1 -0
- package/dist/shared/audit.d.ts +25 -3
- package/dist/shared/audit.d.ts.map +1 -1
- package/dist/shared/audit.js +97 -3
- package/dist/shared/audit.js.map +1 -1
- package/dist/shared/error-handler.d.ts +10 -1
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +17 -2
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared/security.d.ts +12 -0
- package/dist/shared/security.d.ts.map +1 -1
- package/dist/shared/security.js +80 -0
- package/dist/shared/security.js.map +1 -1
- package/dist/shared/sqlite-runtime.d.ts +46 -0
- package/dist/shared/sqlite-runtime.d.ts.map +1 -0
- package/dist/shared/sqlite-runtime.js +110 -0
- package/dist/shared/sqlite-runtime.js.map +1 -0
- package/dist/tasks/store.d.ts +1 -1
- package/dist/tasks/store.d.ts.map +1 -1
- package/dist/tasks/store.js +29 -15
- package/dist/tasks/store.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +26 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +31 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +3 -3
- package/dist/test-runner.js.map +1 -1
- package/dist/version-checker.d.ts.map +1 -1
- package/dist/version-checker.js +7 -14
- package/dist/version-checker.js.map +1 -1
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +103 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -2
- package/templates/photon.template.ts +7 -13
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed authorization-server stores.
|
|
3
|
+
*
|
|
4
|
+
* Implements the same five interfaces as `auth-store.ts` (AuthCodeStore,
|
|
5
|
+
* RefreshTokenStore, ClientRegistry, ConsentStore, PendingAuthorizationStore)
|
|
6
|
+
* with persistent storage across process restarts.
|
|
7
|
+
*
|
|
8
|
+
* Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
|
|
9
|
+
* - Under Bun: uses built-in `bun:sqlite` (zero install).
|
|
10
|
+
* - Under Node: falls back to `better-sqlite3` (optional peer dep).
|
|
11
|
+
*
|
|
12
|
+
* All five stores share a single database handle. Schema is created on first
|
|
13
|
+
* use. TTL enforcement happens at read time (stale rows are ignored and
|
|
14
|
+
* sweep() deletes them).
|
|
15
|
+
*/
|
|
16
|
+
import type { AuthorizationCode, RefreshToken, RegisteredClient, ConsentRecord } from '../types/index.js';
|
|
17
|
+
import type { AuthCodeStore, RefreshTokenStore, ClientRegistry, ConsentStore, PendingAuthorizationStore, PendingAuthorization } from './auth-store.js';
|
|
18
|
+
import { type SqliteDatabase } from '../../shared/sqlite-runtime.js';
|
|
19
|
+
/**
|
|
20
|
+
* Open the AS SQLite database at `path` with all schema created.
|
|
21
|
+
*/
|
|
22
|
+
export declare function openAuthDatabase(path: string): Promise<SqliteDatabase>;
|
|
23
|
+
export declare class SqliteAuthCodeStore implements AuthCodeStore {
|
|
24
|
+
private db;
|
|
25
|
+
private insert;
|
|
26
|
+
private select;
|
|
27
|
+
private remove;
|
|
28
|
+
private sweepStmt;
|
|
29
|
+
constructor(db: SqliteDatabase);
|
|
30
|
+
save(code: AuthorizationCode): Promise<void>;
|
|
31
|
+
peek(code: string): Promise<AuthorizationCode | null>;
|
|
32
|
+
consume(code: string): Promise<AuthorizationCode | null>;
|
|
33
|
+
sweep(now?: Date): Promise<number>;
|
|
34
|
+
}
|
|
35
|
+
export declare class SqliteRefreshTokenStore implements RefreshTokenStore {
|
|
36
|
+
private db;
|
|
37
|
+
private insert;
|
|
38
|
+
private select;
|
|
39
|
+
private remove;
|
|
40
|
+
private sweepStmt;
|
|
41
|
+
constructor(db: SqliteDatabase);
|
|
42
|
+
save(token: RefreshToken): Promise<void>;
|
|
43
|
+
private insertRow;
|
|
44
|
+
find(token: string): Promise<RefreshToken | null>;
|
|
45
|
+
rotate(oldToken: string, newToken: RefreshToken): Promise<RefreshToken | null>;
|
|
46
|
+
revoke(token: string): Promise<boolean>;
|
|
47
|
+
sweep(now?: Date): Promise<number>;
|
|
48
|
+
}
|
|
49
|
+
export declare class SqliteClientRegistry implements ClientRegistry {
|
|
50
|
+
private upsert;
|
|
51
|
+
private select;
|
|
52
|
+
private touchStmt;
|
|
53
|
+
private remove;
|
|
54
|
+
private sweepStmt;
|
|
55
|
+
constructor(db: SqliteDatabase);
|
|
56
|
+
save(client: RegisteredClient): Promise<void>;
|
|
57
|
+
find(clientId: string): Promise<RegisteredClient | null>;
|
|
58
|
+
touch(clientId: string, now?: Date): Promise<void>;
|
|
59
|
+
delete(clientId: string): Promise<boolean>;
|
|
60
|
+
sweep(maxIdleMs: number, now?: Date): Promise<number>;
|
|
61
|
+
}
|
|
62
|
+
export declare class SqliteConsentStore implements ConsentStore {
|
|
63
|
+
private upsert;
|
|
64
|
+
private select;
|
|
65
|
+
private remove;
|
|
66
|
+
private sweepStmt;
|
|
67
|
+
constructor(db: SqliteDatabase);
|
|
68
|
+
save(record: ConsentRecord): Promise<void>;
|
|
69
|
+
covers(userId: string, tenantId: string, clientId: string, scopes: string[]): Promise<boolean>;
|
|
70
|
+
revoke(userId: string, tenantId: string, clientId: string): Promise<boolean>;
|
|
71
|
+
sweep(now?: Date): Promise<number>;
|
|
72
|
+
}
|
|
73
|
+
export declare class SqlitePendingAuthorizationStore implements PendingAuthorizationStore {
|
|
74
|
+
private db;
|
|
75
|
+
private insert;
|
|
76
|
+
private select;
|
|
77
|
+
private remove;
|
|
78
|
+
private sweepStmt;
|
|
79
|
+
constructor(db: SqliteDatabase);
|
|
80
|
+
save(req: PendingAuthorization): Promise<void>;
|
|
81
|
+
peek(id: string): Promise<PendingAuthorization | null>;
|
|
82
|
+
consume(id: string): Promise<PendingAuthorization | null>;
|
|
83
|
+
sweep(now?: Date): Promise<number>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=sqlite-stores.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-stores.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/sqlite-stores.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed authorization-server stores.
|
|
3
|
+
*
|
|
4
|
+
* Implements the same five interfaces as `auth-store.ts` (AuthCodeStore,
|
|
5
|
+
* RefreshTokenStore, ClientRegistry, ConsentStore, PendingAuthorizationStore)
|
|
6
|
+
* with persistent storage across process restarts.
|
|
7
|
+
*
|
|
8
|
+
* Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
|
|
9
|
+
* - Under Bun: uses built-in `bun:sqlite` (zero install).
|
|
10
|
+
* - Under Node: falls back to `better-sqlite3` (optional peer dep).
|
|
11
|
+
*
|
|
12
|
+
* All five stores share a single database handle. Schema is created on first
|
|
13
|
+
* use. TTL enforcement happens at read time (stale rows are ignored and
|
|
14
|
+
* sweep() deletes them).
|
|
15
|
+
*/
|
|
16
|
+
import { openSqlite, } from '../../shared/sqlite-runtime.js';
|
|
17
|
+
/**
|
|
18
|
+
* Open the AS SQLite database at `path` with all schema created.
|
|
19
|
+
*/
|
|
20
|
+
export async function openAuthDatabase(path) {
|
|
21
|
+
return openSqlite(path, initSchema);
|
|
22
|
+
}
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Schema
|
|
25
|
+
// ============================================================================
|
|
26
|
+
function initSchema(db) {
|
|
27
|
+
db.exec(`
|
|
28
|
+
CREATE TABLE IF NOT EXISTS auth_codes (
|
|
29
|
+
code TEXT PRIMARY KEY,
|
|
30
|
+
client_id TEXT NOT NULL,
|
|
31
|
+
redirect_uri TEXT NOT NULL,
|
|
32
|
+
scope TEXT NOT NULL,
|
|
33
|
+
user_id TEXT NOT NULL,
|
|
34
|
+
tenant_id TEXT NOT NULL,
|
|
35
|
+
code_challenge TEXT NOT NULL,
|
|
36
|
+
code_challenge_method TEXT NOT NULL,
|
|
37
|
+
nonce TEXT,
|
|
38
|
+
expires_at INTEGER NOT NULL,
|
|
39
|
+
created_at INTEGER NOT NULL
|
|
40
|
+
);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_auth_codes_expires ON auth_codes(expires_at);
|
|
42
|
+
|
|
43
|
+
CREATE TABLE IF NOT EXISTS refresh_tokens (
|
|
44
|
+
token TEXT PRIMARY KEY,
|
|
45
|
+
client_id TEXT NOT NULL,
|
|
46
|
+
user_id TEXT NOT NULL,
|
|
47
|
+
tenant_id TEXT NOT NULL,
|
|
48
|
+
scope TEXT NOT NULL,
|
|
49
|
+
expires_at INTEGER NOT NULL,
|
|
50
|
+
created_at INTEGER NOT NULL,
|
|
51
|
+
supersedes TEXT
|
|
52
|
+
);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_refresh_expires ON refresh_tokens(expires_at);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_refresh_user ON refresh_tokens(tenant_id, user_id);
|
|
55
|
+
|
|
56
|
+
CREATE TABLE IF NOT EXISTS registered_clients (
|
|
57
|
+
client_id TEXT PRIMARY KEY,
|
|
58
|
+
client_secret_hash TEXT,
|
|
59
|
+
client_name TEXT NOT NULL,
|
|
60
|
+
redirect_uris TEXT NOT NULL,
|
|
61
|
+
grant_types TEXT NOT NULL,
|
|
62
|
+
response_types TEXT NOT NULL,
|
|
63
|
+
scope TEXT NOT NULL,
|
|
64
|
+
contacts TEXT,
|
|
65
|
+
logo_uri TEXT,
|
|
66
|
+
tos_uri TEXT,
|
|
67
|
+
policy_uri TEXT,
|
|
68
|
+
is_public INTEGER NOT NULL,
|
|
69
|
+
created_at INTEGER NOT NULL,
|
|
70
|
+
last_used_at INTEGER NOT NULL,
|
|
71
|
+
user_agent TEXT,
|
|
72
|
+
ip_address TEXT
|
|
73
|
+
);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_clients_last_used ON registered_clients(last_used_at);
|
|
75
|
+
|
|
76
|
+
CREATE TABLE IF NOT EXISTS consent_records (
|
|
77
|
+
user_id TEXT NOT NULL,
|
|
78
|
+
tenant_id TEXT NOT NULL,
|
|
79
|
+
client_id TEXT NOT NULL,
|
|
80
|
+
scopes TEXT NOT NULL,
|
|
81
|
+
expires_at INTEGER NOT NULL,
|
|
82
|
+
created_at INTEGER NOT NULL,
|
|
83
|
+
PRIMARY KEY (tenant_id, user_id, client_id)
|
|
84
|
+
);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_consent_expires ON consent_records(expires_at);
|
|
86
|
+
|
|
87
|
+
CREATE TABLE IF NOT EXISTS pending_auth (
|
|
88
|
+
id TEXT PRIMARY KEY,
|
|
89
|
+
client_id TEXT NOT NULL,
|
|
90
|
+
redirect_uri TEXT NOT NULL,
|
|
91
|
+
scope TEXT NOT NULL,
|
|
92
|
+
state TEXT,
|
|
93
|
+
nonce TEXT,
|
|
94
|
+
code_challenge TEXT NOT NULL,
|
|
95
|
+
code_challenge_method TEXT NOT NULL,
|
|
96
|
+
user_id TEXT NOT NULL,
|
|
97
|
+
tenant_id TEXT NOT NULL,
|
|
98
|
+
response_type TEXT NOT NULL,
|
|
99
|
+
expires_at INTEGER NOT NULL,
|
|
100
|
+
created_at INTEGER NOT NULL
|
|
101
|
+
);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_pending_expires ON pending_auth(expires_at);
|
|
103
|
+
`);
|
|
104
|
+
// Backfill columns added after the original schema. CREATE TABLE IF NOT EXISTS
|
|
105
|
+
// is a no-op against an existing table, so explicit ALTERs are required.
|
|
106
|
+
// ALTER COLUMN ADD on SQLite is idempotent only via PRAGMA inspection — the
|
|
107
|
+
// raw statement throws "duplicate column" on a re-run, which we swallow.
|
|
108
|
+
addColumnIfMissing(db, 'auth_codes', 'nonce', 'TEXT');
|
|
109
|
+
addColumnIfMissing(db, 'pending_auth', 'nonce', 'TEXT');
|
|
110
|
+
}
|
|
111
|
+
/** Idempotent ALTER TABLE ADD COLUMN. SQLite's table_info is the safest probe. */
|
|
112
|
+
function addColumnIfMissing(db, table, column, type) {
|
|
113
|
+
try {
|
|
114
|
+
const cols = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
115
|
+
if (cols.some((c) => c.name === column))
|
|
116
|
+
return;
|
|
117
|
+
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${type}`);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Table missing or PRAGMA unavailable — initial CREATE above will have
|
|
121
|
+
// produced the column; this is purely an upgrade-from-pre-nonce path.
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Auth Code Store
|
|
126
|
+
// ============================================================================
|
|
127
|
+
export class SqliteAuthCodeStore {
|
|
128
|
+
db;
|
|
129
|
+
insert;
|
|
130
|
+
select;
|
|
131
|
+
remove;
|
|
132
|
+
sweepStmt;
|
|
133
|
+
constructor(db) {
|
|
134
|
+
this.db = db;
|
|
135
|
+
this.insert = db.prepare(`
|
|
136
|
+
INSERT INTO auth_codes (code, client_id, redirect_uri, scope, user_id, tenant_id,
|
|
137
|
+
code_challenge, code_challenge_method, nonce, expires_at, created_at)
|
|
138
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
139
|
+
`);
|
|
140
|
+
this.select = db.prepare('SELECT * FROM auth_codes WHERE code = ?');
|
|
141
|
+
this.remove = db.prepare('DELETE FROM auth_codes WHERE code = ?');
|
|
142
|
+
this.sweepStmt = db.prepare('DELETE FROM auth_codes WHERE expires_at < ?');
|
|
143
|
+
}
|
|
144
|
+
async save(code) {
|
|
145
|
+
try {
|
|
146
|
+
this.insert.run(code.code, code.clientId, code.redirectUri, code.scope, code.userId, code.tenantId, code.codeChallenge, code.codeChallengeMethod, code.nonce ?? null, code.expiresAt.getTime(), code.createdAt.getTime());
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
if (err instanceof Error && /UNIQUE/i.test(err.message)) {
|
|
150
|
+
throw new Error('authorization code collision');
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async peek(code) {
|
|
156
|
+
const row = this.select.get(code);
|
|
157
|
+
if (!row)
|
|
158
|
+
return null;
|
|
159
|
+
const expiresAt = new Date(row.expires_at);
|
|
160
|
+
if (expiresAt.getTime() < Date.now())
|
|
161
|
+
return null;
|
|
162
|
+
return rowToAuthCode(row);
|
|
163
|
+
}
|
|
164
|
+
async consume(code) {
|
|
165
|
+
const tx = this.db.transaction((c) => {
|
|
166
|
+
const row = this.select.get(c);
|
|
167
|
+
if (!row)
|
|
168
|
+
return null;
|
|
169
|
+
this.remove.run(c);
|
|
170
|
+
return row;
|
|
171
|
+
});
|
|
172
|
+
const row = tx(code);
|
|
173
|
+
if (!row)
|
|
174
|
+
return null;
|
|
175
|
+
const expiresAt = new Date(row.expires_at);
|
|
176
|
+
if (expiresAt.getTime() < Date.now())
|
|
177
|
+
return null;
|
|
178
|
+
return rowToAuthCode(row);
|
|
179
|
+
}
|
|
180
|
+
async sweep(now = new Date()) {
|
|
181
|
+
const result = this.sweepStmt.run(now.getTime());
|
|
182
|
+
return result.changes ?? 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function rowToAuthCode(row) {
|
|
186
|
+
return {
|
|
187
|
+
code: row.code,
|
|
188
|
+
clientId: row.client_id,
|
|
189
|
+
redirectUri: row.redirect_uri,
|
|
190
|
+
scope: row.scope,
|
|
191
|
+
userId: row.user_id,
|
|
192
|
+
tenantId: row.tenant_id,
|
|
193
|
+
codeChallenge: row.code_challenge,
|
|
194
|
+
codeChallengeMethod: row.code_challenge_method,
|
|
195
|
+
nonce: row.nonce ?? undefined,
|
|
196
|
+
expiresAt: new Date(row.expires_at),
|
|
197
|
+
createdAt: new Date(row.created_at),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// ============================================================================
|
|
201
|
+
// Refresh Token Store
|
|
202
|
+
// ============================================================================
|
|
203
|
+
export class SqliteRefreshTokenStore {
|
|
204
|
+
db;
|
|
205
|
+
insert;
|
|
206
|
+
select;
|
|
207
|
+
remove;
|
|
208
|
+
sweepStmt;
|
|
209
|
+
constructor(db) {
|
|
210
|
+
this.db = db;
|
|
211
|
+
this.insert = db.prepare(`
|
|
212
|
+
INSERT OR REPLACE INTO refresh_tokens
|
|
213
|
+
(token, client_id, user_id, tenant_id, scope, expires_at, created_at, supersedes)
|
|
214
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
215
|
+
`);
|
|
216
|
+
this.select = db.prepare('SELECT * FROM refresh_tokens WHERE token = ?');
|
|
217
|
+
this.remove = db.prepare('DELETE FROM refresh_tokens WHERE token = ?');
|
|
218
|
+
this.sweepStmt = db.prepare('DELETE FROM refresh_tokens WHERE expires_at < ?');
|
|
219
|
+
}
|
|
220
|
+
async save(token) {
|
|
221
|
+
this.insertRow(token);
|
|
222
|
+
}
|
|
223
|
+
insertRow(token) {
|
|
224
|
+
this.insert.run(token.token, token.clientId, token.userId, token.tenantId, token.scope, token.expiresAt.getTime(), token.createdAt.getTime(), token.supersedes ?? null);
|
|
225
|
+
}
|
|
226
|
+
async find(token) {
|
|
227
|
+
const row = this.select.get(token);
|
|
228
|
+
if (!row)
|
|
229
|
+
return null;
|
|
230
|
+
if (row.expires_at < Date.now())
|
|
231
|
+
return null;
|
|
232
|
+
return rowToRefreshToken(row);
|
|
233
|
+
}
|
|
234
|
+
async rotate(oldToken, newToken) {
|
|
235
|
+
const tx = this.db.transaction((o, n) => {
|
|
236
|
+
const existing = this.select.get(o);
|
|
237
|
+
if (!existing)
|
|
238
|
+
return null;
|
|
239
|
+
if (existing.expires_at < Date.now()) {
|
|
240
|
+
this.remove.run(o);
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
this.remove.run(o);
|
|
244
|
+
this.insertRow(n);
|
|
245
|
+
return n;
|
|
246
|
+
});
|
|
247
|
+
return tx(oldToken, newToken);
|
|
248
|
+
}
|
|
249
|
+
async revoke(token) {
|
|
250
|
+
const result = this.remove.run(token);
|
|
251
|
+
return (result.changes ?? 0) > 0;
|
|
252
|
+
}
|
|
253
|
+
async sweep(now = new Date()) {
|
|
254
|
+
const result = this.sweepStmt.run(now.getTime());
|
|
255
|
+
return result.changes ?? 0;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function rowToRefreshToken(row) {
|
|
259
|
+
return {
|
|
260
|
+
token: row.token,
|
|
261
|
+
clientId: row.client_id,
|
|
262
|
+
userId: row.user_id,
|
|
263
|
+
tenantId: row.tenant_id,
|
|
264
|
+
scope: row.scope,
|
|
265
|
+
expiresAt: new Date(row.expires_at),
|
|
266
|
+
createdAt: new Date(row.created_at),
|
|
267
|
+
supersedes: row.supersedes ?? undefined,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// ============================================================================
|
|
271
|
+
// Client Registry
|
|
272
|
+
// ============================================================================
|
|
273
|
+
export class SqliteClientRegistry {
|
|
274
|
+
upsert;
|
|
275
|
+
select;
|
|
276
|
+
touchStmt;
|
|
277
|
+
remove;
|
|
278
|
+
sweepStmt;
|
|
279
|
+
constructor(db) {
|
|
280
|
+
this.upsert = db.prepare(`
|
|
281
|
+
INSERT OR REPLACE INTO registered_clients
|
|
282
|
+
(client_id, client_secret_hash, client_name, redirect_uris, grant_types,
|
|
283
|
+
response_types, scope, contacts, logo_uri, tos_uri, policy_uri,
|
|
284
|
+
is_public, created_at, last_used_at, user_agent, ip_address)
|
|
285
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
286
|
+
`);
|
|
287
|
+
this.select = db.prepare('SELECT * FROM registered_clients WHERE client_id = ?');
|
|
288
|
+
this.touchStmt = db.prepare('UPDATE registered_clients SET last_used_at = ? WHERE client_id = ?');
|
|
289
|
+
this.remove = db.prepare('DELETE FROM registered_clients WHERE client_id = ?');
|
|
290
|
+
this.sweepStmt = db.prepare('DELETE FROM registered_clients WHERE last_used_at < ?');
|
|
291
|
+
}
|
|
292
|
+
async save(client) {
|
|
293
|
+
this.upsert.run(client.clientId, client.clientSecretHash ?? null, client.clientName, JSON.stringify(client.redirectUris), JSON.stringify(client.grantTypes), JSON.stringify(client.responseTypes), client.scope, client.contacts ? JSON.stringify(client.contacts) : null, client.logoUri ?? null, client.tosUri ?? null, client.policyUri ?? null, client.isPublic ? 1 : 0, client.createdAt.getTime(), client.lastUsedAt.getTime(), client.registrationContext?.userAgent ?? null, client.registrationContext?.ipAddress ?? null);
|
|
294
|
+
}
|
|
295
|
+
async find(clientId) {
|
|
296
|
+
const row = this.select.get(clientId);
|
|
297
|
+
if (!row)
|
|
298
|
+
return null;
|
|
299
|
+
return rowToRegisteredClient(row);
|
|
300
|
+
}
|
|
301
|
+
async touch(clientId, now = new Date()) {
|
|
302
|
+
this.touchStmt.run(now.getTime(), clientId);
|
|
303
|
+
}
|
|
304
|
+
async delete(clientId) {
|
|
305
|
+
const result = this.remove.run(clientId);
|
|
306
|
+
return (result.changes ?? 0) > 0;
|
|
307
|
+
}
|
|
308
|
+
async sweep(maxIdleMs, now = new Date()) {
|
|
309
|
+
const threshold = now.getTime() - maxIdleMs;
|
|
310
|
+
const result = this.sweepStmt.run(threshold);
|
|
311
|
+
return result.changes ?? 0;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function rowToRegisteredClient(row) {
|
|
315
|
+
return {
|
|
316
|
+
clientId: row.client_id,
|
|
317
|
+
clientSecretHash: row.client_secret_hash ?? undefined,
|
|
318
|
+
clientName: row.client_name,
|
|
319
|
+
redirectUris: JSON.parse(row.redirect_uris),
|
|
320
|
+
grantTypes: JSON.parse(row.grant_types),
|
|
321
|
+
responseTypes: JSON.parse(row.response_types),
|
|
322
|
+
scope: row.scope,
|
|
323
|
+
contacts: row.contacts ? JSON.parse(row.contacts) : undefined,
|
|
324
|
+
logoUri: row.logo_uri ?? undefined,
|
|
325
|
+
tosUri: row.tos_uri ?? undefined,
|
|
326
|
+
policyUri: row.policy_uri ?? undefined,
|
|
327
|
+
isPublic: row.is_public === 1,
|
|
328
|
+
createdAt: new Date(row.created_at),
|
|
329
|
+
lastUsedAt: new Date(row.last_used_at),
|
|
330
|
+
registrationContext: row.user_agent || row.ip_address
|
|
331
|
+
? { userAgent: row.user_agent ?? undefined, ipAddress: row.ip_address ?? undefined }
|
|
332
|
+
: undefined,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
// ============================================================================
|
|
336
|
+
// Consent Store
|
|
337
|
+
// ============================================================================
|
|
338
|
+
export class SqliteConsentStore {
|
|
339
|
+
upsert;
|
|
340
|
+
select;
|
|
341
|
+
remove;
|
|
342
|
+
sweepStmt;
|
|
343
|
+
constructor(db) {
|
|
344
|
+
this.upsert = db.prepare(`
|
|
345
|
+
INSERT OR REPLACE INTO consent_records
|
|
346
|
+
(user_id, tenant_id, client_id, scopes, expires_at, created_at)
|
|
347
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
348
|
+
`);
|
|
349
|
+
this.select = db.prepare('SELECT * FROM consent_records WHERE tenant_id = ? AND user_id = ? AND client_id = ?');
|
|
350
|
+
this.remove = db.prepare('DELETE FROM consent_records WHERE tenant_id = ? AND user_id = ? AND client_id = ?');
|
|
351
|
+
this.sweepStmt = db.prepare('DELETE FROM consent_records WHERE expires_at < ?');
|
|
352
|
+
}
|
|
353
|
+
async save(record) {
|
|
354
|
+
this.upsert.run(record.userId, record.tenantId, record.clientId, record.scopes, record.expiresAt.getTime(), record.createdAt.getTime());
|
|
355
|
+
}
|
|
356
|
+
async covers(userId, tenantId, clientId, scopes) {
|
|
357
|
+
const row = this.select.get(tenantId, userId, clientId);
|
|
358
|
+
if (!row)
|
|
359
|
+
return false;
|
|
360
|
+
if (row.expires_at < Date.now()) {
|
|
361
|
+
this.remove.run(tenantId, userId, clientId);
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
const stored = new Set(row.scopes.split(' ').filter(Boolean));
|
|
365
|
+
return scopes.every((s) => stored.has(s));
|
|
366
|
+
}
|
|
367
|
+
async revoke(userId, tenantId, clientId) {
|
|
368
|
+
const result = this.remove.run(tenantId, userId, clientId);
|
|
369
|
+
return (result.changes ?? 0) > 0;
|
|
370
|
+
}
|
|
371
|
+
async sweep(now = new Date()) {
|
|
372
|
+
const result = this.sweepStmt.run(now.getTime());
|
|
373
|
+
return result.changes ?? 0;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// ============================================================================
|
|
377
|
+
// Pending Authorization Store
|
|
378
|
+
// ============================================================================
|
|
379
|
+
export class SqlitePendingAuthorizationStore {
|
|
380
|
+
db;
|
|
381
|
+
insert;
|
|
382
|
+
select;
|
|
383
|
+
remove;
|
|
384
|
+
sweepStmt;
|
|
385
|
+
constructor(db) {
|
|
386
|
+
this.db = db;
|
|
387
|
+
this.insert = db.prepare(`
|
|
388
|
+
INSERT INTO pending_auth
|
|
389
|
+
(id, client_id, redirect_uri, scope, state, nonce, code_challenge,
|
|
390
|
+
code_challenge_method, user_id, tenant_id, response_type,
|
|
391
|
+
expires_at, created_at)
|
|
392
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
393
|
+
`);
|
|
394
|
+
this.select = db.prepare('SELECT * FROM pending_auth WHERE id = ?');
|
|
395
|
+
this.remove = db.prepare('DELETE FROM pending_auth WHERE id = ?');
|
|
396
|
+
this.sweepStmt = db.prepare('DELETE FROM pending_auth WHERE expires_at < ?');
|
|
397
|
+
}
|
|
398
|
+
async save(req) {
|
|
399
|
+
this.insert.run(req.id, req.clientId, req.redirectUri, req.scope, req.state ?? null, req.nonce ?? null, req.codeChallenge, req.codeChallengeMethod, req.userId, req.tenantId, req.responseType, req.expiresAt.getTime(), req.createdAt.getTime());
|
|
400
|
+
}
|
|
401
|
+
async peek(id) {
|
|
402
|
+
const row = this.select.get(id);
|
|
403
|
+
if (!row)
|
|
404
|
+
return null;
|
|
405
|
+
if (row.expires_at < Date.now())
|
|
406
|
+
return null;
|
|
407
|
+
return rowToPending(row);
|
|
408
|
+
}
|
|
409
|
+
async consume(id) {
|
|
410
|
+
const tx = this.db.transaction((i) => {
|
|
411
|
+
const row = this.select.get(i);
|
|
412
|
+
if (!row)
|
|
413
|
+
return null;
|
|
414
|
+
this.remove.run(i);
|
|
415
|
+
return row;
|
|
416
|
+
});
|
|
417
|
+
const row = tx(id);
|
|
418
|
+
if (!row)
|
|
419
|
+
return null;
|
|
420
|
+
if (row.expires_at < Date.now())
|
|
421
|
+
return null;
|
|
422
|
+
return rowToPending(row);
|
|
423
|
+
}
|
|
424
|
+
async sweep(now = new Date()) {
|
|
425
|
+
const result = this.sweepStmt.run(now.getTime());
|
|
426
|
+
return result.changes ?? 0;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
function rowToPending(row) {
|
|
430
|
+
return {
|
|
431
|
+
id: row.id,
|
|
432
|
+
clientId: row.client_id,
|
|
433
|
+
redirectUri: row.redirect_uri,
|
|
434
|
+
scope: row.scope,
|
|
435
|
+
state: row.state ?? undefined,
|
|
436
|
+
nonce: row.nonce ?? undefined,
|
|
437
|
+
codeChallenge: row.code_challenge,
|
|
438
|
+
codeChallengeMethod: row.code_challenge_method,
|
|
439
|
+
userId: row.user_id,
|
|
440
|
+
tenantId: row.tenant_id,
|
|
441
|
+
responseType: row.response_type,
|
|
442
|
+
expiresAt: new Date(row.expires_at),
|
|
443
|
+
createdAt: new Date(row.created_at),
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
//# sourceMappingURL=sqlite-stores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-stores.js","sourceRoot":"","sources":["../../../src/serv/auth/sqlite-stores.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,61 @@ export interface ClientMetadataDocument {
|
|
|
34
34
|
policy_uri?: string;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Error taxonomy for CIMD resolution failures. Maps to OAuth `invalid_client`
|
|
38
|
+
* with distinct `error_description` so callers can diagnose misconfiguration.
|
|
39
|
+
*/
|
|
40
|
+
export type CimdError = 'not_https' | 'fetch_failed' | 'http_error' | 'invalid_json' | 'client_id_mismatch' | 'missing_redirect_uris' | 'domain_not_allowed' | 'timeout';
|
|
41
|
+
export interface CimdResult {
|
|
42
|
+
ok: boolean;
|
|
43
|
+
metadata?: ClientMetadataDocument;
|
|
44
|
+
error?: CimdError;
|
|
45
|
+
errorDescription?: string;
|
|
46
|
+
fromCache?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface CimdFetchOptions {
|
|
49
|
+
/** Allowlist of hostnames; supports exact match or leading wildcard (*.claude.ai). Empty = allow all. */
|
|
50
|
+
allowedDomains?: string[];
|
|
51
|
+
/** Cache to consult/update. If omitted, fetch is uncached. */
|
|
52
|
+
cache?: CimdCache;
|
|
53
|
+
/** Override fetch for testing. */
|
|
54
|
+
fetchImpl?: typeof fetch;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a CIMD client_id to its metadata document with full validation,
|
|
58
|
+
* caching, and domain-allowlist enforcement.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveClientMetadata(clientId: string, opts?: CimdFetchOptions): Promise<CimdResult>;
|
|
61
|
+
/**
|
|
62
|
+
* @deprecated Use resolveClientMetadata for structured errors + caching.
|
|
63
|
+
* Retained for callers that only need the happy-path document.
|
|
38
64
|
*/
|
|
39
65
|
export declare function fetchClientMetadata(clientId: string): Promise<ClientMetadataDocument | null>;
|
|
66
|
+
interface CimdCacheEntry {
|
|
67
|
+
metadata: ClientMetadataDocument;
|
|
68
|
+
etag?: string;
|
|
69
|
+
expiresAt: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* LRU cache for CIMD metadata. Eviction on insert past capacity.
|
|
73
|
+
*/
|
|
74
|
+
export declare class CimdCache {
|
|
75
|
+
private capacity;
|
|
76
|
+
private entries;
|
|
77
|
+
constructor(capacity?: number);
|
|
78
|
+
get(clientId: string): CimdCacheEntry | undefined;
|
|
79
|
+
set(clientId: string, entry: CimdCacheEntry): void;
|
|
80
|
+
clear(): void;
|
|
81
|
+
size(): number;
|
|
82
|
+
}
|
|
83
|
+
declare function isDomainAllowed(hostname: string, allowlist?: string[]): boolean;
|
|
84
|
+
declare function resolveTtlMs(response: Response): number;
|
|
85
|
+
/**
|
|
86
|
+
* Internal exports for tests only.
|
|
87
|
+
*/
|
|
88
|
+
export declare const __test__: {
|
|
89
|
+
isDomainAllowed: typeof isDomainAllowed;
|
|
90
|
+
resolveTtlMs: typeof resolveTtlMs;
|
|
91
|
+
};
|
|
40
92
|
/**
|
|
41
93
|
* Handle /.well-known/oauth-protected-resource request
|
|
42
94
|
*/
|
|
@@ -57,4 +109,5 @@ export declare function handleAuthServerRequest(config: WellKnownConfig, tenant:
|
|
|
57
109
|
* Generate WWW-Authenticate header for 401 responses
|
|
58
110
|
*/
|
|
59
111
|
export declare function generateWwwAuthenticate(baseUrl: string, tenant: Tenant, error?: string, errorDescription?: string): string;
|
|
112
|
+
export {};
|
|
60
113
|
//# sourceMappingURL=well-known.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/well-known.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,MAAM,EACP,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,yBAAyB,CAU3B;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,2BAA2B,
|
|
1
|
+
{"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/well-known.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,MAAM,EACP,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,yBAAyB,CAU3B;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,2BAA2B,CA6B7B;AAMD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,cAAc,GACd,YAAY,GACZ,cAAc,GACd,oBAAoB,GACpB,uBAAuB,GACvB,oBAAoB,GACpB,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yGAAyG;IACzG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAID;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAoGrB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAGxC;AAMD,UAAU,cAAc;IACtB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,SAAS;IAER,OAAO,CAAC,QAAQ;IAD5B,OAAO,CAAC,OAAO,CAAqC;gBAChC,QAAQ,SAAM;IAElC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IASjD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAUlD,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;CAGf;AAMD,iBAAS,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAWxE;AAED,iBAAS,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAQhD;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ;;;CAAoC,CAAC;AA+B1D;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,CAeR"}
|