/// import { io, writeAll } from "../../deps.ts"; import type { ExtractType } from "./types.ts"; export class IPC { lines: AsyncIterableIterator; writer: Deno.Writer; constructor({ reader, writer }: { reader: Deno.Reader; writer: Deno.Writer; }) { this.lines = io.readLines(reader); this.writer = writer; } async recvType( type: K, ): Promise> { const data = await this.recv(); if (data.type !== type) { throw new Error(`Unexpected type: ${data.type}`); } return data as ExtractType; } async recv(): Promise { const result = await this.lines.next(); if (!result.done) { return JSON.parse(result.value); } throw new Error("EOF"); } async send(data: T) { await writeAll( this.writer, new TextEncoder().encode(JSON.stringify(data) + "\n"), ); } }