import type { Transport, OpenOptions } from "./interface"; export class WebSerial implements Transport { constructor(private port: SerialPort) {} private reader?: ReadableStreamDefaultReader; private writer?: WritableStreamDefaultWriter; async open(options: OpenOptions): Promise { await this.port.open({ baudRate: options.baudRate, }); if (this.port.readable) { this.reader = this.port.readable.getReader(); } if (this.port.writable) { this.writer = this.port.writable.getWriter(); } } async close(): Promise { if (this.port.readable && this.reader) { await this.reader.cancel(); this.reader.releaseLock(); } if (this.port.writable && this.writer) { await this.writer.close(); this.writer.releaseLock(); } await this.port.close(); } async read(): Promise { if (!this.reader) throw new Error("reader not initialized"); while (this.port.readable && this.port.readable.locked) { const { value, done } = await this.reader.read(); if (done) { break; } if (value) { return Buffer.from(value); } } throw new Error("read failed"); } async write(data: Buffer): Promise { if (!this.writer) throw new Error("writer not initialized"); await this.writer.write(data); } }