mirror of
https://github.com/oven-sh/bun
synced 2026-02-02 15:08:46 +00:00
* Prepare for windows event loop * More progress * Update libuv.zig * wip * Make compiling each dependency a shell script * Bump mimalloc * Add the build scripts * Update settings.json * Fix a bunch of compiler warnings * Remove more warnings * more warnings * cmake works * Update JSSQLStatement.h * put it in the zig file * Fix usockets warnings * Fixup * Fix one of the compiler errors * chunk * draw the rest of the owl * theres more * Rename Process -> BunProcess Works around a Windows issue * Add musl polyfill for memmem on Windows * More * 12 mb * Fix getenvZ * fix variosu issues * Add fast-ish path for bun install on Windows * Update windows.zig * Update windows.zig * Fix build issue * it works * hmmm * Rename file * Fixups * Update wtf-bindings.cpp * Update src/bun.js/bindings/headers-handwritten.h Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com> * further! * more * Update .gitignore * hm * quite a lot of fixes * Update CMakeLists.txt * zig fmt * Many more things are starting to work. * reb * regenaret * Update JSSink.h * fixup * fetch works * Bun.serve() and much of the event loop works now * Make require() work * bun install progress * more things work * use less std.os * Fixes * small fixes * Bump * Bummp * Undo that change * We have to bump the version of Debian because libarchive has a higher minimum requirement * ok * some clenaup * windows * Update bun.zig * fixup * avoid duplicate symbols * avoid undefined symbols * bump * Remove issue template for install It's not used, and use the bug issue instead. * Add types for cp and cpSync * Add types for watchFile and unwatchFile * Add bun-types to 'bun fmt' script * Update nodejs compat docs cp/cpSync/watchFile/unwatchFile (#4525) * feat(fetch) rejectUnauthorized and checkServerIdentity (#4514) * enable root certs on fetch * rebase * fix lookup * some fixes and improvements * fmt * more fixes * more fixes * check detached onHandshake * fix promise case * fix cert non-Native * add fetch tls tests * more one test * churn * Update feature_flags.zig * Update response.zig * Revert "avoid undefined symbols" This reverts commitca835b726f. * Revert "avoid duplicate symbols" This reverts commit4ac6ca8700. * Update feature_flags.zig * Set permissions * more * Update mimalloc * Fix sqlite test failures * Fix some test failures * Make sure we remove libusockets is removed * hm * [dave]: fix webcrypto crash * bump * Update index.ts * windows zig compiles * cmake on mac works * progress * yay * bun run build * fix * ok * oops * asdfasfdafdsafda * fghjkl * git ignore * wow * Process -> BunProcess * hmm * blah * finalize merge * now it only has linker errors on mac * sdfadsf * g * getting farther * sxdcvbnmk, * adfhjskfjdhkas * a * fgh * update build dot zig * asdfg * theoretical -DCANARY flag we can use * asdf * cool * okay * colorterm * New build workflow * Fix script * Use sudo * More sudo * Tweak dependencies * Another sudo attempt * Tweak script * 16.0 -> 16 * Tweak script * Tweak script * Tweak script * Tweak script * Tweak script * bun install * ssh into github actions * add more to ssh * Fix postinstal * Skip llvm * New dockerfile * Build * More changes to Dockerfile * chaos chaos chaos * okay * a * more cmake nonsense * add unified sources code (does not work) * stuff * prepare for CI builds * ok * yay * yeah * make this more stable simply by trying again if it fails, 5 times, then lose. it fixes the stability issue i was running into L O L * messing with ci * x * a * clean dependencies before build * oops * this is not going to work but its closer * not gonna work either * a * a * did i do it * a * a * work around weird fs+Bun.build issues * properly pass debug flag correctly * idk im sorry * lose * maybe * run the tests please * a * fix zlib script * a * hi * prevent stupid ci issue * i totally didnt leave in a syntax error on cmakelists * a * lol * relax * 😭 * a * SO SILLY * 😡 one line mistake * one character diff * fix linking symbols missing * work on dependency scripts * does this work now? * fix mac build * a * bump! * woops * add macos baseline build * . * fix sqlite and also enable $assert/$debug support in builtin functions * okay * oops * zig upgrade lol * Merge * Fix spawn test issue * Set a timeout * yeah * etc * mi --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Co-authored-by: Dylan Conway <dylan.conway567@gmail.com> Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com> Co-authored-by: Ashcon Partovi <ashcon@partovi.net> Co-authored-by: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Co-authored-by: dave caruso <me@paperdave.net>
168 lines
5.0 KiB
TypeScript
168 lines
5.0 KiB
TypeScript
import { serve } from "bun";
|
|
|
|
// This is obviously incomplete but these are probably the most common status codes + the ones we need for testing
|
|
type ValidStatusCode = 200 | 201 | 400 | 404 | 405 | 500;
|
|
|
|
const defaultOpts = {
|
|
type: "json",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
status: 200,
|
|
};
|
|
|
|
const defaultResponseBodies = {
|
|
200: "OK",
|
|
201: "Created",
|
|
400: "Bad Request",
|
|
404: "Not Found",
|
|
405: "Method Not Allowed",
|
|
500: "Internal Server Error",
|
|
} as Record<ValidStatusCode, string>;
|
|
|
|
function getDefaultJSONBody(request: Request) {
|
|
return {
|
|
url: request.url,
|
|
method: request.method,
|
|
};
|
|
}
|
|
|
|
function makeTestJsonResponse(
|
|
request: Request,
|
|
opts: ResponseInit & { type?: "plaintext" | "json" } = { status: 200, type: "json" },
|
|
body?: { [k: string | number]: any } | string,
|
|
): Response {
|
|
const defaultJSONBody = getDefaultJSONBody(request);
|
|
|
|
let type = opts.type || "json";
|
|
let resBody;
|
|
let headers;
|
|
|
|
// Setup headers
|
|
|
|
if (!opts.headers) headers = new Headers();
|
|
|
|
if (!(opts.headers instanceof Headers)) headers = new Headers(opts.headers);
|
|
else headers = opts.headers;
|
|
|
|
switch (type) {
|
|
case "json":
|
|
if (typeof body === "object" && body !== null) {
|
|
resBody = JSON.stringify({ ...defaultJSONBody, ...body }) as string;
|
|
} else if (typeof body === "string") {
|
|
resBody = JSON.stringify({ ...defaultJSONBody, data: body }) as string;
|
|
} else {
|
|
resBody = JSON.stringify(defaultJSONBody) as string;
|
|
}
|
|
// Check to set headers
|
|
headers.set("Content-Type", "application/json");
|
|
break;
|
|
case "plaintext":
|
|
if (typeof body === "object") {
|
|
if (body === null) {
|
|
resBody = "";
|
|
} else {
|
|
resBody = JSON.stringify(body);
|
|
}
|
|
}
|
|
// Check to set headers
|
|
headers.set("Content-Type", "text/plain");
|
|
default:
|
|
}
|
|
|
|
return new Response(resBody as string, {
|
|
...defaultOpts,
|
|
...opts,
|
|
headers: { ...defaultOpts.headers, ...headers },
|
|
});
|
|
}
|
|
|
|
export function createServer() {
|
|
const server = serve({
|
|
port: 0,
|
|
fetch: async req => {
|
|
const { pathname, search } = new URL(req.url);
|
|
const lowerPath = pathname.toLowerCase();
|
|
|
|
let response: Response;
|
|
switch (lowerPath.match(/\/\w+/)?.[0] || "") {
|
|
// START HTTP METHOD ROUTES
|
|
case "/get":
|
|
if (req.method.toUpperCase() !== "GET") {
|
|
response = makeTestJsonResponse(req, { status: 405 });
|
|
break;
|
|
}
|
|
if (search !== "") {
|
|
const params = new URLSearchParams(search);
|
|
const args = {} as Record<string, string | number>;
|
|
params.forEach((v, k) => {
|
|
if (!isNaN(parseInt(v))) {
|
|
args[k] = parseInt(v);
|
|
} else {
|
|
args[k] = v;
|
|
}
|
|
});
|
|
response = makeTestJsonResponse(req, { status: 200 }, { args });
|
|
break;
|
|
}
|
|
// Normal case
|
|
response = makeTestJsonResponse(req);
|
|
break;
|
|
case "/post":
|
|
if (req.method.toUpperCase() !== "POST") {
|
|
response = makeTestJsonResponse(req, { status: 405 });
|
|
break;
|
|
}
|
|
response = makeTestJsonResponse(req, { status: 201, type: "json" }, await req.text());
|
|
break;
|
|
case "/head":
|
|
if (req.method.toUpperCase() !== "HEAD") {
|
|
response = makeTestJsonResponse(req, { status: 405 });
|
|
break;
|
|
}
|
|
response = makeTestJsonResponse(req, { status: 200 });
|
|
break;
|
|
|
|
// END HTTP METHOD ROUTES
|
|
|
|
case "/status":
|
|
// Parse the status from URL path params: /status/200
|
|
const rawStatus = lowerPath.split("/").filter(Boolean)[1];
|
|
if (rawStatus) {
|
|
const status = parseInt(rawStatus);
|
|
if (!isNaN(status) && status > 100 && status < 599) {
|
|
response = makeTestJsonResponse(
|
|
req,
|
|
{ status },
|
|
{ data: defaultResponseBodies[(status || 200) as ValidStatusCode] },
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
response = makeTestJsonResponse(req, { status: 400 }, { data: "Invalid status" });
|
|
break;
|
|
case "/delay":
|
|
const rawDelay = lowerPath.split("/").filter(Boolean)[1];
|
|
if (rawDelay) {
|
|
const delay = parseInt(rawDelay);
|
|
if (!isNaN(delay) && delay >= 0) {
|
|
await Bun.sleep(delay * 1000);
|
|
response = makeTestJsonResponse(req, { status: 200 }, { data: "Delayed" });
|
|
break;
|
|
}
|
|
}
|
|
response = makeTestJsonResponse(req, { status: 400 }, { data: "Invalid delay" });
|
|
break;
|
|
case "/headers":
|
|
response = makeTestJsonResponse(req, { status: 200 }, { headers: req.headers });
|
|
break;
|
|
default:
|
|
response = makeTestJsonResponse(req, { status: 404 });
|
|
}
|
|
|
|
return response;
|
|
},
|
|
});
|
|
return server;
|
|
}
|