feat: add web probe sentinel service (#896)
Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
#!/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;
|
||||
}
|
||||
Reference in New Issue
Block a user