File size: 790 Bytes
5cb63c1 | 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 | import type net from "node:net";
export class SocketReader {
private buffered = Buffer.alloc(0);
private readonly waiters = new Set<() => void>();
constructor(socket: net.Socket) {
socket.on("data", (chunk) => {
this.buffered = Buffer.concat([
this.buffered,
Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk),
]);
for (const waiter of this.waiters) {
waiter();
}
this.waiters.clear();
});
}
async readExactly(length: number): Promise<Buffer> {
while (this.buffered.length < length) {
await new Promise<void>((resolve) => {
this.waiters.add(resolve);
});
}
const value = this.buffered.subarray(0, length);
this.buffered = this.buffered.subarray(length);
return value;
}
}
|