openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
49 lines (48 loc) • 1.16 kB
JavaScript
//#region packages/terminal-core/src/stream-writer.ts
/** Detect broken pipe style stream errors. */
function isBrokenPipeError(err) {
const code = err?.code;
return code === "EPIPE" || code === "EIO";
}
/** Create a stream writer that stops writing after EPIPE/EIO. */
function createSafeStreamWriter(options = {}) {
let closed = false;
let notified = false;
const noteBrokenPipe = (err, stream) => {
if (notified) return;
notified = true;
options.onBrokenPipe?.(err, stream);
};
const handleError = (err, stream) => {
if (!isBrokenPipeError(err)) throw err;
closed = true;
noteBrokenPipe(err, stream);
return false;
};
const write = (stream, text) => {
if (closed) return false;
try {
options.beforeWrite?.();
} catch (err) {
return handleError(err, process.stderr);
}
try {
stream.write(text);
return !closed;
} catch (err) {
return handleError(err, stream);
}
};
const writeLine = (stream, text) => write(stream, `${text}\n`);
return {
write,
writeLine,
reset: () => {
closed = false;
notified = false;
},
isClosed: () => closed
};
}
//#endregion
export { createSafeStreamWriter as t };