feat: 添加 CaseRun native 热重载
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import { listNativeCases, readNativeEvents, readNativeRun, startNativeRun } from "./caserun-native-fixtures";
|
||||
|
||||
const port = Number(process.env.HWLAB_CASERUN_NATIVE_PORT || 4316);
|
||||
const hostname = process.env.HWLAB_CASERUN_NATIVE_HOST || "127.0.0.1";
|
||||
|
||||
function json(data: unknown, status = 200): Response {
|
||||
return Response.json(data, { status, headers: { "cache-control": "no-store" } });
|
||||
}
|
||||
|
||||
function notFound(kind: string, id?: string): Response {
|
||||
return json({ ok: false, mode: "native-test", error: { code: `${kind}-not-found`, message: id ? `${kind} ${id} not found` : `${kind} not found` } }, 404);
|
||||
}
|
||||
|
||||
function authSession(): Record<string, unknown> {
|
||||
return {
|
||||
ok: true,
|
||||
authenticated: true,
|
||||
mode: "native-test",
|
||||
sessionKind: "native-test",
|
||||
user: { id: "native-admin", username: "native-admin", displayName: "Native Admin", role: "admin", status: "active" },
|
||||
capabilities: { admin: "available" },
|
||||
access: { nav: { profileId: "native-test", allowedIds: ["*"], valuesRedacted: true } },
|
||||
valuesRedacted: true
|
||||
};
|
||||
}
|
||||
|
||||
const server = Bun.serve({
|
||||
hostname,
|
||||
port,
|
||||
development: true,
|
||||
async fetch(request) {
|
||||
const url = new URL(request.url);
|
||||
if (request.method === "GET" && url.pathname === "/health") return json({ ok: true, mode: "native-test" });
|
||||
if (request.method === "POST" && url.pathname === "/auth/login") {
|
||||
return Response.json(authSession(), { headers: { "cache-control": "no-store", "set-cookie": "hwlab_session=native-test; Path=/; HttpOnly; SameSite=Lax" } });
|
||||
}
|
||||
if (request.method === "GET" && url.pathname === "/auth/session") return json(authSession());
|
||||
if (request.method === "GET" && url.pathname === "/v1/caserun/cases") return json(listNativeCases());
|
||||
if (request.method === "POST" && url.pathname === "/v1/caserun/runs") {
|
||||
const body = await request.json().catch(() => null) as { caseId?: string } | null;
|
||||
if (!body?.caseId) return json({ ok: false, mode: "native-test", error: { code: "case-id-required", message: "caseId is required" } }, 400);
|
||||
const run = startNativeRun(body.caseId);
|
||||
return run ? json(run, 202) : notFound("case", body.caseId);
|
||||
}
|
||||
const eventsMatch = url.pathname.match(/^\/v1\/caserun\/runs\/([^/]+)\/events$/);
|
||||
if (request.method === "GET" && eventsMatch) {
|
||||
const runId = decodeURIComponent(eventsMatch[1]);
|
||||
const events = readNativeEvents(runId);
|
||||
return events ? json(events) : notFound("run", runId);
|
||||
}
|
||||
const runMatch = url.pathname.match(/^\/v1\/caserun\/runs\/([^/]+)$/);
|
||||
if (request.method === "GET" && runMatch) {
|
||||
const runId = decodeURIComponent(runMatch[1]);
|
||||
const run = readNativeRun(runId);
|
||||
return run ? json(run) : notFound("run", runId);
|
||||
}
|
||||
return notFound("route", url.pathname);
|
||||
}
|
||||
});
|
||||
|
||||
console.log(JSON.stringify({ event: "caserun-native-listening", mode: "native-test", hostname: server.hostname, port: server.port }));
|
||||
Reference in New Issue
Block a user