unjwt 0.5.29 → 0.5.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Sandro Circi
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Sandro Circi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,19 +1,23 @@
1
- import { b as JWEEncryptOptions } from '../shared/unjwt.9mL1vSFP.mjs';
2
- export { d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.9mL1vSFP.mjs';
1
+ import { b as JWEEncryptOptions } from '../shared/unjwt.BU3IrsCv.mjs';
2
+ export { d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.BU3IrsCv.mjs';
3
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
+ import { S as StrictOmit } from '../shared/unjwt.JdKqVANs.mjs';
5
6
  import { CookieSerializeOptions } from 'cookie-es';
6
7
  import { H3Event } from 'h3';
7
8
  import { c as JWSSignOptions } from '../shared/unjwt.BsLgL0DQ.mjs';
8
9
  export { d as deriveJWKFromPassword, e as exportJWKToPEM, g as generateJWK, i as importJWKFromPEM } from '../shared/unjwt.BjP_dGnX.mjs';
9
10
 
10
- type SessionData<T extends JWTClaims = JWTClaims> = Omit<T, "jti" | "iat" | "exp">;
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 ExpiresIn | undefined = number | undefined> {
11
+ interface SessionClaims extends Required<Pick<JWTClaims, "jti" | "iat">>, Pick<JWTClaims, "exp"> {
12
+ }
13
+ type SessionData<T extends Record<string, any> = SessionClaims> = StrictOmit<T, "jti" | "iat" | "exp">;
14
+ type SessionUpdate<T extends Record<string, any> = SessionClaims> = Partial<SessionData<T>> | ((oldData: SessionData<T>) => Partial<SessionData<T>> | undefined);
15
+ interface SessionManager<T extends Record<string, any> = SessionClaims, ConfigMaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
13
16
  readonly id: string | undefined;
14
17
  readonly createdAt: number;
15
- readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : T["exp"];
18
+ readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : "exp" extends keyof T ? T["exp"] : number | undefined;
16
19
  readonly data: SessionData<T>;
20
+ readonly token: string | undefined;
17
21
  update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
18
22
  clear: () => Promise<SessionManager<T>>;
19
23
  }
@@ -25,14 +29,14 @@ interface SessionManager<T extends JWTClaims = JWTClaims, ConfigMaxAge extends E
25
29
  */
26
30
 
27
31
  declare const kGetSessionPromise$1: unique symbol;
28
- interface SessionJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
32
+ interface SessionJWE<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
29
33
  id: string;
30
34
  createdAt: number;
31
35
  expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
32
36
  data: SessionData<T>;
33
37
  [kGetSessionPromise$1]?: Promise<SessionJWE<T, MaxAge>>;
34
38
  }
35
- interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
39
+ interface SessionHooksJWE<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
36
40
  onRead?: (args: {
37
41
  session: SessionJWE<T, MaxAge>;
38
42
  event: H3Event;
@@ -58,7 +62,7 @@ interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends Expire
58
62
  config: SessionConfigJWE<T, MaxAge>;
59
63
  }) => void | Promise<void>;
60
64
  }
61
- interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
65
+ interface SessionConfigJWE<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
62
66
  /** @deprecated use `key` instead */
63
67
  secret?: string | JWK_Symmetric | {
64
68
  privateKey: JWK_Private | JWK_Symmetric;
@@ -102,15 +106,16 @@ type CompatEvent$1 = {
102
106
  /**
103
107
  * Create a session manager for the current request.
104
108
  */
105
- 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>>;
109
+ declare function useJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
106
110
  /**
107
111
  * Get (and lazily initialize) the session for the current request.
108
112
  */
109
- 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>>;
113
+ declare function getJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
114
+ declare function getJWESessionToken<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): string | undefined;
110
115
  /**
111
116
  * Update the session (optionally mutating the session data) and re-issue the JWE token.
112
117
  */
113
- 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>>;
118
+ declare function updateJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: SessionConfigJWE<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWE<T, MaxAge>>;
114
119
  /**
115
120
  * Produce a JWE for the current session.
116
121
  * Payload structure:
@@ -121,15 +126,15 @@ declare function updateJWESession<T extends JWTClaims = JWTClaims, MaxAge extend
121
126
  * data: Record<string, any>;
122
127
  * }
123
128
  */
124
- declare function sealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
129
+ declare function sealJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
125
130
  /**
126
131
  * Decrypt the JWE and return a Session-compatible object.
127
132
  */
128
- 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>>>;
133
+ declare function unsealJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: H3Event | CompatEvent$1, config: SessionConfigJWE<T, MaxAge>, sealed: string): Promise<Partial<SessionJWE<T, MaxAge>>>;
129
134
  /**
130
135
  * Clear the session (delete from context and drop cookie).
131
136
  */
132
- declare function clearJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
137
+ declare function clearJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
133
138
 
134
139
  /**
135
140
  * This is a fork of h3 library's session utility functions.
@@ -138,14 +143,14 @@ declare function clearJWESession<T extends JWTClaims = JWTClaims, MaxAge extends
138
143
  */
139
144
 
140
145
  declare const kGetSessionPromise: unique symbol;
141
- interface SessionJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
146
+ interface SessionJWS<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
142
147
  id: string;
143
148
  createdAt: number;
144
149
  expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
145
150
  data: SessionData<T>;
146
151
  [kGetSessionPromise]?: Promise<SessionJWS<T, MaxAge>>;
147
152
  }
148
- interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
153
+ interface SessionHooksJWS<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
149
154
  onRead?: (args: {
150
155
  session: SessionJWS<T, MaxAge>;
151
156
  event: H3Event;
@@ -171,7 +176,7 @@ interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends Expire
171
176
  config: SessionConfigJWS<T, MaxAge>;
172
177
  }) => void | Promise<void>;
173
178
  }
174
- interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
179
+ interface SessionConfigJWS<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
175
180
  /**
176
181
  * JWK (private for signing with RS/ES/PS, or symmetric oct) used for signing.
177
182
  */
@@ -213,21 +218,21 @@ type CompatEvent = {
213
218
  * Create a session manager for the current request using JWS (signed only, not encrypted).
214
219
  * NOTE: Contents are visible to clients (Base64URL-decoded JSON). Do not store secrets in session data.
215
220
  */
216
- declare function useJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
221
+ declare function useJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
217
222
  /**
218
223
  * Retrieve (and lazily initialize) the session.
219
224
  */
220
- declare function getJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
225
+ declare function getJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
221
226
  /**
222
227
  * Update session data (if provided) and reissue JWS.
223
228
  */
224
- 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>>;
229
+ declare function updateJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: SessionConfigJWS<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWS<T, MaxAge>>;
225
230
  /**
226
231
  * Sign current session as a compact JWS.
227
232
  * Payload claims:
228
233
  * jti, iat, exp?, data, plus optional extraClaims (cannot override reserved)
229
234
  */
230
- declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
235
+ declare function signJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
231
236
  /**
232
237
  * Verify and parse a compact JWS into a Session structure.
233
238
  * Performs:
@@ -236,11 +241,11 @@ declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends
236
241
  * - ensures jti & iat presence
237
242
  * - enforces maxAge if provided
238
243
  */
239
- 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>>>;
244
+ declare function verifyJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: H3Event | CompatEvent, config: SessionConfigJWS<T, MaxAge>, token: string): Promise<Partial<SessionJWS<T, MaxAge>>>;
240
245
  /**
241
246
  * Destroy the session (context + cookie).
242
247
  */
243
- declare function clearJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
248
+ declare function clearJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: H3Event, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
244
249
 
245
- export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
246
- export type { SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWEConfig, SessionJWS, SessionJWSConfig, SessionManager, SessionUpdate };
250
+ export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
251
+ export type { SessionClaims, SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWEConfig, SessionJWS, SessionJWSConfig, SessionManager, SessionUpdate };
@@ -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"))) {
@@ -142,6 +132,37 @@ 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
+ if (!token) {
152
+ const setCookie2 = _getResHeader$1(event, "set-cookie");
153
+ if (typeof setCookie2 === "string") {
154
+ token = findSetCookie$1(setCookie2, sessionName);
155
+ } else if (Array.isArray(setCookie2)) {
156
+ for (const sc of setCookie2) {
157
+ token = findSetCookie$1(sc, sessionName);
158
+ if (token) {
159
+ break;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ return token;
165
+ }
145
166
  function _getReqHeader$1(event, name) {
146
167
  if (event.node) {
147
168
  return event.node?.req.headers[name];
@@ -153,6 +174,14 @@ function _getReqHeader$1(event, name) {
153
174
  return event.headers.get(name);
154
175
  }
155
176
  }
177
+ function _getResHeader$1(event, name) {
178
+ if (event.node) {
179
+ return event.node?.res.getHeader(name);
180
+ }
181
+ if (event.response) {
182
+ return event.response.headers?.get(name);
183
+ }
184
+ }
156
185
  async function updateJWESession(event, config, update) {
157
186
  const sessionName = config.name || DEFAULT_NAME$1;
158
187
  const session = event.context.sessions?.[sessionName] || await getJWESession(event, config);
@@ -308,6 +337,11 @@ function getDecryptKey(key) {
308
337
  }
309
338
  return _key;
310
339
  }
340
+ function findSetCookie$1(setCookie2, name) {
341
+ const regex = new RegExp(`(?:^|,\\s*)${name}=([^;]+)`);
342
+ const match = setCookie2.match(regex);
343
+ return match ? match[1] : void 0;
344
+ }
311
345
 
312
346
  /**
313
347
  * This is a fork of h3 library's session utility functions.
@@ -337,6 +371,9 @@ async function useJWSSession(event, config) {
337
371
  get data() {
338
372
  return event.context.sessions?.[sessionName]?.data || {};
339
373
  },
374
+ get token() {
375
+ return getJWSSessionToken(event, config);
376
+ },
340
377
  update: async (update) => {
341
378
  if (!isEvent(event)) {
342
379
  throw new Error("[h3] Cannot update read-only session.");
@@ -388,20 +425,7 @@ async function getJWSSession(event, config) {
388
425
  data: /* @__PURE__ */ Object.create(null)
389
426
  };
390
427
  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
- }
428
+ const token = getJWSSessionToken(event, config);
405
429
  if (token) {
406
430
  const promise = verifyJWSSession(event, config, token).catch(async (error_) => {
407
431
  if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
@@ -446,6 +470,37 @@ async function getJWSSession(event, config) {
446
470
  });
447
471
  return session;
448
472
  }
473
+ function getJWSSessionToken(event, config) {
474
+ const sessionName = config.name || DEFAULT_NAME;
475
+ let token;
476
+ if (config.sessionHeader !== false) {
477
+ const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
478
+ const headerValue = _getReqHeader(event, headerName);
479
+ if (typeof headerValue === "string") {
480
+ token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
481
+ }
482
+ }
483
+ if (!token) {
484
+ const cookieHeader = _getReqHeader(event, "cookie");
485
+ if (cookieHeader) {
486
+ token = parse(String(cookieHeader))[sessionName];
487
+ }
488
+ }
489
+ if (!token) {
490
+ const setCookie2 = _getResHeader(event, "set-cookie");
491
+ if (typeof setCookie2 === "string") {
492
+ token = findSetCookie(setCookie2, sessionName);
493
+ } else if (Array.isArray(setCookie2)) {
494
+ for (const sc of setCookie2) {
495
+ token = findSetCookie(sc, sessionName);
496
+ if (token) {
497
+ break;
498
+ }
499
+ }
500
+ }
501
+ }
502
+ return token;
503
+ }
449
504
  function _getReqHeader(event, name) {
450
505
  if (event.node) {
451
506
  return event.node.req.headers[name];
@@ -457,6 +512,14 @@ function _getReqHeader(event, name) {
457
512
  return event.headers.get(name);
458
513
  }
459
514
  }
515
+ function _getResHeader(event, name) {
516
+ if (event.node) {
517
+ return event.node?.res.getHeader(name);
518
+ }
519
+ if (event.response) {
520
+ return event.response.headers?.get(name);
521
+ }
522
+ }
460
523
  async function updateJWSSession(event, config, update) {
461
524
  const sessionName = config.name || DEFAULT_NAME;
462
525
  const session = event.context.sessions?.[sessionName] || await getJWSSession(event, config);
@@ -604,5 +667,10 @@ function getVerifyKey(key) {
604
667
  }
605
668
  return _key;
606
669
  }
670
+ function findSetCookie(setCookie2, name) {
671
+ const regex = new RegExp(`(?:^|,\\s*)${name}=([^;]+)`);
672
+ const match = setCookie2.match(regex);
673
+ return match ? match[1] : void 0;
674
+ }
607
675
 
608
- export { clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
676
+ export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
@@ -1,7 +1,8 @@
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';
1
+ export { d as JWEDecryptOptions, e as JWEDecryptResult, b as JWEEncryptOptions, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.BU3IrsCv.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 { SessionClaims, 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
+ import '../shared/unjwt.JdKqVANs.mjs';
5
6
  import 'cookie-es';
6
7
  import 'h3';
7
8
  import '../shared/unjwt.BsLgL0DQ.mjs';
@@ -1,5 +1,5 @@
1
1
  export { k as deriveJWKFromPassword, h as exportJWKToPEM, c as generateJWK, f as importJWKFromPEM } from '../shared/unjwt.DyouTtLD.mjs';
2
- export { clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession } from './h3.mjs';
2
+ export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession } from './h3.mjs';
3
3
  import '../shared/unjwt.Be8NxwFK.mjs';
4
4
  import 'h3';
5
5
  import 'cookie-es';
@@ -1,32 +1,36 @@
1
- import { b as JWEEncryptOptions } from '../shared/unjwt.9mL1vSFP.mjs';
2
- export { d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.9mL1vSFP.mjs';
1
+ import { b as JWEEncryptOptions } from '../shared/unjwt.BU3IrsCv.mjs';
2
+ export { d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from '../shared/unjwt.BU3IrsCv.mjs';
3
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
+ import { S as StrictOmit } from '../shared/unjwt.JdKqVANs.mjs';
5
6
  import { HTTPEvent } from 'h3';
6
7
  import { CookieSerializeOptions } from 'cookie-es';
7
8
  import { c as JWSSignOptions } from '../shared/unjwt.BsLgL0DQ.mjs';
8
9
  export { d as deriveJWKFromPassword, e as exportJWKToPEM, g as generateJWK, i as importJWKFromPEM } from '../shared/unjwt.BjP_dGnX.mjs';
9
10
 
10
- type SessionData<T extends JWTClaims = JWTClaims> = Omit<T, "jti" | "iat" | "exp">;
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 ExpiresIn | undefined = number | undefined> {
11
+ interface SessionClaims extends Required<Pick<JWTClaims, "jti" | "iat">>, Pick<JWTClaims, "exp"> {
12
+ }
13
+ type SessionData<T extends Record<string, any> = SessionClaims> = StrictOmit<T, "jti" | "iat" | "exp">;
14
+ type SessionUpdate<T extends Record<string, any> = SessionClaims> = Partial<SessionData<T>> | ((oldData: SessionData<T>) => Partial<SessionData<T>> | undefined);
15
+ interface SessionManager<T extends Record<string, any> = SessionClaims, ConfigMaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
13
16
  readonly id: string | undefined;
14
17
  readonly createdAt: number;
15
- readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : T["exp"];
18
+ readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : "exp" extends keyof T ? T["exp"] : number | undefined;
16
19
  readonly data: SessionData<T>;
20
+ readonly token: string | undefined;
17
21
  update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
18
22
  clear: () => Promise<SessionManager<T>>;
19
23
  }
20
24
 
21
25
  declare const kGetSessionPromise$1: unique symbol;
22
- interface SessionJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
26
+ interface SessionJWE<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
23
27
  id: string;
24
28
  createdAt: number;
25
29
  expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
26
30
  data: SessionData<T>;
27
31
  [kGetSessionPromise$1]?: Promise<SessionJWE<T, MaxAge>>;
28
32
  }
29
- interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
33
+ interface SessionHooksJWE<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
30
34
  onRead?: (args: {
31
35
  session: SessionJWE<T, MaxAge>;
32
36
  event: HTTPEvent;
@@ -52,7 +56,7 @@ interface SessionHooksJWE<T extends JWTClaims = JWTClaims, MaxAge extends Expire
52
56
  config: SessionConfigJWE<T, MaxAge>;
53
57
  }) => void | Promise<void>;
54
58
  }
55
- interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
59
+ interface SessionConfigJWE<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
56
60
  /** Shared secret used, string for PBES2 or Json Web Key (JWK) */
57
61
  key: string | JWK_Symmetric | {
58
62
  privateKey: JWK_Private | JWK_Symmetric;
@@ -80,37 +84,38 @@ interface SessionConfigJWE<T extends JWTClaims = JWTClaims, MaxAge extends Expir
80
84
  /**
81
85
  * Create a session manager for the current request.
82
86
  */
83
- declare function useJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
87
+ declare function useJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
84
88
  /**
85
89
  * Get the session for the current request.
86
90
  */
87
- declare function getJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
91
+ declare function getJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<SessionJWE<T, MaxAge>>;
92
+ declare function getJWESessionToken<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): string | undefined;
88
93
  /**
89
94
  * Update the session data for the current request.
90
95
  */
91
- 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>>;
96
+ declare function updateJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWE<T, MaxAge>>;
92
97
  /**
93
98
  * Produce a JWE for the current session.
94
99
  */
95
- declare function sealJWESession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
100
+ declare function sealJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>): Promise<string>;
96
101
  /**
97
102
  * Decrypt the JWE and return a Session-compatible object.
98
103
  */
99
- 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>>>;
104
+ declare function unsealJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: HTTPEvent, config: SessionConfigJWE<T, MaxAge>, sealed: string): Promise<Partial<SessionJWE<T, MaxAge>>>;
100
105
  /**
101
106
  * Clear the session (delete from context and drop cookie).
102
107
  */
103
- declare function clearJWESession<T extends JWTClaims, MaxAge extends ExpiresIn | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
108
+ declare function clearJWESession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWE<T, MaxAge>>): Promise<void>;
104
109
 
105
110
  declare const kGetSessionPromise: unique symbol;
106
- interface SessionJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
111
+ interface SessionJWS<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
107
112
  id: string;
108
113
  createdAt: number;
109
114
  expiresAt: MaxAge extends ExpiresIn ? number : T["exp"];
110
115
  data: SessionData<T>;
111
116
  [kGetSessionPromise]?: Promise<SessionJWS<T, MaxAge>>;
112
117
  }
113
- interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
118
+ interface SessionHooksJWS<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
114
119
  onRead?: (args: {
115
120
  session: SessionJWS<T, MaxAge>;
116
121
  event: HTTPEvent;
@@ -136,7 +141,7 @@ interface SessionHooksJWS<T extends JWTClaims = JWTClaims, MaxAge extends Expire
136
141
  config: SessionConfigJWS<T, MaxAge>;
137
142
  }) => void | Promise<void>;
138
143
  }
139
- interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
144
+ interface SessionConfigJWS<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined> {
140
145
  key: JWK_Symmetric | {
141
146
  privateKey: JWK_Private;
142
147
  publicKey: JWK_Public | JWK_Public[] | JWKSet;
@@ -154,12 +159,13 @@ interface SessionConfigJWS<T extends JWTClaims = JWTClaims, MaxAge extends Expir
154
159
  };
155
160
  hooks?: SessionHooksJWS<T, MaxAge>;
156
161
  }
157
- declare function useJWSSession<T extends JWTClaims, MaxAge extends ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
158
- declare function getJWSSession<T extends JWTClaims, MaxAge extends ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
159
- 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>>;
160
- declare function signJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
161
- 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>>>;
162
- declare function clearJWSSession<T extends JWTClaims = JWTClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
162
+ declare function useJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionManager<T, MaxAge>>;
163
+ declare function getJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<SessionJWS<T, MaxAge>>;
164
+ declare function getJWSSessionToken<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): string | undefined;
165
+ declare function updateJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>, update?: SessionUpdate<T>): Promise<SessionJWS<T, MaxAge>>;
166
+ declare function signJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>): Promise<string>;
167
+ declare function verifyJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(_event: HTTPEvent, config: SessionConfigJWS<T, MaxAge>, token: string): Promise<Partial<SessionJWS<T, MaxAge>>>;
168
+ declare function clearJWSSession<T extends Record<string, any> = SessionClaims, MaxAge extends ExpiresIn | undefined = ExpiresIn | undefined>(event: HTTPEvent, config: Partial<SessionConfigJWS<T, MaxAge>>): Promise<void>;
163
169
 
164
- export { JWEEncryptOptions, JWKSet, JWK_Private, JWK_Public, JWK_Symmetric, JWTClaimValidationOptions, JWTClaims, clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
165
- export type { SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWS, SessionManager, SessionUpdate };
170
+ 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 };
171
+ export type { SessionClaims, SessionConfigJWE, SessionConfigJWS, SessionData, SessionHooksJWE, SessionHooksJWS, SessionJWE, SessionJWS, SessionManager, SessionUpdate };
@@ -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) {
@@ -127,6 +120,27 @@ 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
+ if (!token && hasWritableResponse$1(event)) {
137
+ const setCookie = event.res.headers.get("set-cookie");
138
+ if (typeof setCookie === "string") {
139
+ token = findSetCookie$1(setCookie, sessionName);
140
+ }
141
+ }
142
+ return token;
143
+ }
130
144
  async function updateJWESession(event, config, update) {
131
145
  const sessionName = config.name || DEFAULT_NAME$1;
132
146
  const context = getEventContext(event);
@@ -290,6 +304,11 @@ function getDecryptKey(key) {
290
304
  }
291
305
  return _key;
292
306
  }
307
+ function findSetCookie$1(setCookie, name) {
308
+ const regex = new RegExp(`(?:^|,\\s*)${name}=([^;]+)`);
309
+ const match = setCookie.match(regex);
310
+ return match ? match[1] : void 0;
311
+ }
293
312
 
294
313
  const kGetSessionPromise = Symbol("h3_jws_getSession");
295
314
  const DEFAULT_NAME = "h3-jws";
@@ -314,6 +333,9 @@ async function useJWSSession(event, config) {
314
333
  get data() {
315
334
  return getSessionFromContext(event, sessionName)?.data || {};
316
335
  },
336
+ get token() {
337
+ return getJWSSessionToken(event, config);
338
+ },
317
339
  update: async (update) => {
318
340
  await updateJWSSession(event, config, update);
319
341
  return sessionManager;
@@ -360,17 +382,7 @@ async function getJWSSession(event, config) {
360
382
  data: new NullProtoObj()
361
383
  };
362
384
  context.sessions[sessionName] = session;
363
- let token;
364
- if (config.sessionHeader !== false) {
365
- const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
366
- const headerValue = event.req.headers.get(headerName);
367
- if (typeof headerValue === "string") {
368
- token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
369
- }
370
- }
371
- if (!token) {
372
- token = getChunkedCookie(event, sessionName);
373
- }
385
+ const token = getJWSSessionToken(event, config);
374
386
  if (token) {
375
387
  const promise = verifyJWSSession(event, config, token).catch(async (error_) => {
376
388
  if (error_ instanceof Error && (error_.message.includes("Token has expired") || error_.message.includes("Token is too old"))) {
@@ -410,6 +422,27 @@ async function getJWSSession(event, config) {
410
422
  });
411
423
  return session;
412
424
  }
425
+ function getJWSSessionToken(event, config) {
426
+ const sessionName = config.name || DEFAULT_NAME;
427
+ let token;
428
+ if (config.sessionHeader !== false) {
429
+ const headerName = typeof config.sessionHeader === "string" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;
430
+ const headerValue = event.req.headers.get(headerName);
431
+ if (typeof headerValue === "string") {
432
+ token = headerValue.startsWith("Bearer ") ? headerValue.slice(7).trim() : headerValue;
433
+ }
434
+ }
435
+ if (!token) {
436
+ token = getChunkedCookie(event, sessionName);
437
+ }
438
+ if (!token && hasWritableResponse(event)) {
439
+ const setCookie = event.res.headers.get("set-cookie");
440
+ if (typeof setCookie === "string") {
441
+ token = findSetCookie(setCookie, sessionName);
442
+ }
443
+ }
444
+ return token;
445
+ }
413
446
  async function updateJWSSession(event, config, update) {
414
447
  const sessionName = config.name || DEFAULT_NAME;
415
448
  const context = getEventContext(event);
@@ -580,5 +613,10 @@ function getVerifyKey(key) {
580
613
  }
581
614
  return _key;
582
615
  }
616
+ function findSetCookie(setCookie, name) {
617
+ const regex = new RegExp(`(?:^|,\\s*)${name}=([^;]+)`);
618
+ const match = setCookie.match(regex);
619
+ return match ? match[1] : void 0;
620
+ }
583
621
 
584
- export { clearJWESession, clearJWSSession, getJWESession, getJWSSession, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
622
+ export { clearJWESession, clearJWSSession, getJWESession, getJWESessionToken, getJWSSession, getJWSSessionToken, sealJWESession, signJWSSession, unsealJWESession, updateJWESession, updateJWSSession, useJWESession, useJWSSession, verifyJWSSession };
package/dist/index.d.mts CHANGED
@@ -1,7 +1,8 @@
1
1
  export { C as CompositeKey, f as ContentEncryptionAlgorithm, D as DeriveKeyOptions, e as DeriveKeyReturn, E as ExpiresIn, 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, M as MaxTokenAge, U as UnwrapKeyOptions, W as WrapKeyOptions, g as WrapKeyResult } from './shared/unjwt.CtHrClHc.mjs';
2
- export { i as utils } from './shared/unjwt.BrNGm4On.mjs';
3
- export { j as jwe } from './shared/unjwt.VUfJDcCJ.mjs';
2
+ export { i as utils } from './shared/unjwt.CkkdXjZD.mjs';
3
+ export { j as jwe } from './shared/unjwt.B9nv94SS.mjs';
4
4
  export { j as jwk } from './shared/unjwt.BjP_dGnX.mjs';
5
5
  export { j as jws } from './shared/unjwt.C5jNR_1K.mjs';
6
6
  export { J as JWSAlgorithm, a as JWSHeaderParameters, f as JWSKeyLookupFunction, b as JWSProtectedHeader, c as JWSSignOptions, e as JWSVerifyOptions, d as JWSVerifyResult } from './shared/unjwt.BsLgL0DQ.mjs';
7
- export { d as JWEDecryptOptions, e as JWEDecryptResult, b as JWEEncryptOptions, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from './shared/unjwt.9mL1vSFP.mjs';
7
+ export { d as JWEDecryptOptions, e as JWEDecryptResult, b as JWEEncryptOptions, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from './shared/unjwt.BU3IrsCv.mjs';
8
+ import './shared/unjwt.JdKqVANs.mjs';
package/dist/jwe.d.mts CHANGED
@@ -1,3 +1,4 @@
1
1
  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';
2
- export { d as JWEDecryptOptions, e as JWEDecryptResult, b as JWEEncryptOptions, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from './shared/unjwt.9mL1vSFP.mjs';
3
- export { d as decrypt, e as encrypt } from './shared/unjwt.VUfJDcCJ.mjs';
2
+ export { d as JWEDecryptOptions, e as JWEDecryptResult, b as JWEEncryptOptions, J as JWEHeaderParameters, c as JWEKeyLookupFunction, a as JWEKeyManagementHeaderParameters } from './shared/unjwt.BU3IrsCv.mjs';
3
+ export { d as decrypt, e as encrypt } from './shared/unjwt.B9nv94SS.mjs';
4
+ import './shared/unjwt.JdKqVANs.mjs';
@@ -1,5 +1,5 @@
1
1
  import { X as JWTClaims, v as JWK, K as KeyManagementAlgorithm, f as ContentEncryptionAlgorithm, r as JWK_Symmetric, u as JWK_Private, C as CompositeKey, D as DeriveKeyOptions, e as DeriveKeyReturn, c as GenerateJWKOptions, d as GenerateJWKReturn, G as GenerateKeyAlgorithm, a as GenerateKeyOptions, b as GenerateKeyReturn, 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, 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, Q as JWK_Symmetric_Algorithm, q as JWK_oct, Y as JWT, Z as JWTClaimValidationOptions, V as JoseHeaderParameters, U as UnwrapKeyOptions, W as WrapKeyOptions, g as WrapKeyResult } from './unjwt.CtHrClHc.mjs';
2
- import { b as JWEEncryptOptions, c as JWEKeyLookupFunction, d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, a as JWEKeyManagementHeaderParameters } from './unjwt.9mL1vSFP.mjs';
2
+ import { b as JWEEncryptOptions, c as JWEKeyLookupFunction, d as JWEDecryptOptions, e as JWEDecryptResult, J as JWEHeaderParameters, a as JWEKeyManagementHeaderParameters } from './unjwt.BU3IrsCv.mjs';
3
3
 
4
4
  /**
5
5
  * Encrypts a payload to produce a JWE Compact Serialization string.
@@ -1,4 +1,5 @@
1
1
  import { K as KeyManagementAlgorithm, f as ContentEncryptionAlgorithm, E as ExpiresIn, V as JoseHeaderParameters, h as JWK_EC_Public, i as JWK_EC_Private, v as JWK, Z as JWTClaimValidationOptions, X as JWTClaims } from './unjwt.CtHrClHc.mjs';
2
+ import { S as StrictOmit } from './unjwt.JdKqVANs.mjs';
2
3
 
3
4
  /** Recognized JWE Header Parameters, any other Header Members may also be present. */
4
5
  interface JWEHeaderParameters extends JoseHeaderParameters {
@@ -79,7 +80,7 @@ interface JWEEncryptOptions {
79
80
  /** Time at which the JWT should expire, if no `exp` was already provided (only when typ is "JWT" or explicitly parsing JWT). */
80
81
  expiresIn?: ExpiresIn;
81
82
  /** Additional JWE Protected Header parameters. */
82
- protectedHeader?: Omit<JWEHeaderParameters, "alg" | "enc" | "iv" | "tag" | "p2s" | "p2c" | "epk" | "apu" | "apv">;
83
+ protectedHeader?: StrictOmit<JWEHeaderParameters, "alg" | "enc" | "iv" | "tag" | "p2s" | "p2c" | "epk" | "apu" | "apv">;
83
84
  /** Initialization Vector for AES-GCMKW key wrapping. Generated if not provided. */
84
85
  keyManagementIV?: Uint8Array<ArrayBuffer>;
85
86
  /** PBES2 Salt value (p2s). Required for PBES2 algorithms. */
@@ -1,4 +1,5 @@
1
1
  import { E as ExpiresIn, X as JWTClaims, Z as JWTClaimValidationOptions, v as JWK, w as JWKSet, q as JWK_oct, u as JWK_Private, t as JWK_Public } from './unjwt.CtHrClHc.mjs';
2
+ import { S as StrictOmit } from './unjwt.JdKqVANs.mjs';
2
3
 
3
4
  /**
4
5
  * Apply default typ/cty semantics shared by JWS & JWE.
@@ -101,6 +102,7 @@ declare function isPrivateJWK(key: unknown): key is JWK_Private;
101
102
  */
102
103
  declare function isPublicJWK(key: unknown): key is JWK_Public;
103
104
 
105
+ declare const index_StrictOmit: typeof StrictOmit;
104
106
  declare const index_applyTypCtyDefaults: typeof applyTypCtyDefaults;
105
107
  declare const index_assertCryptoKey: typeof assertCryptoKey;
106
108
  declare const index_base64Decode: typeof base64Decode;
@@ -134,6 +136,7 @@ declare const index_validateCriticalHeadersJWS: typeof validateCriticalHeadersJW
134
136
  declare const index_validateJwtClaims: typeof validateJwtClaims;
135
137
  declare namespace index {
136
138
  export {
139
+ index_StrictOmit as StrictOmit,
137
140
  index_applyTypCtyDefaults as applyTypCtyDefaults,
138
141
  index_assertCryptoKey as assertCryptoKey,
139
142
  index_base64Decode as base64Decode,
@@ -0,0 +1,5 @@
1
+ type StrictOmit<T, K extends keyof T | (string & {}) | (number & {}) | (symbol & {})> = {
2
+ [P in keyof T as P extends K ? never : P]: T[P];
3
+ };
4
+
5
+ export type { StrictOmit as S };
package/dist/utils.d.mts CHANGED
@@ -1,2 +1,3 @@
1
1
  import './shared/unjwt.CtHrClHc.mjs';
2
- export { s as applyTypCtyDefaults, j as assertCryptoKey, d as base64Decode, b as base64Encode, e as base64UrlDecode, c as base64UrlEncode, z as computeExpiresInSeconds, B as computeJwtTimeClaims, A as computeMaxTokenAgeSeconds, f as concatUint8Arrays, v as decodeMaybeJWTString, x as decodePayloadFromB64UrlSegment, w as decodePayloadFromBytes, y as getPlaintextBytes, o as isAsymmetricJWK, k as isCryptoKey, l as isCryptoKeyPair, g as isJWK, h as isJWKSet, u as isJWTContent, p as isPrivateJWK, q as isPublicJWK, n as isSymmetricJWK, m as maybeArray, r as randomBytes, F as sanitizeObject, a as textDecoder, t as textEncoder, E as validateCriticalHeadersJWE, D as validateCriticalHeadersJWS, C as validateJwtClaims } from './shared/unjwt.BrNGm4On.mjs';
2
+ export { S as StrictOmit } from './shared/unjwt.JdKqVANs.mjs';
3
+ export { s as applyTypCtyDefaults, j as assertCryptoKey, d as base64Decode, b as base64Encode, e as base64UrlDecode, c as base64UrlEncode, z as computeExpiresInSeconds, B as computeJwtTimeClaims, A as computeMaxTokenAgeSeconds, f as concatUint8Arrays, v as decodeMaybeJWTString, x as decodePayloadFromB64UrlSegment, w as decodePayloadFromBytes, y as getPlaintextBytes, o as isAsymmetricJWK, k as isCryptoKey, l as isCryptoKeyPair, g as isJWK, h as isJWKSet, u as isJWTContent, p as isPrivateJWK, q as isPublicJWK, n as isSymmetricJWK, m as maybeArray, r as randomBytes, F as sanitizeObject, a as textDecoder, t as textEncoder, E as validateCriticalHeadersJWE, D as validateCriticalHeadersJWS, C as validateJwtClaims } from './shared/unjwt.CkkdXjZD.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unjwt",
3
- "version": "0.5.29",
3
+ "version": "0.5.31",
4
4
  "description": "Low-level JWT utilities",
5
5
  "repository": "sandros94/unjwt",
6
6
  "license": "MIT",
@@ -56,7 +56,7 @@
56
56
  "lint": "eslint . && prettier -c .",
57
57
  "lint:fix": "automd && eslint . --fix && prettier -w .",
58
58
  "prepack": "pnpm build",
59
- "release": "pnpm test && pnpm prepack && changelogen --release --push --publish",
59
+ "release": "pnpm test && pnpm prepack && changelogen --release --push",
60
60
  "test": "pnpm lint && pnpm test:types && vitest run --slowTestThreshold=1000",
61
61
  "test:coverage": "pnpm lint && pnpm test:types && vitest run --coverage --slowTestThreshold=1000",
62
62
  "test:types": "tsc --noEmit --skipLibCheck",