Initial boiler plate project

This commit is contained in:
2024-09-24 03:52:46 +00:00
parent 6120b2d6c3
commit 154b93e267
10034 changed files with 2079352 additions and 2 deletions

View File

@ -0,0 +1,4 @@
import type { ProxyFetchRequest, ProxyResponse } from './types';
export type FetchHandlerResult = Response | 'abort' | 'continue' | null | undefined;
export type FetchHandler = (testData: string, request: Request) => FetchHandlerResult | Promise<FetchHandlerResult>;
export declare function handleFetch(req: ProxyFetchRequest, onFetch: FetchHandler): Promise<ProxyResponse>;

View File

@ -0,0 +1,48 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "handleFetch", {
enumerable: true,
get: function() {
return handleFetch;
}
});
const _types = require("./types");
function buildRequest(req) {
const { request: proxyRequest } = req;
const { url, headers, body, ...options } = proxyRequest;
return new Request(url, {
...options,
headers: new Headers(headers),
body: body ? Buffer.from(body, "base64") : null
});
}
async function buildResponse(response) {
if (!response) {
return _types.UNHANDLED;
}
if (response === "abort") {
return _types.ABORT;
}
if (response === "continue") {
return _types.CONTINUE;
}
const { status, headers, body } = response;
return {
api: "fetch",
response: {
status,
headers: Array.from(headers),
body: body ? Buffer.from(await response.arrayBuffer()).toString("base64") : null
}
};
}
async function handleFetch(req, onFetch) {
const { testData } = req;
const request = buildRequest(req);
const response = await onFetch(testData, request);
return buildResponse(response);
}
//# sourceMappingURL=fetch-api.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/experimental/testmode/proxy/fetch-api.ts"],"names":["handleFetch","buildRequest","req","request","proxyRequest","url","headers","body","options","Request","Headers","Buffer","from","buildResponse","response","UNHANDLED","ABORT","CONTINUE","status","api","Array","arrayBuffer","toString","onFetch","testData"],"mappings":";;;;+BAmDsBA;;;eAAAA;;;uBAlDqB;AAc3C,SAASC,aAAaC,GAAsB;IAC1C,MAAM,EAAEC,SAASC,YAAY,EAAE,GAAGF;IAClC,MAAM,EAAEG,GAAG,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGC,SAAS,GAAGJ;IAC3C,OAAO,IAAIK,QAAQJ,KAAK;QACtB,GAAGG,OAAO;QACVF,SAAS,IAAII,QAAQJ;QACrBC,MAAMA,OAAOI,OAAOC,IAAI,CAACL,MAAM,YAAY;IAC7C;AACF;AAEA,eAAeM,cACbC,QAA4B;IAE5B,IAAI,CAACA,UAAU;QACb,OAAOC,gBAAS;IAClB;IACA,IAAID,aAAa,SAAS;QACxB,OAAOE,YAAK;IACd;IACA,IAAIF,aAAa,YAAY;QAC3B,OAAOG,eAAQ;IACjB;IAEA,MAAM,EAAEC,MAAM,EAAEZ,OAAO,EAAEC,IAAI,EAAE,GAAGO;IAClC,OAAO;QACLK,KAAK;QACLL,UAAU;YACRI;YACAZ,SAASc,MAAMR,IAAI,CAACN;YACpBC,MAAMA,OACFI,OAAOC,IAAI,CAAC,MAAME,SAASO,WAAW,IAAIC,QAAQ,CAAC,YACnD;QACN;IACF;AACF;AAEO,eAAetB,YACpBE,GAAsB,EACtBqB,OAAqB;IAErB,MAAM,EAAEC,QAAQ,EAAE,GAAGtB;IACrB,MAAMC,UAAUF,aAAaC;IAC7B,MAAMY,WAAW,MAAMS,QAAQC,UAAUrB;IACzC,OAAOU,cAAcC;AACvB"}

View File

@ -0,0 +1,3 @@
export { createProxyServer } from './server';
export type { FetchHandler, FetchHandlerResult } from './fetch-api';
export type * from './types';

View File

@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "createProxyServer", {
enumerable: true,
get: function() {
return _server.createProxyServer;
}
});
const _server = require("./server");
//# sourceMappingURL=index.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/experimental/testmode/proxy/index.ts"],"names":["createProxyServer"],"mappings":";;;;+BAASA;;;eAAAA,yBAAiB;;;wBAAQ"}

View File

@ -0,0 +1,5 @@
import type { ProxyServer } from './types';
import type { FetchHandler } from './fetch-api';
export declare function createProxyServer({ onFetch, }: {
onFetch?: FetchHandler;
}): Promise<ProxyServer>;

View File

@ -0,0 +1,85 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "createProxyServer", {
enumerable: true,
get: function() {
return createProxyServer;
}
});
const _http = /*#__PURE__*/ _interop_require_default(require("http"));
const _types = require("./types");
const _fetchapi = require("./fetch-api");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function readBody(req) {
const acc = [];
for await (const chunk of req){
acc.push(chunk);
}
return Buffer.concat(acc);
}
async function createProxyServer({ onFetch }) {
const server = _http.default.createServer(async (req, res)=>{
if (req.url !== "/") {
res.writeHead(404);
res.end();
return;
}
let json;
try {
json = JSON.parse((await readBody(req)).toString("utf-8"));
} catch (e) {
res.writeHead(400);
res.end();
return;
}
const { api } = json;
let response;
switch(api){
case "fetch":
if (onFetch) {
response = await (0, _fetchapi.handleFetch)(json, onFetch);
}
break;
default:
break;
}
if (!response) {
response = _types.UNHANDLED;
}
res.writeHead(200, {
"Content-Type": "application/json"
});
res.write(JSON.stringify(response));
res.end();
});
await new Promise((resolve)=>{
server.listen(0, "localhost", ()=>{
resolve(undefined);
});
});
const address = server.address();
if (!address || typeof address !== "object") {
server.close();
throw new Error("Failed to create a proxy server");
}
const port = address.port;
const fetchWith = (input, init, testData)=>{
const request = new Request(input, init);
request.headers.set("Next-Test-Proxy-Port", String(port));
request.headers.set("Next-Test-Data", testData ?? "");
return fetch(request);
};
return {
port,
close: ()=>server.close(),
fetchWith
};
}
//# sourceMappingURL=server.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/experimental/testmode/proxy/server.ts"],"names":["createProxyServer","readBody","req","acc","chunk","push","Buffer","concat","onFetch","server","http","createServer","res","url","writeHead","end","json","JSON","parse","toString","e","api","response","handleFetch","UNHANDLED","write","stringify","Promise","resolve","listen","undefined","address","close","Error","port","fetchWith","input","init","testData","request","Request","headers","set","String","fetch"],"mappings":";;;;+BAiBsBA;;;eAAAA;;;6DAjBL;uBAGS;0BAEE;;;;;;AAE5B,eAAeC,SAASC,GAAoB;IAC1C,MAAMC,MAAgB,EAAE;IAExB,WAAW,MAAMC,SAASF,IAAK;QAC7BC,IAAIE,IAAI,CAACD;IACX;IAEA,OAAOE,OAAOC,MAAM,CAACJ;AACvB;AAEO,eAAeH,kBAAkB,EACtCQ,OAAO,EAGR;IACC,MAAMC,SAASC,aAAI,CAACC,YAAY,CAAC,OAAOT,KAAKU;QAC3C,IAAIV,IAAIW,GAAG,KAAK,KAAK;YACnBD,IAAIE,SAAS,CAAC;YACdF,IAAIG,GAAG;YACP;QACF;QAEA,IAAIC;QACJ,IAAI;YACFA,OAAOC,KAAKC,KAAK,CAAC,AAAC,CAAA,MAAMjB,SAASC,IAAG,EAAGiB,QAAQ,CAAC;QACnD,EAAE,OAAOC,GAAG;YACVR,IAAIE,SAAS,CAAC;YACdF,IAAIG,GAAG;YACP;QACF;QAEA,MAAM,EAAEM,GAAG,EAAE,GAAGL;QAEhB,IAAIM;QACJ,OAAQD;YACN,KAAK;gBACH,IAAIb,SAAS;oBACXc,WAAW,MAAMC,IAAAA,qBAAW,EAACP,MAAMR;gBACrC;gBACA;YACF;gBACE;QACJ;QACA,IAAI,CAACc,UAAU;YACbA,WAAWE,gBAAS;QACtB;QAEAZ,IAAIE,SAAS,CAAC,KAAK;YAAE,gBAAgB;QAAmB;QACxDF,IAAIa,KAAK,CAACR,KAAKS,SAAS,CAACJ;QACzBV,IAAIG,GAAG;IACT;IAEA,MAAM,IAAIY,QAAQ,CAACC;QACjBnB,OAAOoB,MAAM,CAAC,GAAG,aAAa;YAC5BD,QAAQE;QACV;IACF;IAEA,MAAMC,UAAUtB,OAAOsB,OAAO;IAC9B,IAAI,CAACA,WAAW,OAAOA,YAAY,UAAU;QAC3CtB,OAAOuB,KAAK;QACZ,MAAM,IAAIC,MAAM;IAClB;IACA,MAAMC,OAAOH,QAAQG,IAAI;IAEzB,MAAMC,YAAsC,CAACC,OAAOC,MAAMC;QACxD,MAAMC,UAAU,IAAIC,QAAQJ,OAAOC;QACnCE,QAAQE,OAAO,CAACC,GAAG,CAAC,wBAAwBC,OAAOT;QACnDK,QAAQE,OAAO,CAACC,GAAG,CAAC,kBAAkBJ,YAAY;QAClD,OAAOM,MAAML;IACf;IAEA,OAAO;QAAEL;QAAMF,OAAO,IAAMvB,OAAOuB,KAAK;QAAIG;IAAU;AACxD"}

View File

@ -0,0 +1,43 @@
export interface ProxyServer {
readonly port: number;
fetchWith(input: string | URL, init?: RequestInit, testData?: string): Promise<Response>;
close(): void;
}
interface ProxyRequestBase {
testData: string;
api: string;
}
interface ProxyResponseBase {
api: string;
}
export interface ProxyUnhandledResponse extends ProxyResponseBase {
api: 'unhandled';
}
export interface ProxyAbortResponse extends ProxyResponseBase {
api: 'abort';
}
export interface ProxyContinueResponse extends ProxyResponseBase {
api: 'continue';
}
export interface ProxyFetchRequest extends ProxyRequestBase {
api: 'fetch';
request: {
url: string;
headers: Array<[string, string]>;
body: string | null;
} & Omit<RequestInit, 'headers' | 'body'>;
}
export interface ProxyFetchResponse extends ProxyResponseBase {
api: 'fetch';
response: {
status: number;
headers: Array<[string, string]>;
body: string | null;
};
}
export type ProxyRequest = ProxyFetchRequest;
export type ProxyResponse = ProxyUnhandledResponse | ProxyAbortResponse | ProxyContinueResponse | ProxyFetchResponse;
export declare const ABORT: ProxyResponse;
export declare const CONTINUE: ProxyResponse;
export declare const UNHANDLED: ProxyResponse;
export {};

View File

@ -0,0 +1,37 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
ABORT: null,
CONTINUE: null,
UNHANDLED: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
ABORT: function() {
return ABORT;
},
CONTINUE: function() {
return CONTINUE;
},
UNHANDLED: function() {
return UNHANDLED;
}
});
const ABORT = {
api: "abort"
};
const CONTINUE = {
api: "continue"
};
const UNHANDLED = {
api: "unhandled"
};
//# sourceMappingURL=types.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/experimental/testmode/proxy/types.ts"],"names":["ABORT","CONTINUE","UNHANDLED","api"],"mappings":";;;;;;;;;;;;;;;;IAyDaA,KAAK;eAALA;;IACAC,QAAQ;eAARA;;IACAC,SAAS;eAATA;;;AAFN,MAAMF,QAAuB;IAAEG,KAAK;AAAQ;AAC5C,MAAMF,WAA0B;IAAEE,KAAK;AAAW;AAClD,MAAMD,YAA2B;IAAEC,KAAK;AAAY"}