182 lines
6.0 KiB
JavaScript
182 lines
6.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.MsgPackDecoderFast = void 0;
|
|
const tslib_1 = require("tslib");
|
|
const JsonPackExtension_1 = require("../JsonPackExtension");
|
|
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 MsgPackDecoderFast {
|
|
constructor(reader = new Reader_1.Reader(), keyDecoder = sharedCachedUtf8Decoder_1.default) {
|
|
this.reader = reader;
|
|
this.keyDecoder = keyDecoder;
|
|
}
|
|
decode(uint8) {
|
|
this.reader.reset(uint8);
|
|
return this.val();
|
|
}
|
|
read(uint8) {
|
|
this.reader.reset(uint8);
|
|
return this.val();
|
|
}
|
|
val() {
|
|
const reader = this.reader;
|
|
const byte = reader.u8();
|
|
if (byte >= 0xe0)
|
|
return byte - 0x100;
|
|
if (byte <= 0xbf) {
|
|
if (byte < 0x90) {
|
|
if (byte <= 0b1111111)
|
|
return byte;
|
|
return this.obj(byte & 0b1111);
|
|
}
|
|
else {
|
|
if (byte < 0xa0)
|
|
return this.arr(byte & 0b1111);
|
|
else
|
|
return reader.utf8(byte & 0b11111);
|
|
}
|
|
}
|
|
if (byte <= 0xd0) {
|
|
if (byte <= 0xc8) {
|
|
if (byte <= 0xc4) {
|
|
if (byte <= 0xc2)
|
|
return byte === 0xc2 ? false : byte === 0xc0 ? null : undefined;
|
|
else
|
|
return byte === 0xc4 ? reader.buf(reader.u8()) : true;
|
|
}
|
|
else {
|
|
if (byte <= 0xc6)
|
|
return byte === 0xc6 ? reader.buf(reader.u32()) : reader.buf(reader.u16());
|
|
else
|
|
return byte === 0xc8 ? this.ext(reader.u16()) : this.ext(reader.u8());
|
|
}
|
|
}
|
|
else {
|
|
return byte <= 0xcc
|
|
? byte <= 0xca
|
|
? byte === 0xca
|
|
? reader.f32()
|
|
: this.ext(reader.u32())
|
|
: byte === 0xcc
|
|
? reader.u8()
|
|
: reader.f64()
|
|
: byte <= 0xce
|
|
? byte === 0xce
|
|
? reader.u32()
|
|
: reader.u16()
|
|
: byte === 0xd0
|
|
? reader.i8()
|
|
: reader.u32() * 4294967296 + reader.u32();
|
|
}
|
|
}
|
|
else if (byte <= 0xd8) {
|
|
return byte <= 0xd4
|
|
? byte <= 0xd2
|
|
? byte === 0xd2
|
|
? reader.i32()
|
|
: reader.i16()
|
|
: byte === 0xd4
|
|
? this.ext(1)
|
|
: reader.i32() * 4294967296 + reader.u32()
|
|
: byte <= 0xd6
|
|
? byte === 0xd6
|
|
? this.ext(4)
|
|
: this.ext(2)
|
|
: byte === 0xd8
|
|
? this.ext(16)
|
|
: this.ext(8);
|
|
}
|
|
else {
|
|
switch (byte) {
|
|
case 0xd9:
|
|
return reader.utf8(reader.u8());
|
|
case 0xda:
|
|
return reader.utf8(reader.u16());
|
|
case 0xdb:
|
|
return reader.utf8(reader.u32());
|
|
case 0xdc:
|
|
return this.arr(reader.u16());
|
|
case 0xdd:
|
|
return this.arr(reader.u32());
|
|
case 0xde:
|
|
return this.obj(reader.u16());
|
|
case 0xdf:
|
|
return this.obj(reader.u32());
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
str() {
|
|
const reader = this.reader;
|
|
const byte = reader.u8();
|
|
if (byte >> 5 === 0b101)
|
|
return reader.utf8(byte & 0b11111);
|
|
switch (byte) {
|
|
case 0xd9:
|
|
return reader.utf8(reader.u8());
|
|
case 0xda:
|
|
return reader.utf8(reader.u16());
|
|
case 0xdb:
|
|
return reader.utf8(reader.u32());
|
|
}
|
|
return undefined;
|
|
}
|
|
obj(size) {
|
|
const obj = {};
|
|
for (let i = 0; i < size; i++) {
|
|
const key = this.key();
|
|
if (key === '__proto__')
|
|
throw 6;
|
|
obj[key] = this.val();
|
|
}
|
|
return obj;
|
|
}
|
|
key() {
|
|
const reader = this.reader;
|
|
const byte = reader.view.getUint8(reader.x);
|
|
if (byte >= 0b10100000 && byte <= 0b10111111) {
|
|
const size = byte & 0b11111;
|
|
const key = this.keyDecoder.decode(reader.uint8, reader.x + 1, size);
|
|
reader.x += 1 + size;
|
|
return key;
|
|
}
|
|
else if (byte === 0xd9) {
|
|
const size = reader.view.getUint8(reader.x + 1);
|
|
if (size < 32) {
|
|
const key = this.keyDecoder.decode(reader.uint8, reader.x + 2, size);
|
|
reader.x += 2 + size;
|
|
return key;
|
|
}
|
|
}
|
|
reader.x++;
|
|
switch (byte) {
|
|
case 0xd9:
|
|
return reader.utf8(reader.u8());
|
|
case 0xda:
|
|
return reader.utf8(reader.u16());
|
|
case 0xdb:
|
|
return reader.utf8(reader.u32());
|
|
default:
|
|
return '';
|
|
}
|
|
}
|
|
arr(size) {
|
|
const arr = [];
|
|
for (let i = 0; i < size; i++)
|
|
arr.push(this.val());
|
|
return arr;
|
|
}
|
|
ext(size) {
|
|
const reader = this.reader;
|
|
const type = reader.u8();
|
|
const end = reader.x + size;
|
|
const buf = reader.uint8.subarray(reader.x, end);
|
|
reader.x = end;
|
|
return new JsonPackExtension_1.JsonPackExtension(type, buf);
|
|
}
|
|
back(bytes) {
|
|
this.reader.x -= bytes;
|
|
}
|
|
}
|
|
exports.MsgPackDecoderFast = MsgPackDecoderFast;
|
|
//# sourceMappingURL=MsgPackDecoderFast.js.map
|