import type BufferIO from "./BufferIO"; import { ProtocolBase } from "./Protocol"; import type Implementation from "./Implementation"; import TypedIO from "./TypedIO"; import { RequestBicoder } from "./Request"; import Response from "./Response"; export default function serveProtocol( bufferIO: BufferIO, protocol: Protocol, implementation: Implementation, ) { const Request = RequestBicoder(protocol); const typedIO = TypedIO(bufferIO, Request, Response); (async () => { while (true) { const readResult = await typedIO.read(); if (readResult === null) { return; } const request = readResult.message; const handler = implementation[request.method]; handler(...request.args).then((response) => typedIO.write({ id: request.id, data: protocol.methods[request.method as string].result.encode( response, ), }) ); } })(); }