diff --git a/buffer.manager.ts b/buffer.manager.ts new file mode 100644 index 0000000..6434ece --- /dev/null +++ b/buffer.manager.ts @@ -0,0 +1,33 @@ +export class BufferManager { + + private buffer: Buffer; + + constructor( + private readonly maxBufferSize: number, + ) { + this.buffer = Buffer.alloc(0); + } + + hasRoom(chunk: Buffer): boolean { + return chunk.length + this.buffer.length <= this.maxBufferSize; + } + + append(chunk: Buffer) { + + if (!this.hasRoom(chunk)) { + throw new Error('Buffer overflow - data will be lost. Check hasRoom before calling'); + } + + this.buffer = Buffer.concat([this.buffer, chunk]); + } + + appendAndGetCompletedBuffer(chunk: Buffer): Buffer { + + const fillSize = this.maxBufferSize - this.buffer.length; + const completedBuffer = Buffer.concat([this.buffer, chunk.slice(0, fillSize)]); + + this.buffer = Buffer.from(chunk.slice(fillSize, chunk.length)); // ??? could be an issue + + return completedBuffer; + } +}