123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.MsgPackDecoder = void 0;
- const _1 = require(".");
- const MsgPackDecoderFast_1 = require("./MsgPackDecoderFast");
- class MsgPackDecoder extends MsgPackDecoderFast_1.MsgPackDecoderFast {
- skipAny() {
- const byte = this.reader.u8();
- if (byte >= 0xe0)
- return 1;
- if (byte <= 0xbf) {
- if (byte < 0x90) {
- if (byte <= 0b1111111)
- return 1;
- return 1 + this.skipObj(byte & 0b1111);
- }
- else {
- if (byte < 0xa0)
- return 1 + this.skipArr(byte & 0b1111);
- else
- return 1 + this.skip(byte & 0b11111);
- }
- }
- if (byte <= 0xd0) {
- if (byte <= 0xc8) {
- if (byte <= 0xc4) {
- if (byte <= 0xc2)
- return byte === 0xc2 ? 1 : 1;
- else
- return byte === 0xc4 ? 2 + this.skip(this.reader.u8()) : 1;
- }
- else {
- if (byte <= 0xc6)
- return byte === 0xc6 ? 5 + this.skip(this.reader.u32()) : 3 + this.skip(this.reader.u16());
- else
- return byte === 0xc8 ? 4 + this.skip(this.reader.u16()) : 3 + this.skip(this.reader.u8());
- }
- }
- else {
- return byte <= 0xcc
- ? byte <= 0xca
- ? byte === 0xca
- ? 1 + this.skip(4)
- : 1 + 1 + 4 + this.skip(this.reader.u32())
- : byte === 0xcc
- ? 1 + this.skip(1)
- : 1 + this.skip(8)
- : byte <= 0xce
- ? byte === 0xce
- ? 1 + this.skip(4)
- : 1 + this.skip(2)
- : byte === 0xd0
- ? 1 + this.skip(1)
- : 1 + this.skip(8);
- }
- }
- else if (byte <= 0xd8) {
- return byte <= 0xd4
- ? byte <= 0xd2
- ? byte === 0xd2
- ? 1 + this.skip(4)
- : 1 + this.skip(2)
- : byte === 0xd4
- ? 1 + this.skip(2)
- : 1 + this.skip(8)
- : byte <= 0xd6
- ? byte === 0xd6
- ? 1 + this.skip(5)
- : 1 + this.skip(3)
- : byte === 0xd8
- ? 1 + this.skip(17)
- : 1 + this.skip(9);
- }
- else {
- switch (byte) {
- case 0xd9:
- return 2 + this.skip(this.reader.u8());
- case 0xda:
- return 3 + this.skip(this.reader.u16());
- case 0xdb:
- return 5 + this.skip(this.reader.u32());
- case 0xdc:
- return 3 + this.skipArr(this.reader.u16());
- case 0xdd:
- return 5 + this.skipArr(this.reader.u32());
- case 0xde:
- return 3 + this.skipObj(this.reader.u16());
- case 0xdf:
- return 5 + this.skipObj(this.reader.u32());
- }
- }
- return 1;
- }
- skipArr(size) {
- let length = 0;
- for (let i = 0; i < size; i++)
- length += this.skipAny();
- return length;
- }
- skipObj(size) {
- let length = 0;
- for (let i = 0; i < size; i++) {
- length += this.skipAny() + this.skipAny();
- }
- return length;
- }
- readLevel(uint8) {
- this.reader.reset(uint8);
- return this.valOneLevel();
- }
- valOneLevel() {
- const byte = this.reader.view.getUint8(this.reader.x);
- const isMap = byte === 0xde || byte === 0xdf || byte >> 4 === 0b1000;
- if (isMap) {
- this.reader.x++;
- const size = byte === 0xde ? this.reader.u16() : byte === 0xdf ? this.reader.u32() : byte & 0b1111;
- const obj = {};
- for (let i = 0; i < size; i++) {
- const key = this.key();
- obj[key] = this.primitive();
- }
- return obj;
- }
- const isArray = byte === 0xdc || byte === 0xdd || byte >> 4 === 0b1001;
- if (isArray) {
- this.reader.x++;
- const size = byte === 0xdc ? this.reader.u16() : byte === 0xdd ? this.reader.u32() : byte & 0b1111;
- const arr = [];
- for (let i = 0; i < size; i++)
- arr.push(this.primitive());
- return arr;
- }
- return this.val();
- }
- primitive() {
- const reader = this.reader;
- const byte = reader.view.getUint8(reader.x);
- const isMapOrArray = byte === 0xde || byte === 0xdf || byte === 0xdc || byte === 0xdd || byte >> 5 === 0b100;
- if (isMapOrArray) {
- const length = this.skipAny();
- reader.x -= length;
- const buf = reader.buf(length);
- return new _1.JsonPackValue(buf);
- }
- return this.val();
- }
- skip(length) {
- this.reader.x += length;
- return length;
- }
- 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 new Error('INVALID_SIZE');
- }
- readObjHdr() {
- const reader = this.reader;
- const byte = reader.u8();
- const isFixMap = byte >> 4 === 0b1000;
- if (isFixMap)
- return byte & 0b1111;
- switch (byte) {
- case 0xde:
- return reader.u16();
- case 0xdf:
- return reader.u32();
- }
- throw new Error('NOT_OBJ');
- }
- readStrHdr() {
- const reader = this.reader;
- const byte = reader.u8();
- if (byte >> 5 === 0b101)
- return byte & 0b11111;
- switch (byte) {
- case 0xd9:
- return reader.u8();
- case 0xda:
- return reader.u16();
- case 0xdb:
- return reader.u32();
- }
- throw new Error('NOT_STR');
- }
- 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 new Error('KEY_NOT_FOUND');
- }
- readArrHdr() {
- const reader = this.reader;
- const byte = reader.u8();
- const isFixArr = byte >> 4 === 0b1001;
- if (isFixArr)
- return byte & 0b1111;
- switch (byte) {
- case 0xdc:
- return this.reader.u16();
- case 0xdd:
- return this.reader.u32();
- }
- throw new Error('NOT_ARR');
- }
- findIndex(index) {
- const size = this.readArrHdr();
- if (index >= size)
- throw new Error('INDEX_OUT_OF_BOUNDS');
- 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.MsgPackDecoder = MsgPackDecoder;
- //# sourceMappingURL=MsgPackDecoder.js.map
|