@vercel/node 3.0.1 → 3.0.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.
@@ -8,6 +8,7 @@ import { createEdgeEventHandler } from './edge-functions/edge-handler.mjs';
8
8
  import { createServer } from 'http';
9
9
  import { createServerlessEventHandler } from './serverless-functions/serverless-handler.mjs';
10
10
  import { isEdgeRuntime, logError, validateConfiguredRuntime } from './utils.js';
11
+ import { toToReadable } from '@edge-runtime/node-utils';
11
12
  import { getConfig } from '@vercel/static-config';
12
13
  import { Project } from 'ts-morph';
13
14
  import { listen } from 'async-listen';
@@ -71,17 +72,17 @@ async function onDevRequest(req, res) {
71
72
  const { headers, body, status } = await handleEvent(req);
72
73
  res.statusCode = status;
73
74
  for (const [key, value] of headers) {
74
- // node-fetch does not support headers.getSetCookie(), so we need to
75
- // manually set the raw value which can be an array of strings
76
- if (value !== undefined) {
77
- res.setHeader(key, key === 'set-cookie' ? headers.raw()[key] : value);
78
- }
75
+ if (value !== undefined)
76
+ res.setHeader(key, key === 'set-cookie' ? headers.getSetCookie() : value);
79
77
  }
80
- if (body instanceof Buffer) {
78
+ if (body === null) {
79
+ res.end();
80
+ }
81
+ else if (body instanceof Buffer) {
81
82
  res.end(body);
82
83
  }
83
84
  else {
84
- body.pipe(res);
85
+ toToReadable(body).pipe(res);
85
86
  }
86
87
  }
87
88
  catch (error) {
@@ -1,7 +1,7 @@
1
1
  import { createEdgeWasmPlugin } from './edge-wasm-plugin.mjs';
2
2
  import { createNodeCompatPlugin, } from './edge-node-compat-plugin.mjs';
3
3
  import { EdgeRuntime, runServer } from 'edge-runtime';
4
- import fetch, { Headers } from 'node-fetch';
4
+ import { fetch, Headers } from 'undici';
5
5
  import { isError } from '@vercel/error-utils';
6
6
  import { readFileSync } from 'fs';
7
7
  import { serializeBody, entrypointToOutputPath, logError } from '../utils.js';
@@ -142,7 +142,6 @@ export async function createEdgeEventHandler(entrypointFullPath, entrypointRelat
142
142
  if (body !== undefined)
143
143
  headers.set('content-length', String(body.length));
144
144
  const url = new URL(request.url ?? '/', server.url);
145
- // @ts-expect-error
146
145
  const response = await fetch(url, {
147
146
  body,
148
147
  headers,
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
3
  import { ServerResponse, IncomingMessage } from 'http';
4
- import type { Headers } from 'node-fetch';
4
+ import type { Headers } from 'undici';
5
5
  export type VercelRequestCookies = {
6
6
  [key: string]: string;
7
7
  };
@@ -36,6 +36,6 @@ export type NowApiHandler = VercelApiHandler;
36
36
  export interface VercelProxyResponse {
37
37
  status: number;
38
38
  headers: Headers;
39
- body: Buffer | NodeJS.ReadableStream;
39
+ body: ReadableStream<Uint8Array> | Buffer | null;
40
40
  encoding: BufferEncoding;
41
41
  }
@@ -18,6 +18,7 @@ class FetchEvent {
18
18
  const webHandlerToNodeHandler = (0, node_utils_1.buildToNodeHandler)({
19
19
  Headers,
20
20
  ReadableStream,
21
+ // @ts-expect-error Property 'duplex' is missing in type 'Request'
21
22
  Request: class extends Request {
22
23
  constructor(input, init) {
23
24
  super(input, addDuplexToInit(init));
@@ -1,9 +1,8 @@
1
1
  import { addHelpers } from './helpers.js';
2
2
  import { createServer } from 'http';
3
3
  import { serializeBody } from '../utils.js';
4
- import { streamToBuffer } from '@vercel/build-utils';
5
4
  import exitHook from 'exit-hook';
6
- import fetch from 'node-fetch';
5
+ import { Headers, fetch } from 'undici';
7
6
  import { listen } from 'async-listen';
8
7
  import { isAbsolute } from 'path';
9
8
  import { pathToFileURL } from 'url';
@@ -75,10 +74,10 @@ export async function createServerlessEventHandler(entrypointPath, options) {
75
74
  const isStreaming = options.mode === 'streaming';
76
75
  return async function (request) {
77
76
  const url = new URL(request.url ?? '/', server.url);
78
- // @ts-expect-error
79
77
  const response = await fetch(url, {
80
78
  body: await serializeBody(request),
81
79
  compress: !isStreaming,
80
+ // @ts-expect-error
82
81
  headers: {
83
82
  ...request.headers,
84
83
  host: request.headers['x-forwarded-host'],
@@ -86,26 +85,31 @@ export async function createServerlessEventHandler(entrypointPath, options) {
86
85
  method: request.method,
87
86
  redirect: 'manual',
88
87
  });
89
- let body;
88
+ let body = null;
89
+ let headers = response.headers;
90
90
  if (isStreaming) {
91
91
  body = response.body;
92
92
  }
93
93
  else {
94
- body = await streamToBuffer(response.body);
94
+ body = Buffer.from(await response.arrayBuffer());
95
95
  const contentEncoding = response.headers.get('content-encoding');
96
96
  if (contentEncoding) {
97
97
  body = compress(body, contentEncoding);
98
- response.headers.set('content-length', Buffer.byteLength(body));
98
+ const clonedHeaders = [];
99
+ console.log(response.headers.entries());
100
+ for (const [key, value] of response.headers.entries()) {
101
+ if (key !== 'transfer-encoding') {
102
+ // transfer-encoding is only for streaming response
103
+ clonedHeaders.push([key, value]);
104
+ }
105
+ }
106
+ clonedHeaders.push(['content-length', String(Buffer.byteLength(body))]);
107
+ headers = new Headers(clonedHeaders);
99
108
  }
100
- /**
101
- * `transfer-encoding` is related to streaming chunks.
102
- * Since we are buffering the response.body, it should be stripped.
103
- */
104
- response.headers.delete('transfer-encoding');
105
109
  }
106
110
  return {
107
111
  status: response.status,
108
- headers: response.headers,
112
+ headers,
109
113
  body,
110
114
  encoding: 'utf8',
111
115
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/node",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index",
6
6
  "homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -13,24 +13,24 @@
13
13
  "dist"
14
14
  ],
15
15
  "dependencies": {
16
- "@edge-runtime/node-utils": "2.0.3",
17
- "@edge-runtime/primitives": "2.1.2",
18
- "@edge-runtime/vm": "3.0.1",
16
+ "@edge-runtime/node-utils": "2.2.0",
17
+ "@edge-runtime/primitives": "3.1.0",
18
+ "@edge-runtime/vm": "3.1.0",
19
19
  "@types/node": "14.18.33",
20
- "@types/node-fetch": "2.6.3",
21
20
  "@vercel/build-utils": "7.0.0",
22
21
  "@vercel/error-utils": "2.0.1",
23
22
  "@vercel/static-config": "3.0.0",
24
23
  "async-listen": "3.0.0",
25
24
  "content-type": "1.0.5",
26
- "edge-runtime": "2.4.4",
25
+ "edge-runtime": "2.5.0",
27
26
  "esbuild": "0.14.47",
28
27
  "exit-hook": "2.2.1",
29
28
  "node-fetch": "2.6.9",
30
29
  "path-to-regexp": "6.2.1",
31
30
  "ts-morph": "12.0.0",
32
31
  "ts-node": "10.9.1",
33
- "typescript": "4.9.5"
32
+ "typescript": "4.9.5",
33
+ "undici": "5.23.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@babel/core": "7.5.0",