'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var token = require('./token.js'); var common = require('./common.js'); const uintBoundaries = [ 24, 256, 65536, 4294967296, BigInt('18446744073709551616') ]; function readUint8(data, offset, options) { common.assertEnoughData(data, offset, 1); const value = data[offset]; if (options.strict === true && value < uintBoundaries[0]) { throw new Error(`${ common.decodeErrPrefix } integer encoded in more bytes than necessary (strict decode)`); } return value; } function readUint16(data, offset, options) { common.assertEnoughData(data, offset, 2); const value = data[offset] << 8 | data[offset + 1]; if (options.strict === true && value < uintBoundaries[1]) { throw new Error(`${ common.decodeErrPrefix } integer encoded in more bytes than necessary (strict decode)`); } return value; } function readUint32(data, offset, options) { common.assertEnoughData(data, offset, 4); const value = data[offset] * 16777216 + (data[offset + 1] << 16) + (data[offset + 2] << 8) + data[offset + 3]; if (options.strict === true && value < uintBoundaries[2]) { throw new Error(`${ common.decodeErrPrefix } integer encoded in more bytes than necessary (strict decode)`); } return value; } function readUint64(data, offset, options) { common.assertEnoughData(data, offset, 8); const hi = data[offset] * 16777216 + (data[offset + 1] << 16) + (data[offset + 2] << 8) + data[offset + 3]; const lo = data[offset + 4] * 16777216 + (data[offset + 5] << 16) + (data[offset + 6] << 8) + data[offset + 7]; const value = (BigInt(hi) << BigInt(32)) + BigInt(lo); if (options.strict === true && value < uintBoundaries[3]) { throw new Error(`${ common.decodeErrPrefix } integer encoded in more bytes than necessary (strict decode)`); } if (value <= Number.MAX_SAFE_INTEGER) { return Number(value); } if (options.allowBigInt === true) { return value; } throw new Error(`${ common.decodeErrPrefix } integers outside of the safe integer range are not supported`); } function decodeUint8(data, pos, _minor, options) { return new token.Token(token.Type.uint, readUint8(data, pos + 1, options), 2); } function decodeUint16(data, pos, _minor, options) { return new token.Token(token.Type.uint, readUint16(data, pos + 1, options), 3); } function decodeUint32(data, pos, _minor, options) { return new token.Token(token.Type.uint, readUint32(data, pos + 1, options), 5); } function decodeUint64(data, pos, _minor, options) { return new token.Token(token.Type.uint, readUint64(data, pos + 1, options), 9); } function encodeUint(buf, token) { return encodeUintValue(buf, 0, token.value); } function encodeUintValue(buf, major, uint) { if (uint < uintBoundaries[0]) { const nuint = Number(uint); buf.push([major | nuint]); } else if (uint < uintBoundaries[1]) { const nuint = Number(uint); buf.push([ major | 24, nuint ]); } else if (uint < uintBoundaries[2]) { const nuint = Number(uint); buf.push([ major | 25, nuint >>> 8, nuint & 255 ]); } else if (uint < uintBoundaries[3]) { const nuint = Number(uint); buf.push([ major | 26, nuint >>> 24 & 255, nuint >>> 16 & 255, nuint >>> 8 & 255, nuint & 255 ]); } else { const buint = BigInt(uint); if (buint < uintBoundaries[4]) { const set = [ major | 27, 0, 0, 0, 0, 0, 0, 0 ]; let lo = Number(buint & BigInt(4294967295)); let hi = Number(buint >> BigInt(32) & BigInt(4294967295)); set[8] = lo & 255; lo = lo >> 8; set[7] = lo & 255; lo = lo >> 8; set[6] = lo & 255; lo = lo >> 8; set[5] = lo & 255; set[4] = hi & 255; hi = hi >> 8; set[3] = hi & 255; hi = hi >> 8; set[2] = hi & 255; hi = hi >> 8; set[1] = hi & 255; buf.push(set); } else { throw new Error(`${ common.decodeErrPrefix } encountered BigInt larger than allowable range`); } } } encodeUint.encodedSize = function encodedSize(token) { return encodeUintValue.encodedSize(token.value); }; encodeUintValue.encodedSize = function encodedSize(uint) { if (uint < uintBoundaries[0]) { return 1; } if (uint < uintBoundaries[1]) { return 2; } if (uint < uintBoundaries[2]) { return 3; } if (uint < uintBoundaries[3]) { return 5; } return 9; }; encodeUint.compareTokens = function compareTokens(tok1, tok2) { return tok1.value < tok2.value ? -1 : tok1.value > tok2.value ? 1 : 0; }; exports.decodeUint16 = decodeUint16; exports.decodeUint32 = decodeUint32; exports.decodeUint64 = decodeUint64; exports.decodeUint8 = decodeUint8; exports.encodeUint = encodeUint; exports.encodeUintValue = encodeUintValue; exports.readUint16 = readUint16; exports.readUint32 = readUint32; exports.readUint64 = readUint64; exports.readUint8 = readUint8; exports.uintBoundaries = uintBoundaries;