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;
  }
}