Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 37 additions & 38 deletions packages/util/src/FlexibleBuffer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ interface IBufferJson {

interface IFlexibleBuffer {
readonly length: number
clear(): void
push(value: ArrayLike<number>): void
toBuffer(): Buffer
toArray(): IBufferRawData
clear(): void
toBuffer(): Buffer
toJSON(): IBufferJson
}

Expand All @@ -23,82 +23,81 @@ export abstract class FlexibleBuffer implements IFlexibleBuffer {
: new ArrayFlexibleBuffer();
}

static flexible(): FlexibleBuffer { return new ArrayFlexibleBuffer(); }

static fixed(size: number): FlexibleBuffer { return new BufferFlexibleBuffer(size); }

static flexible(): FlexibleBuffer { return new ArrayFlexibleBuffer(); }

abstract readonly length: number
abstract clear(): void
abstract push(value: ArrayLike<number>): void
abstract toBuffer(): Buffer
abstract toArray(): IBufferRawData
abstract clear(): void
abstract toBuffer(): Buffer
abstract toJSON(): IBufferJson
}

class BufferFlexibleBuffer extends FlexibleBuffer {
constructor(readonly size: number) {
super();
this._buffer = Buffer.alloc(size);
}

private readonly _buffer: Buffer;
private _index: number = 0;
class ArrayFlexibleBuffer extends FlexibleBuffer {
private readonly _array: Uint8Array[] = [];
private _length = 0;

get length(): number {
return this._index;
return this._length;
}

push(value: ArrayLike<number>) {
this._buffer.set(value, this._index);
this._index += value.length;
clear(): void {
this._length = this._array.length = 0;
}

toBuffer(): Buffer {
return this._buffer;
push(value: ArrayLike<number>): void {
if (!isUint8Array(value)) value = new Uint8Array(value);
this._array.push(value as Uint8Array);
this._length += value.length;
}

toArray(): IBufferRawData {
return this.toJSON().data;
}

clear(): void {
this._buffer.fill(0);
this._index = 0;
toBuffer(): Buffer {
return Buffer.concat(this._array, this._length);
}

toJSON(): IBufferJson {
return this._buffer.toJSON();
return this.toBuffer().toJSON();
}
}

class ArrayFlexibleBuffer extends FlexibleBuffer {
private readonly _array: Uint8Array[] = [];
private _length = 0;
class BufferFlexibleBuffer extends FlexibleBuffer {
constructor(readonly size: number) {
super();
this._buffer = Buffer.alloc(size);
}

private readonly _buffer: Buffer;
private _index: number = 0;

get length(): number {
return this._length;
return this._index;
}

push(value: ArrayLike<number>): void {
if (!isUint8Array(value)) value = new Uint8Array(value);
this._array.push(value as Uint8Array);
this._length += value.length;
clear(): void {
this._buffer.fill(0);
this._index = 0;
}

toBuffer(): Buffer {
return Buffer.concat(this._array, this._length);
push(value: ArrayLike<number>) {
this._buffer.set(value, this._index);
this._index += value.length;
}

toArray(): IBufferRawData {
return this.toJSON().data;
}

clear(): void {
this._array.length = 0;
this._length = 0;
toBuffer(): Buffer {
return this._buffer;
}

toJSON(): IBufferJson {
return this.toBuffer().toJSON();
return this._buffer.toJSON();
}
}
Loading