Files
pikasTech-unidesk/scripts/src/output.ts
T

43 lines
1.2 KiB
TypeScript

export interface JsonEnvelope<T> {
ok: boolean;
command: string;
data?: T;
error?: unknown;
}
function isEpipe(error: unknown): boolean {
return typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "EPIPE";
}
process.stdout.on("error", (error) => {
if (isEpipe(error)) process.exit(0);
throw error;
});
process.stderr.on("error", (error) => {
if (isEpipe(error)) process.exit(0);
throw error;
});
export function emitJson<T>(command: string, data: T, ok = true): void {
const envelope: JsonEnvelope<T> = { ok, command, data };
safeStdoutWrite(`${JSON.stringify(envelope, null, 2)}\n`);
}
export function emitError(command: string, error: unknown): void {
const payload = error instanceof Error
? { name: error.name, message: error.message, stack: error.stack ?? null }
: { message: String(error) };
const envelope: JsonEnvelope<never> = { ok: false, command, error: payload };
safeStdoutWrite(`${JSON.stringify(envelope, null, 2)}\n`);
}
function safeStdoutWrite(text: string): void {
try {
process.stdout.write(text);
} catch (error) {
if (isEpipe(error)) process.exit(0);
throw error;
}
}