-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathbuffer.ts
58 lines (49 loc) · 1.4 KB
/
buffer.ts
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import { Buffer } from 'node:buffer';
const INITIAL_SIZE = 4096;
export class ElasticBuffer {
private offset = 0;
private buffer?: Buffer;
private size = INITIAL_SIZE;
clear() {
this.offset = 0;
}
get empty() {
return this.offset === 0;
}
reserve(size: number) {
let length = this.buffer?.length || 0;
const offset = this.offset;
const available = length - offset;
if (available < size || !this.buffer) {
while (available + length < size)
length = Math.max(this.size, length << 1);
const buffer = Buffer.allocUnsafe(length << 1);
if (this.buffer) {
this.buffer.copy(buffer, 0, 0, offset);
}
this.buffer = buffer;
return buffer;
}
return this.buffer;
}
getBuffer(size: number) {
const offset = this.offset;
const buffer = this.reserve(size);
this.offset += size;
return buffer.subarray(offset, offset + size);
}
consume() {
const buffer = this.buffer?.subarray(0, this.offset);
if (buffer) {
this.size = Math.max(this.offset, INITIAL_SIZE) >> 1;
}
this.offset = 0;
this.buffer = undefined;
return buffer;
}
offer(buffer: Buffer) {
if (!this.buffer) {
this.buffer = buffer;
}
}
}