"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CborDecoderBase = void 0; const tslib_1 = require("tslib"); const f16_1 = require("@jsonjoy.com/util/lib/buffers/f16"); const JsonPackExtension_1 = require("../JsonPackExtension"); const JsonPackValue_1 = require("../JsonPackValue"); const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader"); const sharedCachedUtf8Decoder_1 = tslib_1.__importDefault(require("@jsonjoy.com/util/lib/buffers/utf8/sharedCachedUtf8Decoder")); class CborDecoderBase { constructor(reader = new Reader_1.Reader(), keyDecoder = sharedCachedUtf8Decoder_1.default) { this.reader = reader; this.keyDecoder = keyDecoder; } read(uint8) { this.reader.reset(uint8); return this.val(); } decode(uint8) { this.reader.reset(uint8); return this.val(); } val() { const reader = this.reader; const octet = reader.u8(); const major = octet >> 5; const minor = octet & 31; if (major < 4) { if (major < 2) return major === 0 ? this.readUint(minor) : this.readNint(minor); else return major === 2 ? this.readBin(minor) : this.readStr(minor); } else { if (major < 6) return major === 4 ? this.readArr(minor) : this.readObj(minor); else return major === 6 ? this.readTag(minor) : this.readTkn(minor); } } readAnyRaw(octet) { const major = octet >> 5; const minor = octet & 31; if (major < 4) { if (major < 2) return major === 0 ? this.readUint(minor) : this.readNint(minor); else return major === 2 ? this.readBin(minor) : this.readStr(minor); } else { if (major < 6) return major === 4 ? this.readArr(minor) : this.readObj(minor); else return major === 6 ? this.readTag(minor) : this.readTkn(minor); } } readMinorLen(minor) { if (minor < 24) return minor; switch (minor) { case 24: return this.reader.u8(); case 25: return this.reader.u16(); case 26: return this.reader.u32(); case 27: return Number(this.reader.u64()); case 31: return -1; default: throw 1; } } readUint(minor) { if (minor < 25) { return minor === 24 ? this.reader.u8() : minor; } else { if (minor < 27) { return minor === 25 ? this.reader.u16() : this.reader.u32(); } else { const num = this.reader.u64(); return num > 9007199254740991 ? num : Number(num); } } } readNint(minor) { if (minor < 25) { return minor === 24 ? -this.reader.u8() - 1 : -minor - 1; } else { if (minor < 27) { return minor === 25 ? -this.reader.u16() - 1 : -this.reader.u32() - 1; } else { const num = this.reader.u64(); return num > 9007199254740991 - 1 ? -num - BigInt(1) : -Number(num) - 1; } } } readBin(minor) { const reader = this.reader; if (minor <= 23) return reader.buf(minor); switch (minor) { case 24: return reader.buf(reader.u8()); case 25: return reader.buf(reader.u16()); case 26: return reader.buf(reader.u32()); case 27: return reader.buf(Number(reader.u64())); case 31: { let size = 0; const list = []; while (this.reader.peak() !== 255) { const uint8 = this.readBinChunk(); size += uint8.length; list.push(uint8); } this.reader.x++; const res = new Uint8Array(size); let offset = 0; const length = list.length; for (let i = 0; i < length; i++) { const arr = list[i]; res.set(arr, offset); offset += arr.length; } return res; } default: throw 1; } } readBinChunk() { const octet = this.reader.u8(); const major = octet >> 5; const minor = octet & 31; if (major !== 2) throw 2; if (minor > 27) throw 3; return this.readBin(minor); } readAsStr() { const reader = this.reader; const octet = reader.u8(); const major = octet >> 5; const minor = octet & 31; if (major !== 3) throw 11; return this.readStr(minor); } readStr(minor) { const reader = this.reader; if (minor <= 23) return reader.utf8(minor); switch (minor) { case 24: return reader.utf8(reader.u8()); case 25: return reader.utf8(reader.u16()); case 26: return reader.utf8(reader.u32()); case 27: return reader.utf8(Number(reader.u64())); case 31: { let str = ''; while (reader.peak() !== 255) str += this.readStrChunk(); this.reader.x++; return str; } default: throw 1; } } readStrLen(minor) { if (minor <= 23) return minor; switch (minor) { case 24: return this.reader.u8(); case 25: return this.reader.u16(); case 26: return this.reader.u32(); case 27: return Number(this.reader.u64()); default: throw 1; } } readStrChunk() { const octet = this.reader.u8(); const major = octet >> 5; const minor = octet & 31; if (major !== 3) throw 4; if (minor > 27) throw 5; return this.readStr(minor); } readArr(minor) { const length = this.readMinorLen(minor); if (length >= 0) return this.readArrRaw(length); return this.readArrIndef(); } readArrRaw(length) { const arr = []; for (let i = 0; i < length; i++) arr.push(this.val()); return arr; } readArrIndef() { const arr = []; while (this.reader.peak() !== 255) arr.push(this.val()); this.reader.x++; return arr; } readObj(minor) { if (minor < 28) { let length = minor; switch (minor) { case 24: length = this.reader.u8(); break; case 25: length = this.reader.u16(); break; case 26: length = this.reader.u32(); break; case 27: length = Number(this.reader.u64()); break; } const obj = {}; for (let i = 0; i < length; i++) { const key = this.key(); if (key === '__proto__') throw 6; const value = this.val(); obj[key] = value; } return obj; } else if (minor === 31) return this.readObjIndef(); else throw 1; } readObjRaw(length) { const obj = {}; for (let i = 0; i < length; i++) { const key = this.key(); const value = this.val(); obj[key] = value; } return obj; } readObjIndef() { const obj = {}; while (this.reader.peak() !== 255) { const key = this.key(); if (this.reader.peak() === 255) throw 7; const value = this.val(); obj[key] = value; } this.reader.x++; return obj; } key() { const octet = this.reader.u8(); const major = octet >> 5; const minor = octet & 31; if (major !== 3) return String(this.readAnyRaw(octet)); const length = this.readStrLen(minor); if (length > 31) return this.reader.utf8(length); const key = this.keyDecoder.decode(this.reader.uint8, this.reader.x, length); this.reader.skip(length); return key; } readTag(minor) { if (minor <= 23) return this.readTagRaw(minor); switch (minor) { case 24: return this.readTagRaw(this.reader.u8()); case 25: return this.readTagRaw(this.reader.u16()); case 26: return this.readTagRaw(this.reader.u32()); case 27: return this.readTagRaw(Number(this.reader.u64())); default: throw 1; } } readTagRaw(tag) { return new JsonPackExtension_1.JsonPackExtension(tag, this.val()); } readTkn(minor) { switch (minor) { case 0xf4 & 31: return false; case 0xf5 & 31: return true; case 0xf6 & 31: return null; case 0xf7 & 31: return undefined; case 0xf8 & 31: return new JsonPackValue_1.JsonPackValue(this.reader.u8()); case 0xf9 & 31: return this.f16(); case 0xfa & 31: return this.reader.f32(); case 0xfb & 31: return this.reader.f64(); } if (minor <= 23) return new JsonPackValue_1.JsonPackValue(minor); throw 1; } f16() { return (0, f16_1.decodeF16)(this.reader.u16()); } } exports.CborDecoderBase = CborDecoderBase; //# sourceMappingURL=CborDecoderBase.js.map