Files
pikasTech-unidesk/scripts/web-probe-sentinel-service.ts
T
2026-06-25 22:19:25 +08:00

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;
}