123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.JsonDecoder = void 0;
- const decodeUtf8_1 = require("@jsonjoy.com/util/lib/buffers/utf8/decodeUtf8");
- const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader");
- const fromBase64Bin_1 = require("@jsonjoy.com/base64/lib/fromBase64Bin");
- const util_1 = require("./util");
- const REGEX_REPLACE_ESCAPED_CHARS = /\\(b|f|n|r|t|"|\/|\\)/g;
- const escapedCharReplacer = (char) => {
- switch (char) {
- case '\\b':
- return '\b';
- case '\\f':
- return '\f';
- case '\\n':
- return '\n';
- case '\\r':
- return '\r';
- case '\\t':
- return '\t';
- case '\\"':
- return '"';
- case '\\/':
- return '/';
- case '\\\\':
- return '\\';
- }
- return char;
- };
- const hasBinaryPrefix = (u8, x) => u8[x] === 0x64 &&
- u8[x + 1] === 0x61 &&
- u8[x + 2] === 0x74 &&
- u8[x + 3] === 0x61 &&
- u8[x + 4] === 0x3a &&
- u8[x + 5] === 0x61 &&
- u8[x + 6] === 0x70 &&
- u8[x + 7] === 0x70 &&
- u8[x + 8] === 0x6c &&
- u8[x + 9] === 0x69 &&
- u8[x + 10] === 0x63 &&
- u8[x + 11] === 0x61 &&
- u8[x + 12] === 0x74 &&
- u8[x + 13] === 0x69 &&
- u8[x + 14] === 0x6f &&
- u8[x + 15] === 0x6e &&
- u8[x + 16] === 0x2f &&
- u8[x + 17] === 0x6f &&
- u8[x + 18] === 0x63 &&
- u8[x + 19] === 0x74 &&
- u8[x + 20] === 0x65 &&
- u8[x + 21] === 0x74 &&
- u8[x + 22] === 0x2d &&
- u8[x + 23] === 0x73 &&
- u8[x + 24] === 0x74 &&
- u8[x + 25] === 0x72 &&
- u8[x + 26] === 0x65 &&
- u8[x + 27] === 0x61 &&
- u8[x + 28] === 0x6d &&
- u8[x + 29] === 0x3b &&
- u8[x + 30] === 0x62 &&
- u8[x + 31] === 0x61 &&
- u8[x + 32] === 0x73 &&
- u8[x + 33] === 0x65 &&
- u8[x + 34] === 0x36 &&
- u8[x + 35] === 0x34 &&
- u8[x + 36] === 0x2c;
- const isUndefined = (u8, x) => u8[x++] === 0x61 &&
- u8[x++] === 0x74 &&
- u8[x++] === 0x61 &&
- u8[x++] === 0x3a &&
- u8[x++] === 0x61 &&
- u8[x++] === 0x70 &&
- u8[x++] === 0x70 &&
- u8[x++] === 0x6c &&
- u8[x++] === 0x69 &&
- u8[x++] === 0x63 &&
- u8[x++] === 0x61 &&
- u8[x++] === 0x74 &&
- u8[x++] === 0x69 &&
- u8[x++] === 0x6f &&
- u8[x++] === 0x6e &&
- u8[x++] === 0x2f &&
- u8[x++] === 0x63 &&
- u8[x++] === 0x62 &&
- u8[x++] === 0x6f &&
- u8[x++] === 0x72 &&
- u8[x++] === 0x2c &&
- u8[x++] === 0x62 &&
- u8[x++] === 0x61 &&
- u8[x++] === 0x73 &&
- u8[x++] === 0x65 &&
- u8[x++] === 0x36 &&
- u8[x++] === 0x34 &&
- u8[x++] === 0x3b &&
- u8[x++] === 0x39 &&
- u8[x++] === 0x77 &&
- u8[x++] === 0x3d &&
- u8[x++] === 0x3d &&
- u8[x++] === 0x22;
- const fromCharCode = String.fromCharCode;
- const readShortUtf8StrAndUnescape = (reader) => {
- const buf = reader.uint8;
- const len = buf.length;
- const points = [];
- let x = reader.x;
- let prev = 0;
- while (x < len) {
- let code = buf[x++];
- if ((code & 0x80) === 0) {
- if (prev === 92) {
- switch (code) {
- case 98:
- code = 8;
- break;
- case 102:
- code = 12;
- break;
- case 110:
- code = 10;
- break;
- case 114:
- code = 13;
- break;
- case 116:
- code = 9;
- break;
- case 34:
- code = 34;
- break;
- case 47:
- code = 47;
- break;
- case 92:
- code = 92;
- break;
- default:
- throw new Error('Invalid JSON');
- }
- prev = 0;
- }
- else {
- if (code === 34)
- break;
- prev = code;
- if (prev === 92)
- continue;
- }
- }
- else {
- const octet2 = buf[x++] & 0x3f;
- if ((code & 0xe0) === 0xc0) {
- code = ((code & 0x1f) << 6) | octet2;
- }
- else {
- const octet3 = buf[x++] & 0x3f;
- if ((code & 0xf0) === 0xe0) {
- code = ((code & 0x1f) << 12) | (octet2 << 6) | octet3;
- }
- else {
- if ((code & 0xf8) === 0xf0) {
- const octet4 = buf[x++] & 0x3f;
- let unit = ((code & 0x07) << 0x12) | (octet2 << 0x0c) | (octet3 << 0x06) | octet4;
- if (unit > 0xffff) {
- unit -= 0x10000;
- const unit0 = ((unit >>> 10) & 0x3ff) | 0xd800;
- unit = 0xdc00 | (unit & 0x3ff);
- points.push(unit0);
- code = unit;
- }
- else {
- code = unit;
- }
- }
- }
- }
- }
- points.push(code);
- }
- reader.x = x;
- return fromCharCode.apply(String, points);
- };
- class JsonDecoder {
- constructor() {
- this.reader = new Reader_1.Reader();
- }
- read(uint8) {
- this.reader.reset(uint8);
- return this.readAny();
- }
- decode(uint8) {
- this.reader.reset(uint8);
- return this.readAny();
- }
- readAny() {
- this.skipWhitespace();
- const reader = this.reader;
- const x = reader.x;
- const uint8 = reader.uint8;
- const char = uint8[x];
- switch (char) {
- case 34: {
- if (uint8[x + 1] === 0x64) {
- const bin = this.tryReadBin();
- if (bin)
- return bin;
- if (isUndefined(uint8, x + 2)) {
- reader.x = x + 35;
- return undefined;
- }
- }
- return this.readStr();
- }
- case 91:
- return this.readArr();
- case 102:
- return this.readFalse();
- case 110:
- return this.readNull();
- case 116:
- return this.readTrue();
- case 123:
- return this.readObj();
- default:
- if ((char >= 48 && char <= 57) || char === 45)
- return this.readNum();
- throw new Error('Invalid JSON');
- }
- }
- skipWhitespace() {
- const reader = this.reader;
- const uint8 = reader.uint8;
- let x = reader.x;
- let char = 0;
- while (true) {
- char = uint8[x];
- switch (char) {
- case 32:
- case 9:
- case 10:
- case 13:
- x++;
- continue;
- default:
- reader.x = x;
- return;
- }
- }
- }
- readNull() {
- if (this.reader.u32() !== 0x6e756c6c)
- throw new Error('Invalid JSON');
- return null;
- }
- readTrue() {
- if (this.reader.u32() !== 0x74727565)
- throw new Error('Invalid JSON');
- return true;
- }
- readFalse() {
- const reader = this.reader;
- if (reader.u8() !== 0x66 || reader.u32() !== 0x616c7365)
- throw new Error('Invalid JSON');
- return false;
- }
- readBool() {
- const reader = this.reader;
- switch (reader.uint8[reader.x]) {
- case 102:
- return this.readFalse();
- case 116:
- return this.readTrue();
- default:
- throw new Error('Invalid JSON');
- }
- }
- readNum() {
- const reader = this.reader;
- const uint8 = reader.uint8;
- let x = reader.x;
- let c = uint8[x++];
- const c1 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c2 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c3 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c4 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c5 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c6 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c7 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c8 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c9 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c10 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c11 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c12 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c13 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c14 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c15 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c16 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c17 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c18 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c19 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c20 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c21 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c22 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c23 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- const c24 = c;
- c = uint8[x++];
- if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) {
- reader.x = x - 1;
- const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c24);
- if (num !== num)
- throw new Error('Invalid JSON');
- return num;
- }
- throw new Error('Invalid JSON');
- }
- readStr() {
- const reader = this.reader;
- const uint8 = reader.uint8;
- const char = uint8[reader.x++];
- if (char !== 0x22)
- throw new Error('Invalid JSON');
- const x0 = reader.x;
- const x1 = (0, util_1.findEndingQuote)(uint8, x0);
- let str = (0, decodeUtf8_1.decodeUtf8)(uint8, x0, x1 - x0);
- str = str.replace(REGEX_REPLACE_ESCAPED_CHARS, escapedCharReplacer);
- reader.x = x1 + 1;
- return str;
- }
- tryReadBin() {
- const reader = this.reader;
- const u8 = reader.uint8;
- let x = reader.x;
- if (u8[x++] !== 0x22)
- return undefined;
- const hasDataUrlPrefix = hasBinaryPrefix(u8, x);
- if (!hasDataUrlPrefix)
- return undefined;
- x += 37;
- const x0 = x;
- x = (0, util_1.findEndingQuote)(u8, x);
- reader.x = x0;
- const bin = (0, fromBase64Bin_1.fromBase64Bin)(reader.view, x0, x - x0);
- reader.x = x + 1;
- return bin;
- }
- readBin() {
- const reader = this.reader;
- const u8 = reader.uint8;
- let x = reader.x;
- if (u8[x++] !== 0x22)
- throw new Error('Invalid JSON');
- const hasDataUrlPrefix = hasBinaryPrefix(u8, x);
- if (!hasDataUrlPrefix)
- throw new Error('Invalid JSON');
- x += 37;
- const x0 = x;
- x = (0, util_1.findEndingQuote)(u8, x);
- reader.x = x0;
- const bin = (0, fromBase64Bin_1.fromBase64Bin)(reader.view, x0, x - x0);
- reader.x = x + 1;
- return bin;
- }
- readArr() {
- const reader = this.reader;
- if (reader.u8() !== 0x5b)
- throw new Error('Invalid JSON');
- const arr = [];
- const uint8 = reader.uint8;
- while (true) {
- this.skipWhitespace();
- const char = uint8[reader.x];
- if (char === 0x5d)
- return reader.x++, arr;
- if (char === 0x2c) {
- reader.x++;
- continue;
- }
- arr.push(this.readAny());
- }
- }
- readObj() {
- const reader = this.reader;
- if (reader.u8() !== 0x7b)
- throw new Error('Invalid JSON');
- const obj = {};
- const uint8 = reader.uint8;
- while (true) {
- this.skipWhitespace();
- let char = uint8[reader.x];
- if (char === 0x7d)
- return reader.x++, obj;
- if (char === 0x2c) {
- reader.x++;
- continue;
- }
- char = uint8[reader.x++];
- if (char !== 0x22)
- throw new Error('Invalid JSON');
- const key = readShortUtf8StrAndUnescape(reader);
- if (key === '__proto__')
- throw new Error('Invalid JSON');
- this.skipWhitespace();
- if (reader.u8() !== 0x3a)
- throw new Error('Invalid JSON');
- this.skipWhitespace();
- obj[key] = this.readAny();
- }
- }
- }
- exports.JsonDecoder = JsonDecoder;
- //# sourceMappingURL=JsonDecoder.js.map
|