srvx 0.2.1 → 0.2.2

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,5 +1,6 @@
1
1
  import { ServerOptions, Server, FetchHandler, NodeHttpHandler } from '../types.mjs';
2
2
  import NodeHttp__default from 'node:http';
3
+ import { Readable } from 'node:stream';
3
4
  import 'node:net';
4
5
  import 'bun';
5
6
  import '@cloudflare/workers-types';
@@ -7,8 +8,8 @@ import '@cloudflare/workers-types';
7
8
  type NodeFastResponse = InstanceType<typeof NodeFastResponse>;
8
9
  declare const NodeFastResponse: {
9
10
  new (body?: BodyInit | null, init?: ResponseInit): {
10
- "__#4200@#body"?: BodyInit | null;
11
- "__#4200@#init"?: ResponseInit;
11
+ "__#4201@#body"?: BodyInit | null;
12
+ "__#4201@#init"?: ResponseInit;
12
13
  /**
13
14
  * Prepare Node.js response object
14
15
  */
@@ -16,14 +17,14 @@ declare const NodeFastResponse: {
16
17
  status: number;
17
18
  statusText: string;
18
19
  headers: NodeHttp__default.OutgoingHttpHeader[];
19
- body: string | Uint8Array<ArrayBufferLike> | ReadableStream<Uint8Array<ArrayBufferLike>> | Buffer<ArrayBufferLike> | DataView<ArrayBufferLike> | null | undefined;
20
+ body: string | Uint8Array<ArrayBufferLike> | ReadableStream<Uint8Array<ArrayBufferLike>> | Readable | Buffer<ArrayBufferLike> | DataView<ArrayBufferLike> | null | undefined;
20
21
  };
21
22
  /** Lazy initialized response instance */
22
- "__#4200@#responseObj"?: Response;
23
+ "__#4201@#responseObj"?: Response;
23
24
  /** Lazy initialized headers instance */
24
- "__#4200@#headersObj"?: Headers;
25
+ "__#4201@#headersObj"?: Headers;
25
26
  clone(): Response;
26
- readonly "__#4200@#response": Response;
27
+ readonly "__#4201@#response": Response;
27
28
  readonly headers: Headers;
28
29
  readonly ok: boolean;
29
30
  readonly redirected: boolean;
@@ -31,7 +32,7 @@ declare const NodeFastResponse: {
31
32
  readonly statusText: string;
32
33
  readonly type: ResponseType;
33
34
  readonly url: string;
34
- "__#4200@#fastBody"<T extends object>(as: new (...args: any[]) => T): T | null | false;
35
+ "__#4201@#fastBody"<T extends object>(as: new (...args: any[]) => T): T | null | false;
35
36
  readonly body: ReadableStream<Uint8Array> | null;
36
37
  readonly bodyUsed: boolean;
37
38
  arrayBuffer(): Promise<ArrayBuffer>;
@@ -10,11 +10,18 @@ async function sendNodeResponse(nodeRes, webRes) {
10
10
  }
11
11
  if (webRes.nodeResponse) {
12
12
  const res = webRes.nodeResponse();
13
- nodeRes.writeHead(res.status, res.statusText, res.headers);
14
- if (res.body instanceof ReadableStream) {
15
- return streamBody(res.body, nodeRes);
13
+ if (!nodeRes.headersSent) {
14
+ nodeRes.writeHead(res.status, res.statusText, res.headers);
15
+ }
16
+ if (res.body) {
17
+ if (res.body instanceof ReadableStream) {
18
+ return streamBody(res.body, nodeRes);
19
+ } else if (typeof res.body?.pipe === "function") {
20
+ res.body.pipe(nodeRes);
21
+ return new Promise((resolve) => nodeRes.on("close", resolve));
22
+ }
23
+ nodeRes.write(res.body);
16
24
  }
17
- nodeRes.write(res.body);
18
25
  return endNodeResponse(nodeRes);
19
26
  }
20
27
  const headerEntries = [];
@@ -27,7 +34,9 @@ async function sendNodeResponse(nodeRes, webRes) {
27
34
  headerEntries.push([key, value]);
28
35
  }
29
36
  }
30
- nodeRes.writeHead(webRes.status || 200, webRes.statusText, headerEntries);
37
+ if (!nodeRes.headersSent) {
38
+ nodeRes.writeHead(webRes.status || 200, webRes.statusText, headerEntries);
39
+ }
31
40
  return webRes.body ? streamBody(webRes.body, nodeRes) : endNodeResponse(nodeRes);
32
41
  }
33
42
  function endNodeResponse(nodeRes) {
@@ -516,12 +525,10 @@ const NodeFastResponse = /* @__PURE__ */ (() => (
516
525
  const status = this.#init?.status ?? 200;
517
526
  const statusText = this.#init?.statusText ?? "";
518
527
  const headers = [];
519
- let headersInit = this.#init?.headers;
528
+ const headersInit = this.#init?.headers;
520
529
  if (headersInit) {
521
- if (typeof headersInit === "object") {
522
- headersInit = Object.entries(headersInit);
523
- }
524
- for (const [key, value] of headersInit) {
530
+ const headerEntries = headersInit.entries ? headersInit.entries() : Object.entries(headersInit);
531
+ for (const [key, value] of headerEntries) {
525
532
  if (key === "set-cookie") {
526
533
  for (const setCookie of splitSetCookieString(value)) {
527
534
  headers.push(["set-cookie", setCookie]);
@@ -549,6 +556,8 @@ const NodeFastResponse = /* @__PURE__ */ (() => (
549
556
  if (bodyInit.type) {
550
557
  headers.push(["content-type", bodyInit.type]);
551
558
  }
559
+ } else if (typeof bodyInit.pipe === "function") {
560
+ body = bodyInit;
552
561
  } else {
553
562
  const res = new Response(bodyInit);
554
563
  body = res.body;
package/dist/types.d.mts CHANGED
@@ -4,6 +4,7 @@ import * as Bun from 'bun';
4
4
  import * as CF from '@cloudflare/workers-types';
5
5
 
6
6
  type MaybePromise<T> = T | Promise<T>;
7
+ declare const Response: globalThis.Response;
7
8
  /**
8
9
  * Create a new server instance.
9
10
  */
@@ -172,4 +173,4 @@ type DenoFetchHandler = (request: Request, info?: Deno.ServeHandlerInfo<Deno.Net
172
173
  type NodeHttpHandler = (nodeReq: NodeHttp.IncomingMessage, nodeRes: NodeHttp.ServerResponse) => void | Promise<void>;
173
174
  type CloudflareFetchHandler = CF.ExportedHandlerFetchHandler;
174
175
 
175
- export { type BunFetchandler, type CloudflareFetchHandler, type DenoFetchHandler, type FetchHandler, type NodeHttpHandler, type Server, type ServerHandler, type ServerOptions, type ServerPlugin, type ServerPluginInstance, type ServerRequest, serve };
176
+ export { type BunFetchandler, type CloudflareFetchHandler, type DenoFetchHandler, type FetchHandler, type NodeHttpHandler, Response, type Server, type ServerHandler, type ServerOptions, type ServerPlugin, type ServerPluginInstance, type ServerRequest, serve };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "srvx",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Universal Server API based on web platform standards. Works seamlessly with Deno, Bun and Node.js.",
5
5
  "repository": "unjs/srvx",
6
6
  "license": "MIT",