openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
78 lines (77 loc) • 2.02 kB
JavaScript
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 {};