Clémentine
init
7c5b7bd
raw
history blame
7.8 kB
"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