29 lines
1.7 KiB
TypeScript
29 lines
1.7 KiB
TypeScript
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-07-12-p17-monitor-central-persistence.
|
|
// Responsibility: Environment-projected bootstrap for the independent central Monitor HTTP service.
|
|
import { createMonitorCentralService, createPostgresMonitorCentralStore, structuredMonitorCentralError } from "./src/monitor-central-persistence";
|
|
|
|
function requiredString(name: string): string {
|
|
const value = process.env[name];
|
|
if (!value) throw Object.assign(new Error(`${name} is required`), { code: "monitor_central_runtime_config_missing" });
|
|
return value;
|
|
}
|
|
|
|
function requiredPositiveInteger(name: string): number {
|
|
const value = Number(requiredString(name));
|
|
if (!Number.isSafeInteger(value) || value < 1) throw Object.assign(new Error(`${name} must be a positive integer`), { code: "monitor_central_runtime_config_invalid" });
|
|
return value;
|
|
}
|
|
|
|
try {
|
|
const databaseUrl = requiredString("DATABASE_URL");
|
|
const store = createPostgresMonitorCentralStore(databaseUrl, { poolMax: requiredPositiveInteger("MONITOR_CENTRAL_PG_POOL_MAX"), idleTimeoutSeconds: requiredPositiveInteger("MONITOR_CENTRAL_PG_IDLE_TIMEOUT_SECONDS") });
|
|
await store.migrate();
|
|
const service = createMonitorCentralService({ store, pageSize: requiredPositiveInteger("MONITOR_CENTRAL_PAGE_SIZE") });
|
|
const server = Bun.serve({ hostname: requiredString("MONITOR_CENTRAL_HOST"), port: requiredPositiveInteger("MONITOR_CENTRAL_PORT"), fetch: service.fetch });
|
|
console.log(JSON.stringify({ ok: true, service: "monitor-central", port: server.port, valuesRedacted: true }));
|
|
} catch (error) {
|
|
const structured = { ok: false, error: structuredMonitorCentralError(error), valuesRedacted: true };
|
|
console.log(JSON.stringify(structured));
|
|
process.exitCode = 2;
|
|
}
|