UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

78 lines (77 loc) • 2.02 kB
import { t as decodeTerminalPtyControl } from "../terminal-pty-protocol-C3csg-5h.mjs"; import { n as spawnTerminalPty } from "../terminal-pty-CoEQF0mY.mjs"; //#region src/process/terminal-pty-worker.ts let pty; let starting = false; let parentLost = false; let finished = false; function report(message, done) { if (!process.connected) { done?.(); return; } process.send?.(message, () => done?.()); } function finish(message) { if (finished) return; finished = true; pty?.kill(); process.stdout.end(() => { report(message, () => { if (process.connected) process.disconnect?.(); }); }); } function close() { parentLost = true; pty?.kill(); } process.once("disconnect", close); process.once("SIGTERM", close); process.once("SIGINT", close); process.stdout.on("error", close); process.stdout.on("drain", () => pty?.resume()); process.on("message", (raw) => { const message = decodeTerminalPtyControl(raw); if (!message) { finish({ type: "error", message: "Invalid terminal host message" }); return; } if (message.type === "start") { if (starting || parentLost) return; starting = true; if (process.versions.bun) { finish({ type: "error", message: "Terminal worker requires Node; PATH resolves node to Bun." }); return; } spawnTerminalPty(message.params).then((handle) => { pty = handle; pty.onData((data) => { if (!process.stdout.write(data)) handle.pause(); }); pty.onExit((event) => finish({ type: "exit", ...event })); if (parentLost || finished) pty.kill(); else report({ type: "ready", pid: pty.pid }); }, (error) => finish({ type: "error", message: error instanceof Error ? error.message : String(error) })); } else if (message.type === "input") pty?.write("data" in message ? message.data : Buffer.from(message.dataBase64, "base64")); else if (message.type === "resize") pty?.resize(message.cols, message.rows); else pty?.kill(message.signal); }); report({ type: "boot" }); //#endregion export {};