UNPKG

1.28 kBJavaScriptView Raw
1const max = 65536
2const cache = {}
3
4// in node 6 Buffer.subarray returns a Uint8Array instead of a Buffer
5// later versions return a Buffer
6// alternative is Buffer.slice but that creates a new buffer
7// creating new buffers takes time
8// SubOk is only false on node < 8
9const SubOk = Buffer.isBuffer(Buffer.from([1, 2]).subarray(0, 1))
10
11function generateBuffer (i) {
12 const buffer = Buffer.allocUnsafe(2)
13 buffer.writeUInt8(i >> 8, 0)
14 buffer.writeUInt8(i & 0x00FF, 0 + 1)
15
16 return buffer
17}
18
19function generateCache () {
20 for (let i = 0; i < max; i++) {
21 cache[i] = generateBuffer(i)
22 }
23}
24
25function genBufVariableByteInt (num) {
26 const maxLength = 4 // max 4 bytes
27 let digit = 0
28 let pos = 0
29 const buffer = Buffer.allocUnsafe(maxLength)
30
31 do {
32 digit = num % 128 | 0
33 num = num / 128 | 0
34 if (num > 0) digit = digit | 0x80
35
36 buffer.writeUInt8(digit, pos++)
37 } while (num > 0 && pos < maxLength)
38
39 if (num > 0) {
40 pos = 0
41 }
42
43 return SubOk ? buffer.subarray(0, pos) : buffer.slice(0, pos)
44}
45
46function generate4ByteBuffer (num) {
47 const buffer = Buffer.allocUnsafe(4)
48 buffer.writeUInt32BE(num, 0)
49 return buffer
50}
51
52module.exports = {
53 cache,
54 generateCache,
55 generateNumber: generateBuffer,
56 genBufVariableByteInt,
57 generate4ByteBuffer
58}