32 lines
966 B
TypeScript
32 lines
966 B
TypeScript
export interface JsonEnvelope<T> {
|
|
ok: boolean;
|
|
command: string;
|
|
data?: T;
|
|
error?: unknown;
|
|
}
|
|
|
|
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 (typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "EPIPE") {
|
|
process.exitCode = 0;
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|