123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.CborDecoder = void 0;
- const CborDecoderBase_1 = require("./CborDecoderBase");
- const JsonPackValue_1 = require("../JsonPackValue");
- class CborDecoder extends CborDecoderBase_1.CborDecoderBase {
- readAsMap() {
- const octet = this.reader.u8();
- const major = octet >> 5;
- const minor = octet & 31;
- switch (major) {
- case 5:
- return this.readMap(minor);
- default:
- throw 0;
- }
- }
- readMap(minor) {
- const length = this.readMinorLen(minor);
- if (length >= 0)
- return this.readMapRaw(length);
- else
- return this.readMapIndef();
- }
- readMapRaw(length) {
- const map = new Map();
- for (let i = 0; i < length; i++) {
- const key = this.val();
- const value = this.val();
- map.set(key, value);
- }
- return map;
- }
- readMapIndef() {
- const map = new Map();
- while (this.reader.peak() !== 255) {
- const key = this.val();
- if (this.reader.peak() === 255)
- throw 7;
- const value = this.val();
- map.set(key, value);
- }
- this.reader.x++;
- return map;
- }
- skipN(n) {
- for (let i = 0; i < n; i++)
- this.skipAny();
- }
- skipAny() {
- this.skipAnyRaw(this.reader.u8());
- }
- skipAnyRaw(octet) {
- const major = octet >> 5;
- const minor = octet & 31;
- switch (major) {
- case 0:
- case 1:
- this.skipUNint(minor);
- break;
- case 2:
- this.skipBin(minor);
- break;
- case 3:
- this.skipStr(minor);
- break;
- case 4:
- this.skipArr(minor);
- break;
- case 5:
- this.skipObj(minor);
- break;
- case 7:
- this.skipTkn(minor);
- break;
- case 6:
- this.skipTag(minor);
- break;
- }
- }
- skipMinorLen(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());
- case 31:
- return -1;
- default:
- throw 1;
- }
- }
- skipUNint(minor) {
- if (minor <= 23)
- return;
- switch (minor) {
- case 24:
- return this.reader.skip(1);
- case 25:
- return this.reader.skip(2);
- case 26:
- return this.reader.skip(4);
- case 27:
- return this.reader.skip(8);
- default:
- throw 1;
- }
- }
- skipBin(minor) {
- const length = this.skipMinorLen(minor);
- if (length >= 0)
- this.reader.skip(length);
- else {
- while (this.reader.peak() !== 255)
- this.skipBinChunk();
- this.reader.x++;
- }
- }
- skipBinChunk() {
- const octet = this.reader.u8();
- const major = octet >> 5;
- const minor = octet & 31;
- if (major !== 2)
- throw 2;
- if (minor > 27)
- throw 3;
- this.skipBin(minor);
- }
- skipStr(minor) {
- const length = this.skipMinorLen(minor);
- if (length >= 0)
- this.reader.skip(length);
- else {
- while (this.reader.peak() !== 255)
- this.skipStrChunk();
- this.reader.x++;
- }
- }
- skipStrChunk() {
- const octet = this.reader.u8();
- const major = octet >> 5;
- const minor = octet & 31;
- if (major !== 3)
- throw 4;
- if (minor > 27)
- throw 5;
- this.skipStr(minor);
- }
- skipArr(minor) {
- const length = this.skipMinorLen(minor);
- if (length >= 0)
- this.skipN(length);
- else {
- while (this.reader.peak() !== 255)
- this.skipAny();
- this.reader.x++;
- }
- }
- skipObj(minor) {
- const length = this.readMinorLen(minor);
- if (length >= 0)
- return this.skipN(length * 2);
- else {
- while (this.reader.peak() !== 255) {
- this.skipAny();
- if (this.reader.peak() === 255)
- throw 7;
- this.skipAny();
- }
- this.reader.x++;
- }
- }
- skipTag(minor) {
- const length = this.skipMinorLen(minor);
- if (length < 0)
- throw 1;
- this.skipAny();
- }
- skipTkn(minor) {
- switch (minor) {
- case 0xf8 & 31:
- this.reader.skip(1);
- return;
- case 0xf9 & 31:
- this.reader.skip(2);
- return;
- case 0xfa & 31:
- this.reader.skip(4);
- return;
- case 0xfb & 31:
- this.reader.skip(8);
- return;
- }
- if (minor <= 23)
- return;
- throw 1;
- }
- validate(value, offset = 0, size = value.length) {
- this.reader.reset(value);
- this.reader.x = offset;
- const start = offset;
- this.skipAny();
- const end = this.reader.x;
- if (end - start !== size)
- throw 8;
- }
- decodeLevel(value) {
- this.reader.reset(value);
- return this.readLevel();
- }
- readLevel() {
- const octet = this.reader.u8();
- const major = octet >> 5;
- const minor = octet & 31;
- switch (major) {
- case 4:
- return this.readArrLevel(minor);
- case 5:
- return this.readObjLevel(minor);
- default:
- return super.readAnyRaw(octet);
- }
- }
- readPrimitiveOrVal() {
- const octet = this.reader.peak();
- const major = octet >> 5;
- switch (major) {
- case 4:
- case 5:
- return this.readAsValue();
- default:
- return this.val();
- }
- }
- readAsValue() {
- const reader = this.reader;
- const start = reader.x;
- this.skipAny();
- const end = reader.x;
- return new JsonPackValue_1.JsonPackValue(reader.uint8.subarray(start, end));
- }
- readObjLevel(minor) {
- const length = this.readMinorLen(minor);
- if (length >= 0)
- return this.readObjRawLevel(length);
- else
- return this.readObjIndefLevel();
- }
- readObjRawLevel(length) {
- const obj = {};
- for (let i = 0; i < length; i++) {
- const key = this.key();
- const value = this.readPrimitiveOrVal();
- obj[key] = value;
- }
- return obj;
- }
- readObjIndefLevel() {
- const obj = {};
- while (this.reader.peak() !== 255) {
- const key = this.key();
- if (this.reader.peak() === 255)
- throw 7;
- const value = this.readPrimitiveOrVal();
- obj[key] = value;
- }
- this.reader.x++;
- return obj;
- }
- readArrLevel(minor) {
- const length = this.readMinorLen(minor);
- if (length >= 0)
- return this.readArrRawLevel(length);
- return this.readArrIndefLevel();
- }
- readArrRawLevel(length) {
- const arr = [];
- for (let i = 0; i < length; i++)
- arr.push(this.readPrimitiveOrVal());
- return arr;
- }
- readArrIndefLevel() {
- const arr = [];
- while (this.reader.peak() !== 255)
- arr.push(this.readPrimitiveOrVal());
- this.reader.x++;
- return arr;
- }
- readHdr(expectedMajor) {
- const octet = this.reader.u8();
- const major = octet >> 5;
- if (major !== expectedMajor)
- throw 0;
- const minor = octet & 31;
- 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;
- }
- throw 1;
- }
- readStrHdr() {
- return this.readHdr(3);
- }
- readObjHdr() {
- return this.readHdr(5);
- }
- readArrHdr() {
- return this.readHdr(4);
- }
- findKey(key) {
- const size = this.readObjHdr();
- for (let i = 0; i < size; i++) {
- const k = this.key();
- if (k === key)
- return this;
- this.skipAny();
- }
- throw 9;
- }
- findIndex(index) {
- const size = this.readArrHdr();
- if (index >= size)
- throw 10;
- for (let i = 0; i < index; i++)
- this.skipAny();
- return this;
- }
- find(path) {
- for (let i = 0; i < path.length; i++) {
- const segment = path[i];
- if (typeof segment === 'string')
- this.findKey(segment);
- else
- this.findIndex(segment);
- }
- return this;
- }
- }
- exports.CborDecoder = CborDecoder;
- //# sourceMappingURL=CborDecoder.js.map
|