feat: complete TASK-WP0-07 supervisor

This commit is contained in:
suyx
2026-07-27 23:28:36 +08:00
parent 2dd6f5c2c2
commit 096a1f1279
22 changed files with 1717 additions and 6 deletions
+46
View File
@@ -0,0 +1,46 @@
import { createConnection } from "node:net";
const API_CREDENTIALS = ["Dada/P0A/api/resend", "Dada/P0A/api/amap"] as const;
export async function receiveApiCredentials(input: NodeJS.ReadableStream = process.stdin) {
const chunks: Buffer[] = [];
for await (const chunk of input) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
const payload = Buffer.concat(chunks);
try {
const parsed = JSON.parse(payload.toString("utf8")) as Record<string, unknown>;
const names = Object.keys(parsed).sort();
const expected = [...API_CREDENTIALS].sort();
if (names.length !== expected.length || names.some((name, index) => name !== expected[index])) {
throw new Error("API credential channel contains an unexpected credential scope.");
}
if (expected.some((name) => typeof parsed[name] !== "string" || parsed[name] === "")) {
throw new Error("API credential channel contains an invalid credential value.");
}
return parsed as Record<(typeof API_CREDENTIALS)[number], string>;
} finally {
payload.fill(0);
for (const chunk of chunks) chunk.fill(0);
chunks.length = 0;
}
}
export function initializeApiCredentialClients(credentials: Record<(typeof API_CREDENTIALS)[number], string>) {
const configured = API_CREDENTIALS.every((name) => credentials[name].length > 0);
for (const name of API_CREDENTIALS) credentials[name] = "";
if (!configured) throw new Error("API credential client initialization failed.");
}
export function attachApiSupervisorControl(pipeName: string, shutdown: () => Promise<void>) {
const socket = createConnection(`\\\\.\\pipe\\${pipeName}`);
let pending = "";
socket.setEncoding("utf8");
socket.on("connect", () => socket.write("ready\n"));
socket.on("data", (chunk) => {
pending += chunk;
if (!pending.includes("\n")) return;
const [command] = pending.split("\n", 1);
pending = "";
if (command === "shutdown") void shutdown().finally(() => socket.end());
});
return socket;
}