54 lines
1.0 KiB
TypeScript
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;
|
||
|
|
}
|