@portel/photon 1.22.1 → 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
package/dist/serv/auth/jwt.js
CHANGED
|
@@ -4,22 +4,103 @@
|
|
|
4
4
|
* Handles JWT generation and validation for SERV sessions
|
|
5
5
|
* Uses HMAC-SHA256 for simplicity; can be upgraded to RSA/EC for production
|
|
6
6
|
*/
|
|
7
|
-
import { createHmac, randomBytes, timingSafeEqual } from 'crypto';
|
|
7
|
+
import { createHash, createHmac, createSign, createVerify, createPrivateKey, createPublicKey, randomBytes, timingSafeEqual, } from 'crypto';
|
|
8
8
|
const DEFAULT_CONFIG = {
|
|
9
9
|
expirySeconds: 15 * 60, // 15 minutes
|
|
10
10
|
algorithm: 'HS256',
|
|
11
11
|
};
|
|
12
|
+
function isAsymmetric(alg) {
|
|
13
|
+
return alg === 'RS256' || alg === 'ES256';
|
|
14
|
+
}
|
|
12
15
|
// ============================================================================
|
|
13
16
|
// JWT Implementation
|
|
14
17
|
// ============================================================================
|
|
15
18
|
export class JwtService {
|
|
16
19
|
config;
|
|
20
|
+
privateKey;
|
|
21
|
+
publicKey;
|
|
17
22
|
constructor(config) {
|
|
18
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
19
|
-
if (this.config.
|
|
23
|
+
this.config = { ...DEFAULT_CONFIG, ...config, secret: config.secret ?? '' };
|
|
24
|
+
if (isAsymmetric(this.config.algorithm)) {
|
|
25
|
+
if (!this.config.privateKey) {
|
|
26
|
+
throw new Error(`JWT algorithm ${this.config.algorithm} requires a privateKey`);
|
|
27
|
+
}
|
|
28
|
+
this.privateKey = createPrivateKey(this.config.privateKey);
|
|
29
|
+
this.publicKey = this.config.publicKey
|
|
30
|
+
? createPublicKey(this.config.publicKey)
|
|
31
|
+
: createPublicKey(this.privateKey);
|
|
32
|
+
}
|
|
33
|
+
else if (this.config.secret.length < 32) {
|
|
20
34
|
console.warn('JWT secret is less than 32 characters. Consider using a stronger secret.');
|
|
21
35
|
}
|
|
22
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Export the public JWK for publication at `/.well-known/jwks.json`.
|
|
39
|
+
* Only meaningful for asymmetric algorithms.
|
|
40
|
+
*/
|
|
41
|
+
exportJwk() {
|
|
42
|
+
if (!this.publicKey)
|
|
43
|
+
return null;
|
|
44
|
+
const jwk = this.publicKey.export({ format: 'jwk' });
|
|
45
|
+
jwk.alg = this.config.algorithm;
|
|
46
|
+
jwk.use = 'sig';
|
|
47
|
+
if (this.config.kid)
|
|
48
|
+
jwk.kid = this.config.kid;
|
|
49
|
+
return jwk;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate an OAuth access token JWT for the token endpoint.
|
|
53
|
+
*
|
|
54
|
+
* This is a lower-level variant of `generateSessionToken` that accepts
|
|
55
|
+
* the minimal fields needed for an OAuth 2.1 bearer token: `sub`, `scope`,
|
|
56
|
+
* `client_id`, `tenant_id`, plus a TTL. No `Session` object required.
|
|
57
|
+
*/
|
|
58
|
+
generateAccessToken(args) {
|
|
59
|
+
const nowSec = Math.floor((args.now?.getTime() ?? Date.now()) / 1000);
|
|
60
|
+
const payload = {
|
|
61
|
+
iss: this.config.issuer,
|
|
62
|
+
sub: args.sub,
|
|
63
|
+
aud: `${this.config.issuer}/mcp`,
|
|
64
|
+
exp: nowSec + args.expiresInSeconds,
|
|
65
|
+
iat: nowSec,
|
|
66
|
+
jti: args.jti ?? randomBytes(16).toString('base64url'),
|
|
67
|
+
tenant_id: args.tenantId,
|
|
68
|
+
client_id: args.clientId,
|
|
69
|
+
scope: args.scope,
|
|
70
|
+
};
|
|
71
|
+
return this.sign(payload);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sign a custom payload (used by RFC 8693 token exchange, where the
|
|
75
|
+
* caller fully controls the claim set including `aud`, `act`, etc.).
|
|
76
|
+
* Caller is responsible for including `iss`, `exp`, `iat`.
|
|
77
|
+
*/
|
|
78
|
+
exchangeSign(payload) {
|
|
79
|
+
return this.sign(payload);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate an OpenID Connect id_token per OIDC Core §3.1.3.7.
|
|
83
|
+
*
|
|
84
|
+
* Identity assertion about the end-user. Issued when `openid` scope is
|
|
85
|
+
* granted at /token. Signed with the same key/algorithm as access tokens.
|
|
86
|
+
* `azp` (authorized party) claim identifies the client that requested it.
|
|
87
|
+
*/
|
|
88
|
+
generateIdToken(args) {
|
|
89
|
+
const nowSec = Math.floor((args.now?.getTime() ?? Date.now()) / 1000);
|
|
90
|
+
const payload = {
|
|
91
|
+
iss: this.config.issuer,
|
|
92
|
+
sub: args.sub,
|
|
93
|
+
aud: args.clientId, // RFC: id_token audience is the client, not the resource
|
|
94
|
+
azp: args.clientId,
|
|
95
|
+
exp: nowSec + args.expiresInSeconds,
|
|
96
|
+
iat: nowSec,
|
|
97
|
+
tenant_id: args.tenantId,
|
|
98
|
+
...(args.profile ?? {}),
|
|
99
|
+
};
|
|
100
|
+
if (args.nonce)
|
|
101
|
+
payload.nonce = args.nonce;
|
|
102
|
+
return this.sign(payload);
|
|
103
|
+
}
|
|
23
104
|
/**
|
|
24
105
|
* Generate a session token
|
|
25
106
|
*/
|
|
@@ -103,6 +184,8 @@ export class JwtService {
|
|
|
103
184
|
alg: this.config.algorithm,
|
|
104
185
|
typ: 'JWT',
|
|
105
186
|
};
|
|
187
|
+
if (this.config.kid)
|
|
188
|
+
header.kid = this.config.kid;
|
|
106
189
|
const headerB64 = base64UrlEncode(JSON.stringify(header));
|
|
107
190
|
const payloadB64 = base64UrlEncode(JSON.stringify(payload));
|
|
108
191
|
const signatureInput = `${headerB64}.${payloadB64}`;
|
|
@@ -117,39 +200,83 @@ export class JwtService {
|
|
|
117
200
|
if (parts.length !== 3)
|
|
118
201
|
return null;
|
|
119
202
|
const [headerB64, payloadB64, signatureB64] = parts;
|
|
120
|
-
// Verify signature
|
|
121
203
|
const signatureInput = `${headerB64}.${payloadB64}`;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
204
|
+
if (isAsymmetric(this.config.algorithm)) {
|
|
205
|
+
if (!this.publicKey)
|
|
206
|
+
return null;
|
|
207
|
+
try {
|
|
208
|
+
const verifier = createVerify(this.hashName());
|
|
209
|
+
verifier.update(signatureInput);
|
|
210
|
+
verifier.end();
|
|
211
|
+
const raw = Buffer.from(signatureB64, 'base64url');
|
|
212
|
+
// ES256/384/512 carry IEEE-P1363 r||s per RFC 7518 §3.4. Node's verifier
|
|
213
|
+
// expects DER internally on some runtimes (Bun in particular), so we
|
|
214
|
+
// convert P1363→DER before calling verify. `dsaEncoding: 'ieee-p1363'`
|
|
215
|
+
// option is Node-only and errors on Bun.
|
|
216
|
+
const signature = this.config.algorithm === 'ES256' ? p1363ToDer(raw) : raw;
|
|
217
|
+
const ok = verifier.verify(this.publicKey, signature);
|
|
218
|
+
if (!ok)
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
128
224
|
}
|
|
129
|
-
|
|
130
|
-
|
|
225
|
+
else {
|
|
226
|
+
const expectedSignature = this.createSignature(signatureInput);
|
|
227
|
+
const signatureBuffer = Buffer.from(signatureB64, 'base64url');
|
|
228
|
+
const expectedBuffer = Buffer.from(expectedSignature, 'base64url');
|
|
229
|
+
if (signatureBuffer.length !== expectedBuffer.length)
|
|
230
|
+
return null;
|
|
231
|
+
if (!timingSafeEqual(signatureBuffer, expectedBuffer))
|
|
232
|
+
return null;
|
|
131
233
|
}
|
|
132
|
-
// Parse payload
|
|
133
234
|
try {
|
|
134
235
|
return JSON.parse(base64UrlDecode(payloadB64));
|
|
135
236
|
}
|
|
136
237
|
catch {
|
|
137
|
-
return null;
|
|
238
|
+
return null;
|
|
138
239
|
}
|
|
139
240
|
}
|
|
140
241
|
/**
|
|
141
|
-
* Create HMAC
|
|
242
|
+
* Create JWS signature. HMAC for symmetric algs, RSA-PSS / ECDSA for asymmetric.
|
|
142
243
|
*/
|
|
143
244
|
createSignature(input) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
245
|
+
if (isAsymmetric(this.config.algorithm)) {
|
|
246
|
+
if (!this.privateKey) {
|
|
247
|
+
throw new Error('asymmetric JWT signing requires privateKey');
|
|
248
|
+
}
|
|
249
|
+
const signer = createSign(this.hashName());
|
|
250
|
+
signer.update(input);
|
|
251
|
+
signer.end();
|
|
252
|
+
// Node.js signs ECDSA with DER by default. RFC 7518 §3.4 requires
|
|
253
|
+
// the IEEE-P1363 r||s concatenation for JWS, so we convert after
|
|
254
|
+
// signing. The `dsaEncoding: 'ieee-p1363'` sign option would work
|
|
255
|
+
// on Node but throws on Bun ("Length out of range"), so we do the
|
|
256
|
+
// conversion manually for runtime-agnosticism.
|
|
257
|
+
const der = signer.sign(this.privateKey);
|
|
258
|
+
if (this.config.algorithm === 'ES256') {
|
|
259
|
+
return derToP1363(der, 32).toString('base64url');
|
|
260
|
+
}
|
|
261
|
+
return der.toString('base64url');
|
|
262
|
+
}
|
|
263
|
+
const hmac = createHmac(this.hashName(), this.config.secret);
|
|
150
264
|
hmac.update(input);
|
|
151
265
|
return hmac.digest('base64url');
|
|
152
266
|
}
|
|
267
|
+
hashName() {
|
|
268
|
+
switch (this.config.algorithm) {
|
|
269
|
+
case 'HS384':
|
|
270
|
+
return 'sha384';
|
|
271
|
+
case 'HS512':
|
|
272
|
+
return 'sha512';
|
|
273
|
+
case 'HS256':
|
|
274
|
+
case 'RS256':
|
|
275
|
+
case 'ES256':
|
|
276
|
+
default:
|
|
277
|
+
return 'sha256';
|
|
278
|
+
}
|
|
279
|
+
}
|
|
153
280
|
}
|
|
154
281
|
// ============================================================================
|
|
155
282
|
// PKCE Utilities
|
|
@@ -161,11 +288,11 @@ export function generateCodeVerifier() {
|
|
|
161
288
|
return randomBytes(32).toString('base64url');
|
|
162
289
|
}
|
|
163
290
|
/**
|
|
164
|
-
* Generate a code challenge from a verifier
|
|
291
|
+
* Generate a code challenge from a verifier (RFC 7636 §4.2, S256 method)
|
|
292
|
+
* code_challenge = BASE64URL-ENCODE(SHA256(code_verifier))
|
|
165
293
|
*/
|
|
166
294
|
export function generateCodeChallenge(verifier) {
|
|
167
|
-
|
|
168
|
-
return hash.toString('base64url');
|
|
295
|
+
return createHash('sha256').update(verifier).digest('base64url');
|
|
169
296
|
}
|
|
170
297
|
/**
|
|
171
298
|
* Verify a code verifier against a challenge
|
|
@@ -220,6 +347,81 @@ function base64UrlDecode(str) {
|
|
|
220
347
|
return Buffer.from(str, 'base64url').toString('utf-8');
|
|
221
348
|
}
|
|
222
349
|
// ============================================================================
|
|
350
|
+
// ECDSA signature encoding (DER ↔ IEEE-P1363)
|
|
351
|
+
// ============================================================================
|
|
352
|
+
/**
|
|
353
|
+
* Convert a DER-encoded ECDSA signature (Node's default output from
|
|
354
|
+
* `createSign().sign()`) into the IEEE-P1363 r||s encoding required by
|
|
355
|
+
* RFC 7518 §3.4 for JWS ES256/ES384/ES512.
|
|
356
|
+
*
|
|
357
|
+
* DER layout: 0x30 [totalLen] 0x02 [rLen] [r...] 0x02 [sLen] [s...]
|
|
358
|
+
* r and s are encoded as signed integers — DER prepends 0x00 if the high
|
|
359
|
+
* bit of the first byte would otherwise make them negative. P1363 strips
|
|
360
|
+
* that padding and left-zero-pads each component to `componentLen` bytes.
|
|
361
|
+
*/
|
|
362
|
+
function derToP1363(der, componentLen) {
|
|
363
|
+
if (der[0] !== 0x30) {
|
|
364
|
+
throw new Error('invalid DER signature: missing SEQUENCE');
|
|
365
|
+
}
|
|
366
|
+
// Skip SEQUENCE header (1-byte length for signatures we produce).
|
|
367
|
+
let offset = 2;
|
|
368
|
+
if ((der[1] & 0x80) !== 0) {
|
|
369
|
+
offset += der[1] & 0x7f;
|
|
370
|
+
}
|
|
371
|
+
const readInt = () => {
|
|
372
|
+
if (der[offset] !== 0x02) {
|
|
373
|
+
throw new Error('invalid DER signature: expected INTEGER');
|
|
374
|
+
}
|
|
375
|
+
const len = der[offset + 1];
|
|
376
|
+
const start = offset + 2;
|
|
377
|
+
let value = der.subarray(start, start + len);
|
|
378
|
+
offset = start + len;
|
|
379
|
+
// Strip leading 0x00 padding that keeps DER integers positive.
|
|
380
|
+
while (value.length > 1 && value[0] === 0x00) {
|
|
381
|
+
value = value.subarray(1);
|
|
382
|
+
}
|
|
383
|
+
if (value.length > componentLen) {
|
|
384
|
+
throw new Error(`ECDSA component overflow: ${value.length} > ${componentLen}`);
|
|
385
|
+
}
|
|
386
|
+
return value;
|
|
387
|
+
};
|
|
388
|
+
const r = readInt();
|
|
389
|
+
const s = readInt();
|
|
390
|
+
const out = Buffer.alloc(componentLen * 2);
|
|
391
|
+
r.copy(out, componentLen - r.length);
|
|
392
|
+
s.copy(out, componentLen * 2 - s.length);
|
|
393
|
+
return out;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Convert a P1363 r||s signature into DER for Node's `verifier.verify()`.
|
|
397
|
+
* Inverse of `derToP1363`. Used on the verify path so signatures received
|
|
398
|
+
* in spec-compliant JWS form can still be handed to Node's DER-only API.
|
|
399
|
+
*/
|
|
400
|
+
function p1363ToDer(p1363) {
|
|
401
|
+
if (p1363.length % 2 !== 0) {
|
|
402
|
+
throw new Error('invalid P1363 signature: odd length');
|
|
403
|
+
}
|
|
404
|
+
const half = p1363.length / 2;
|
|
405
|
+
const encodeInt = (value) => {
|
|
406
|
+
// Strip leading zeros (but leave at least one byte).
|
|
407
|
+
let v = value;
|
|
408
|
+
while (v.length > 1 && v[0] === 0x00) {
|
|
409
|
+
v = v.subarray(1);
|
|
410
|
+
}
|
|
411
|
+
// If high bit is set, prepend 0x00 so DER reads it as positive.
|
|
412
|
+
if ((v[0] & 0x80) !== 0) {
|
|
413
|
+
v = Buffer.concat([Buffer.from([0x00]), v]);
|
|
414
|
+
}
|
|
415
|
+
return Buffer.concat([Buffer.from([0x02, v.length]), v]);
|
|
416
|
+
};
|
|
417
|
+
const r = encodeInt(p1363.subarray(0, half));
|
|
418
|
+
const s = encodeInt(p1363.subarray(half));
|
|
419
|
+
const body = Buffer.concat([r, s]);
|
|
420
|
+
return Buffer.concat([Buffer.from([0x30, body.length]), body]);
|
|
421
|
+
}
|
|
422
|
+
/** Internal exports for tests only. */
|
|
423
|
+
export const __test_ecdsa__ = { derToP1363, p1363ToDer };
|
|
424
|
+
// ============================================================================
|
|
223
425
|
// Factory Function
|
|
224
426
|
// ============================================================================
|
|
225
427
|
let jwtServiceInstance = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/serv/auth/jwt.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/serv/auth/jwt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed implementations of `ElicitationStore` and `GrantStore`.
|
|
3
|
+
*
|
|
4
|
+
* These hold OAuth state that currently goes through `MemoryElicitationStore`
|
|
5
|
+
* and `MemoryGrantStore` in `oauth.ts` — elicitation requests (short-lived,
|
|
6
|
+
* waiting for a user to complete the upstream OAuth flow) and photon grants
|
|
7
|
+
* (long-lived, encrypted refresh tokens for upstream APIs like Stripe/GitHub).
|
|
8
|
+
*
|
|
9
|
+
* Without persistent storage, every daemon restart forces users to re-auth
|
|
10
|
+
* against every upstream provider because the grants live in memory only.
|
|
11
|
+
* Moving grants to SQLite fixes that; elicitations benefit because pending
|
|
12
|
+
* approvals survive a crash of the daemon during the redirect window.
|
|
13
|
+
*
|
|
14
|
+
* Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
|
|
15
|
+
* - Under Bun: uses built-in `bun:sqlite`
|
|
16
|
+
* - Under Node: falls back to `better-sqlite3`
|
|
17
|
+
*/
|
|
18
|
+
import type { ElicitationRequest, PhotonGrant } from '../types/index.js';
|
|
19
|
+
import type { ElicitationStore, GrantStore } from './oauth.js';
|
|
20
|
+
import { type SqliteDatabase } from '../../shared/sqlite-runtime.js';
|
|
21
|
+
export declare function openOauthDatabase(path: string): Promise<SqliteDatabase>;
|
|
22
|
+
export declare class SqliteElicitationStore implements ElicitationStore {
|
|
23
|
+
private insert;
|
|
24
|
+
private select;
|
|
25
|
+
private updateStmt;
|
|
26
|
+
private remove;
|
|
27
|
+
private sweepStmt;
|
|
28
|
+
constructor(db: SqliteDatabase);
|
|
29
|
+
create(data: Omit<ElicitationRequest, 'id' | 'createdAt'>): Promise<ElicitationRequest>;
|
|
30
|
+
get(id: string): Promise<ElicitationRequest | null>;
|
|
31
|
+
update(id: string, data: Partial<ElicitationRequest>): Promise<void>;
|
|
32
|
+
delete(id: string): Promise<void>;
|
|
33
|
+
cleanup(): Promise<number>;
|
|
34
|
+
}
|
|
35
|
+
export declare class SqliteGrantStore implements GrantStore {
|
|
36
|
+
private insert;
|
|
37
|
+
private selectByKey;
|
|
38
|
+
private selectByUser;
|
|
39
|
+
private updateStmt;
|
|
40
|
+
private remove;
|
|
41
|
+
constructor(db: SqliteDatabase);
|
|
42
|
+
find(tenantId: string, photonId: string, provider: string, userId?: string): Promise<PhotonGrant | null>;
|
|
43
|
+
create(data: Omit<PhotonGrant, 'id' | 'createdAt' | 'updatedAt'>): Promise<PhotonGrant>;
|
|
44
|
+
update(id: string, data: Partial<PhotonGrant>): Promise<void>;
|
|
45
|
+
delete(id: string): Promise<void>;
|
|
46
|
+
findByUser(tenantId: string, userId: string): Promise<PhotonGrant[]>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=oauth-sqlite-stores.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-sqlite-stores.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/oauth-sqlite-stores.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,gCAAgC,CAAC;AA0CxC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE7E;AAMD,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,EAAE,EAAE,cAAc;IAmBxB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqBvF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAWnD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAIjC;AAqBD,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,EAAE,EAAE,cAAc;IA6BxB,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAWxB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBvF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAI3E"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed implementations of `ElicitationStore` and `GrantStore`.
|
|
3
|
+
*
|
|
4
|
+
* These hold OAuth state that currently goes through `MemoryElicitationStore`
|
|
5
|
+
* and `MemoryGrantStore` in `oauth.ts` — elicitation requests (short-lived,
|
|
6
|
+
* waiting for a user to complete the upstream OAuth flow) and photon grants
|
|
7
|
+
* (long-lived, encrypted refresh tokens for upstream APIs like Stripe/GitHub).
|
|
8
|
+
*
|
|
9
|
+
* Without persistent storage, every daemon restart forces users to re-auth
|
|
10
|
+
* against every upstream provider because the grants live in memory only.
|
|
11
|
+
* Moving grants to SQLite fixes that; elicitations benefit because pending
|
|
12
|
+
* approvals survive a crash of the daemon during the redirect window.
|
|
13
|
+
*
|
|
14
|
+
* Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
|
|
15
|
+
* - Under Bun: uses built-in `bun:sqlite`
|
|
16
|
+
* - Under Node: falls back to `better-sqlite3`
|
|
17
|
+
*/
|
|
18
|
+
import { randomBytes } from 'crypto';
|
|
19
|
+
import { openSqlite, } from '../../shared/sqlite-runtime.js';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Schema + open
|
|
22
|
+
// ============================================================================
|
|
23
|
+
function initSchema(db) {
|
|
24
|
+
db.exec(`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS elicitations (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
session_id TEXT NOT NULL,
|
|
28
|
+
photon_id TEXT NOT NULL,
|
|
29
|
+
provider TEXT NOT NULL,
|
|
30
|
+
required_scopes TEXT NOT NULL,
|
|
31
|
+
status TEXT NOT NULL,
|
|
32
|
+
redirect_uri TEXT NOT NULL,
|
|
33
|
+
code_verifier TEXT,
|
|
34
|
+
created_at INTEGER NOT NULL,
|
|
35
|
+
expires_at INTEGER NOT NULL
|
|
36
|
+
);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_elicitations_session ON elicitations(session_id);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_elicitations_expires ON elicitations(expires_at);
|
|
39
|
+
|
|
40
|
+
CREATE TABLE IF NOT EXISTS photon_grants (
|
|
41
|
+
id TEXT PRIMARY KEY,
|
|
42
|
+
tenant_id TEXT NOT NULL,
|
|
43
|
+
user_id TEXT,
|
|
44
|
+
photon_id TEXT NOT NULL,
|
|
45
|
+
provider TEXT NOT NULL,
|
|
46
|
+
scopes TEXT NOT NULL,
|
|
47
|
+
access_token_encrypted TEXT NOT NULL,
|
|
48
|
+
refresh_token_encrypted TEXT,
|
|
49
|
+
token_expires_at INTEGER NOT NULL,
|
|
50
|
+
created_at INTEGER NOT NULL,
|
|
51
|
+
updated_at INTEGER NOT NULL,
|
|
52
|
+
UNIQUE (tenant_id, photon_id, provider, user_id)
|
|
53
|
+
);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_grants_user ON photon_grants(tenant_id, user_id);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_grants_expires ON photon_grants(token_expires_at);
|
|
56
|
+
`);
|
|
57
|
+
}
|
|
58
|
+
export async function openOauthDatabase(path) {
|
|
59
|
+
return openSqlite(path, initSchema);
|
|
60
|
+
}
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// SqliteElicitationStore
|
|
63
|
+
// ============================================================================
|
|
64
|
+
export class SqliteElicitationStore {
|
|
65
|
+
insert;
|
|
66
|
+
select;
|
|
67
|
+
updateStmt;
|
|
68
|
+
remove;
|
|
69
|
+
sweepStmt;
|
|
70
|
+
constructor(db) {
|
|
71
|
+
this.insert = db.prepare(`
|
|
72
|
+
INSERT INTO elicitations
|
|
73
|
+
(id, session_id, photon_id, provider, required_scopes, status,
|
|
74
|
+
redirect_uri, code_verifier, created_at, expires_at)
|
|
75
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
76
|
+
`);
|
|
77
|
+
this.select = db.prepare('SELECT * FROM elicitations WHERE id = ?');
|
|
78
|
+
this.updateStmt = db.prepare(`
|
|
79
|
+
UPDATE elicitations
|
|
80
|
+
SET status = COALESCE(?, status),
|
|
81
|
+
code_verifier = COALESCE(?, code_verifier),
|
|
82
|
+
expires_at = COALESCE(?, expires_at)
|
|
83
|
+
WHERE id = ?
|
|
84
|
+
`);
|
|
85
|
+
this.remove = db.prepare('DELETE FROM elicitations WHERE id = ?');
|
|
86
|
+
this.sweepStmt = db.prepare('DELETE FROM elicitations WHERE expires_at < ?');
|
|
87
|
+
}
|
|
88
|
+
async create(data) {
|
|
89
|
+
const request = {
|
|
90
|
+
...data,
|
|
91
|
+
id: randomBytes(16).toString('hex'),
|
|
92
|
+
createdAt: new Date(),
|
|
93
|
+
};
|
|
94
|
+
this.insert.run(request.id, request.sessionId, request.photonId, request.provider, JSON.stringify(request.requiredScopes), request.status, request.redirectUri, request.codeVerifier ?? null, request.createdAt.getTime(), request.expiresAt.getTime());
|
|
95
|
+
return request;
|
|
96
|
+
}
|
|
97
|
+
async get(id) {
|
|
98
|
+
const row = this.select.get(id);
|
|
99
|
+
if (!row)
|
|
100
|
+
return null;
|
|
101
|
+
const expiresAt = new Date(row.expires_at);
|
|
102
|
+
if (expiresAt.getTime() < Date.now()) {
|
|
103
|
+
this.remove.run(id);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return rowToElicitation(row);
|
|
107
|
+
}
|
|
108
|
+
async update(id, data) {
|
|
109
|
+
// Only status / codeVerifier / expiresAt are mutated in practice
|
|
110
|
+
const expiresAt = data.expiresAt ? data.expiresAt.getTime() : null;
|
|
111
|
+
this.updateStmt.run(data.status ?? null, data.codeVerifier ?? null, expiresAt, id);
|
|
112
|
+
}
|
|
113
|
+
async delete(id) {
|
|
114
|
+
this.remove.run(id);
|
|
115
|
+
}
|
|
116
|
+
async cleanup() {
|
|
117
|
+
const result = this.sweepStmt.run(Date.now());
|
|
118
|
+
return result.changes ?? 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function rowToElicitation(row) {
|
|
122
|
+
return {
|
|
123
|
+
id: row.id,
|
|
124
|
+
sessionId: row.session_id,
|
|
125
|
+
photonId: row.photon_id,
|
|
126
|
+
provider: row.provider,
|
|
127
|
+
requiredScopes: JSON.parse(row.required_scopes),
|
|
128
|
+
status: row.status,
|
|
129
|
+
redirectUri: row.redirect_uri,
|
|
130
|
+
codeVerifier: row.code_verifier ?? undefined,
|
|
131
|
+
createdAt: new Date(row.created_at),
|
|
132
|
+
expiresAt: new Date(row.expires_at),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// SqliteGrantStore
|
|
137
|
+
// ============================================================================
|
|
138
|
+
export class SqliteGrantStore {
|
|
139
|
+
insert;
|
|
140
|
+
selectByKey;
|
|
141
|
+
selectByUser;
|
|
142
|
+
updateStmt;
|
|
143
|
+
remove;
|
|
144
|
+
constructor(db) {
|
|
145
|
+
this.insert = db.prepare(`
|
|
146
|
+
INSERT OR REPLACE INTO photon_grants
|
|
147
|
+
(id, tenant_id, user_id, photon_id, provider, scopes,
|
|
148
|
+
access_token_encrypted, refresh_token_encrypted, token_expires_at,
|
|
149
|
+
created_at, updated_at)
|
|
150
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
151
|
+
`);
|
|
152
|
+
this.selectByKey = db.prepare(`
|
|
153
|
+
SELECT * FROM photon_grants
|
|
154
|
+
WHERE tenant_id = ? AND photon_id = ? AND provider = ?
|
|
155
|
+
AND (user_id = ? OR (user_id IS NULL AND ? IS NULL))
|
|
156
|
+
LIMIT 1
|
|
157
|
+
`);
|
|
158
|
+
this.selectByUser = db.prepare('SELECT * FROM photon_grants WHERE tenant_id = ? AND user_id = ?');
|
|
159
|
+
this.updateStmt = db.prepare(`
|
|
160
|
+
UPDATE photon_grants
|
|
161
|
+
SET access_token_encrypted = COALESCE(?, access_token_encrypted),
|
|
162
|
+
refresh_token_encrypted = COALESCE(?, refresh_token_encrypted),
|
|
163
|
+
scopes = COALESCE(?, scopes),
|
|
164
|
+
token_expires_at = COALESCE(?, token_expires_at),
|
|
165
|
+
updated_at = ?
|
|
166
|
+
WHERE id = ?
|
|
167
|
+
`);
|
|
168
|
+
this.remove = db.prepare('DELETE FROM photon_grants WHERE id = ?');
|
|
169
|
+
}
|
|
170
|
+
async find(tenantId, photonId, provider, userId) {
|
|
171
|
+
const row = this.selectByKey.get(tenantId, photonId, provider, userId ?? null, userId ?? null);
|
|
172
|
+
return row ? rowToGrant(row) : null;
|
|
173
|
+
}
|
|
174
|
+
async create(data) {
|
|
175
|
+
const now = new Date();
|
|
176
|
+
const grant = {
|
|
177
|
+
...data,
|
|
178
|
+
id: randomBytes(16).toString('hex'),
|
|
179
|
+
createdAt: now,
|
|
180
|
+
updatedAt: now,
|
|
181
|
+
};
|
|
182
|
+
this.insert.run(grant.id, grant.tenantId, grant.userId ?? null, grant.photonId, grant.provider, JSON.stringify(grant.scopes), grant.accessTokenEncrypted, grant.refreshTokenEncrypted ?? null, grant.tokenExpiresAt.getTime(), grant.createdAt.getTime(), grant.updatedAt.getTime());
|
|
183
|
+
return grant;
|
|
184
|
+
}
|
|
185
|
+
async update(id, data) {
|
|
186
|
+
const expiresAt = data.tokenExpiresAt ? data.tokenExpiresAt.getTime() : null;
|
|
187
|
+
this.updateStmt.run(data.accessTokenEncrypted ?? null, data.refreshTokenEncrypted ?? null, data.scopes ? JSON.stringify(data.scopes) : null, expiresAt, Date.now(), id);
|
|
188
|
+
}
|
|
189
|
+
async delete(id) {
|
|
190
|
+
this.remove.run(id);
|
|
191
|
+
}
|
|
192
|
+
async findByUser(tenantId, userId) {
|
|
193
|
+
const rows = this.selectByUser.all(tenantId, userId);
|
|
194
|
+
return rows.map((r) => rowToGrant(r));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function rowToGrant(row) {
|
|
198
|
+
return {
|
|
199
|
+
id: row.id,
|
|
200
|
+
tenantId: row.tenant_id,
|
|
201
|
+
userId: row.user_id ?? undefined,
|
|
202
|
+
photonId: row.photon_id,
|
|
203
|
+
provider: row.provider,
|
|
204
|
+
scopes: JSON.parse(row.scopes),
|
|
205
|
+
accessTokenEncrypted: row.access_token_encrypted,
|
|
206
|
+
refreshTokenEncrypted: row.refresh_token_encrypted ?? undefined,
|
|
207
|
+
tokenExpiresAt: new Date(row.token_expires_at),
|
|
208
|
+
createdAt: new Date(row.created_at),
|
|
209
|
+
updatedAt: new Date(row.updated_at),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=oauth-sqlite-stores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-sqlite-stores.js","sourceRoot":"","sources":["../../../src/serv/auth/oauth-sqlite-stores.ts"],"names":[],"mappings":"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"}
|