123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.RespDecoder = void 0;
- const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader");
- const extensions_1 = require("./extensions");
- const isUtf8_1 = require("@jsonjoy.com/util/lib/buffers/utf8/isUtf8");
- class RespDecoder {
- constructor(reader = new Reader_1.Reader()) {
- this.reader = reader;
- this.tryUtf8 = false;
- }
- read(uint8) {
- this.reader.reset(uint8);
- return this.val();
- }
- decode(uint8) {
- this.reader.reset(uint8);
- return this.val();
- }
- val() {
- const reader = this.reader;
- const type = reader.u8();
- switch (type) {
- case 58:
- return this.readInt();
- case 44:
- return this.readFloat();
- case 43:
- return this.readStrSimple();
- case 36:
- return this.readStrBulk();
- case 35:
- return this.readBool();
- case 95:
- return reader.skip(2), null;
- case 37:
- return this.readObj();
- case 42:
- return this.readArr();
- case 61:
- return this.readStrVerbatim();
- case 62:
- return new extensions_1.RespPush(this.readArr() || []);
- case 40:
- return this.readBigint();
- case 126:
- return this.readSet();
- case 45:
- return this.readErrSimple();
- case 33:
- return this.readErrBulk();
- case 124:
- return new extensions_1.RespAttributes(this.readObj());
- }
- throw new Error('UNKNOWN_TYPE');
- }
- readLength() {
- const reader = this.reader;
- let number = 0;
- while (true) {
- const c = reader.u8();
- if (c === 13)
- return reader.skip(1), number;
- number = number * 10 + (c - 48);
- }
- }
- readCmd() {
- const reader = this.reader;
- const type = reader.u8();
- if (type !== 42)
- throw new Error('INVALID_COMMAND');
- const c = reader.peak();
- if (c === 45)
- throw new Error('INVALID_COMMAND');
- const length = this.readLength();
- if (length === 0)
- throw new Error('INVALID_COMMAND');
- const cmd = this.readAsciiAsStrBulk().toUpperCase();
- const args = [cmd];
- this.tryUtf8 = false;
- for (let i = 1; i < length; i++) {
- const type = reader.u8();
- if (type !== 36)
- throw new Error('INVALID_COMMAND');
- args.push(this.readStrBulk());
- }
- return args;
- }
- readBool() {
- const reader = this.reader;
- const c = reader.u8();
- reader.skip(2);
- return c === 116;
- }
- readInt() {
- const reader = this.reader;
- let negative = false;
- let c = reader.u8();
- let number = 0;
- if (c === 45) {
- negative = true;
- }
- else if (c !== 43)
- number = c - 48;
- while (true) {
- c = reader.u8();
- if (c === 13) {
- reader.skip(1);
- return negative ? -number : number;
- }
- number = number * 10 + (c - 48);
- }
- }
- readFloat() {
- const reader = this.reader;
- const x = reader.x;
- while (true) {
- const c = reader.u8();
- if (c !== 13)
- continue;
- const length = reader.x - x - 1;
- reader.x = x;
- const str = reader.ascii(length);
- switch (length) {
- case 3:
- switch (str) {
- case 'inf':
- return reader.skip(2), Infinity;
- case 'nan':
- return reader.skip(2), NaN;
- }
- break;
- case 4:
- if (str === '-inf') {
- return reader.skip(2), -Infinity;
- }
- break;
- }
- reader.skip(2);
- return Number(str);
- }
- }
- readBigint() {
- const reader = this.reader;
- const x = reader.x;
- while (true) {
- const c = reader.u8();
- if (c !== 13)
- continue;
- const length = reader.x - x;
- reader.x = x;
- const str = reader.ascii(length);
- reader.skip(1);
- return BigInt(str);
- }
- }
- readStrSimple() {
- const reader = this.reader;
- const x = reader.x;
- while (true) {
- const c = reader.u8();
- if (c !== 13)
- continue;
- const size = reader.x - x - 1;
- reader.x = x;
- const str = reader.utf8(size);
- reader.skip(2);
- return str;
- }
- }
- readStrBulk() {
- const reader = this.reader;
- if (reader.peak() === 45) {
- reader.skip(4);
- return null;
- }
- const length = this.readLength();
- let res;
- if (this.tryUtf8 && (0, isUtf8_1.isUtf8)(reader.uint8, reader.x, length))
- res = reader.utf8(length);
- else
- res = reader.buf(length);
- reader.skip(2);
- return res;
- }
- readAsciiAsStrBulk() {
- const reader = this.reader;
- reader.skip(1);
- const length = this.readLength();
- const buf = reader.ascii(length);
- reader.skip(2);
- return buf;
- }
- readStrVerbatim() {
- const reader = this.reader;
- const length = this.readLength();
- const u32 = reader.u32();
- const isTxt = u32 === 1954051130;
- if (isTxt) {
- const str = reader.utf8(length - 4);
- reader.skip(2);
- return str;
- }
- const buf = reader.buf(length - 4);
- reader.skip(2);
- return buf;
- }
- readErrSimple() {
- const reader = this.reader;
- const x = reader.x;
- while (true) {
- const c = reader.u8();
- if (c !== 13)
- continue;
- const size = reader.x - x - 1;
- reader.x = x;
- const str = reader.utf8(size);
- reader.skip(2);
- return new Error(str);
- }
- }
- readErrBulk() {
- const reader = this.reader;
- const length = this.readLength();
- const message = reader.utf8(length);
- reader.skip(2);
- return new Error(message);
- }
- readArr() {
- const reader = this.reader;
- const c = reader.peak();
- if (c === 45) {
- reader.skip(4);
- return null;
- }
- const length = this.readLength();
- const arr = [];
- for (let i = 0; i < length; i++)
- arr.push(this.val());
- return arr;
- }
- readSet() {
- const length = this.readLength();
- const set = new Set();
- for (let i = 0; i < length; i++)
- set.add(this.val());
- return set;
- }
- readObj() {
- const length = this.readLength();
- const obj = {};
- for (let i = 0; i < length; i++) {
- const key = this.val() + '';
- obj[key] = this.val();
- }
- return obj;
- }
- skipN(n) {
- for (let i = 0; i < n; i++)
- this.skipAny();
- }
- skipAny() {
- const reader = this.reader;
- const type = reader.u8();
- switch (type) {
- case 58:
- return this.skipInt();
- case 44:
- return this.skipFloat();
- case 43:
- return this.skipStrSimple();
- case 36:
- return this.skipStrBulk();
- case 35:
- return this.skipBool();
- case 95:
- return reader.skip(2);
- case 37:
- return this.skipObj();
- case 42:
- return this.skipArr();
- case 61:
- return this.skipStrVerbatim();
- case 62:
- return this.skipArr();
- case 40:
- return this.skipBigint();
- case 126:
- return this.skipSet();
- case 45:
- return this.skipErrSimple();
- case 33:
- return this.skipErrBulk();
- case 124:
- return this.skipObj();
- }
- throw new Error('UNKNOWN_TYPE');
- }
- skipBool() {
- this.reader.skip(3);
- }
- skipInt() {
- const reader = this.reader;
- while (true) {
- if (reader.u8() !== 13)
- continue;
- reader.skip(1);
- return;
- }
- }
- skipFloat() {
- const reader = this.reader;
- while (true) {
- if (reader.u8() !== 13)
- continue;
- reader.skip(1);
- return;
- }
- }
- skipBigint() {
- const reader = this.reader;
- while (true) {
- if (reader.u8() !== 13)
- continue;
- reader.skip(1);
- return;
- }
- }
- skipStrSimple() {
- const reader = this.reader;
- while (true) {
- if (reader.u8() !== 13)
- continue;
- reader.skip(1);
- return;
- }
- }
- skipStrBulk() {
- const reader = this.reader;
- if (reader.peak() === 45) {
- reader.skip(4);
- return;
- }
- reader.skip(this.readLength() + 2);
- }
- skipStrVerbatim() {
- const length = this.readLength();
- this.reader.skip(length + 2);
- }
- skipErrSimple() {
- const reader = this.reader;
- while (true) {
- if (reader.u8() !== 13)
- continue;
- reader.skip(1);
- return;
- }
- }
- skipErrBulk() {
- const length = this.readLength();
- this.reader.skip(length + 2);
- }
- skipArr() {
- const reader = this.reader;
- const c = reader.peak();
- if (c === 45) {
- reader.skip(4);
- return;
- }
- const length = this.readLength();
- for (let i = 0; i < length; i++)
- this.skipAny();
- }
- skipSet() {
- const length = this.readLength();
- for (let i = 0; i < length; i++)
- this.skipAny();
- }
- skipObj() {
- const length = this.readLength();
- for (let i = 0; i < length; i++) {
- this.skipAny();
- this.skipAny();
- }
- }
- }
- exports.RespDecoder = RespDecoder;
- //# sourceMappingURL=RespDecoder.js.map
|