File size: 1,356 Bytes
4e23b01 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /**
* IPC wire framing — newline-delimited JSON over a `node:net` stream. One
* socket multiplexes RPC `call`s and event `listen`s: `hello`/`call`/
* `listen`/`unlisten` go out, `ready`/`result`/`error`/`listen_result`/
* `event` come back.
*/
/** One NDJSON message. `type` discriminates; other fields depend on it. */
export interface IpcFrame {
readonly type: string;
readonly id?: string;
readonly scope?: string;
readonly service?: string;
readonly method?: string;
readonly arg?: unknown;
readonly workspaceId?: string;
readonly sessionId?: string;
readonly agentId?: string;
readonly event?: string;
readonly token?: string;
readonly code?: number;
readonly msg?: string;
readonly data?: unknown;
}
export function encodeFrame(frame: IpcFrame): string {
return `${JSON.stringify(frame)}\n`;
}
/** Incremental NDJSON decoder; malformed lines are dropped. */
export class NdjsonDecoder {
private buffer = '';
push(chunk: string): IpcFrame[] {
this.buffer += chunk;
const lines = this.buffer.split('\n');
this.buffer = lines.pop() ?? '';
const frames: IpcFrame[] = [];
for (const line of lines) {
if (line.length === 0) continue;
try {
frames.push(JSON.parse(line) as IpcFrame);
} catch {
// drop malformed frames
}
}
return frames;
}
}
|