main repo

This commit is contained in:
Basilosaurusrex
2025-11-24 18:09:40 +01:00
parent b636ee5e70
commit f027651f9b
34146 changed files with 4436636 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
import { errorToJSON } from "../../render";
import crypto from "crypto";
import isError from "../../../lib/is-error";
import { deserializeErr } from "./request-utils";
// we can't use process.send as jest-worker relies on
// it already and can cause unexpected message errors
// so we create an IPC server for communicating
export async function createIpcServer(server) {
// Generate a random key in memory to validate messages from other processes.
// This is just a simple guard against other processes attempting to send
// traffic to the IPC server.
const ipcValidationKey = crypto.randomBytes(32).toString("hex");
const ipcServer = require("http").createServer(async (req, res)=>{
try {
const url = new URL(req.url || "/", "http://n");
const key = url.searchParams.get("key");
if (key !== ipcValidationKey) {
return res.end();
}
const method = url.searchParams.get("method");
const args = JSON.parse(url.searchParams.get("args") || "[]");
if (!method || !Array.isArray(args)) {
return res.end();
}
if (typeof server[method] === "function") {
var _args_;
if (method === "logErrorWithOriginalStack" && ((_args_ = args[0]) == null ? void 0 : _args_.stack)) {
args[0] = deserializeErr(args[0]);
}
let result = await server[method](...args);
if (result && typeof result === "object" && result.stack) {
result = errorToJSON(result);
}
res.end(JSON.stringify(result || ""));
}
} catch (err) {
if (isError(err) && err.code !== "ENOENT") {
console.error(err);
}
res.end(JSON.stringify({
err: {
name: err.name,
message: err.message,
stack: err.stack
}
}));
}
});
const ipcPort = await new Promise((resolveIpc)=>{
ipcServer.listen(0, server.hostname, ()=>{
const addr = ipcServer.address();
if (addr && typeof addr === "object") {
resolveIpc(addr.port);
}
});
});
return {
ipcPort,
ipcServer,
ipcValidationKey
};
}
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/lib/server-ipc/index.ts"],"names":["errorToJSON","crypto","isError","deserializeErr","createIpcServer","server","ipcValidationKey","randomBytes","toString","ipcServer","require","createServer","req","res","url","URL","key","searchParams","get","end","method","args","JSON","parse","Array","isArray","stack","result","stringify","err","code","console","error","name","message","ipcPort","Promise","resolveIpc","listen","hostname","addr","address","port"],"mappings":"AACA,SAASA,WAAW,QAAQ,eAAc;AAC1C,OAAOC,YAAY,SAAQ;AAC3B,OAAOC,aAAa,wBAAuB;AAC3C,SAASC,cAAc,QAAQ,kBAAiB;AAEhD,qDAAqD;AACrD,qDAAqD;AACrD,+CAA+C;AAC/C,OAAO,eAAeC,gBACpBC,MAAuC;IAMvC,6EAA6E;IAC7E,yEAAyE;IACzE,6BAA6B;IAC7B,MAAMC,mBAAmBL,OAAOM,WAAW,CAAC,IAAIC,QAAQ,CAAC;IAEzD,MAAMC,YAAY,AAACC,QAAQ,QAAkCC,YAAY,CACvE,OAAOC,KAAKC;QACV,IAAI;YACF,MAAMC,MAAM,IAAIC,IAAIH,IAAIE,GAAG,IAAI,KAAK;YACpC,MAAME,MAAMF,IAAIG,YAAY,CAACC,GAAG,CAAC;YAEjC,IAAIF,QAAQV,kBAAkB;gBAC5B,OAAOO,IAAIM,GAAG;YAChB;YAEA,MAAMC,SAASN,IAAIG,YAAY,CAACC,GAAG,CAAC;YACpC,MAAMG,OAAcC,KAAKC,KAAK,CAACT,IAAIG,YAAY,CAACC,GAAG,CAAC,WAAW;YAE/D,IAAI,CAACE,UAAU,CAACI,MAAMC,OAAO,CAACJ,OAAO;gBACnC,OAAOR,IAAIM,GAAG;YAChB;YAEA,IAAI,OAAO,AAACd,MAAc,CAACe,OAAO,KAAK,YAAY;oBACHC;gBAA9C,IAAID,WAAW,iCAA+BC,SAAAA,IAAI,CAAC,EAAE,qBAAPA,OAASK,KAAK,GAAE;oBAC5DL,IAAI,CAAC,EAAE,GAAGlB,eAAekB,IAAI,CAAC,EAAE;gBAClC;gBACA,IAAIM,SAAS,MAAM,AAACtB,MAAc,CAACe,OAAO,IAAIC;gBAE9C,IAAIM,UAAU,OAAOA,WAAW,YAAYA,OAAOD,KAAK,EAAE;oBACxDC,SAAS3B,YAAY2B;gBACvB;gBACAd,IAAIM,GAAG,CAACG,KAAKM,SAAS,CAACD,UAAU;YACnC;QACF,EAAE,OAAOE,KAAU;YACjB,IAAI3B,QAAQ2B,QAAQA,IAAIC,IAAI,KAAK,UAAU;gBACzCC,QAAQC,KAAK,CAACH;YAChB;YACAhB,IAAIM,GAAG,CACLG,KAAKM,SAAS,CAAC;gBACbC,KAAK;oBAAEI,MAAMJ,IAAII,IAAI;oBAAEC,SAASL,IAAIK,OAAO;oBAAER,OAAOG,IAAIH,KAAK;gBAAC;YAChE;QAEJ;IACF;IAGF,MAAMS,UAAU,MAAM,IAAIC,QAAgB,CAACC;QACzC5B,UAAU6B,MAAM,CAAC,GAAGjC,OAAOkC,QAAQ,EAAE;YACnC,MAAMC,OAAO/B,UAAUgC,OAAO;YAE9B,IAAID,QAAQ,OAAOA,SAAS,UAAU;gBACpCH,WAAWG,KAAKE,IAAI;YACtB;QACF;IACF;IAEA,OAAO;QACLP;QACA1B;QACAH;IACF;AACF"}

View File

@@ -0,0 +1,23 @@
import { filterReqHeaders, ipcForbiddenHeaders } from "./utils";
export const invokeRequest = async (targetUrl, requestInit, readableBody)=>{
const invokeHeaders = filterReqHeaders({
"cache-control": "",
...requestInit.headers
}, ipcForbiddenHeaders);
return await fetch(targetUrl, {
headers: invokeHeaders,
method: requestInit.method,
redirect: "manual",
signal: requestInit.signal,
...requestInit.method !== "GET" && requestInit.method !== "HEAD" && readableBody ? {
body: readableBody,
duplex: "half"
} : {},
next: {
// @ts-ignore
internal: true
}
});
};
//# sourceMappingURL=invoke-request.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/lib/server-ipc/invoke-request.ts"],"names":["filterReqHeaders","ipcForbiddenHeaders","invokeRequest","targetUrl","requestInit","readableBody","invokeHeaders","headers","fetch","method","redirect","signal","body","duplex","next","internal"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,mBAAmB,QAAQ,UAAS;AAE/D,OAAO,MAAMC,gBAAgB,OAC3BC,WACAC,aAKAC;IAEA,MAAMC,gBAAgBN,iBACpB;QACE,iBAAiB;QACjB,GAAGI,YAAYG,OAAO;IACxB,GACAN;IAGF,OAAO,MAAMO,MAAML,WAAW;QAC5BI,SAASD;QACTG,QAAQL,YAAYK,MAAM;QAC1BC,UAAU;QACVC,QAAQP,YAAYO,MAAM;QAE1B,GAAIP,YAAYK,MAAM,KAAK,SAC3BL,YAAYK,MAAM,KAAK,UACvBJ,eACI;YACEO,MAAMP;YACNQ,QAAQ;QACV,IACA,CAAC,CAAC;QAENC,MAAM;YACJ,aAAa;YACbC,UAAU;QACZ;IACF;AACF,EAAC"}

View File

@@ -0,0 +1,38 @@
import { PageNotFoundError } from "../../../shared/lib/utils";
import { invokeRequest } from "./invoke-request";
export const deserializeErr = (serializedErr)=>{
if (!serializedErr || typeof serializedErr !== "object" || !serializedErr.stack) {
return serializedErr;
}
let ErrorType = Error;
if (serializedErr.name === "PageNotFoundError") {
ErrorType = PageNotFoundError;
}
const err = new ErrorType(serializedErr.message);
err.stack = serializedErr.stack;
err.name = serializedErr.name;
err.digest = serializedErr.digest;
if (process.env.NEXT_RUNTIME !== "edge") {
const { decorateServerError } = require("next/dist/compiled/@next/react-dev-overlay/dist/middleware");
decorateServerError(err, serializedErr.source || "server");
}
return err;
};
export async function invokeIpcMethod({ fetchHostname = "localhost", method, args, ipcPort, ipcKey }) {
if (ipcPort) {
const res = await invokeRequest(`http://${fetchHostname}:${ipcPort}?key=${ipcKey}&method=${method}&args=${encodeURIComponent(JSON.stringify(args))}`, {
method: "GET",
headers: {}
});
const body = await res.text();
if (body.startsWith("{") && body.endsWith("}")) {
const parsedBody = JSON.parse(body);
if (parsedBody && typeof parsedBody === "object" && "err" in parsedBody && "stack" in parsedBody.err) {
throw deserializeErr(parsedBody.err);
}
return parsedBody;
}
}
}
//# sourceMappingURL=request-utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/lib/server-ipc/request-utils.ts"],"names":["PageNotFoundError","invokeRequest","deserializeErr","serializedErr","stack","ErrorType","Error","name","err","message","digest","process","env","NEXT_RUNTIME","decorateServerError","require","source","invokeIpcMethod","fetchHostname","method","args","ipcPort","ipcKey","res","encodeURIComponent","JSON","stringify","headers","body","text","startsWith","endsWith","parsedBody","parse"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,4BAA2B;AAC7D,SAASC,aAAa,QAAQ,mBAAkB;AAEhD,OAAO,MAAMC,iBAAiB,CAACC;IAC7B,IACE,CAACA,iBACD,OAAOA,kBAAkB,YACzB,CAACA,cAAcC,KAAK,EACpB;QACA,OAAOD;IACT;IACA,IAAIE,YAAiBC;IAErB,IAAIH,cAAcI,IAAI,KAAK,qBAAqB;QAC9CF,YAAYL;IACd;IAEA,MAAMQ,MAAM,IAAIH,UAAUF,cAAcM,OAAO;IAC/CD,IAAIJ,KAAK,GAAGD,cAAcC,KAAK;IAC/BI,IAAID,IAAI,GAAGJ,cAAcI,IAAI;IAC3BC,IAAYE,MAAM,GAAGP,cAAcO,MAAM;IAE3C,IAAIC,QAAQC,GAAG,CAACC,YAAY,KAAK,QAAQ;QACvC,MAAM,EAAEC,mBAAmB,EAAE,GAC3BC,QAAQ;QACVD,oBAAoBN,KAAKL,cAAca,MAAM,IAAI;IACnD;IACA,OAAOR;AACT,EAAC;AAED,OAAO,eAAeS,gBAAgB,EACpCC,gBAAgB,WAAW,EAC3BC,MAAM,EACNC,IAAI,EACJC,OAAO,EACPC,MAAM,EAOP;IACC,IAAID,SAAS;QACX,MAAME,MAAM,MAAMtB,cAChB,CAAC,OAAO,EAAEiB,cAAc,CAAC,EAAEG,QAAQ,KAAK,EAAEC,OAAO,QAAQ,EACvDH,OACD,MAAM,EAAEK,mBAAmBC,KAAKC,SAAS,CAACN,OAAO,CAAC,EACnD;YACED,QAAQ;YACRQ,SAAS,CAAC;QACZ;QAEF,MAAMC,OAAO,MAAML,IAAIM,IAAI;QAE3B,IAAID,KAAKE,UAAU,CAAC,QAAQF,KAAKG,QAAQ,CAAC,MAAM;YAC9C,MAAMC,aAAaP,KAAKQ,KAAK,CAACL;YAE9B,IACEI,cACA,OAAOA,eAAe,YACtB,SAASA,cACT,WAAWA,WAAWxB,GAAG,EACzB;gBACA,MAAMN,eAAe8B,WAAWxB,GAAG;YACrC;YACA,OAAOwB;QACT;IACF;AACF"}

View File

@@ -0,0 +1,30 @@
export const ipcForbiddenHeaders = [
"accept-encoding",
"keepalive",
"keep-alive",
"content-encoding",
"transfer-encoding",
// https://github.com/nodejs/undici/issues/1470
"connection",
// marked as unsupported by undici: https://github.com/nodejs/undici/blob/c83b084879fa0bb8e0469d31ec61428ac68160d5/lib/core/request.js#L354
"expect"
];
export const actionsForbiddenHeaders = [
...ipcForbiddenHeaders,
"content-length"
];
export const filterReqHeaders = (headers, forbiddenHeaders)=>{
// Some browsers are not matching spec and sending Content-Length: 0. This causes issues in undici
// https://github.com/nodejs/undici/issues/2046
if (headers["content-length"] && headers["content-length"] === "0") {
delete headers["content-length"];
}
for (const [key, value] of Object.entries(headers)){
if (forbiddenHeaders.includes(key) || !(Array.isArray(value) || typeof value === "string")) {
delete headers[key];
}
}
return headers;
};
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/lib/server-ipc/utils.ts"],"names":["ipcForbiddenHeaders","actionsForbiddenHeaders","filterReqHeaders","headers","forbiddenHeaders","key","value","Object","entries","includes","Array","isArray"],"mappings":"AAAA,OAAO,MAAMA,sBAAsB;IACjC;IACA;IACA;IACA;IACA;IACA,+CAA+C;IAC/C;IACA,2IAA2I;IAC3I;CACD,CAAA;AAED,OAAO,MAAMC,0BAA0B;OAClCD;IACH;CACD,CAAA;AAED,OAAO,MAAME,mBAAmB,CAC9BC,SACAC;IAEA,kGAAkG;IAClG,+CAA+C;IAC/C,IAAID,OAAO,CAAC,iBAAiB,IAAIA,OAAO,CAAC,iBAAiB,KAAK,KAAK;QAClE,OAAOA,OAAO,CAAC,iBAAiB;IAClC;IAEA,KAAK,MAAM,CAACE,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACL,SAAU;QAClD,IACEC,iBAAiBK,QAAQ,CAACJ,QAC1B,CAAEK,CAAAA,MAAMC,OAAO,CAACL,UAAU,OAAOA,UAAU,QAAO,GAClD;YACA,OAAOH,OAAO,CAACE,IAAI;QACrB;IACF;IACA,OAAOF;AACT,EAAC"}