@spine-event-engine/auth 2.0.0-snapshot.2

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 (57) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +112 -0
  3. package/REFERENCE.md +94 -0
  4. package/dist/gateway/dynamic-subscription-creator.d.ts +52 -0
  5. package/dist/gateway/dynamic-subscription-creator.d.ts.map +1 -0
  6. package/dist/gateway/dynamic-subscription-creator.js +71 -0
  7. package/dist/gateway/dynamic-subscription-creator.js.map +1 -0
  8. package/dist/gateway/dynamic-unary-forwarder.d.ts +130 -0
  9. package/dist/gateway/dynamic-unary-forwarder.d.ts.map +1 -0
  10. package/dist/gateway/dynamic-unary-forwarder.js +185 -0
  11. package/dist/gateway/dynamic-unary-forwarder.js.map +1 -0
  12. package/dist/gateway/index.d.ts +164 -0
  13. package/dist/gateway/index.d.ts.map +1 -0
  14. package/dist/gateway/index.js +195 -0
  15. package/dist/gateway/index.js.map +1 -0
  16. package/dist/index.d.ts +433 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +56 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/native/index.d.ts +182 -0
  21. package/dist/native/index.d.ts.map +1 -0
  22. package/dist/native/index.js +463 -0
  23. package/dist/native/index.js.map +1 -0
  24. package/dist/oidc/contracts.d.ts +334 -0
  25. package/dist/oidc/contracts.d.ts.map +1 -0
  26. package/dist/oidc/contracts.js +15 -0
  27. package/dist/oidc/contracts.js.map +1 -0
  28. package/dist/oidc/index.d.ts +41 -0
  29. package/dist/oidc/index.d.ts.map +1 -0
  30. package/dist/oidc/index.js +825 -0
  31. package/dist/oidc/index.js.map +1 -0
  32. package/dist/providers/index.d.ts +154 -0
  33. package/dist/providers/index.d.ts.map +1 -0
  34. package/dist/providers/index.js +574 -0
  35. package/dist/providers/index.js.map +1 -0
  36. package/dist/request/index.d.ts +10 -0
  37. package/dist/request/index.d.ts.map +1 -0
  38. package/dist/request/index.js +81 -0
  39. package/dist/request/index.js.map +1 -0
  40. package/dist/sessions/cookies.d.ts +104 -0
  41. package/dist/sessions/cookies.d.ts.map +1 -0
  42. package/dist/sessions/cookies.js +295 -0
  43. package/dist/sessions/cookies.js.map +1 -0
  44. package/dist/sessions/opaque.d.ts +163 -0
  45. package/dist/sessions/opaque.d.ts.map +1 -0
  46. package/dist/sessions/opaque.js +268 -0
  47. package/dist/sessions/opaque.js.map +1 -0
  48. package/dist/sessions/signed.d.ts +245 -0
  49. package/dist/sessions/signed.d.ts.map +1 -0
  50. package/dist/sessions/signed.js +534 -0
  51. package/dist/sessions/signed.js.map +1 -0
  52. package/dist/subscriptions/index.d.ts +463 -0
  53. package/dist/subscriptions/index.d.ts.map +1 -0
  54. package/dist/subscriptions/index.js +814 -0
  55. package/dist/subscriptions/index.js.map +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/package.json +37 -0
@@ -0,0 +1,534 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { create } from "@bufbuild/protobuf";
15
+ import { KeyObject, createPrivateKey, createPublicKey, randomBytes as nodeRandomBytes, sign, verify, } from "node:crypto";
16
+ import { TimestampSchema } from "@bufbuild/protobuf/wkt";
17
+ /**
18
+ * Finite, local ES256/JWT application sessions. This class has no remote key
19
+ * discovery, persistence, OIDC behavior, or authorization policy. It imports
20
+ * owned key copies, but Node does not expose explicit `KeyObject` zeroing.
21
+ */
22
+ export class SignedSessions {
23
+ #issuer;
24
+ #audience;
25
+ #clock;
26
+ #random;
27
+ #ttl;
28
+ #skew;
29
+ #maxToken;
30
+ #maxKeys;
31
+ #maxId;
32
+ #maxAttributes;
33
+ #maxAttributeChars;
34
+ #active;
35
+ #keys = new Map();
36
+ #revocation;
37
+ #closed = false;
38
+ /**
39
+ * Creates signed sessions with copied finite configuration and P-256 keys.
40
+ * @param options The issuer, key ring, limits, clock, entropy, and revocation settings.
41
+ */
42
+ constructor(options) {
43
+ this.#issuer = SignedSessionValues.boundedString(options.issuer, "issuer");
44
+ this.#audience = SignedSessionValues.boundedString(options.audience, "audience");
45
+ this.#ttl = SignedSessionValues.positive(options.ttlSeconds ?? 28_800, "ttlSeconds");
46
+ this.#skew = SignedSessionValues.nonnegative(options.clockSkewSeconds ?? 60, "clockSkewSeconds");
47
+ this.#maxToken = SignedSessionValues.positive(options.maxTokenCharacters ?? 8_192, "maxTokenCharacters");
48
+ this.#maxKeys = SignedSessionValues.positive(options.maxKeys ?? 16, "maxKeys");
49
+ this.#maxId = SignedSessionValues.positive(options.maxPrincipalIdCharacters ?? 256, "maxPrincipalIdCharacters");
50
+ this.#maxAttributes = SignedSessionValues.nonnegative(options.maxAttributes ?? 32, "maxAttributes");
51
+ this.#maxAttributeChars = SignedSessionValues.nonnegative(options.maxAttributeCharacters ?? 4_096, "maxAttributeCharacters");
52
+ this.#clock = options.clock ?? { now: Date.now };
53
+ this.#random = options.randomBytes ?? nodeRandomBytes;
54
+ this.#revocation = options.revocation;
55
+ if ((options.retiredKeys?.length ?? 0) + 1 > this.#maxKeys)
56
+ throw new Error("maxKeys exceeded");
57
+ const retainedUntil = options.retiredKeys === undefined || options.retiredKeys.length === 0
58
+ ? undefined
59
+ : SignedSessionValues.retentionDeadline(SignedSessionValues.clockValue(this.#clock), this.#ttl, this.#skew);
60
+ this.#active = SignedSessionValues.signing(options.activeKey);
61
+ this.#keys.set(this.#active.kid, { publicKey: this.#active.publicKey });
62
+ for (const key of options.retiredKeys ?? []) {
63
+ const copied = SignedSessionValues.verification(key);
64
+ if (this.#keys.has(copied.kid))
65
+ throw new Error("duplicate kid");
66
+ this.#keys.set(copied.kid, retainedUntil === undefined
67
+ ? { publicKey: copied.publicKey }
68
+ : { publicKey: copied.publicKey, expiresAt: retainedUntil });
69
+ }
70
+ }
71
+ /**
72
+ * Creates one compact ES256 bearer token inside configured identity bounds.
73
+ * @param principal The authenticated principal to encode.
74
+ * @returns The issuance outcome and, when accepted, credential and session.
75
+ */
76
+ issue(principal) {
77
+ if (this.#isClosed())
78
+ return Promise.resolve(SignedSessionValues.rejected("closed"));
79
+ const now = this.#now();
80
+ if (typeof now !== "number")
81
+ return Promise.resolve(SignedSessionValues.rejected(now.kind === "closed" ? "closed" : "clock-failure"));
82
+ if (this.#isClosed())
83
+ return Promise.resolve(SignedSessionValues.rejected("closed"));
84
+ this.#sweep(now);
85
+ let copied;
86
+ try {
87
+ copied = SignedSessionValues.principalCopy(principal, this.#maxId, this.#maxAttributes, this.#maxAttributeChars);
88
+ }
89
+ catch {
90
+ return Promise.resolve(SignedSessionValues.rejected("principal-invalid"));
91
+ }
92
+ if (copied === undefined)
93
+ return Promise.resolve(SignedSessionValues.rejected("principal-invalid"));
94
+ const jti = this.#jti();
95
+ if (jti === undefined)
96
+ return Promise.resolve(this.#isClosed()
97
+ ? SignedSessionValues.rejected("closed")
98
+ : SignedSessionValues.rejected("entropy-failure"));
99
+ if (this.#isClosed())
100
+ return Promise.resolve(SignedSessionValues.rejected("closed"));
101
+ const again = this.#now();
102
+ if (typeof again !== "number")
103
+ return Promise.resolve(SignedSessionValues.rejected(again.kind === "closed" ? "closed" : "clock-failure"));
104
+ if (this.#isClosed())
105
+ return Promise.resolve(SignedSessionValues.rejected("closed"));
106
+ const iat = Math.floor(again / 1000);
107
+ const exp = iat + this.#ttl;
108
+ if (!Number.isSafeInteger(exp) || !SignedSessionValues.timeValid(exp * 1000))
109
+ return Promise.resolve(SignedSessionValues.rejected("clock-failure"));
110
+ const claims = {
111
+ iss: this.#issuer,
112
+ aud: this.#audience,
113
+ sub: copied.id,
114
+ iat,
115
+ nbf: iat,
116
+ exp,
117
+ jti,
118
+ ...(copied.attributes === undefined ? {} : { attributes: copied.attributes }),
119
+ };
120
+ try {
121
+ const token = this.#token(claims);
122
+ if (token.length > this.#maxToken)
123
+ return Promise.resolve(SignedSessionValues.rejected("signing-failure"));
124
+ if (this.#isClosed())
125
+ return Promise.resolve(SignedSessionValues.rejected("closed"));
126
+ return Promise.resolve({
127
+ kind: "issued",
128
+ credential: Object.freeze({ kind: "bearer", value: token }),
129
+ session: SignedSessionValues.session(copied, exp),
130
+ });
131
+ }
132
+ catch {
133
+ return Promise.resolve(SignedSessionValues.rejected("signing-failure"));
134
+ }
135
+ }
136
+ /**
137
+ * Resolves one locally verifiable bearer credential.
138
+ *
139
+ * Cookie credentials and every malformed, invalid, expired, revoked, or
140
+ * unavailable-revocation result return `undefined`.
141
+ * @param credential The credential to resolve.
142
+ * @returns The verified session, or undefined when it cannot be trusted.
143
+ */
144
+ async resolve(credential) {
145
+ if (this.#isClosed() || credential.kind !== "bearer")
146
+ return undefined;
147
+ const claims = this.#verifiedClaims(credential.value);
148
+ if (claims === undefined)
149
+ return undefined;
150
+ if (this.#revocation !== undefined)
151
+ try {
152
+ if (await this.#revocation.isRevoked(claims.jti))
153
+ return undefined;
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ if (this.#isClosed())
159
+ return undefined;
160
+ return SignedSessionValues.session({
161
+ id: claims.sub,
162
+ ...(claims.attributes === undefined ? {} : { attributes: claims.attributes }),
163
+ }, claims.exp);
164
+ }
165
+ /**
166
+ * Updates the active P-256 key atomically.
167
+ *
168
+ * The previous verifier remains through the configured token lifetime plus
169
+ * clock skew, subject to the finite key bound.
170
+ * @param next The next active signing key.
171
+ * @returns The rotation outcome.
172
+ */
173
+ rotate(next) {
174
+ if (this.#isClosed())
175
+ return Promise.resolve(SignedSessionValues.rotation("closed"));
176
+ const now = this.#now();
177
+ if (typeof now !== "number")
178
+ return Promise.resolve(SignedSessionValues.rotation(now.kind === "closed" ? "closed" : "clock-failure"));
179
+ if (this.#isClosed())
180
+ return Promise.resolve(SignedSessionValues.rotation("closed"));
181
+ this.#sweep(now);
182
+ let copy;
183
+ try {
184
+ copy = SignedSessionValues.signing(next);
185
+ }
186
+ catch {
187
+ return Promise.resolve(SignedSessionValues.rotation("invalid-key"));
188
+ }
189
+ if (this.#keys.has(copy.kid))
190
+ return Promise.resolve(SignedSessionValues.rotation("duplicate-key"));
191
+ if (this.#keys.size + 1 > this.#maxKeys)
192
+ return Promise.resolve(SignedSessionValues.rotation("key-capacity-exceeded"));
193
+ const again = this.#now();
194
+ if (typeof again !== "number")
195
+ return Promise.resolve(SignedSessionValues.rotation(again.kind === "closed" ? "closed" : "clock-failure"));
196
+ if (this.#isClosed())
197
+ return Promise.resolve(SignedSessionValues.rotation("closed"));
198
+ let expiresAt;
199
+ try {
200
+ expiresAt = SignedSessionValues.retentionDeadline(again, this.#ttl, this.#skew);
201
+ }
202
+ catch {
203
+ return Promise.resolve(SignedSessionValues.rotation("clock-failure"));
204
+ }
205
+ const active = this.#active;
206
+ if (active === undefined)
207
+ return Promise.resolve(SignedSessionValues.rotation("closed"));
208
+ this.#keys.set(active.kid, {
209
+ publicKey: active.publicKey,
210
+ expiresAt,
211
+ });
212
+ this.#active = copy;
213
+ this.#keys.set(copy.kid, { publicKey: copy.publicKey });
214
+ return Promise.resolve({ kind: "rotated" });
215
+ }
216
+ /**
217
+ * Sends a logout request without revealing invalid-token state.
218
+ *
219
+ * Immediate revocation requires `SignedTokenRevocation`; otherwise valid and
220
+ * invalid input both report `expiryOnly`.
221
+ * @param credential The credential to revoke when valid.
222
+ * @returns The enumeration-safe logout outcome.
223
+ */
224
+ async logout(credential) {
225
+ const resolved = await this.#claimsForLogout(credential);
226
+ if (resolved === undefined)
227
+ return { kind: "expiryOnly" };
228
+ if (this.#revocation === undefined)
229
+ return { kind: "expiryOnly" };
230
+ try {
231
+ await this.#revocation.revoke(resolved.jti, SignedSessionValues.timestamp(resolved.exp));
232
+ return this.#closed ? { kind: "expiryOnly" } : { kind: "revoked" };
233
+ }
234
+ catch {
235
+ return this.#closed ? { kind: "expiryOnly" } : { kind: "unavailable" };
236
+ }
237
+ }
238
+ /**
239
+ * Closes the resolver and clears active, verification-key, and revocation references.
240
+ * Node `KeyObject` memory cannot be explicitly zeroed.
241
+ * @returns Completes after resolver references are cleared.
242
+ */
243
+ close() {
244
+ this.#closed = true;
245
+ this.#keys.clear();
246
+ this.#active = undefined;
247
+ this.#revocation = undefined;
248
+ return Promise.resolve();
249
+ }
250
+ #claimsForLogout(credential) {
251
+ if (credential.kind !== "bearer" || this.#isClosed())
252
+ return Promise.resolve(undefined);
253
+ return Promise.resolve(this.#verifiedClaims(credential.value));
254
+ }
255
+ #verifiedClaims(value) {
256
+ const parsed = this.#parse(value);
257
+ if (parsed === undefined)
258
+ return undefined;
259
+ const now = this.#now();
260
+ if (typeof now !== "number" || this.#isClosed())
261
+ return undefined;
262
+ this.#sweep(now);
263
+ const key = this.#keys.get(parsed.kid);
264
+ if (key === undefined || (key.expiresAt !== undefined && now > key.expiresAt))
265
+ return undefined;
266
+ try {
267
+ if (!verify("sha256", Buffer.from(parsed.input), { key: key.publicKey, dsaEncoding: "ieee-p1363" }, parsed.signature))
268
+ return undefined;
269
+ }
270
+ catch {
271
+ return undefined;
272
+ }
273
+ return SignedSessionValues.validClaims(parsed.claims, this.#issuer, this.#audience, this.#ttl, this.#skew, now, this.#maxId, this.#maxAttributes, this.#maxAttributeChars);
274
+ }
275
+ #token(claims) {
276
+ const active = this.#active;
277
+ if (active === undefined)
278
+ throw new Error("SignedSessions is closed");
279
+ const header = SignedSessionValues.encode({ alg: "ES256", typ: "JWT", kid: active.kid });
280
+ const payload = SignedSessionValues.encode(claims);
281
+ const input = `${header}.${payload}`;
282
+ const signature = sign("sha256", Buffer.from(input), {
283
+ key: active.privateKey,
284
+ dsaEncoding: "ieee-p1363",
285
+ });
286
+ if (signature.byteLength !== 64)
287
+ throw new Error("invalid ES256 signature");
288
+ return `${input}.${Buffer.from(signature).toString("base64url")}`;
289
+ }
290
+ #jti() {
291
+ let bytes;
292
+ try {
293
+ bytes = this.#random(16);
294
+ if (bytes.byteLength !== 16)
295
+ return undefined;
296
+ return Buffer.from(bytes).toString("base64url");
297
+ }
298
+ catch {
299
+ return undefined;
300
+ }
301
+ finally {
302
+ bytes?.fill(0);
303
+ }
304
+ }
305
+ #now() {
306
+ try {
307
+ const value = this.#clock.now();
308
+ if (!Number.isSafeInteger(value) || !SignedSessionValues.timeValid(value))
309
+ throw new Error();
310
+ return value;
311
+ }
312
+ catch {
313
+ if (this.#isClosed())
314
+ return { kind: "closed" };
315
+ void this.close();
316
+ return { kind: "failure" };
317
+ }
318
+ }
319
+ #isClosed() {
320
+ return this.#closed;
321
+ }
322
+ #sweep(now) {
323
+ for (const [kid, key] of this.#keys)
324
+ if (key.expiresAt !== undefined && now > key.expiresAt)
325
+ this.#keys.delete(kid);
326
+ }
327
+ #parse(value) {
328
+ if (typeof value !== "string" || value.length === 0 || value.length > this.#maxToken)
329
+ return undefined;
330
+ const segments = value.split(".");
331
+ if (segments.length !== 3 ||
332
+ segments.some((segment) => !SignedSessionValues.base64url(segment)))
333
+ return undefined;
334
+ const [encodedHeader, encodedClaims, encodedSignature] = segments;
335
+ try {
336
+ const header = SignedSessionValues.json(encodedHeader);
337
+ if (!SignedSessionValues.plain(header) ||
338
+ header.alg !== "ES256" ||
339
+ header.typ !== "JWT" ||
340
+ typeof header.kid !== "string" ||
341
+ Object.keys(header).length !== 3 ||
342
+ !SignedSessionValues.validKid(header.kid))
343
+ return undefined;
344
+ const signature = Buffer.from(encodedSignature, "base64url");
345
+ if (signature.byteLength !== 64 || signature.toString("base64url") !== encodedSignature)
346
+ return undefined;
347
+ return {
348
+ kid: header.kid,
349
+ input: `${encodedHeader}.${encodedClaims}`,
350
+ signature,
351
+ claims: SignedSessionValues.json(encodedClaims),
352
+ };
353
+ }
354
+ catch {
355
+ return undefined;
356
+ }
357
+ }
358
+ }
359
+ /**
360
+ * Validates, serializes, and constructs finite signed-session values.
361
+ */
362
+ const SignedSessionValues = Object.freeze({
363
+ rejected(reason) {
364
+ return { kind: "rejected", reason };
365
+ },
366
+ rotation(reason) {
367
+ return { kind: "rejected", reason };
368
+ },
369
+ signing(key) {
370
+ const kid = SignedSessionValues.boundedString(key.kid, "kid");
371
+ if (key.privateKey.type !== "private" ||
372
+ key.privateKey.asymmetricKeyType !== "ec" ||
373
+ key.privateKey.asymmetricKeyDetails?.namedCurve !== "prime256v1")
374
+ throw new Error("P-256 private key required");
375
+ const der = key.privateKey.export({ type: "pkcs8", format: "der" });
376
+ let privateKey;
377
+ try {
378
+ privateKey = createPrivateKey({ key: der, type: "pkcs8", format: "der" });
379
+ }
380
+ finally {
381
+ der.fill(0);
382
+ }
383
+ const publicKey = createPublicKey(privateKey);
384
+ return { kid, privateKey, publicKey };
385
+ },
386
+ verification(key) {
387
+ const kid = SignedSessionValues.boundedString(key.kid, "kid");
388
+ if (key.publicKey.type !== "public" ||
389
+ key.publicKey.asymmetricKeyType !== "ec" ||
390
+ key.publicKey.asymmetricKeyDetails?.namedCurve !== "prime256v1")
391
+ throw new Error("P-256 public key required");
392
+ const der = key.publicKey.export({ type: "spki", format: "der" });
393
+ try {
394
+ return { kid, publicKey: createPublicKey({ key: der, type: "spki", format: "der" }) };
395
+ }
396
+ finally {
397
+ der.fill(0);
398
+ }
399
+ },
400
+ positive(value, name) {
401
+ if (!Number.isSafeInteger(value) || value <= 0)
402
+ throw new Error(`${name} must be a positive safe integer`);
403
+ return value;
404
+ },
405
+ nonnegative(value, name) {
406
+ if (!Number.isSafeInteger(value) || value < 0)
407
+ throw new Error(`${name} must be a non-negative safe integer`);
408
+ return value;
409
+ },
410
+ boundedString(value, name) {
411
+ if (typeof value !== "string" || value.length === 0 || value.length > 256)
412
+ throw new Error(`${name} must be a non-empty string of at most 256 characters`);
413
+ return value;
414
+ },
415
+ validKid(value) {
416
+ return value.length > 0 && value.length <= 256;
417
+ },
418
+ base64url(value) {
419
+ return value.length > 0 && /^[A-Za-z0-9_-]+$/.test(value) && value.length % 4 !== 1;
420
+ },
421
+ encode(value) {
422
+ return Buffer.from(JSON.stringify(value)).toString("base64url");
423
+ },
424
+ json(value) {
425
+ const decoded = Buffer.from(value, "base64url");
426
+ if (decoded.byteLength > 16_384)
427
+ throw new Error();
428
+ return JSON.parse(decoded.toString("utf8"));
429
+ },
430
+ plain(value) {
431
+ return (typeof value === "object" &&
432
+ value !== null &&
433
+ Object.getPrototypeOf(value) === Object.prototype);
434
+ },
435
+ principalCopy(value, maxId, maxAttributes, maxChars) {
436
+ if (typeof value.id !== "string" || value.id.length === 0 || value.id.length > maxId)
437
+ return undefined;
438
+ if (value.attributes === undefined)
439
+ return Object.freeze({ id: value.id });
440
+ if (!SignedSessionValues.plain(value.attributes))
441
+ return undefined;
442
+ const entries = [];
443
+ let characters = 0;
444
+ for (const name in value.attributes) {
445
+ if (!Object.prototype.hasOwnProperty.call(value.attributes, name))
446
+ continue;
447
+ if (entries.length === maxAttributes)
448
+ return undefined;
449
+ const attribute = value.attributes[name];
450
+ if (typeof attribute !== "string")
451
+ return undefined;
452
+ characters += name.length + attribute.length;
453
+ if (characters > maxChars)
454
+ return undefined;
455
+ entries.push([name, attribute]);
456
+ }
457
+ return Object.freeze({
458
+ id: value.id,
459
+ attributes: Object.freeze(Object.fromEntries(entries)),
460
+ });
461
+ },
462
+ validClaims(value, issuer, audience, ttl, skew, now, maxId, maxAttributes, maxChars) {
463
+ if (!SignedSessionValues.plain(value) ||
464
+ Object.keys(value).some((key) => !["iss", "aud", "sub", "iat", "nbf", "exp", "jti", "attributes"].includes(key)))
465
+ return undefined;
466
+ const { iss, aud, sub, iat, nbf, exp, jti, attributes } = value;
467
+ if (iss !== issuer ||
468
+ aud !== audience ||
469
+ typeof iat !== "number" ||
470
+ typeof nbf !== "number" ||
471
+ typeof exp !== "number" ||
472
+ typeof jti !== "string" ||
473
+ ![iat, nbf, exp].every(Number.isSafeInteger) ||
474
+ exp <= nbf ||
475
+ nbf < iat ||
476
+ exp - iat > ttl ||
477
+ nbf * 1000 > now + skew * 1000 ||
478
+ exp * 1000 < now - skew * 1000 ||
479
+ !SignedSessionValues.validJti(jti))
480
+ return undefined;
481
+ const principal = SignedSessionValues.principalCopy({
482
+ id: sub,
483
+ ...(attributes === undefined ? {} : { attributes: attributes }),
484
+ }, maxId, maxAttributes, maxChars);
485
+ if (!principal)
486
+ return undefined;
487
+ return {
488
+ iss,
489
+ aud,
490
+ sub: principal.id,
491
+ iat,
492
+ nbf,
493
+ exp,
494
+ jti,
495
+ ...(principal.attributes === undefined ? {} : { attributes: principal.attributes }),
496
+ };
497
+ },
498
+ timestamp(seconds) {
499
+ return create(TimestampSchema, { seconds: BigInt(seconds) });
500
+ },
501
+ session(principal, seconds) {
502
+ const copied = SignedSessionValues.principalCopy(principal, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
503
+ if (copied === undefined)
504
+ throw new Error("invalid principal");
505
+ return Object.freeze({
506
+ principal: copied,
507
+ expiresAt: SignedSessionValues.timestamp(seconds),
508
+ });
509
+ },
510
+ timeValid(milliseconds) {
511
+ const seconds = Math.floor(milliseconds / 1000);
512
+ return seconds >= -62_135_596_800 && seconds <= 253_402_300_799;
513
+ },
514
+ validJti(value) {
515
+ return value.length === 22 && SignedSessionValues.base64url(value);
516
+ },
517
+ clockValue(clock) {
518
+ const value = clock.now();
519
+ if (!Number.isSafeInteger(value) || !SignedSessionValues.timeValid(value))
520
+ throw new Error("invalid clock");
521
+ return value;
522
+ },
523
+ retentionDeadline(now, ttl, skew) {
524
+ const seconds = ttl + skew;
525
+ const milliseconds = seconds * 1_000;
526
+ const deadline = now + milliseconds;
527
+ if (!Number.isSafeInteger(seconds) ||
528
+ !Number.isSafeInteger(milliseconds) ||
529
+ !SignedSessionValues.timeValid(deadline))
530
+ throw new Error("retention deadline exceeds Timestamp range");
531
+ return deadline;
532
+ },
533
+ });
534
+ //# sourceMappingURL=signed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed.js","sourceRoot":"","sources":["../../src/sessions/signed.ts"],"names":[],"mappings":"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"}