h3 1.15.3 → 1.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,11 +33,11 @@ H3 (pronounced as /eɪtʃθriː/, like h-3) is a minimal h(ttp) framework built
33
33
 
34
34
  <!-- automd:contributors license=MIT author="pi0" -->
35
35
 
36
- Published under the [MIT](https://github.com/unjs/h3/blob/main/LICENSE) license.
37
- Made by [@pi0](https://github.com/pi0) and [community](https://github.com/unjs/h3/graphs/contributors) 💛
36
+ Published under the [MIT](https://github.com/h3js/h3/blob/main/LICENSE) license.
37
+ Made by [@pi0](https://github.com/pi0) and [community](https://github.com/h3js/h3/graphs/contributors) 💛
38
38
  <br><br>
39
- <a href="https://github.com/unjs/h3/graphs/contributors">
40
- <img src="https://contrib.rocks/image?repo=unjs/h3" />
39
+ <a href="https://github.com/h3js/h3/graphs/contributors">
40
+ <img src="https://contrib.rocks/image?repo=h3js/h3" />
41
41
  </a>
42
42
 
43
43
  <!-- /automd -->
package/dist/index.cjs CHANGED
@@ -315,7 +315,8 @@ function getRequestHeader(event, name) {
315
315
  const getHeader = getRequestHeader;
316
316
  function getRequestHost(event, opts = {}) {
317
317
  if (opts.xForwardedHost) {
318
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
318
+ const _header = event.node.req.headers["x-forwarded-host"];
319
+ const xForwardedHost = (_header || "").split(",").shift()?.trim();
319
320
  if (xForwardedHost) {
320
321
  return xForwardedHost;
321
322
  }
package/dist/index.d.cts CHANGED
@@ -117,6 +117,12 @@ interface Session<T extends SessionDataT = SessionDataT> {
117
117
  data: SessionData<T>;
118
118
  [getSessionPromise]?: Promise<Session<T>>;
119
119
  }
120
+ interface SessionManager<T extends SessionDataT = SessionDataT> {
121
+ readonly id: string | undefined;
122
+ readonly data: SessionData<T>;
123
+ update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
124
+ clear: () => Promise<SessionManager<T>>;
125
+ }
120
126
  interface SessionConfig {
121
127
  /** Private key used to encrypt session tokens */
122
128
  password: string;
@@ -145,12 +151,7 @@ type CompatEvent = {
145
151
  /**
146
152
  * Create a session manager for the current request.
147
153
  */
148
- declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<{
149
- readonly id: any;
150
- readonly data: T;
151
- update: (update: SessionUpdate<T>) => Promise</*elided*/ any>;
152
- clear: () => Promise</*elided*/ any>;
153
- }>;
154
+ declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<SessionManager<T>>;
154
155
  /**
155
156
  * Get the session for the current request.
156
157
  */
@@ -1393,4 +1394,4 @@ declare function toPlainHandler(app: App): PlainHandler;
1393
1394
  declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
1394
1395
 
1395
1396
  export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
1396
- export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
1397
+ export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, SessionManager, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
package/dist/index.d.mts CHANGED
@@ -117,6 +117,12 @@ interface Session<T extends SessionDataT = SessionDataT> {
117
117
  data: SessionData<T>;
118
118
  [getSessionPromise]?: Promise<Session<T>>;
119
119
  }
120
+ interface SessionManager<T extends SessionDataT = SessionDataT> {
121
+ readonly id: string | undefined;
122
+ readonly data: SessionData<T>;
123
+ update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
124
+ clear: () => Promise<SessionManager<T>>;
125
+ }
120
126
  interface SessionConfig {
121
127
  /** Private key used to encrypt session tokens */
122
128
  password: string;
@@ -145,12 +151,7 @@ type CompatEvent = {
145
151
  /**
146
152
  * Create a session manager for the current request.
147
153
  */
148
- declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<{
149
- readonly id: any;
150
- readonly data: T;
151
- update: (update: SessionUpdate<T>) => Promise</*elided*/ any>;
152
- clear: () => Promise</*elided*/ any>;
153
- }>;
154
+ declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<SessionManager<T>>;
154
155
  /**
155
156
  * Get the session for the current request.
156
157
  */
@@ -1393,4 +1394,4 @@ declare function toPlainHandler(app: App): PlainHandler;
1393
1394
  declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
1394
1395
 
1395
1396
  export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
1396
- export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
1397
+ export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, SessionManager, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
package/dist/index.d.ts CHANGED
@@ -117,6 +117,12 @@ interface Session<T extends SessionDataT = SessionDataT> {
117
117
  data: SessionData<T>;
118
118
  [getSessionPromise]?: Promise<Session<T>>;
119
119
  }
120
+ interface SessionManager<T extends SessionDataT = SessionDataT> {
121
+ readonly id: string | undefined;
122
+ readonly data: SessionData<T>;
123
+ update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
124
+ clear: () => Promise<SessionManager<T>>;
125
+ }
120
126
  interface SessionConfig {
121
127
  /** Private key used to encrypt session tokens */
122
128
  password: string;
@@ -145,12 +151,7 @@ type CompatEvent = {
145
151
  /**
146
152
  * Create a session manager for the current request.
147
153
  */
148
- declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<{
149
- readonly id: any;
150
- readonly data: T;
151
- update: (update: SessionUpdate<T>) => Promise</*elided*/ any>;
152
- clear: () => Promise</*elided*/ any>;
153
- }>;
154
+ declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<SessionManager<T>>;
154
155
  /**
155
156
  * Get the session for the current request.
156
157
  */
@@ -1393,4 +1394,4 @@ declare function toPlainHandler(app: App): PlainHandler;
1393
1394
  declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
1394
1395
 
1395
1396
  export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
1396
- export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
1397
+ export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, SessionManager, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
package/dist/index.mjs CHANGED
@@ -308,7 +308,8 @@ function getRequestHeader(event, name) {
308
308
  const getHeader = getRequestHeader;
309
309
  function getRequestHost(event, opts = {}) {
310
310
  if (opts.xForwardedHost) {
311
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
311
+ const _header = event.node.req.headers["x-forwarded-host"];
312
+ const xForwardedHost = (_header || "").split(",").shift()?.trim();
312
313
  if (xForwardedHost) {
313
314
  return xForwardedHost;
314
315
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "1.15.3",
3
+ "version": "1.15.4",
4
4
  "description": "Minimal H(TTP) framework built for high performance and portability.",
5
- "repository": "unjs/h3",
5
+ "repository": "h3js/h3",
6
6
  "license": "MIT",
7
7
  "sideEffects": false,
8
8
  "exports": {
@@ -34,42 +34,42 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "cookie-es": "^1.2.2",
37
- "crossws": "^0.3.4",
37
+ "crossws": "^0.3.5",
38
38
  "defu": "^6.1.4",
39
39
  "destr": "^2.0.5",
40
40
  "iron-webcrypto": "^1.2.1",
41
- "node-mock-http": "^1.0.0",
41
+ "node-mock-http": "^1.0.2",
42
42
  "radix3": "^1.1.2",
43
43
  "ufo": "^1.6.1",
44
44
  "uncrypto": "^0.1.3"
45
45
  },
46
46
  "devDependencies": {
47
- "0x": "^5.8.0",
48
- "@types/express": "^5.0.1",
49
- "@types/node": "^22.15.2",
47
+ "0x": "^6.0.0",
48
+ "@types/express": "^5.0.3",
49
+ "@types/node": "^24.1.0",
50
50
  "@types/supertest": "^6.0.3",
51
- "@vitest/coverage-v8": "^3.1.2",
51
+ "@vitest/coverage-v8": "^3.2.4",
52
52
  "autocannon": "^8.0.0",
53
53
  "automd": "^0.4.0",
54
- "changelogen": "^0.6.1",
54
+ "changelogen": "^0.6.2",
55
55
  "connect": "^3.7.0",
56
- "eslint": "^9.25.1",
57
- "eslint-config-unjs": "^0.4.2",
56
+ "eslint": "^9.32.0",
57
+ "eslint-config-unjs": "^0.5.0",
58
58
  "express": "^5.1.0",
59
59
  "get-port": "^7.1.0",
60
- "h3": "^1.15.1",
61
- "jiti": "^2.4.2",
60
+ "h3": "^1.15.3",
61
+ "jiti": "^2.5.1",
62
62
  "listhen": "^1.9.0",
63
63
  "node-fetch-native": "^1.6.6",
64
- "prettier": "^3.5.3",
65
- "react": "^19.1.0",
66
- "react-dom": "^19.1.0",
67
- "supertest": "^7.1.0",
64
+ "prettier": "^3.6.2",
65
+ "react": "^19.1.1",
66
+ "react-dom": "^19.1.1",
67
+ "supertest": "^7.1.4",
68
68
  "typescript": "^5.8.3",
69
- "unbuild": "^3.5.0",
70
- "undici": "^7.8.0",
71
- "vitest": "^3.1.2",
72
- "zod": "^3.24.3"
69
+ "unbuild": "^3.6.0",
70
+ "undici": "^7.12.0",
71
+ "vitest": "^3.2.4",
72
+ "zod": "^4.0.14"
73
73
  },
74
74
  "packageManager": "pnpm@10.2.0"
75
75
  }