unjwt 0.5.28 → 0.5.30

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.
@@ -1,6 +1,6 @@
1
1
  import { b as JWEEncryptOptions } from '../shared/unjwt.9mL1vSFP.mjs';
2
2
  export { d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.9mL1vSFP.mjs';
3
- import { X as JWTClaims, r as JWK_Symmetric, u as JWK_Private, t as JWK_Public, Z as JWTClaimValidationOptions, w as JWKSet } from '../shared/unjwt.CtHrClHc.mjs';
3
+ import { X as JWTClaims, E as ExpiresIn, r as JWK_Symmetric, u as JWK_Private, t as JWK_Public, Z as JWTClaimValidationOptions, w as JWKSet } from '../shared/unjwt.CtHrClHc.mjs';
4
4
  export { C as CompositeKey, f as ContentEncryptionAlgorithm, D as DeriveKeyOptions, e as DeriveKeyReturn, c as GenerateJWKOptions, d as GenerateJWKReturn, G as GenerateKeyAlgorithm, a as GenerateKeyOptions, b as GenerateKeyReturn, v as JWK, S as JWKAlgorithm, T as JWKPEMAlgorithm, J as JWKParameters, I as JWK_AES_CBC_HMAC, L as JWK_AES_GCM, H as JWK_AES_GCM_KW, F as JWK_AES_KW, s as JWK_Asymmetric, R as JWK_Asymmetric_Algorithm, j as JWK_EC, O as JWK_ECDH_ES, A as JWK_ECDSA, i as JWK_EC_Private, h as JWK_EC_Public, x as JWK_HMAC, p as JWK_OKP, o as JWK_OKP_Private, n as JWK_OKP_Public, P as JWK_OKP_SIGN, N as JWK_PBES2, m as JWK_RSA, B as JWK_RSA_ENC, z as JWK_RSA_PSS, l as JWK_RSA_Private, k as JWK_RSA_Public, y as JWK_RSA_SIGN, Q as JWK_Symmetric_Algorithm, q as JWK_oct, Y as JWT, V as JoseHeaderParameters, K as KeyManagementAlgorithm, U as UnwrapKeyOptions, W as WrapKeyOptions, g as WrapKeyResult } from '../shared/unjwt.CtHrClHc.mjs';
5
5
  import { CookieSerializeOptions } from 'cookie-es';
6
6
  import { H3Event } from 'h3';
@@ -9,13 +9,12 @@ export { d as deriveJWKFromPassword, e as exportJWKToPEM, g as generateJWK, i as
9
9
 
10
10
  type SessionData<T extends JWTClaims = JWTClaims> = Omit<T, "jti" | "iat" | "exp">;
11
11
  type SessionUpdate<T extends JWTClaims = JWTClaims> = Partial<SessionData<T>> | ((oldData: SessionData<T>) => Partial<SessionData<T>> | undefined);
12
- interface SessionManager<T extends JWTClaims = JWTClaims, ConfigMaxAge extends number | undefined = number | undefined> {
12
+ interface SessionManager<T extends JWTClaims = JWTClaims, ConfigMaxAge extends ExpiresIn | undefined = number | undefined> {
13
13
  readonly id: string | undefined;
14
14
  readonly createdAt: number;
15
- readonly expiresAt: T extends {
16
- exp: number;
17
- } ? number : ConfigMaxAge;
15
+ readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : T["exp"];
18
16
  readonly data: SessionData<T>;
17
+ readonly token: string | undefined;
19
18
  update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
20
19
  clear: () => Promise<SessionManager<T>>;
21
20
  }
@@ -27,14 +26,14 @@ interface SessionManager<T extends JWTClaims = JWTClaims, ConfigMaxAge extends n
27
26
  */
28
27
 
29
28
  declare const kGetSessionPromise$1: unique symbol;
30
- interface SessionJWE<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
29
+ interface SessionJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
31
30
  id: string;
32
31
  createdAt: number;
33
- expiresAt: MaxAge extends number ? number : T["exp"];
32
+ expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
34
33
  data: SessionData<T>;
35
34
  [kGetSessionPromise$1]?: Promise<SessionJWE<T, MaxAge>>;
36
35
  }
37
- interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
36
+ interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
38
37
  onRead?: (args: {
39
38
  session: SessionJWE<T, MaxAge>;
40
39
  event: H3Event;
@@ -60,7 +59,7 @@ interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends number
60
59
  config: SessionConfigJWE<T, MaxAge>;
61
60
  }) => void | Promise<void>;
62
61
  }
63
- interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
62
+ interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
64
63
  /** @deprecated use `key` instead */
65
64
  secret?: string | JWK_Symmetric | {
66
65
  privateKey: JWK_Private | JWK_Symmetric;
@@ -104,15 +103,16 @@ type CompatEvent$1 = {
104
103
  /**
105
104
  * Create a session manager for the current request.
106
105
  */
107
- declare function useJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
106
+ declare function useJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
108
107
  /**
109
108
  * Get (and lazily initialize) the session for the current request.
110
109
  */
111
- declare function getJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
110
+ declare function getJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
111
+ declare function getJWESessionToken<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): string | undefined;
112
112
  /**
113
113
  * Update the session (optionally mutating the session data) and re-issue the JWE token.
114
114
  */
115
- declare function updateJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event, config: SessionConfigJWE<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWE<T, MaxAge>>;
115
+ declare function updateJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: SessionConfigJWE<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWE<T, MaxAge>>;
116
116
  /**
117
117
  * Produce a JWE for the current session.
118
118
  * Payload structure:
@@ -123,15 +123,15 @@ declare function updateJWESession<T extends JWTClaims = JWTClaims, MaxAge extend
123
123
  * data: Record<string, any>;
124
124
  * }
125
125
  */
126
- declare function sealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
126
+ declare function sealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
127
127
  /**
128
128
  * Decrypt the JWE and return a Session-compatible object.
129
129
  */
130
- declare function unsealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(_event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>, sealed: string): Promise<Partial<SessionJWE<T, MaxAge>>>;
130
+ declare function unsealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>, sealed: string): Promise<Partial<SessionJWE<T, MaxAge>>>;
131
131
  /**
132
132
  * Clear the session (delete from context and drop cookie).
133
133
  */
134
- declare function clearJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
134
+ declare function clearJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
135
135
 
136
136
  /**
137
137
  * This is a fork of h3 library's session utility functions.
@@ -140,14 +140,14 @@ declare function clearJWESession<T extends JWTClaims = JWTClaims, MaxAge extends
140
140
  */
141
141
 
142
142
  declare const kGetSessionPromise: unique symbol;
143
- interface SessionJWS<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
143
+ interface SessionJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
144
144
  id: string;
145
145
  createdAt: number;
146
- expiresAt: MaxAge extends number ? number : T["exp"];
146
+ expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
147
147
  data: SessionData<T>;
148
148
  [kGetSessionPromise]?: Promise<SessionJWS<T, MaxAge>>;
149
149
  }
150
- interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
150
+ interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
151
151
  onRead?: (args: {
152
152
  session: SessionJWS<T, MaxAge>;
153
153
  event: H3Event;
@@ -173,7 +173,7 @@ interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends number
173
173
  config: SessionConfigJWS<T, MaxAge>;
174
174
  }) => void | Promise<void>;
175
175
  }
176
- interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
176
+ interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
177
177
  /**
178
178
  * JWK (private for signing with RS/ES/PS, or symmetric oct) used for signing.
179
179
  */
@@ -215,21 +215,21 @@ type CompatEvent = {
215
215
  * Create a session manager for the current request using JWS (signed only, not encrypted).
216
216
  * NOTE: Contents are visible to clients (Base64URL-decoded JSON). Do not store secrets in session data.
217
217
  */
218
- declare function useJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
218
+ declare function useJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
219
219
  /**
220
220
  * Retrieve (and lazily initialize) the session.
221
221
  */
222
- declare function getJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
222
+ declare function getJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
223
223
  /**
224
224
  * Update session data (if provided) and reissue JWS.
225
225
  */
226
- declare function updateJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event, config: SessionConfigJWS<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWS<T, MaxAge>>;
226
+ declare function updateJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: SessionConfigJWS<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWS<T, MaxAge>>;
227
227
  /**
228
228
  * Sign current session as a compact JWS.
229
229
  * Payload claims:
230
230
  * jti, iat, exp?, data, plus optional extraClaims (cannot override reserved)
231
231
  */
232
- declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
232
+ declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
233
233
  /**
234
234
  * Verify and parse a compact JWS into a Session structure.
235
235
  * Performs:
@@ -238,11 +238,11 @@ declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends
238
238
  * - ensures jti & iat presence
239
239
  * - enforces maxAge if provided
240
240
  */
241
- declare function verifyJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(_event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>, token: string): Promise<Partial<SessionJWS<T, MaxAge>>>;
241
+ declare function verifyJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>, token: string): Promise<Partial<SessionJWS<T, MaxAge>>>;
242
242
  /**
243
243
  * Destroy the session (context + cookie).
244
244
  */
245
- declare function clearJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: H3Event, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
245
+ declare function clearJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
246
246
 
247
- export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
247
+ export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
248
248
  export type { SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWEConfig, SessionJWS, SessionJWSConfig, SessionManager, SessionUpdate };
@@ -1,9 +1,9 @@
1
- export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.epPK1KFr.mjs';
1
+ export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.DyouTtLD.mjs';
2
2
  import { isEvent, setCookie } from 'h3';
3
3
  import { parse } from 'cookie-es';
4
- import { e as encrypt, d as decrypt } from '../shared/unjwt.CiBEuvtQ.mjs';
5
- import { p as isSymmetricJWK, q as isPrivateJWK, u as isPublicJWK } from '../shared/unjwt.C86hA0o-.mjs';
6
- import { s as sign, v as verify } from '../shared/unjwt.D-FATaw1.mjs';
4
+ import { e as encrypt, d as decrypt } from '../shared/unjwt.KqQq9jpF.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.DQVUT7FU.mjs';
7
7
 
8
8
  /**
9
9
  * This is a fork of h3 library's session utility functions.
@@ -33,6 +33,9 @@ async function useJWESession(event, config) {
33
33
  get data() {
34
34
  return event.context.sessions?.[sessionName]?.data || {};
35
35
  },
36
+ get token() {
37
+ return getJWESessionToken(event, config);
38
+ },
36
39
  update: async (update) => {
37
40
  if (!isEvent(event)) {
38
41
  throw new Error("[h3] Cannot update read-only session.");
@@ -84,20 +87,7 @@ async function getJWESession(event, config) {
84
87
  data: /* @__PURE__ */ Object.create(null)
85
88
  };
86
89
  event.context.sessions[sessionName] = session;
87
- let token;
88
- if (config.sessionHeader !== false) {
89
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
90
- const headerValue = _getReqHeader$1(event, headerName);
91
- if (typeof headerValue === "string") {
92
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
93
- }
94
- }
95
- if (!token) {
96
- const cookieHeader = _getReqHeader$1(event, "cookie");
97
- if (cookieHeader) {
98
- token = parse(String(cookieHeader))[sessionName];
99
- }
100
- }
90
+ const token = getJWESessionToken(event, config);
101
91
  if (token) {
102
92
  const promise = unsealJWESession(event, config, token).catch(async (error_) => {
103
93
  if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
@@ -132,7 +122,7 @@ async function getJWESession(event, config) {
132
122
  }
133
123
  session.id = config.generateId?.() ?? crypto.randomUUID();
134
124
  session.createdAt = config.jwe?.encryptOptions?.currentDate?.getTime() ?? Date.now();
135
- session.expiresAt = config.maxAge ? session.createdAt + config.maxAge * 1e3 : void 0;
125
+ session.expiresAt = config.maxAge === void 0 ? void 0 : session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3;
136
126
  await updateJWESession(event, config);
137
127
  }
138
128
  await config.hooks?.onRead?.({
@@ -142,6 +132,24 @@ async function getJWESession(event, config) {
142
132
  });
143
133
  return session;
144
134
  }
135
+ function getJWESessionToken(event, config) {
136
+ const sessionName = config.name || DEFAULT_NAME$1;
137
+ let token;
138
+ if (config.sessionHeader !== false) {
139
+ const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
140
+ const headerValue = _getReqHeader$1(event, headerName);
141
+ if (typeof headerValue === "string") {
142
+ token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
143
+ }
144
+ }
145
+ if (!token) {
146
+ const cookieHeader = _getReqHeader$1(event, "cookie");
147
+ if (cookieHeader) {
148
+ token = parse(String(cookieHeader))[sessionName];
149
+ }
150
+ }
151
+ return token;
152
+ }
145
153
  function _getReqHeader$1(event, name) {
146
154
  if (event.node) {
147
155
  return event.node?.req.headers[name];
@@ -172,10 +180,10 @@ async function updateJWESession(event, config, update) {
172
180
  setCookie(event, sessionName, sealed, {
173
181
  ...DEFAULT_COOKIE$1,
174
182
  ...config.cookie,
175
- expires: config.maxAge ? new Date(
183
+ expires: config.maxAge === void 0 ? void 0 : new Date(
176
184
  // createdAt is ms, maxAge is seconds
177
- session.createdAt + config.maxAge * 1e3
178
- ) : void 0
185
+ session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
186
+ )
179
187
  });
180
188
  }
181
189
  return session;
@@ -185,7 +193,7 @@ async function sealJWESession(event, config) {
185
193
  const sessionName = config.name || DEFAULT_NAME$1;
186
194
  const session = event.context.sessions?.[sessionName] || await getJWESession(event, config);
187
195
  const iatSeconds = Math.floor(session.createdAt / 1e3);
188
- const expSeconds = config.maxAge == null ? void 0 : iatSeconds + config.maxAge;
196
+ const expSeconds = config.maxAge === void 0 ? void 0 : iatSeconds + computeExpiresInSeconds(config.maxAge);
189
197
  const payload = {
190
198
  ...session.data,
191
199
  jti: session.id,
@@ -337,6 +345,9 @@ async function useJWSSession(event, config) {
337
345
  get data() {
338
346
  return event.context.sessions?.[sessionName]?.data || {};
339
347
  },
348
+ get token() {
349
+ return getJWSSessionToken(event, config);
350
+ },
340
351
  update: async (update) => {
341
352
  if (!isEvent(event)) {
342
353
  throw new Error("[h3] Cannot update read-only session.");
@@ -388,20 +399,7 @@ async function getJWSSession(event, config) {
388
399
  data: /* @__PURE__ */ Object.create(null)
389
400
  };
390
401
  event.context.sessions[sessionName] = session;
391
- let token;
392
- if (config.sessionHeader !== false) {
393
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
394
- const headerValue = _getReqHeader(event, headerName);
395
- if (typeof headerValue === "string") {
396
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
397
- }
398
- }
399
- if (!token) {
400
- const cookieHeader = _getReqHeader(event, "cookie");
401
- if (cookieHeader) {
402
- token = parse(String(cookieHeader))[sessionName];
403
- }
404
- }
402
+ const token = getJWSSessionToken(event, config);
405
403
  if (token) {
406
404
  const promise = verifyJWSSession(event, config, token).catch(async (error_) => {
407
405
  if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
@@ -436,7 +434,7 @@ async function getJWSSession(event, config) {
436
434
  }
437
435
  session.id = config.generateId?.() ?? crypto.randomUUID();
438
436
  session.createdAt = config.jws?.signOptions?.currentDate?.getTime() ?? Date.now();
439
- session.expiresAt = config.maxAge ? session.createdAt + config.maxAge * 1e3 : void 0;
437
+ session.expiresAt = config.maxAge === void 0 ? void 0 : session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3;
440
438
  await updateJWSSession(event, config);
441
439
  }
442
440
  await config.hooks?.onRead?.({
@@ -446,6 +444,24 @@ async function getJWSSession(event, config) {
446
444
  });
447
445
  return session;
448
446
  }
447
+ function getJWSSessionToken(event, config) {
448
+ const sessionName = config.name || DEFAULT_NAME;
449
+ let token;
450
+ if (config.sessionHeader !== false) {
451
+ const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
452
+ const headerValue = _getReqHeader(event, headerName);
453
+ if (typeof headerValue === "string") {
454
+ token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
455
+ }
456
+ }
457
+ if (!token) {
458
+ const cookieHeader = _getReqHeader(event, "cookie");
459
+ if (cookieHeader) {
460
+ token = parse(String(cookieHeader))[sessionName];
461
+ }
462
+ }
463
+ return token;
464
+ }
449
465
  function _getReqHeader(event, name) {
450
466
  if (event.node) {
451
467
  return event.node.req.headers[name];
@@ -476,7 +492,9 @@ async function updateJWSSession(event, config, update) {
476
492
  setCookie(event, sessionName, token, {
477
493
  ...DEFAULT_COOKIE,
478
494
  ...config.cookie,
479
- expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) : void 0
495
+ expires: config.maxAge === void 0 ? void 0 : new Date(
496
+ session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
497
+ )
480
498
  });
481
499
  }
482
500
  return session;
@@ -486,7 +504,7 @@ async function signJWSSession(event, config) {
486
504
  const sessionName = config.name || DEFAULT_NAME;
487
505
  const session = event.context.sessions?.[sessionName] || await getJWSSession(event, config);
488
506
  const iatSeconds = Math.floor(session.createdAt / 1e3);
489
- const expSeconds = config.maxAge == null ? void 0 : iatSeconds + config.maxAge;
507
+ const expSeconds = config.maxAge === void 0 ? void 0 : iatSeconds + computeExpiresInSeconds(config.maxAge);
490
508
  const payload = {
491
509
  ...session.data,
492
510
  jti: session.id,
@@ -603,4 +621,4 @@ function getVerifyKey(key) {
603
621
  return _key;
604
622
  }
605
623
 
606
- export { clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
624
+ export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
@@ -1,6 +1,6 @@
1
1
  export { d as JWEDecryptOptions, e as JWEDecryptResult, b as JWEEncryptOptions, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.9mL1vSFP.mjs';
2
2
  export { C as CompositeKey, f as ContentEncryptionAlgorithm, D as DeriveKeyOptions, e as DeriveKeyReturn, c as GenerateJWKOptions, d as GenerateJWKReturn, G as GenerateKeyAlgorithm, a as GenerateKeyOptions, b as GenerateKeyReturn, v as JWK, S as JWKAlgorithm, T as JWKPEMAlgorithm, J as JWKParameters, w as JWKSet, I as JWK_AES_CBC_HMAC, L as JWK_AES_GCM, H as JWK_AES_GCM_KW, F as JWK_AES_KW, s as JWK_Asymmetric, R as JWK_Asymmetric_Algorithm, j as JWK_EC, O as JWK_ECDH_ES, A as JWK_ECDSA, i as JWK_EC_Private, h as JWK_EC_Public, x as JWK_HMAC, p as JWK_OKP, o as JWK_OKP_Private, n as JWK_OKP_Public, P as JWK_OKP_SIGN, N as JWK_PBES2, u as JWK_Private, t as JWK_Public, m as JWK_RSA, B as JWK_RSA_ENC, z as JWK_RSA_PSS, l as JWK_RSA_Private, k as JWK_RSA_Public, y as JWK_RSA_SIGN, r as JWK_Symmetric, Q as JWK_Symmetric_Algorithm, q as JWK_oct, Y as JWT, Z as JWTClaimValidationOptions, X as JWTClaims, V as JoseHeaderParameters, K as KeyManagementAlgorithm, U as UnwrapKeyOptions, W as WrapKeyOptions, g as WrapKeyResult } from '../shared/unjwt.CtHrClHc.mjs';
3
- export { SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWEConfig, SessionJWS, SessionJWSConfig, SessionManager, SessionUpdate, clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession } from './h3.mjs';
3
+ export { SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWEConfig, SessionJWS, SessionJWSConfig, SessionManager, SessionUpdate, clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession } from './h3.mjs';
4
4
  export { d as deriveJWKFromPassword, e as exportJWKToPEM, g as generateJWK, i as importJWKFromPEM } from '../shared/unjwt.BjP_dGnX.mjs';
5
5
  import 'cookie-es';
6
6
  import 'h3';
@@ -1,7 +1,7 @@
1
- export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.epPK1KFr.mjs';
2
- export { clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession } from './h3.mjs';
3
- import '../shared/unjwt.C86hA0o-.mjs';
1
+ export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.DyouTtLD.mjs';
2
+ export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession } from './h3.mjs';
3
+ import '../shared/unjwt.Be8NxwFK.mjs';
4
4
  import 'h3';
5
5
  import 'cookie-es';
6
- import '../shared/unjwt.CiBEuvtQ.mjs';
7
- import '../shared/unjwt.D-FATaw1.mjs';
6
+ import '../shared/unjwt.KqQq9jpF.mjs';
7
+ import '../shared/unjwt.DQVUT7FU.mjs';
@@ -1,6 +1,6 @@
1
1
  import { b as JWEEncryptOptions } from '../shared/unjwt.9mL1vSFP.mjs';
2
2
  export { d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.9mL1vSFP.mjs';
3
- import { X as JWTClaims, r as JWK_Symmetric, u as JWK_Private, t as JWK_Public, Z as JWTClaimValidationOptions, w as JWKSet } from '../shared/unjwt.CtHrClHc.mjs';
3
+ import { X as JWTClaims, E as ExpiresIn, r as JWK_Symmetric, u as JWK_Private, t as JWK_Public, Z as JWTClaimValidationOptions, w as JWKSet } from '../shared/unjwt.CtHrClHc.mjs';
4
4
  export { C as CompositeKey, f as ContentEncryptionAlgorithm, D as DeriveKeyOptions, e as DeriveKeyReturn, c as GenerateJWKOptions, d as GenerateJWKReturn, G as GenerateKeyAlgorithm, a as GenerateKeyOptions, b as GenerateKeyReturn, v as JWK, S as JWKAlgorithm, T as JWKPEMAlgorithm, J as JWKParameters, I as JWK_AES_CBC_HMAC, L as JWK_AES_GCM, H as JWK_AES_GCM_KW, F as JWK_AES_KW, s as JWK_Asymmetric, R as JWK_Asymmetric_Algorithm, j as JWK_EC, O as JWK_ECDH_ES, A as JWK_ECDSA, i as JWK_EC_Private, h as JWK_EC_Public, x as JWK_HMAC, p as JWK_OKP, o as JWK_OKP_Private, n as JWK_OKP_Public, P as JWK_OKP_SIGN, N as JWK_PBES2, m as JWK_RSA, B as JWK_RSA_ENC, z as JWK_RSA_PSS, l as JWK_RSA_Private, k as JWK_RSA_Public, y as JWK_RSA_SIGN, Q as JWK_Symmetric_Algorithm, q as JWK_oct, Y as JWT, V as JoseHeaderParameters, K as KeyManagementAlgorithm, U as UnwrapKeyOptions, W as WrapKeyOptions, g as WrapKeyResult } from '../shared/unjwt.CtHrClHc.mjs';
5
5
  import { HTTPEvent } from 'h3';
6
6
  import { CookieSerializeOptions } from 'cookie-es';
@@ -9,26 +9,25 @@ export { d as deriveJWKFromPassword, e as exportJWKToPEM, g as generateJWK, i as
9
9
 
10
10
  type SessionData<T extends JWTClaims = JWTClaims> = Omit<T, "jti" | "iat" | "exp">;
11
11
  type SessionUpdate<T extends JWTClaims = JWTClaims> = Partial<SessionData<T>> | ((oldData: SessionData<T>) => Partial<SessionData<T>> | undefined);
12
- interface SessionManager<T extends JWTClaims = JWTClaims, ConfigMaxAge extends number | undefined = number | undefined> {
12
+ interface SessionManager<T extends JWTClaims = JWTClaims, ConfigMaxAge extends ExpiresIn | undefined = number | undefined> {
13
13
  readonly id: string | undefined;
14
14
  readonly createdAt: number;
15
- readonly expiresAt: T extends {
16
- exp: number;
17
- } ? number : ConfigMaxAge;
15
+ readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : T["exp"];
18
16
  readonly data: SessionData<T>;
17
+ readonly token: string | undefined;
19
18
  update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
20
19
  clear: () => Promise<SessionManager<T>>;
21
20
  }
22
21
 
23
22
  declare const kGetSessionPromise$1: unique symbol;
24
- interface SessionJWE<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
23
+ interface SessionJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
25
24
  id: string;
26
25
  createdAt: number;
27
- expiresAt: MaxAge extends number ? number : T["exp"];
26
+ expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
28
27
  data: SessionData<T>;
29
28
  [kGetSessionPromise$1]?: Promise<SessionJWE<T, MaxAge>>;
30
29
  }
31
- interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
30
+ interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
32
31
  onRead?: (args: {
33
32
  session: SessionJWE<T, MaxAge>;
34
33
  event: HTTPEvent;
@@ -54,7 +53,7 @@ interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends number
54
53
  config: SessionConfigJWE<T, MaxAge>;
55
54
  }) => void | Promise<void>;
56
55
  }
57
- interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
56
+ interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
58
57
  /** Shared secret used, string for PBES2 or Json Web Key (JWK) */
59
58
  key: string | JWK_Symmetric | {
60
59
  privateKey: JWK_Private | JWK_Symmetric;
@@ -82,37 +81,38 @@ interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends numbe
82
81
  /**
83
82
  * Create a session manager for the current request.
84
83
  */
85
- declare function useJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
84
+ declare function useJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
86
85
  /**
87
86
  * Get the session for the current request.
88
87
  */
89
- declare function getJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
88
+ declare function getJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
89
+ declare function getJWESessionToken<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): string | undefined;
90
90
  /**
91
91
  * Update the session data for the current request.
92
92
  */
93
- declare function updateJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWE<T, MaxAge>>;
93
+ declare function updateJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWE<T, MaxAge>>;
94
94
  /**
95
95
  * Produce a JWE for the current session.
96
96
  */
97
- declare function sealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
97
+ declare function sealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
98
98
  /**
99
99
  * Decrypt the JWE and return a Session-compatible object.
100
100
  */
101
- declare function unsealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(_event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>, sealed: string): Promise<Partial<SessionJWE<T, MaxAge>>>;
101
+ declare function unsealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>, sealed: string): Promise<Partial<SessionJWE<T, MaxAge>>>;
102
102
  /**
103
103
  * Clear the session (delete from context and drop cookie).
104
104
  */
105
- declare function clearJWESession<T extends JWTClaims, MaxAge extends number | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
105
+ declare function clearJWESession<T extends JWTClaims, MaxAge extends ExpiresIn | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
106
106
 
107
107
  declare const kGetSessionPromise: unique symbol;
108
- interface SessionJWS<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
108
+ interface SessionJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
109
109
  id: string;
110
110
  createdAt: number;
111
- expiresAt: MaxAge extends number ? number : T["exp"];
111
+ expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
112
112
  data: SessionData<T>;
113
113
  [kGetSessionPromise]?: Promise<SessionJWS<T, MaxAge>>;
114
114
  }
115
- interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
115
+ interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
116
116
  onRead?: (args: {
117
117
  session: SessionJWS<T, MaxAge>;
118
118
  event: HTTPEvent;
@@ -138,7 +138,7 @@ interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends number
138
138
  config: SessionConfigJWS<T, MaxAge>;
139
139
  }) => void | Promise<void>;
140
140
  }
141
- interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined> {
141
+ interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
142
142
  key: JWK_Symmetric | {
143
143
  privateKey: JWK_Private;
144
144
  publicKey: JWK_Public | JWK_Public[] | JWKSet;
@@ -156,12 +156,13 @@ interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends numbe
156
156
  };
157
157
  hooks?: SessionHooksJWS<T, MaxAge>;
158
158
  }
159
- declare function useJWSSession<T extends JWTClaims, MaxAge extends number | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
160
- declare function getJWSSession<T extends JWTClaims, MaxAge extends number | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
161
- declare function updateJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWS<T, MaxAge>>;
162
- declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
163
- declare function verifyJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(_event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>, token: string): Promise<Partial<SessionJWS<T, MaxAge>>>;
164
- declare function clearJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends number | undefined = number | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
159
+ declare function useJWSSession<T extends JWTClaims, MaxAge extends ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
160
+ declare function getJWSSession<T extends JWTClaims, MaxAge extends ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
161
+ declare function getJWSSessionToken<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): string | undefined;
162
+ declare function updateJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWS<T, MaxAge>>;
163
+ declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
164
+ declare function verifyJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>, token: string): Promise<Partial<SessionJWS<T, MaxAge>>>;
165
+ declare function clearJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
165
166
 
166
- export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
167
+ export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, getJWSSessionToken, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
167
168
  export type { SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWS, SessionManager, SessionUpdate };
@@ -1,9 +1,9 @@
1
- export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.epPK1KFr.mjs';
1
+ export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.DyouTtLD.mjs';
2
2
  import { getEventContext, getChunkedCookie, setChunkedCookie } from 'h3';
3
3
  import { NullProtoObj } from 'rou3';
4
- import { e as encrypt, d as decrypt } from '../shared/unjwt.CiBEuvtQ.mjs';
5
- import { p as isSymmetricJWK, q as isPrivateJWK, u as isPublicJWK } from '../shared/unjwt.C86hA0o-.mjs';
6
- import { s as sign, v as verify } from '../shared/unjwt.D-FATaw1.mjs';
4
+ import { e as encrypt, d as decrypt } from '../shared/unjwt.KqQq9jpF.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.DQVUT7FU.mjs';
7
7
 
8
8
  const kGetSessionPromise$1 = Symbol("h3_jwe_getSession");
9
9
  const DEFAULT_NAME$1 = "h3-jwe";
@@ -28,6 +28,9 @@ async function useJWESession(event, config) {
28
28
  get data() {
29
29
  return getSessionFromContext$1(event, sessionName)?.data || {};
30
30
  },
31
+ get token() {
32
+ return getJWESessionToken(event, config);
33
+ },
31
34
  update: async (update) => {
32
35
  await updateJWESession(event, config, update);
33
36
  return sessionManager;
@@ -74,17 +77,7 @@ async function getJWESession(event, config) {
74
77
  data: new NullProtoObj()
75
78
  };
76
79
  context.sessions[sessionName] = session;
77
- let token;
78
- if (config.sessionHeader !== false) {
79
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
80
- const headerValue = event.req.headers.get(headerName);
81
- if (typeof headerValue === "string") {
82
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
83
- }
84
- }
85
- if (!token) {
86
- token = getChunkedCookie(event, sessionName);
87
- }
80
+ const token = getJWESessionToken(event, config);
88
81
  if (token) {
89
82
  const promise = unsealJWESession(event, config, token).catch(async (error_) => {
90
83
  if (error_ instanceof Error) {
@@ -117,7 +110,7 @@ async function getJWESession(event, config) {
117
110
  if (!session.id) {
118
111
  session.id = config.generateId?.() ?? crypto.randomUUID();
119
112
  session.createdAt = config.jwe?.encryptOptions?.currentDate?.getTime() ?? Date.now();
120
- session.expiresAt = config.maxAge ? session.createdAt + config.maxAge * 1e3 : void 0;
113
+ session.expiresAt = config.maxAge === void 0 ? void 0 : session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3;
121
114
  await updateJWESession(event, config);
122
115
  }
123
116
  await config.hooks?.onRead?.({
@@ -127,6 +120,21 @@ async function getJWESession(event, config) {
127
120
  });
128
121
  return session;
129
122
  }
123
+ function getJWESessionToken(event, config) {
124
+ const sessionName = config.name || DEFAULT_NAME$1;
125
+ let token;
126
+ if (config.sessionHeader !== false) {
127
+ const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
128
+ const headerValue = event.req.headers.get(headerName);
129
+ if (typeof headerValue === "string") {
130
+ token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
131
+ }
132
+ }
133
+ if (!token) {
134
+ token = getChunkedCookie(event, sessionName);
135
+ }
136
+ return token;
137
+ }
130
138
  async function updateJWESession(event, config, update) {
131
139
  const sessionName = config.name || DEFAULT_NAME$1;
132
140
  const context = getEventContext(event);
@@ -146,7 +154,9 @@ async function updateJWESession(event, config, update) {
146
154
  const sealed = await sealJWESession(event, config);
147
155
  setChunkedCookie(event, sessionName, sealed, {
148
156
  ...DEFAULT_COOKIE$1,
149
- expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) : void 0,
157
+ expires: config.maxAge === void 0 ? void 0 : new Date(
158
+ session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
159
+ ),
150
160
  ...config.cookie
151
161
  });
152
162
  }
@@ -158,7 +168,7 @@ async function sealJWESession(event, config) {
158
168
  const context = getEventContext(event);
159
169
  const session = context.sessions?.[sessionName] || await getJWESession(event, config);
160
170
  const iatSeconds = Math.floor(session.createdAt / 1e3);
161
- const expSeconds = config.maxAge == null ? void 0 : iatSeconds + config.maxAge;
171
+ const expSeconds = config.maxAge === void 0 ? void 0 : iatSeconds + computeExpiresInSeconds(config.maxAge);
162
172
  const payload = {
163
173
  ...session.data,
164
174
  jti: session.id,
@@ -312,6 +322,9 @@ async function useJWSSession(event, config) {
312
322
  get data() {
313
323
  return getSessionFromContext(event, sessionName)?.data || {};
314
324
  },
325
+ get token() {
326
+ return getJWSSessionToken(event, config);
327
+ },
315
328
  update: async (update) => {
316
329
  await updateJWSSession(event, config, update);
317
330
  return sessionManager;
@@ -358,17 +371,7 @@ async function getJWSSession(event, config) {
358
371
  data: new NullProtoObj()
359
372
  };
360
373
  context.sessions[sessionName] = session;
361
- let token;
362
- if (config.sessionHeader !== false) {
363
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
364
- const headerValue = event.req.headers.get(headerName);
365
- if (typeof headerValue === "string") {
366
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
367
- }
368
- }
369
- if (!token) {
370
- token = getChunkedCookie(event, sessionName);
371
- }
374
+ const token = getJWSSessionToken(event, config);
372
375
  if (token) {
373
376
  const promise = verifyJWSSession(event, config, token).catch(async (error_) => {
374
377
  if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
@@ -398,7 +401,7 @@ async function getJWSSession(event, config) {
398
401
  if (!session.id) {
399
402
  session.id = config.generateId?.() ?? crypto.randomUUID();
400
403
  session.createdAt = config.jws?.signOptions?.currentDate?.getTime() ?? Date.now();
401
- session.expiresAt = config.maxAge ? session.createdAt + config.maxAge * 1e3 : void 0;
404
+ session.expiresAt = config.maxAge === void 0 ? void 0 : session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3;
402
405
  await updateJWSSession(event, config);
403
406
  }
404
407
  await config.hooks?.onRead?.({
@@ -408,6 +411,21 @@ async function getJWSSession(event, config) {
408
411
  });
409
412
  return session;
410
413
  }
414
+ function getJWSSessionToken(event, config) {
415
+ const sessionName = config.name || DEFAULT_NAME;
416
+ let token;
417
+ if (config.sessionHeader !== false) {
418
+ const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
419
+ const headerValue = event.req.headers.get(headerName);
420
+ if (typeof headerValue === "string") {
421
+ token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
422
+ }
423
+ }
424
+ if (!token) {
425
+ token = getChunkedCookie(event, sessionName);
426
+ }
427
+ return token;
428
+ }
411
429
  async function updateJWSSession(event, config, update) {
412
430
  const sessionName = config.name || DEFAULT_NAME;
413
431
  const context = getEventContext(event);
@@ -427,7 +445,9 @@ async function updateJWSSession(event, config, update) {
427
445
  const token = await signJWSSession(event, config);
428
446
  setChunkedCookie(event, sessionName, token, {
429
447
  ...DEFAULT_COOKIE,
430
- expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) : void 0,
448
+ expires: config.maxAge === void 0 ? void 0 : new Date(
449
+ session.createdAt + computeExpiresInSeconds(config.maxAge) * 1e3
450
+ ),
431
451
  ...config.cookie
432
452
  });
433
453
  }
@@ -439,7 +459,7 @@ async function signJWSSession(event, config) {
439
459
  const context = getEventContext(event);
440
460
  const session = context.sessions?.[sessionName] || await getJWSSession(event, config);
441
461
  const iatSeconds = Math.floor(session.createdAt / 1e3);
442
- const expSeconds = config.maxAge == null ? void 0 : iatSeconds + config.maxAge;
462
+ const expSeconds = config.maxAge === void 0 ? void 0 : iatSeconds + computeExpiresInSeconds(config.maxAge);
443
463
  const payload = {
444
464
  ...session.data,
445
465
  jti: session.id,
@@ -577,4 +597,4 @@ function getVerifyKey(key) {
577
597
  return _key;
578
598
  }
579
599
 
580
- export { clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
600
+ export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, getJWSSessionToken, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { i as utils } from './shared/unjwt.C86hA0o-.mjs';
2
- export { j as jwe } from './shared/unjwt.CiBEuvtQ.mjs';
3
- export { j as jwk } from './shared/unjwt.epPK1KFr.mjs';
4
- export { j as jws } from './shared/unjwt.D-FATaw1.mjs';
1
+ export { i as utils } from './shared/unjwt.Be8NxwFK.mjs';
2
+ export { j as jwe } from './shared/unjwt.KqQq9jpF.mjs';
3
+ export { j as jwk } from './shared/unjwt.DyouTtLD.mjs';
4
+ export { j as jws } from './shared/unjwt.DQVUT7FU.mjs';
package/dist/jwe.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import './shared/unjwt.epPK1KFr.mjs';
2
- import './shared/unjwt.C86hA0o-.mjs';
3
- export { d as decrypt, e as encrypt } from './shared/unjwt.CiBEuvtQ.mjs';
1
+ import './shared/unjwt.DyouTtLD.mjs';
2
+ import './shared/unjwt.Be8NxwFK.mjs';
3
+ export { d as decrypt, e as encrypt } from './shared/unjwt.KqQq9jpF.mjs';
package/dist/jwk.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import './shared/unjwt.C86hA0o-.mjs';
2
- export { k as deriveJWKFromPassword, m as deriveKeyFromPassword, h as exportJWKToPEM, n as exportKey, c as generateJWK, l as generateKey, b as getJWKFromSet, f as importJWKFromPEM, i as importKey, u as unwrapKey, w as wrapKey } from './shared/unjwt.epPK1KFr.mjs';
1
+ import './shared/unjwt.Be8NxwFK.mjs';
2
+ export { k as deriveJWKFromPassword, m as deriveKeyFromPassword, h as exportJWKToPEM, n as exportKey, c as generateJWK, l as generateKey, b as getJWKFromSet, f as importJWKFromPEM, i as importKey, u as unwrapKey, w as wrapKey } from './shared/unjwt.DyouTtLD.mjs';
package/dist/jws.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import './shared/unjwt.epPK1KFr.mjs';
2
- import './shared/unjwt.C86hA0o-.mjs';
3
- export { s as sign, v as verify } from './shared/unjwt.D-FATaw1.mjs';
1
+ import './shared/unjwt.DyouTtLD.mjs';
2
+ import './shared/unjwt.Be8NxwFK.mjs';
3
+ export { s as sign, v as verify } from './shared/unjwt.DQVUT7FU.mjs';
@@ -435,4 +435,4 @@ const index = {
435
435
  validateJwtClaims: validateJwtClaims
436
436
  };
437
437
 
438
- export { isAsymmetricJWK as A, maybeArray as B, isJWTContent as C, decodeMaybeJWTString as D, computeExpiresInSeconds as E, computeMaxTokenAgeSeconds as F, isJWK as a, applyTypCtyDefaults as b, computeJwtTimeClaims as c, base64UrlEncode as d, base64UrlDecode as e, decodePayloadFromBytes as f, getPlaintextBytes as g, validateJwtClaims as h, index as i, isCryptoKeyPair as j, isCryptoKey as k, textDecoder as l, isJWKSet as m, decodePayloadFromB64UrlSegment as n, validateCriticalHeadersJWS as o, isSymmetricJWK as p, isPrivateJWK as q, randomBytes as r, sanitizeObject as s, textEncoder as t, isPublicJWK as u, validateCriticalHeadersJWE as v, concatUint8Arrays as w, base64Decode as x, base64Encode as y, assertCryptoKey as z };
438
+ export { assertCryptoKey as A, isAsymmetricJWK as B, maybeArray as C, isJWTContent as D, decodeMaybeJWTString as E, computeMaxTokenAgeSeconds as F, isJWK as a, applyTypCtyDefaults as b, computeJwtTimeClaims as c, base64UrlEncode as d, base64UrlDecode as e, decodePayloadFromBytes as f, getPlaintextBytes as g, validateJwtClaims as h, index as i, isCryptoKeyPair as j, isCryptoKey as k, textDecoder as l, isJWKSet as m, decodePayloadFromB64UrlSegment as n, validateCriticalHeadersJWS as o, computeExpiresInSeconds as p, isSymmetricJWK as q, randomBytes as r, sanitizeObject as s, textEncoder as t, isPrivateJWK as u, validateCriticalHeadersJWE as v, isPublicJWK as w, concatUint8Arrays as x, base64Decode as y, base64Encode as z };
@@ -1,5 +1,5 @@
1
- import { i as importKey, s as sign$1, b as getJWKFromSet, v as verify$1 } from './unjwt.epPK1KFr.mjs';
2
- import { s as sanitizeObject, a as isJWK, b as applyTypCtyDefaults, c as computeJwtTimeClaims, d as base64UrlEncode, t as textEncoder, l as textDecoder, e as base64UrlDecode, m as isJWKSet, n as decodePayloadFromB64UrlSegment, o as validateCriticalHeadersJWS, h as validateJwtClaims } from './unjwt.C86hA0o-.mjs';
1
+ import { i as importKey, s as sign$1, b as getJWKFromSet, v as verify$1 } from './unjwt.DyouTtLD.mjs';
2
+ import { s as sanitizeObject, a as isJWK, b as applyTypCtyDefaults, c as computeJwtTimeClaims, d as base64UrlEncode, t as textEncoder, l as textDecoder, e as base64UrlDecode, m as isJWKSet, n as decodePayloadFromB64UrlSegment, o as validateCriticalHeadersJWS, h as validateJwtClaims } from './unjwt.Be8NxwFK.mjs';
3
3
 
4
4
  async function sign(payload, key, options = {}) {
5
5
  const { protectedHeader: additionalProtectedHeader } = options;
@@ -1,4 +1,4 @@
1
- import { k as isCryptoKey, w as concatUint8Arrays, d as base64UrlEncode, x as base64Decode, y as base64Encode, t as textEncoder, s as sanitizeObject, z as assertCryptoKey, a as isJWK, e as base64UrlDecode, A as isAsymmetricJWK, r as randomBytes, m as isJWKSet } from './unjwt.C86hA0o-.mjs';
1
+ import { k as isCryptoKey, x as concatUint8Arrays, d as base64UrlEncode, y as base64Decode, z as base64Encode, t as textEncoder, s as sanitizeObject, A as assertCryptoKey, a as isJWK, e as base64UrlDecode, B as isAsymmetricJWK, r as randomBytes, m as isJWKSet } from './unjwt.Be8NxwFK.mjs';
2
2
 
3
3
  /**
4
4
  * This is a fork of Jose library's utility functions.
@@ -1,5 +1,5 @@
1
- import { i as importKey, e as encryptKey, g as generateIV, a as encrypt$1, u as unwrapKey, d as decrypt$1 } from './unjwt.epPK1KFr.mjs';
2
- import { r as randomBytes, a as isJWK, s as sanitizeObject, b as applyTypCtyDefaults, c as computeJwtTimeClaims, g as getPlaintextBytes, d as base64UrlEncode, t as textEncoder, e as base64UrlDecode, f as decodePayloadFromBytes, v as validateCriticalHeadersJWE, h as validateJwtClaims, j as isCryptoKeyPair, k as isCryptoKey } from './unjwt.C86hA0o-.mjs';
1
+ import { i as importKey, e as encryptKey, g as generateIV, a as encrypt$1, u as unwrapKey, d as decrypt$1 } from './unjwt.DyouTtLD.mjs';
2
+ import { r as randomBytes, a as isJWK, s as sanitizeObject, b as applyTypCtyDefaults, c as computeJwtTimeClaims, g as getPlaintextBytes, d as base64UrlEncode, t as textEncoder, e as base64UrlDecode, f as decodePayloadFromBytes, v as validateCriticalHeadersJWE, h as validateJwtClaims, j as isCryptoKeyPair, k as isCryptoKey } from './unjwt.Be8NxwFK.mjs';
3
3
 
4
4
  async function encrypt(payload, key, options = {}) {
5
5
  const {
package/dist/utils.mjs CHANGED
@@ -1 +1 @@
1
- export { b as applyTypCtyDefaults, z as assertCryptoKey, x as base64Decode, y as base64Encode, e as base64UrlDecode, d as base64UrlEncode, E as computeExpiresInSeconds, c as computeJwtTimeClaims, F as computeMaxTokenAgeSeconds, w as concatUint8Arrays, D as decodeMaybeJWTString, n as decodePayloadFromB64UrlSegment, f as decodePayloadFromBytes, g as getPlaintextBytes, A as isAsymmetricJWK, k as isCryptoKey, j as isCryptoKeyPair, a as isJWK, m as isJWKSet, C as isJWTContent, q as isPrivateJWK, u as isPublicJWK, p as isSymmetricJWK, B as maybeArray, r as randomBytes, s as sanitizeObject, l as textDecoder, t as textEncoder, v as validateCriticalHeadersJWE, o as validateCriticalHeadersJWS, h as validateJwtClaims } from './shared/unjwt.C86hA0o-.mjs';
1
+ export { b as applyTypCtyDefaults, A as assertCryptoKey, y as base64Decode, z as base64Encode, e as base64UrlDecode, d as base64UrlEncode, p as computeExpiresInSeconds, c as computeJwtTimeClaims, F as computeMaxTokenAgeSeconds, x as concatUint8Arrays, E as decodeMaybeJWTString, n as decodePayloadFromB64UrlSegment, f as decodePayloadFromBytes, g as getPlaintextBytes, B as isAsymmetricJWK, k as isCryptoKey, j as isCryptoKeyPair, a as isJWK, m as isJWKSet, D as isJWTContent, u as isPrivateJWK, w as isPublicJWK, q as isSymmetricJWK, C as maybeArray, r as randomBytes, s as sanitizeObject, l as textDecoder, t as textEncoder, v as validateCriticalHeadersJWE, o as validateCriticalHeadersJWS, h as validateJwtClaims } from './shared/unjwt.Be8NxwFK.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unjwt",
3
- "version": "0.5.28",
3
+ "version": "0.5.30",
4
4
  "description": "Low-level JWT utilities",
5
5
  "repository": "sandros94/unjwt",
6
6
  "license": "MIT",