Files
2026-03-25 14:14:07 +01:00

54 lines
1.0 KiB
TypeScript

class BufferBuilder {
private _pieces: number[];
private readonly _parts: ArrayBufferView[];
constructor() {
this._pieces = [];
this._parts = [];
}
append_buffer(data: ArrayBufferView) {
this.flush();
this._parts.push(data);
}
append(data: number) {
this._pieces.push(data);
}
flush() {
if (this._pieces.length > 0) {
const buf = new Uint8Array(this._pieces);
this._parts.push(buf);
this._pieces = [];
}
}
private encoder = new TextEncoder();
public toArrayBuffer() {
const buffer = [];
for (const part of this._parts) {
buffer.push(part);
}
return concatArrayBuffers(buffer).buffer;
}
}
export { BufferBuilder };
function concatArrayBuffers(bufs: ArrayBufferView[]) {
let size = 0;
for (const buf of bufs) {
size += buf.byteLength;
}
const result = new Uint8Array(size);
let offset = 0;
for (const buf of bufs) {
const view = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
result.set(view, offset);
offset += buf.byteLength;
}
return result;
}