h3 0.8.1 → 0.8.3

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/dist/index.cjs CHANGED
@@ -155,6 +155,9 @@ function readRawBody(event, encoding = "utf-8") {
155
155
  if ("body" in event.req) {
156
156
  return Promise.resolve(event.req.body);
157
157
  }
158
+ if (!parseInt(event.req.headers["content-length"] || "")) {
159
+ return Promise.resolve(void 0);
160
+ }
158
161
  const promise = event.req[RawBodySymbol] = new Promise((resolve, reject) => {
159
162
  const bodyData = [];
160
163
  event.req.on("error", (err) => {
@@ -284,21 +287,43 @@ function sendStream(event, data) {
284
287
  data.on("error", (error) => reject(createError(error)));
285
288
  });
286
289
  }
287
- function writeEarlyHints(event, links, callback) {
290
+ const noop = () => {
291
+ };
292
+ function writeEarlyHints(event, hints, cb = noop) {
288
293
  if (!event.res.socket && !("writeEarlyHints" in event.res)) {
289
- if (callback) {
290
- callback();
291
- }
294
+ cb();
292
295
  return;
293
296
  }
297
+ if (typeof hints === "string" || Array.isArray(hints)) {
298
+ hints = { link: hints };
299
+ }
300
+ if (hints.link) {
301
+ hints.link = Array.isArray(hints.link) ? hints.link : hints.link.split(",");
302
+ hints.link = hints.link.map((l) => l.trim().replace(/; crossorigin/g, ""));
303
+ }
294
304
  if ("writeEarlyHints" in event.res) {
295
- return event.res.writeEarlyHints(links, callback);
305
+ return event.res.writeEarlyHints(hints, cb);
306
+ }
307
+ const headers = Object.entries(hints).map((e) => [e[0].toLowerCase(), e[1]]);
308
+ if (!headers.length) {
309
+ cb();
310
+ return;
311
+ }
312
+ let hint = "HTTP/1.1 103 Early Hints";
313
+ if (hints.link) {
314
+ hint += `\r
315
+ Link: ${hints.link.join(", ")}`;
316
+ }
317
+ for (const [header, value] of headers) {
318
+ if (header === "link") {
319
+ continue;
320
+ }
321
+ hint += `\r
322
+ ${header}: ${value}`;
296
323
  }
297
- const _links = Array.isArray(links) ? links : [links];
298
- event.res.socket.write(`HTTP/1.1 103 Early Hints\r
299
- Link: ${_links.join("\r\n")}\r
324
+ event.res.socket.write(`${hint}\r
300
325
  \r
301
- `, "utf-8", callback);
326
+ `, "utf-8", cb);
302
327
  }
303
328
 
304
329
  function parseCookies(event) {
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@ declare type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
16
16
 
17
17
  declare type NodeListener = (req: IncomingMessage, res: ServerResponse) => void;
18
18
  declare type NodePromisifiedHandler = (req: IncomingMessage, res: ServerResponse) => Promise<any>;
19
- declare type NodeMiddleware = (req: IncomingMessage, res: ServerResponse, next?: (err?: Error) => any) => any;
19
+ declare type NodeMiddleware = (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => any) => any;
20
20
  declare const defineNodeListener: (handler: NodeListener) => NodeListener;
21
21
  declare const defineNodeMiddleware: (middleware: NodeMiddleware) => NodeMiddleware;
22
22
  declare function fromNodeMiddleware(handler: NodeListener | NodeMiddleware): EventHandler;
@@ -159,7 +159,7 @@ declare function useBase(base: string, handler: EventHandler): EventHandler;
159
159
  *
160
160
  * @return {String|Buffer} Encoded raw string or raw Buffer of the body
161
161
  */
162
- declare function readRawBody(event: H3Event, encoding?: Encoding): Encoding extends false ? Buffer : Promise<string | Buffer>;
162
+ declare function readRawBody(event: H3Event, encoding?: Encoding): Encoding extends false ? Buffer : Promise<string | Buffer | undefined>;
163
163
  /** @deprecated Use `h3.readRawBody` */
164
164
  declare const useRawBody: typeof readRawBody;
165
165
  /**
@@ -270,7 +270,7 @@ declare function appendResponseHeader(event: H3Event, name: string, value: strin
270
270
  declare const appendHeader: typeof appendResponseHeader;
271
271
  declare function isStream(data: any): any;
272
272
  declare function sendStream(event: H3Event, data: any): Promise<void>;
273
- declare function writeEarlyHints(event: H3Event, links: string | string[], callback?: () => void): void;
273
+ declare function writeEarlyHints(event: H3Event, hints: string | string[] | Record<string, string | string[]>, cb?: () => void): void;
274
274
 
275
275
  declare type RouterMethod = Lowercase<HTTPMethod>;
276
276
  declare type RouterUse = (path: string, handler: EventHandler, method?: RouterMethod | RouterMethod[]) => Router;
package/dist/index.mjs CHANGED
@@ -153,6 +153,9 @@ function readRawBody(event, encoding = "utf-8") {
153
153
  if ("body" in event.req) {
154
154
  return Promise.resolve(event.req.body);
155
155
  }
156
+ if (!parseInt(event.req.headers["content-length"] || "")) {
157
+ return Promise.resolve(void 0);
158
+ }
156
159
  const promise = event.req[RawBodySymbol] = new Promise((resolve, reject) => {
157
160
  const bodyData = [];
158
161
  event.req.on("error", (err) => {
@@ -282,21 +285,43 @@ function sendStream(event, data) {
282
285
  data.on("error", (error) => reject(createError(error)));
283
286
  });
284
287
  }
285
- function writeEarlyHints(event, links, callback) {
288
+ const noop = () => {
289
+ };
290
+ function writeEarlyHints(event, hints, cb = noop) {
286
291
  if (!event.res.socket && !("writeEarlyHints" in event.res)) {
287
- if (callback) {
288
- callback();
289
- }
292
+ cb();
290
293
  return;
291
294
  }
295
+ if (typeof hints === "string" || Array.isArray(hints)) {
296
+ hints = { link: hints };
297
+ }
298
+ if (hints.link) {
299
+ hints.link = Array.isArray(hints.link) ? hints.link : hints.link.split(",");
300
+ hints.link = hints.link.map((l) => l.trim().replace(/; crossorigin/g, ""));
301
+ }
292
302
  if ("writeEarlyHints" in event.res) {
293
- return event.res.writeEarlyHints(links, callback);
303
+ return event.res.writeEarlyHints(hints, cb);
304
+ }
305
+ const headers = Object.entries(hints).map((e) => [e[0].toLowerCase(), e[1]]);
306
+ if (!headers.length) {
307
+ cb();
308
+ return;
309
+ }
310
+ let hint = "HTTP/1.1 103 Early Hints";
311
+ if (hints.link) {
312
+ hint += `\r
313
+ Link: ${hints.link.join(", ")}`;
314
+ }
315
+ for (const [header, value] of headers) {
316
+ if (header === "link") {
317
+ continue;
318
+ }
319
+ hint += `\r
320
+ ${header}: ${value}`;
294
321
  }
295
- const _links = Array.isArray(links) ? links : [links];
296
- event.res.socket.write(`HTTP/1.1 103 Early Hints\r
297
- Link: ${_links.join("\r\n")}\r
322
+ event.res.socket.write(`${hint}\r
298
323
  \r
299
- `, "utf-8", callback);
324
+ `, "utf-8", cb);
300
325
  }
301
326
 
302
327
  function parseCookies(event) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",
@@ -23,7 +23,7 @@
23
23
  "cookie-es": "^0.5.0",
24
24
  "destr": "^1.1.1",
25
25
  "radix3": "^0.2.1",
26
- "ufo": "^0.8.5"
26
+ "ufo": "^0.8.6"
27
27
  },
28
28
  "devDependencies": {
29
29
  "0x": "^5.4.1",
@@ -33,7 +33,7 @@
33
33
  "@types/supertest": "^2.0.12",
34
34
  "@vitest/coverage-c8": "^0.24.3",
35
35
  "autocannon": "^7.10.0",
36
- "changelogen": "^0.3.2",
36
+ "changelogen": "^0.3.5",
37
37
  "connect": "^3.7.0",
38
38
  "eslint": "^8.25.0",
39
39
  "express": "^4.18.2",
@@ -42,10 +42,10 @@
42
42
  "listhen": "^0.3.4",
43
43
  "supertest": "^6.3.0",
44
44
  "typescript": "^4.8.4",
45
- "unbuild": "^0.9.2",
45
+ "unbuild": "^0.9.4",
46
46
  "vitest": "^0.24.3"
47
47
  },
48
- "packageManager": "pnpm@7.13.4",
48
+ "packageManager": "pnpm@7.13.5",
49
49
  "scripts": {
50
50
  "build": "unbuild",
51
51
  "dev": "vitest",