233 lines
7.6 KiB
JavaScript
233 lines
7.6 KiB
JavaScript
|
"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
|