123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.BencodeDecoder = void 0;
- const Reader_1 = require("@jsonjoy.com/util/lib/buffers/Reader");
- class BencodeDecoder {
- 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() {
- const reader = this.reader;
- const x = reader.x;
- const uint8 = reader.uint8;
- const char = uint8[x];
- switch (char) {
- case 0x69:
- return this.readNum();
- case 0x64:
- return this.readObj();
- case 0x6c:
- return this.readArr();
- case 0x66:
- return this.readFalse();
- case 0x74:
- return this.readTrue();
- case 110:
- return this.readNull();
- case 117:
- return this.readUndef();
- default:
- if (char >= 48 && char <= 57)
- return this.readBin();
- }
- throw new Error('INVALID_BENCODE');
- }
- readNull() {
- if (this.reader.u8() !== 0x6e)
- throw new Error('INVALID_BENCODE');
- return null;
- }
- readUndef() {
- if (this.reader.u8() !== 117)
- throw new Error('INVALID_BENCODE');
- return undefined;
- }
- readTrue() {
- if (this.reader.u8() !== 0x74)
- throw new Error('INVALID_BENCODE');
- return true;
- }
- readFalse() {
- if (this.reader.u8() !== 0x66)
- throw new Error('INVALID_BENCODE');
- return false;
- }
- readBool() {
- const reader = this.reader;
- switch (reader.uint8[reader.x]) {
- case 0x66:
- return this.readFalse();
- case 0x74:
- return this.readTrue();
- default:
- throw new Error('INVALID_BENCODE');
- }
- }
- readNum() {
- const reader = this.reader;
- const startChar = reader.u8();
- if (startChar !== 0x69)
- throw new Error('INVALID_BENCODE');
- const u8 = reader.uint8;
- let x = reader.x;
- let numStr = '';
- let c = u8[x++];
- let i = 0;
- while (c !== 0x65) {
- numStr += String.fromCharCode(c);
- c = u8[x++];
- if (i > 25)
- throw new Error('INVALID_BENCODE');
- i++;
- }
- if (!numStr)
- throw new Error('INVALID_BENCODE');
- reader.x = x;
- return +numStr;
- }
- readStr() {
- const bin = this.readBin();
- return new TextDecoder().decode(bin);
- }
- readBin() {
- const reader = this.reader;
- const u8 = reader.uint8;
- let lenStr = '';
- let x = reader.x;
- let c = u8[x++];
- let i = 0;
- while (c !== 0x3a) {
- if (c < 48 || c > 57)
- throw new Error('INVALID_BENCODE');
- lenStr += String.fromCharCode(c);
- c = u8[x++];
- if (i > 10)
- throw new Error('INVALID_BENCODE');
- i++;
- }
- reader.x = x;
- const len = +lenStr;
- const bin = reader.buf(len);
- return bin;
- }
- readArr() {
- const reader = this.reader;
- if (reader.u8() !== 0x6c)
- throw new Error('INVALID_BENCODE');
- const arr = [];
- const uint8 = reader.uint8;
- while (true) {
- const char = uint8[reader.x];
- if (char === 0x65) {
- reader.x++;
- return arr;
- }
- arr.push(this.readAny());
- }
- }
- readObj() {
- const reader = this.reader;
- if (reader.u8() !== 0x64)
- throw new Error('INVALID_BENCODE');
- const obj = {};
- const uint8 = reader.uint8;
- while (true) {
- const char = uint8[reader.x];
- if (char === 0x65) {
- reader.x++;
- return obj;
- }
- const key = this.readStr();
- if (key === '__proto__')
- throw new Error('INVALID_KEY');
- obj[key] = this.readAny();
- }
- }
- }
- exports.BencodeDecoder = BencodeDecoder;
- //# sourceMappingURL=BencodeDecoder.js.map
|