@vercel/go 3.11.0 → 4.0.0
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/bin/proxy-linux-amd64 +0 -0
- package/bin/proxy-linux-arm64 +0 -0
- package/dist/index.js +284 -0
- package/package.json +8 -3
package/bin/proxy-linux-amd64
CHANGED
|
Binary file
|
package/bin/proxy-linux-arm64
CHANGED
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -10938,6 +10938,288 @@ var require_xdg_app_paths = __commonJS({
|
|
|
10938
10938
|
}
|
|
10939
10939
|
});
|
|
10940
10940
|
|
|
10941
|
+
// ../../internals/ipc-proxy/dist/dev-proxy.js
|
|
10942
|
+
var require_dev_proxy = __commonJS({
|
|
10943
|
+
"../../internals/ipc-proxy/dist/dev-proxy.js"(exports, module2) {
|
|
10944
|
+
"use strict";
|
|
10945
|
+
var __defProp2 = Object.defineProperty;
|
|
10946
|
+
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
|
10947
|
+
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
|
10948
|
+
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
|
10949
|
+
var __export2 = (target, all) => {
|
|
10950
|
+
for (var name in all)
|
|
10951
|
+
__defProp2(target, name, { get: all[name], enumerable: true });
|
|
10952
|
+
};
|
|
10953
|
+
var __copyProps2 = (to2, from, except, desc) => {
|
|
10954
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10955
|
+
for (let key of __getOwnPropNames2(from))
|
|
10956
|
+
if (!__hasOwnProp2.call(to2, key) && key !== except)
|
|
10957
|
+
__defProp2(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable });
|
|
10958
|
+
}
|
|
10959
|
+
return to2;
|
|
10960
|
+
};
|
|
10961
|
+
var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
|
|
10962
|
+
var dev_proxy_exports = {};
|
|
10963
|
+
__export2(dev_proxy_exports, {
|
|
10964
|
+
createDevProxyServer: () => createDevProxyServer,
|
|
10965
|
+
findFreePort: () => findFreePort,
|
|
10966
|
+
normalizeServiceRoutePrefix: () => normalizeServiceRoutePrefix,
|
|
10967
|
+
resolveServiceRoutePrefix: () => resolveServiceRoutePrefix,
|
|
10968
|
+
rewriteRequestUrl: () => rewriteRequestUrl,
|
|
10969
|
+
sanitizeHeaders: () => sanitizeHeaders,
|
|
10970
|
+
startDevProxy: () => startDevProxy,
|
|
10971
|
+
stripServiceRoutePrefix: () => stripServiceRoutePrefix,
|
|
10972
|
+
waitForPort: () => waitForPort2
|
|
10973
|
+
});
|
|
10974
|
+
module2.exports = __toCommonJS2(dev_proxy_exports);
|
|
10975
|
+
var import_node_http = require("http");
|
|
10976
|
+
var import_node_net = require("net");
|
|
10977
|
+
var PING_PATH = "/_vercel/ping";
|
|
10978
|
+
var INTERNAL_HEADER_PREFIX = "x-vercel-internal-";
|
|
10979
|
+
var LOCALHOST = "127.0.0.1";
|
|
10980
|
+
var DEFAULT_READINESS_TIMEOUT = 5 * 6e4;
|
|
10981
|
+
var READINESS_POLL_INTERVAL = 100;
|
|
10982
|
+
var READINESS_DIAL_TIMEOUT = 1e3;
|
|
10983
|
+
function normalizeServiceRoutePrefix(rawPrefix) {
|
|
10984
|
+
if (!rawPrefix)
|
|
10985
|
+
return "";
|
|
10986
|
+
let prefix = rawPrefix.trim();
|
|
10987
|
+
if (!prefix)
|
|
10988
|
+
return "";
|
|
10989
|
+
if (!prefix.startsWith("/")) {
|
|
10990
|
+
prefix = `/${prefix}`;
|
|
10991
|
+
}
|
|
10992
|
+
if (prefix !== "/") {
|
|
10993
|
+
prefix = prefix.replace(/\/+$/, "");
|
|
10994
|
+
if (!prefix)
|
|
10995
|
+
prefix = "/";
|
|
10996
|
+
}
|
|
10997
|
+
return prefix === "/" ? "" : prefix;
|
|
10998
|
+
}
|
|
10999
|
+
function resolveServiceRoutePrefix(env = process.env) {
|
|
11000
|
+
const strip = (env.VERCEL_SERVICE_ROUTE_PREFIX_STRIP ?? "").trim().toLowerCase();
|
|
11001
|
+
if (strip !== "1" && strip !== "true")
|
|
11002
|
+
return "";
|
|
11003
|
+
return normalizeServiceRoutePrefix(env.VERCEL_SERVICE_ROUTE_PREFIX);
|
|
11004
|
+
}
|
|
11005
|
+
function stripServiceRoutePrefix(pathValue, prefix) {
|
|
11006
|
+
if (pathValue === "*")
|
|
11007
|
+
return pathValue;
|
|
11008
|
+
let normalized = pathValue;
|
|
11009
|
+
if (!normalized) {
|
|
11010
|
+
normalized = "/";
|
|
11011
|
+
} else if (!normalized.startsWith("/")) {
|
|
11012
|
+
normalized = `/${normalized}`;
|
|
11013
|
+
}
|
|
11014
|
+
if (!prefix)
|
|
11015
|
+
return normalized;
|
|
11016
|
+
if (normalized === prefix)
|
|
11017
|
+
return "/";
|
|
11018
|
+
if (normalized.startsWith(`${prefix}/`)) {
|
|
11019
|
+
return normalized.slice(prefix.length) || "/";
|
|
11020
|
+
}
|
|
11021
|
+
return normalized;
|
|
11022
|
+
}
|
|
11023
|
+
function splitUrl(url) {
|
|
11024
|
+
const queryIndex = url.indexOf("?");
|
|
11025
|
+
if (queryIndex === -1)
|
|
11026
|
+
return { pathname: url, search: "" };
|
|
11027
|
+
return { pathname: url.slice(0, queryIndex), search: url.slice(queryIndex) };
|
|
11028
|
+
}
|
|
11029
|
+
function rewriteRequestUrl(url, prefix) {
|
|
11030
|
+
const { pathname, search } = splitUrl(url || "/");
|
|
11031
|
+
return `${stripServiceRoutePrefix(pathname, prefix)}${search}`;
|
|
11032
|
+
}
|
|
11033
|
+
function sanitizeHeaders(headers) {
|
|
11034
|
+
const sanitized = {};
|
|
11035
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
11036
|
+
if (key.toLowerCase().startsWith(INTERNAL_HEADER_PREFIX))
|
|
11037
|
+
continue;
|
|
11038
|
+
sanitized[key] = value;
|
|
11039
|
+
}
|
|
11040
|
+
const forwardedHost = headers["x-forwarded-host"];
|
|
11041
|
+
const host = Array.isArray(forwardedHost) ? forwardedHost[0] : forwardedHost;
|
|
11042
|
+
if (host) {
|
|
11043
|
+
sanitized.host = host;
|
|
11044
|
+
}
|
|
11045
|
+
return sanitized;
|
|
11046
|
+
}
|
|
11047
|
+
function findFreePort() {
|
|
11048
|
+
return new Promise((resolve, reject) => {
|
|
11049
|
+
const server = (0, import_node_net.createServer)();
|
|
11050
|
+
server.unref();
|
|
11051
|
+
server.once("error", reject);
|
|
11052
|
+
server.listen(0, LOCALHOST, () => {
|
|
11053
|
+
const address = server.address();
|
|
11054
|
+
if (!address || typeof address === "string") {
|
|
11055
|
+
server.close(() => reject(new Error("Failed to allocate a free port")));
|
|
11056
|
+
return;
|
|
11057
|
+
}
|
|
11058
|
+
const { port } = address;
|
|
11059
|
+
server.close(() => resolve(port));
|
|
11060
|
+
});
|
|
11061
|
+
});
|
|
11062
|
+
}
|
|
11063
|
+
function isPortReachable2(port) {
|
|
11064
|
+
return new Promise((resolve) => {
|
|
11065
|
+
const socket = (0, import_node_net.createConnection)({ port, host: LOCALHOST });
|
|
11066
|
+
const done = (reachable) => {
|
|
11067
|
+
socket.removeAllListeners();
|
|
11068
|
+
socket.destroy();
|
|
11069
|
+
resolve(reachable);
|
|
11070
|
+
};
|
|
11071
|
+
socket.setTimeout(READINESS_DIAL_TIMEOUT);
|
|
11072
|
+
socket.once("connect", () => done(true));
|
|
11073
|
+
socket.once("timeout", () => done(false));
|
|
11074
|
+
socket.once("error", () => done(false));
|
|
11075
|
+
});
|
|
11076
|
+
}
|
|
11077
|
+
function sleep2(ms2) {
|
|
11078
|
+
return new Promise((resolve) => setTimeout(resolve, ms2));
|
|
11079
|
+
}
|
|
11080
|
+
async function waitForPort2(port, child, timeout, label = "Dev server") {
|
|
11081
|
+
let exited;
|
|
11082
|
+
let spawnError;
|
|
11083
|
+
const onExit = (code, signal) => {
|
|
11084
|
+
exited = { code, signal };
|
|
11085
|
+
};
|
|
11086
|
+
const onError = (err) => {
|
|
11087
|
+
spawnError = err;
|
|
11088
|
+
};
|
|
11089
|
+
child.once("exit", onExit);
|
|
11090
|
+
child.once("error", onError);
|
|
11091
|
+
try {
|
|
11092
|
+
const start = Date.now();
|
|
11093
|
+
while (Date.now() - start < timeout) {
|
|
11094
|
+
if (spawnError)
|
|
11095
|
+
throw spawnError;
|
|
11096
|
+
if (exited) {
|
|
11097
|
+
throw new Error(
|
|
11098
|
+
`${label} exited before it started listening (code: ${exited.code}, signal: ${exited.signal})`
|
|
11099
|
+
);
|
|
11100
|
+
}
|
|
11101
|
+
if (await isPortReachable2(port))
|
|
11102
|
+
return;
|
|
11103
|
+
await sleep2(READINESS_POLL_INTERVAL);
|
|
11104
|
+
}
|
|
11105
|
+
throw new Error(`${label} did not start listening within ${timeout}ms`);
|
|
11106
|
+
} finally {
|
|
11107
|
+
child.removeListener("exit", onExit);
|
|
11108
|
+
child.removeListener("error", onError);
|
|
11109
|
+
}
|
|
11110
|
+
}
|
|
11111
|
+
function createDevProxyServer(options) {
|
|
11112
|
+
const { targetPort } = options;
|
|
11113
|
+
const routePrefix = normalizeServiceRoutePrefix(options.routePrefix);
|
|
11114
|
+
const server = (0, import_node_http.createServer)((req, res) => {
|
|
11115
|
+
const { pathname } = splitUrl(req.url || "/");
|
|
11116
|
+
if (pathname === PING_PATH) {
|
|
11117
|
+
res.writeHead(200, { "content-type": "text/plain" });
|
|
11118
|
+
res.end("OK");
|
|
11119
|
+
return;
|
|
11120
|
+
}
|
|
11121
|
+
const proxyReq = (0, import_node_http.request)(
|
|
11122
|
+
{
|
|
11123
|
+
host: LOCALHOST,
|
|
11124
|
+
port: targetPort,
|
|
11125
|
+
method: req.method,
|
|
11126
|
+
path: rewriteRequestUrl(req.url || "/", routePrefix),
|
|
11127
|
+
headers: sanitizeHeaders(req.headers)
|
|
11128
|
+
},
|
|
11129
|
+
(proxyRes) => {
|
|
11130
|
+
res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);
|
|
11131
|
+
proxyRes.pipe(res);
|
|
11132
|
+
}
|
|
11133
|
+
);
|
|
11134
|
+
proxyReq.once("error", (err) => {
|
|
11135
|
+
if (!res.headersSent) {
|
|
11136
|
+
res.writeHead(502, { "content-type": "text/plain" });
|
|
11137
|
+
}
|
|
11138
|
+
res.end(`Dev proxy error: ${err.message}`);
|
|
11139
|
+
});
|
|
11140
|
+
res.once("close", () => {
|
|
11141
|
+
if (!res.writableFinished)
|
|
11142
|
+
proxyReq.destroy();
|
|
11143
|
+
});
|
|
11144
|
+
req.pipe(proxyReq);
|
|
11145
|
+
});
|
|
11146
|
+
server.on("upgrade", (req, clientSocket, head) => {
|
|
11147
|
+
const headers = sanitizeHeaders(req.headers);
|
|
11148
|
+
const path = rewriteRequestUrl(req.url || "/", routePrefix);
|
|
11149
|
+
const upstream = (0, import_node_net.createConnection)(
|
|
11150
|
+
{ host: LOCALHOST, port: targetPort },
|
|
11151
|
+
() => {
|
|
11152
|
+
const lines = [`${req.method} ${path} HTTP/${req.httpVersion}`];
|
|
11153
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
11154
|
+
if (Array.isArray(value)) {
|
|
11155
|
+
for (const entry of value)
|
|
11156
|
+
lines.push(`${key}: ${entry}`);
|
|
11157
|
+
} else if (value !== void 0) {
|
|
11158
|
+
lines.push(`${key}: ${value}`);
|
|
11159
|
+
}
|
|
11160
|
+
}
|
|
11161
|
+
upstream.write(`${lines.join("\r\n")}\r
|
|
11162
|
+
\r
|
|
11163
|
+
`);
|
|
11164
|
+
if (head?.length)
|
|
11165
|
+
upstream.write(new Uint8Array(head));
|
|
11166
|
+
upstream.pipe(clientSocket);
|
|
11167
|
+
clientSocket.pipe(upstream);
|
|
11168
|
+
}
|
|
11169
|
+
);
|
|
11170
|
+
const destroy = () => {
|
|
11171
|
+
upstream.destroy();
|
|
11172
|
+
clientSocket.destroy();
|
|
11173
|
+
};
|
|
11174
|
+
upstream.once("error", destroy);
|
|
11175
|
+
clientSocket.once("error", destroy);
|
|
11176
|
+
});
|
|
11177
|
+
return server;
|
|
11178
|
+
}
|
|
11179
|
+
async function startDevProxy(options) {
|
|
11180
|
+
const {
|
|
11181
|
+
spawnServer,
|
|
11182
|
+
env = process.env,
|
|
11183
|
+
readinessTimeout = DEFAULT_READINESS_TIMEOUT,
|
|
11184
|
+
label = "Dev server"
|
|
11185
|
+
} = options;
|
|
11186
|
+
const internalPort = await findFreePort();
|
|
11187
|
+
const child = spawnServer(internalPort);
|
|
11188
|
+
let server;
|
|
11189
|
+
const close = async () => {
|
|
11190
|
+
if (server) {
|
|
11191
|
+
await new Promise((resolve) => {
|
|
11192
|
+
server?.close(() => resolve());
|
|
11193
|
+
server?.closeAllConnections?.();
|
|
11194
|
+
});
|
|
11195
|
+
}
|
|
11196
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
11197
|
+
child.kill("SIGTERM");
|
|
11198
|
+
}
|
|
11199
|
+
};
|
|
11200
|
+
try {
|
|
11201
|
+
await waitForPort2(internalPort, child, readinessTimeout, label);
|
|
11202
|
+
server = createDevProxyServer({
|
|
11203
|
+
targetPort: internalPort,
|
|
11204
|
+
routePrefix: resolveServiceRoutePrefix(env)
|
|
11205
|
+
});
|
|
11206
|
+
const listenPort = options.port ?? await findFreePort();
|
|
11207
|
+
await new Promise((resolve, reject) => {
|
|
11208
|
+
server?.once("error", reject);
|
|
11209
|
+
server?.listen(listenPort, () => resolve());
|
|
11210
|
+
});
|
|
11211
|
+
if (!child.pid) {
|
|
11212
|
+
throw new Error(`${label} started without a PID`);
|
|
11213
|
+
}
|
|
11214
|
+
return { port: listenPort, pid: child.pid, child, close };
|
|
11215
|
+
} catch (err) {
|
|
11216
|
+
await close();
|
|
11217
|
+
throw err;
|
|
11218
|
+
}
|
|
11219
|
+
}
|
|
11220
|
+
}
|
|
11221
|
+
});
|
|
11222
|
+
|
|
10941
11223
|
// ../../internals/ipc-proxy/dist/index.js
|
|
10942
11224
|
var require_dist2 = __commonJS({
|
|
10943
11225
|
"../../internals/ipc-proxy/dist/index.js"(exports, module2) {
|
|
@@ -10958,6 +11240,7 @@ var require_dist2 = __commonJS({
|
|
|
10958
11240
|
}
|
|
10959
11241
|
return to2;
|
|
10960
11242
|
};
|
|
11243
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps2(target, mod, "default"), secondTarget && __copyProps2(secondTarget, mod, "default"));
|
|
10961
11244
|
var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
|
|
10962
11245
|
var src_exports2 = {};
|
|
10963
11246
|
__export2(src_exports2, {
|
|
@@ -10970,6 +11253,7 @@ var require_dist2 = __commonJS({
|
|
|
10970
11253
|
var import_node_fs7 = require("fs");
|
|
10971
11254
|
var import_promises2 = require("fs/promises");
|
|
10972
11255
|
var import_build_utils6 = require("@vercel/build-utils");
|
|
11256
|
+
__reExport(src_exports2, require_dev_proxy(), module2.exports);
|
|
10973
11257
|
function proxyBinaryName(architecture) {
|
|
10974
11258
|
return architecture === "arm64" ? "proxy-linux-arm64" : "proxy-linux-amd64";
|
|
10975
11259
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vercel/go",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/index",
|
|
6
6
|
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
"bin",
|
|
16
16
|
"bootstrap"
|
|
17
17
|
],
|
|
18
|
+
"dependencies": {},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@vercel/build-utils": "14.3.0"
|
|
21
|
+
},
|
|
18
22
|
"devDependencies": {
|
|
19
23
|
"@tootallnate/once": "1.1.2",
|
|
20
24
|
"@types/async-retry": "1.4.5",
|
|
@@ -32,13 +36,14 @@
|
|
|
32
36
|
"vitest": "4.1.10",
|
|
33
37
|
"xdg-app-paths": "5.1.0",
|
|
34
38
|
"yauzl-promise": "2.1.3",
|
|
35
|
-
"@vercel
|
|
36
|
-
"@vercel/
|
|
39
|
+
"@vercel/build-utils": "14.3.0",
|
|
40
|
+
"@vercel-internals/ipc-proxy": "1.0.0"
|
|
37
41
|
},
|
|
38
42
|
"scripts": {
|
|
39
43
|
"build": "node build.mjs",
|
|
40
44
|
"test": "vitest run --config ../../vitest.config.mts",
|
|
41
45
|
"test-e2e": "vitest run --config ../../vitest.config.mts test/integration-",
|
|
46
|
+
"test-e2e-builder": "pnpm run test-e2e",
|
|
42
47
|
"type-check": "tsc --noEmit"
|
|
43
48
|
}
|
|
44
49
|
}
|