unjwt 0.5.37 → 0.5.39

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 (41) hide show
  1. package/README.md +142 -663
  2. package/dist/_chunks/chunk.mjs +13 -0
  3. package/dist/_chunks/h3v1.mjs +598 -0
  4. package/dist/_chunks/index.d.mts +250 -0
  5. package/dist/_chunks/index2.d.mts +108 -0
  6. package/dist/_chunks/jwe.d.mts +43 -0
  7. package/dist/_chunks/jwe.mjs +132 -0
  8. package/dist/_chunks/jwk.d.mts +575 -0
  9. package/dist/_chunks/jwk.mjs +1592 -0
  10. package/dist/_chunks/jws.d.mts +46 -0
  11. package/dist/_chunks/jws.mjs +2069 -0
  12. package/dist/_chunks/utils.mjs +374 -0
  13. package/dist/adapters/h3.d.mts +3 -265
  14. package/dist/adapters/h3.mjs +3 -706
  15. package/dist/adapters/h3v1.d.mts +3 -8
  16. package/dist/adapters/h3v1.mjs +3 -7
  17. package/dist/adapters/h3v2.d.mts +145 -146
  18. package/dist/adapters/h3v2.mjs +505 -596
  19. package/dist/index.d.mts +6 -8
  20. package/dist/index.mjs +5 -4
  21. package/dist/jwe.d.mts +3 -4
  22. package/dist/jwe.mjs +4 -3
  23. package/dist/jwk.d.mts +3 -2
  24. package/dist/jwk.mjs +3 -2
  25. package/dist/jws.d.mts +3 -3
  26. package/dist/jws.mjs +4 -3
  27. package/dist/utils.d.mts +3 -3
  28. package/dist/utils.mjs +2 -1
  29. package/package.json +33 -31
  30. package/dist/shared/unjwt.4JQCoID_.d.mts +0 -161
  31. package/dist/shared/unjwt.B-v62plj.mjs +0 -249
  32. package/dist/shared/unjwt.BCi3FEWr.d.mts +0 -328
  33. package/dist/shared/unjwt.BYDTEWa-.d.mts +0 -269
  34. package/dist/shared/unjwt.Be8NxwFK.mjs +0 -438
  35. package/dist/shared/unjwt.BqdNUKDr.d.mts +0 -64
  36. package/dist/shared/unjwt.CMNtw8ek.d.mts +0 -155
  37. package/dist/shared/unjwt.Cy2MlkUe.d.mts +0 -174
  38. package/dist/shared/unjwt.D0_ccT7g.d.mts +0 -166
  39. package/dist/shared/unjwt.DdLN9vwI.mjs +0 -163
  40. package/dist/shared/unjwt.Dpl__ZAR.mjs +0 -2121
  41. package/dist/shared/unjwt.JdKqVANs.d.mts +0 -5
@@ -1,706 +1,3 @@
1
- export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.Dpl__ZAR.mjs';
2
- import { isEvent, setCookie } from 'h3';
3
- import { parse } from 'cookie-es';
4
- import { e as encrypt, d as decrypt } from '../shared/unjwt.B-v62plj.mjs';
5
- import { p as computeExpiresInSeconds, q as isSymmetricJWK, u as isPrivateJWK, w as isPublicJWK } from '../shared/unjwt.Be8NxwFK.mjs';
6
- import { s as sign, v as verify } from '../shared/unjwt.DdLN9vwI.mjs';
7
-
8
- /**
9
- * This is a fork of h3 library's session utility functions.
10
- * @source https://github.com/h3js/h3/blob/b4dce71c256911335f3402d09f30ffad120ad61a/src/utils/session.ts
11
- * @license MIT https://github.com/h3js/h3/blob/b4dce71c256911335f3402d09f30ffad120ad61a/LICENSE
12
- */
13
- const kGetSessionPromise$1 = Symbol("h3_jwe_getSession");
14
- const DEFAULT_NAME$1 = "h3-jwe";
15
- const DEFAULT_COOKIE$1 = {
16
- path: "/",
17
- secure: true,
18
- httpOnly: true
19
- };
20
- async function useJWESession(event, config) {
21
- const sessionName = config.name || DEFAULT_NAME$1;
22
- await getJWESession(event, config);
23
- const sessionManager = {
24
- get id() {
25
- return event.context.sessions?.[sessionName]?.id;
26
- },
27
- get createdAt() {
28
- return event.context.sessions?.[sessionName]?.createdAt || Date.now();
29
- },
30
- get expiresAt() {
31
- return event.context.sessions?.[sessionName]?.expiresAt;
32
- },
33
- get data() {
34
- return event.context.sessions?.[sessionName]?.data || {};
35
- },
36
- get token() {
37
- return getJWESessionToken(event, config);
38
- },
39
- update: async (update) => {
40
- if (!isEvent(event)) {
41
- throw new Error("[h3] Cannot update read-only session.");
42
- }
43
- await updateJWESession(event, config, update);
44
- return sessionManager;
45
- },
46
- clear: () => {
47
- if (!isEvent(event)) {
48
- throw new Error("[h3] Cannot clear read-only session.");
49
- }
50
- clearJWESession(event, config);
51
- return Promise.resolve(sessionManager);
52
- }
53
- };
54
- return sessionManager;
55
- }
56
- async function getJWESession(event, config) {
57
- const sessionName = config.name || DEFAULT_NAME$1;
58
- if (!event.context.sessions) {
59
- event.context.sessions = /* @__PURE__ */ Object.create(null);
60
- }
61
- const existingSession = event.context.sessions[sessionName];
62
- if (existingSession) {
63
- const session2 = existingSession[kGetSessionPromise$1] ? await existingSession[kGetSessionPromise$1] : existingSession;
64
- if (session2.expiresAt !== void 0 && session2.expiresAt < Date.now() && isEvent(event)) {
65
- await config.hooks?.onExpire?.({
66
- event,
67
- error: new Error(
68
- `JWT "exp" (Expiration Time) Claim validation failed: Token has expired (exp: ${new Date(session2.expiresAt * 1e3).toISOString()})`
69
- ),
70
- config
71
- });
72
- return clearJWESession(event, config).then(
73
- () => getJWESession(event, config)
74
- );
75
- }
76
- await config.hooks?.onRead?.({
77
- event,
78
- session: session2,
79
- config
80
- });
81
- return session2;
82
- }
83
- const session = {
84
- id: "",
85
- createdAt: 0,
86
- expiresAt: void 0,
87
- data: /* @__PURE__ */ Object.create(null)
88
- };
89
- event.context.sessions[sessionName] = session;
90
- const token = getJWESessionToken(event, config);
91
- if (token) {
92
- const promise = unsealJWESession(event, config, token).catch(async (error_) => {
93
- if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
94
- await config.hooks?.onExpire?.({
95
- event,
96
- error: error_,
97
- config
98
- });
99
- return void 0;
100
- }
101
- await config.hooks?.onError?.({
102
- event,
103
- error: error_,
104
- config
105
- });
106
- return void 0;
107
- }).then((unsealed) => {
108
- if (unsealed) {
109
- Object.assign(session, unsealed);
110
- }
111
- delete event.context.sessions[sessionName][kGetSessionPromise$1];
112
- return session;
113
- });
114
- event.context.sessions[sessionName][kGetSessionPromise$1] = promise;
115
- await promise;
116
- }
117
- if (!session.id) {
118
- if (!isEvent(event)) {
119
- throw new Error(
120
- "Cannot initialize a new session. Use `useSession(event)` within the main handler."
121
- );
122
- }
123
- await updateJWESession(event, config);
124
- }
125
- await config.hooks?.onRead?.({
126
- event,
127
- session,
128
- config
129
- });
130
- return session;
131
- }
132
- function getJWESessionToken(event, config) {
133
- const sessionName = config.name || DEFAULT_NAME$1;
134
- let token;
135
- if (config.sessionHeader !== false) {
136
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
137
- const headerValue = _getReqHeader$1(event, headerName);
138
- if (typeof headerValue === "string") {
139
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
140
- }
141
- }
142
- if (config.cookie !== false) {
143
- const setCookie2 = _getResHeader$1(event, "set-cookie");
144
- if (typeof setCookie2 === "string") {
145
- token = findSetCookie$1(setCookie2, sessionName);
146
- } else if (Array.isArray(setCookie2)) {
147
- for (const sc of setCookie2) {
148
- token = findSetCookie$1(sc, sessionName);
149
- if (token) {
150
- break;
151
- }
152
- }
153
- }
154
- }
155
- if (!token) {
156
- const cookieHeader = _getReqHeader$1(event, "cookie");
157
- if (cookieHeader) {
158
- token = parse(String(cookieHeader))[sessionName];
159
- }
160
- }
161
- return token;
162
- }
163
- function _getReqHeader$1(event, name) {
164
- if (event.node) {
165
- return event.node?.req.headers[name];
166
- }
167
- if (event.request) {
168
- return event.request.headers?.get(name);
169
- }
170
- if (event.headers) {
171
- return event.headers.get(name);
172
- }
173
- }
174
- function _getResHeader$1(event, name) {
175
- if (event.node) {
176
- return event.node?.res.getHeader(name);
177
- }
178
- if (event.response) {
179
- return event.response.headers?.get(name);
180
- }
181
- }
182
- async function updateJWESession(event, config, update) {
183
- const sessionName = config.name || DEFAULT_NAME$1;
184
- const session = event.context.sessions?.[sessionName] || await getJWESession(event, config);
185
- if (typeof update === "function") {
186
- update = update(session.data);
187
- }
188
- if (update) {
189
- const oldSession = { ...session, data: { ...session.data } };
190
- Object.assign(session.data, update);
191
- await config.hooks?.onUpdate?.({
192
- session,
193
- oldSession,
194
- event,
195
- config
196
- });
197
- }
198
- const now = config.jwe?.encryptOptions?.currentDate?.getTime() ?? Date.now();
199
- const createdAt = now - now % 1e3;
200
- Object.assign(session, {
201
- id: config.generateId?.() || crypto.randomUUID(),
202
- createdAt,
203
- expiresAt: config.maxAge === void 0 ? void 0 : createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
204
- });
205
- if (config.cookie !== false) {
206
- const sealed = await sealJWESession(event, config);
207
- setCookie(event, sessionName, sealed, {
208
- ...DEFAULT_COOKIE$1,
209
- ...config.cookie,
210
- expires: config.maxAge === void 0 ? void 0 : new Date(
211
- // createdAt is ms, maxAge is seconds
212
- session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
213
- )
214
- });
215
- }
216
- return session;
217
- }
218
- async function sealJWESession(event, config) {
219
- const key = getEncryptKey(config.key || config.secret);
220
- const sessionName = config.name || DEFAULT_NAME$1;
221
- const session = event.context.sessions?.[sessionName] || await getJWESession(event, config);
222
- const iat = Math.floor(session.createdAt / 1e3);
223
- const exp = session.expiresAt ? Math.floor(session.expiresAt / 1e3) : void 0;
224
- const payload = {
225
- ...session.data,
226
- jti: session.id,
227
- iat
228
- };
229
- if (exp) {
230
- payload.exp = exp;
231
- }
232
- let typ = void 0;
233
- if (config.jwe?.encryptOptions?.protectedHeader?.typ && typeof config.jwe.encryptOptions.protectedHeader.typ === "string" && config.jwe.encryptOptions.protectedHeader.typ.toLowerCase().includes("jwt")) {
234
- typ = config.jwe.encryptOptions.protectedHeader.typ;
235
- }
236
- const token = await encrypt(payload, key, {
237
- ...config.jwe?.encryptOptions,
238
- expiresIn: void 0,
239
- // controlled via 'exp' claim
240
- protectedHeader: {
241
- ...config.jwe?.encryptOptions?.protectedHeader,
242
- kid: typeof key === "string" ? void 0 : key.kid,
243
- typ: typ || "JWT",
244
- cty: "application/json"
245
- }
246
- });
247
- return token;
248
- }
249
- async function unsealJWESession(event, config, sealed) {
250
- const key = config.hooks?.onUnsealKeyLookup ? (header) => config.hooks.onUnsealKeyLookup({
251
- header,
252
- event,
253
- config
254
- }) : getDecryptKey(config.key || config.secret);
255
- const alg = config.jwe?.encryptOptions?.alg;
256
- const enc = config.jwe?.encryptOptions?.enc;
257
- if (config.jwe?.encryptOptions?.protectedHeader?.typ && typeof config.jwe.encryptOptions.protectedHeader.typ === "string" && config.jwe.encryptOptions.protectedHeader.typ.toLowerCase().includes("jwt")) {
258
- config.jwe.encryptOptions.protectedHeader.typ;
259
- }
260
- const { payload } = await decrypt(sealed, key, {
261
- ...config.jwe?.decryptOptions,
262
- requiredClaims: [
263
- .../* @__PURE__ */ new Set([
264
- ...config.jwe?.decryptOptions?.requiredClaims || [],
265
- "jti",
266
- "iat"
267
- ])
268
- ],
269
- maxTokenAge: config.maxAge,
270
- algorithms: alg ? [alg] : void 0,
271
- encryptionAlgorithms: enc ? [enc] : void 0,
272
- unwrappedKeyAlgorithm: void 0,
273
- keyUsage: void 0,
274
- forceUint8Array: false,
275
- validateJWT: true
276
- }).catch((error_) => {
277
- if (error_ instanceof Error) {
278
- const message = error_.message;
279
- throw new Error(`Invalid session token: ${message}`);
280
- }
281
- throw new Error(error_);
282
- });
283
- const { jti, iat, exp, ...data } = payload;
284
- return {
285
- id: jti,
286
- createdAt: iat * 1e3,
287
- // Convert back to ms
288
- expiresAt: exp ? exp * 1e3 : void 0,
289
- data: data && typeof data === "object" ? data : /* @__PURE__ */ Object.create(null)
290
- };
291
- }
292
- async function clearJWESession(event, config) {
293
- const sessionName = config.name || DEFAULT_NAME$1;
294
- let session = event.context.sessions?.[sessionName];
295
- if (session && session[kGetSessionPromise$1]) {
296
- session = await session[kGetSessionPromise$1];
297
- }
298
- if (event.context.sessions?.[sessionName]) {
299
- delete event.context.sessions[sessionName];
300
- }
301
- setCookie(event, sessionName, "", {
302
- ...DEFAULT_COOKIE$1,
303
- ...config.cookie,
304
- expires: /* @__PURE__ */ new Date(0),
305
- maxAge: void 0
306
- });
307
- await config.hooks?.onClear?.({
308
- session,
309
- event,
310
- config
311
- });
312
- }
313
- function getEncryptKey(key) {
314
- if (!key) {
315
- throw new Error("Session: JWE key is required.");
316
- }
317
- let _key;
318
- if (typeof key === "string") {
319
- _key = key;
320
- } else if (isSymmetricJWK(key) || isPrivateJWK(key)) {
321
- _key = key;
322
- } else if ("publicKey" in key && isPublicJWK(key.publicKey)) {
323
- _key = key.publicKey;
324
- } else if ("privateKey" in key && isPrivateJWK(key.privateKey)) {
325
- _key = key.privateKey;
326
- }
327
- if (!_key) {
328
- throw new Error(
329
- "Session: Invalid JWE key. It must be a password string or valid JWK.",
330
- { cause: key }
331
- );
332
- }
333
- return _key;
334
- }
335
- function getDecryptKey(key) {
336
- if (!key) {
337
- throw new Error("Session: JWE key is required.");
338
- }
339
- let _key = void 0;
340
- if (typeof key === "string") {
341
- _key = key;
342
- } else if (isSymmetricJWK(key)) {
343
- _key = key;
344
- } else if ("privateKey" in key) {
345
- _key = key.privateKey;
346
- }
347
- if (!_key) {
348
- throw new Error(
349
- "Session: Invalid JWE key. It must be a password string or a valid private JWK.",
350
- { cause: key }
351
- );
352
- }
353
- return _key;
354
- }
355
- function findSetCookie$1(setCookie2, name) {
356
- const regex = new RegExp(`(?:^|,\\s*)${name}=([^;]+)`);
357
- const match = setCookie2.match(regex);
358
- return match ? match[1] : void 0;
359
- }
360
-
361
- /**
362
- * This is a fork of h3 library's session utility functions.
363
- * @source https://github.com/h3js/h3/blob/b4dce71c256911335f3402d09f30ffad120ad61a/src/utils/session.ts
364
- * @license MIT https://github.com/h3js/h3/blob/b4dce71c256911335f3402d09f30ffad120ad61a/LICENSE
365
- */
366
- const kGetSessionPromise = Symbol("h3_jws_getSession");
367
- const DEFAULT_NAME = "h3-jws";
368
- const DEFAULT_COOKIE = {
369
- path: "/",
370
- secure: true,
371
- httpOnly: false
372
- };
373
- async function useJWSSession(event, config) {
374
- const sessionName = config.name || DEFAULT_NAME;
375
- await getJWSSession(event, config);
376
- const sessionManager = {
377
- get id() {
378
- return event.context.sessions?.[sessionName]?.id;
379
- },
380
- get createdAt() {
381
- return event.context.sessions?.[sessionName]?.createdAt || Date.now();
382
- },
383
- get expiresAt() {
384
- return event.context.sessions?.[sessionName]?.expiresAt;
385
- },
386
- get data() {
387
- return event.context.sessions?.[sessionName]?.data || {};
388
- },
389
- get token() {
390
- return getJWSSessionToken(event, config);
391
- },
392
- update: async (update) => {
393
- if (!isEvent(event)) {
394
- throw new Error("[h3] Cannot update read-only session.");
395
- }
396
- await updateJWSSession(event, config, update);
397
- return sessionManager;
398
- },
399
- clear: () => {
400
- if (!isEvent(event)) {
401
- throw new Error("[h3] Cannot clear read-only session.");
402
- }
403
- clearJWSSession(event, config);
404
- return Promise.resolve(sessionManager);
405
- }
406
- };
407
- return sessionManager;
408
- }
409
- async function getJWSSession(event, config) {
410
- const sessionName = config.name || DEFAULT_NAME;
411
- if (!event.context.sessions) {
412
- event.context.sessions = /* @__PURE__ */ Object.create(null);
413
- }
414
- const existingSession = event.context.sessions[sessionName];
415
- if (existingSession) {
416
- const session2 = existingSession[kGetSessionPromise] ? await existingSession[kGetSessionPromise] : existingSession;
417
- if (session2.expiresAt !== void 0 && session2.expiresAt < Date.now() && isEvent(event)) {
418
- await config.hooks?.onExpire?.({
419
- event,
420
- error: new Error(
421
- `JWT "exp" (Expiration Time) Claim validation failed: Token has expired (exp: ${new Date(session2.expiresAt * 1e3).toISOString()})`
422
- ),
423
- config
424
- });
425
- return clearJWSSession(event, config).then(
426
- () => getJWSSession(event, config)
427
- );
428
- }
429
- await config.hooks?.onRead?.({
430
- event,
431
- session: session2,
432
- config
433
- });
434
- return session2;
435
- }
436
- const session = {
437
- id: "",
438
- createdAt: 0,
439
- expiresAt: void 0,
440
- data: /* @__PURE__ */ Object.create(null)
441
- };
442
- event.context.sessions[sessionName] = session;
443
- const token = getJWSSessionToken(event, config);
444
- if (token) {
445
- const promise = verifyJWSSession(event, config, token).catch(async (error_) => {
446
- if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
447
- await config.hooks?.onExpire?.({
448
- event,
449
- error: error_,
450
- config
451
- });
452
- return void 0;
453
- }
454
- await config.hooks?.onError?.({
455
- event,
456
- error: error_,
457
- config
458
- });
459
- return void 0;
460
- }).then((unsealed) => {
461
- if (unsealed) {
462
- Object.assign(session, unsealed);
463
- }
464
- delete event.context.sessions[sessionName][kGetSessionPromise];
465
- return session;
466
- });
467
- session[kGetSessionPromise] = promise;
468
- await promise;
469
- }
470
- if (!session.id) {
471
- if (!isEvent(event)) {
472
- throw new Error(
473
- "Cannot initialize a new session outside main handler. Use `useJWSSession(event)` properly."
474
- );
475
- }
476
- await updateJWSSession(event, config);
477
- }
478
- await config.hooks?.onRead?.({
479
- event,
480
- session,
481
- config
482
- });
483
- return session;
484
- }
485
- function getJWSSessionToken(event, config) {
486
- const sessionName = config.name || DEFAULT_NAME;
487
- let token;
488
- if (config.sessionHeader !== false) {
489
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
490
- const headerValue = _getReqHeader(event, headerName);
491
- if (typeof headerValue === "string") {
492
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
493
- }
494
- }
495
- if (config.cookie !== false) {
496
- const setCookie2 = _getResHeader(event, "set-cookie");
497
- if (typeof setCookie2 === "string") {
498
- token = findSetCookie(setCookie2, sessionName);
499
- } else if (Array.isArray(setCookie2)) {
500
- for (const sc of setCookie2) {
501
- token = findSetCookie(sc, sessionName);
502
- if (token) {
503
- break;
504
- }
505
- }
506
- }
507
- }
508
- if (!token) {
509
- const cookieHeader = _getReqHeader(event, "cookie");
510
- if (cookieHeader) {
511
- token = parse(String(cookieHeader))[sessionName];
512
- }
513
- }
514
- return token;
515
- }
516
- function _getReqHeader(event, name) {
517
- if (event.node) {
518
- return event.node.req.headers[name];
519
- }
520
- if (event.request) {
521
- return event.request.headers.get(name);
522
- }
523
- if (event.headers) {
524
- return event.headers.get(name);
525
- }
526
- }
527
- function _getResHeader(event, name) {
528
- if (event.node) {
529
- return event.node?.res.getHeader(name);
530
- }
531
- if (event.response) {
532
- return event.response.headers?.get(name);
533
- }
534
- }
535
- async function updateJWSSession(event, config, update) {
536
- const sessionName = config.name || DEFAULT_NAME;
537
- const session = event.context.sessions?.[sessionName] || await getJWSSession(event, config);
538
- if (typeof update === "function") {
539
- update = update(session.data);
540
- }
541
- if (update) {
542
- const oldSession = { ...session, data: { ...session.data } };
543
- Object.assign(session.data, update);
544
- await config.hooks?.onUpdate?.({
545
- session,
546
- oldSession,
547
- event,
548
- config
549
- });
550
- }
551
- const now = config.jws?.signOptions?.currentDate?.getTime() ?? Date.now();
552
- const createdAt = now - now % 1e3;
553
- Object.assign(session, {
554
- id: config.generateId?.() || crypto.randomUUID(),
555
- createdAt,
556
- expiresAt: config.maxAge === void 0 ? void 0 : createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
557
- });
558
- if (config.cookie !== false) {
559
- const token = await signJWSSession(event, config);
560
- setCookie(event, sessionName, token, {
561
- ...DEFAULT_COOKIE,
562
- ...config.cookie,
563
- expires: config.maxAge === void 0 ? void 0 : new Date(
564
- session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
565
- )
566
- });
567
- }
568
- return session;
569
- }
570
- async function signJWSSession(event, config) {
571
- const key = getSignKey(config.key);
572
- const sessionName = config.name || DEFAULT_NAME;
573
- const session = event.context.sessions?.[sessionName] || await getJWSSession(event, config);
574
- const iat = Math.floor(session.createdAt / 1e3);
575
- const exp = session.expiresAt ? Math.floor(session.expiresAt / 1e3) : void 0;
576
- const payload = {
577
- ...session.data,
578
- jti: session.id,
579
- iat
580
- };
581
- if (exp) {
582
- payload.exp = exp;
583
- }
584
- let typ = void 0;
585
- if (config.jws?.signOptions?.protectedHeader?.typ && typeof config.jws.signOptions.protectedHeader.typ === "string" && config.jws.signOptions.protectedHeader.typ.toLowerCase().includes("jwt")) {
586
- typ = config.jws.signOptions.protectedHeader.typ;
587
- }
588
- const token = await sign(payload, key, {
589
- ...config.jws?.signOptions,
590
- expiresIn: void 0,
591
- // controlled via 'exp' claim
592
- protectedHeader: {
593
- ...config.jws?.signOptions?.protectedHeader,
594
- kid: key.kid,
595
- typ: typ || "JWT",
596
- cty: "application/json"
597
- }
598
- });
599
- return token;
600
- }
601
- async function verifyJWSSession(event, config, token) {
602
- const alg = config.jws?.signOptions?.alg;
603
- const jwk = config.hooks?.onVerifyKeyLookup ? (header) => config.hooks.onVerifyKeyLookup({
604
- header,
605
- event,
606
- config
607
- }) : getVerifyKey(config.key);
608
- let typ = void 0;
609
- if (config.jws?.signOptions?.protectedHeader?.typ && typeof config.jws.signOptions.protectedHeader.typ === "string" && config.jws.signOptions.protectedHeader.typ.toLowerCase().includes("jwt")) {
610
- typ = config.jws.signOptions.protectedHeader.typ;
611
- }
612
- const { payload } = await verify(token, jwk, {
613
- ...config.jws?.verifyOptions,
614
- requiredClaims: [
615
- .../* @__PURE__ */ new Set([
616
- ...config.jws?.verifyOptions?.requiredClaims || [],
617
- "jti",
618
- "iat"
619
- ])
620
- ],
621
- typ: typ || "JWT",
622
- algorithms: alg ? [alg] : void 0,
623
- forceUint8Array: false,
624
- validateJWT: true
625
- }).catch((error_) => {
626
- const message = error_ instanceof Error ? error_.message : String(error_);
627
- throw new Error(`Invalid session token: ${message}`);
628
- });
629
- const { jti, iat, exp, ...data } = payload;
630
- return {
631
- id: jti,
632
- createdAt: iat * 1e3,
633
- // Convert back to ms
634
- expiresAt: exp ? exp * 1e3 : void 0,
635
- data: data && typeof data === "object" ? data : /* @__PURE__ */ Object.create(null)
636
- };
637
- }
638
- async function clearJWSSession(event, config) {
639
- const sessionName = config.name || DEFAULT_NAME;
640
- let session = event.context.sessions?.[sessionName];
641
- if (session && session[kGetSessionPromise]) {
642
- session = await session[kGetSessionPromise];
643
- }
644
- if (event.context.sessions?.[sessionName]) {
645
- delete event.context.sessions[sessionName];
646
- }
647
- setCookie(event, sessionName, "", {
648
- ...DEFAULT_COOKIE,
649
- ...config.cookie,
650
- expires: /* @__PURE__ */ new Date(0),
651
- maxAge: void 0
652
- });
653
- await config.hooks?.onClear?.({
654
- session,
655
- event,
656
- config
657
- });
658
- }
659
- function getSignKey(key) {
660
- if (!key) {
661
- throw new Error("Session: JWS key is required.");
662
- }
663
- let _key = void 0;
664
- if (isSymmetricJWK(key)) {
665
- _key = key;
666
- } else if ("privateKey" in key && isPrivateJWK(key.privateKey)) {
667
- _key = key.privateKey;
668
- }
669
- if (!_key) {
670
- throw new Error(
671
- "Session: Invalid JWS key. It must be a symmetric JWK or a private JWK.",
672
- { cause: key }
673
- );
674
- }
675
- return _key;
676
- }
677
- function getVerifyKey(key) {
678
- if (!key) {
679
- throw new Error("Session: JWS key is required.");
680
- }
681
- let _key = void 0;
682
- if (isSymmetricJWK(key)) {
683
- _key = key;
684
- } else if ("publicKey" in key && isPublicJWK(key.publicKey)) {
685
- _key = key.publicKey;
686
- } else if ("publicKey" in key && Array.isArray(key.publicKey)) {
687
- const keys = key.publicKey.filter((k) => isPublicJWK(k));
688
- if (keys && keys.length > 0) {
689
- _key = { keys };
690
- }
691
- }
692
- if (!_key) {
693
- throw new Error(
694
- "Session: Invalid JWS key. It must be a symmetric JWK or a public JWK/set.",
695
- { cause: key }
696
- );
697
- }
698
- return _key;
699
- }
700
- function findSetCookie(setCookie2, name) {
701
- const regex = new RegExp(`(?:^|,\\s*)${name}=([^;]+)`);
702
- const match = setCookie2.match(regex);
703
- return match ? match[1] : void 0;
704
- }
705
-
706
- export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
1
+ import { a as deriveJWKFromPassword, c as importJWKFromPEM, o as exportJWKToPEM, s as generateJWK } from "../_chunks/jws.mjs";
2
+ import { a as useJWSSession, c as getJWESession, d as unsealJWESession, f as updateJWESession, i as updateJWSSession, l as getJWESessionToken, n as getJWSSession, o as verifyJWSSession, p as useJWESession, r as signJWSSession, s as clearJWESession, t as clearJWSSession, u as sealJWESession } from "../_chunks/h3v1.mjs";
3
+ export { clearJWESession, clearJWSSession, deriveJWKFromPassword, exportJWKToPEM, generateJWK, getJWESession, getJWESessionToken, getJWSSession, importJWKFromPEM, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };