()
| 35 | } |
| 36 | |
| 37 | function makeBufferParser() { |
| 38 | let pos = 0; |
| 39 | let buffer; |
| 40 | |
| 41 | const self = { |
| 42 | init: (buf, start) => { |
| 43 | buffer = buf; |
| 44 | pos = (typeof start === 'number' ? start : 0); |
| 45 | }, |
| 46 | pos: () => pos, |
| 47 | length: () => (buffer ? buffer.length : 0), |
| 48 | avail: () => (buffer && pos < buffer.length ? buffer.length - pos : 0), |
| 49 | clear: () => { |
| 50 | buffer = undefined; |
| 51 | }, |
| 52 | readUInt32BE: () => { |
| 53 | if (!buffer || pos + 3 >= buffer.length) |
| 54 | return; |
| 55 | return (buffer[pos++] * 16777216) |
| 56 | + (buffer[pos++] * 65536) |
| 57 | + (buffer[pos++] * 256) |
| 58 | + buffer[pos++]; |
| 59 | }, |
| 60 | readUInt64BE: (behavior) => { |
| 61 | if (!buffer || pos + 7 >= buffer.length) |
| 62 | return; |
| 63 | switch (behavior) { |
| 64 | case 'always': |
| 65 | return BigInt(`0x${buffer.hexSlice(pos, pos += 8)}`); |
| 66 | case 'maybe': |
| 67 | if (buffer[pos] > 0x1F) |
| 68 | return BigInt(`0x${buffer.hexSlice(pos, pos += 8)}`); |
| 69 | // FALLTHROUGH |
| 70 | default: |
| 71 | return (buffer[pos++] * 72057594037927940) |
| 72 | + (buffer[pos++] * 281474976710656) |
| 73 | + (buffer[pos++] * 1099511627776) |
| 74 | + (buffer[pos++] * 4294967296) |
| 75 | + (buffer[pos++] * 16777216) |
| 76 | + (buffer[pos++] * 65536) |
| 77 | + (buffer[pos++] * 256) |
| 78 | + buffer[pos++]; |
| 79 | } |
| 80 | }, |
| 81 | skip: (n) => { |
| 82 | if (buffer && n > 0) |
| 83 | pos += n; |
| 84 | }, |
| 85 | skipString: () => { |
| 86 | const len = self.readUInt32BE(); |
| 87 | if (len === undefined) |
| 88 | return; |
| 89 | pos += len; |
| 90 | return (pos <= buffer.length ? len : undefined); |
| 91 | }, |
| 92 | readByte: () => { |
| 93 | if (buffer && pos < buffer.length) |
| 94 | return buffer[pos++]; |
no test coverage detected
searching dependent graphs…