46205321bf
Co-authored-by: Codex <codex@noreply.local>
62 lines
2.2 KiB
TypeScript
62 lines
2.2 KiB
TypeScript
#!/usr/bin/env bun
|
|
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-25-p0-web-probe-sentinel.
|
|
// Responsibility: Bun entrypoint for the web-probe sentinel HTTP wrapper service.
|
|
import { hwlabRuntimeLaneSpecForNode, isHwlabRuntimeLane } from "./src/hwlab-node-lanes";
|
|
import { createWebProbeSentinelService, startWebProbeSentinelHttpService } from "./src/hwlab-node-web-sentinel-service";
|
|
|
|
const args = process.argv.slice(2);
|
|
const node = requiredOption("--node");
|
|
const lane = requiredOption("--lane");
|
|
if (!isHwlabRuntimeLane(lane)) throw new Error(`web-probe sentinel service only supports HWLAB runtime lanes, got ${lane}`);
|
|
const spec = hwlabRuntimeLaneSpecForNode(lane, node);
|
|
const stateRootOverride = optionValue("--state-root");
|
|
const hostOverride = optionValue("--host");
|
|
const portRaw = optionValue("--port");
|
|
const portOverride = portRaw === undefined ? undefined : Number(portRaw);
|
|
if (portOverride !== undefined && (!Number.isInteger(portOverride) || portOverride <= 0 || portOverride > 65535)) throw new Error("--port must be 1-65535");
|
|
const schedulerEnabled = !args.includes("--scheduler-disabled");
|
|
const service = createWebProbeSentinelService({ spec, stateRootOverride, hostOverride, portOverride, schedulerEnabled });
|
|
|
|
if (args.includes("--once")) {
|
|
const health = service.health();
|
|
console.log(JSON.stringify(health, null, 2));
|
|
service.close();
|
|
process.exit(health.ok === true ? 0 : 1);
|
|
}
|
|
|
|
const server = startWebProbeSentinelHttpService(service);
|
|
console.log(JSON.stringify({
|
|
ok: true,
|
|
command: "web-probe-sentinel-service",
|
|
node,
|
|
lane,
|
|
url: server.url,
|
|
schedulerEnabled,
|
|
health: service.health(),
|
|
valuesRedacted: true,
|
|
}, null, 2));
|
|
|
|
process.on("SIGTERM", () => {
|
|
server.stop();
|
|
service.close();
|
|
process.exit(0);
|
|
});
|
|
process.on("SIGINT", () => {
|
|
server.stop();
|
|
service.close();
|
|
process.exit(0);
|
|
});
|
|
|
|
await new Promise(() => undefined);
|
|
|
|
function optionValue(name: string): string | undefined {
|
|
const index = args.indexOf(name);
|
|
return index === -1 ? undefined : args[index + 1];
|
|
}
|
|
|
|
function requiredOption(name: string): string {
|
|
const value = optionValue(name);
|
|
if (value === undefined || value.length === 0) throw new Error(`${name} is required`);
|
|
return value;
|
|
}
|