147 lines
4.2 KiB
JavaScript
147 lines
4.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.BencodeEncoder = void 0;
|
|
const utf8_1 = require("@jsonjoy.com/util/lib/strings/utf8");
|
|
const insertion_1 = require("@jsonjoy.com/util/lib/sort/insertion");
|
|
class BencodeEncoder {
|
|
constructor(writer) {
|
|
this.writer = writer;
|
|
}
|
|
encode(value) {
|
|
const writer = this.writer;
|
|
writer.reset();
|
|
this.writeAny(value);
|
|
return writer.flush();
|
|
}
|
|
writeUnknown(value) {
|
|
this.writeNull();
|
|
}
|
|
writeAny(value) {
|
|
switch (typeof value) {
|
|
case 'boolean':
|
|
return this.writeBoolean(value);
|
|
case 'number':
|
|
return this.writeNumber(value);
|
|
case 'string':
|
|
return this.writeStr(value);
|
|
case 'object': {
|
|
if (value === null)
|
|
return this.writeNull();
|
|
const constructor = value.constructor;
|
|
switch (constructor) {
|
|
case Object:
|
|
return this.writeObj(value);
|
|
case Array:
|
|
return this.writeArr(value);
|
|
case Uint8Array:
|
|
return this.writeBin(value);
|
|
case Map:
|
|
return this.writeMap(value);
|
|
case Set:
|
|
return this.writeSet(value);
|
|
default:
|
|
return this.writeUnknown(value);
|
|
}
|
|
}
|
|
case 'bigint': {
|
|
return this.writeBigint(value);
|
|
}
|
|
case 'undefined': {
|
|
return this.writeUndef();
|
|
}
|
|
default:
|
|
return this.writeUnknown(value);
|
|
}
|
|
}
|
|
writeNull() {
|
|
this.writer.u8(110);
|
|
}
|
|
writeUndef() {
|
|
this.writer.u8(117);
|
|
}
|
|
writeBoolean(bool) {
|
|
this.writer.u8(bool ? 0x74 : 0x66);
|
|
}
|
|
writeNumber(num) {
|
|
const writer = this.writer;
|
|
writer.u8(0x69);
|
|
writer.ascii(Math.round(num) + '');
|
|
writer.u8(0x65);
|
|
}
|
|
writeInteger(int) {
|
|
const writer = this.writer;
|
|
writer.u8(0x69);
|
|
writer.ascii(int + '');
|
|
writer.u8(0x65);
|
|
}
|
|
writeUInteger(uint) {
|
|
this.writeInteger(uint);
|
|
}
|
|
writeFloat(float) {
|
|
this.writeNumber(float);
|
|
}
|
|
writeBigint(int) {
|
|
const writer = this.writer;
|
|
writer.u8(0x69);
|
|
writer.ascii(int + '');
|
|
writer.u8(0x65);
|
|
}
|
|
writeBin(buf) {
|
|
const writer = this.writer;
|
|
const length = buf.length;
|
|
writer.ascii(length + '');
|
|
writer.u8(0x3a);
|
|
writer.buf(buf, length);
|
|
}
|
|
writeStr(str) {
|
|
const writer = this.writer;
|
|
const length = (0, utf8_1.utf8Size)(str);
|
|
writer.ascii(length + '');
|
|
writer.u8(0x3a);
|
|
writer.ensureCapacity(length);
|
|
writer.utf8(str);
|
|
}
|
|
writeAsciiStr(str) {
|
|
const writer = this.writer;
|
|
writer.ascii(str.length + '');
|
|
writer.u8(0x3a);
|
|
writer.ascii(str);
|
|
}
|
|
writeArr(arr) {
|
|
const writer = this.writer;
|
|
writer.u8(0x6c);
|
|
const length = arr.length;
|
|
for (let i = 0; i < length; i++)
|
|
this.writeAny(arr[i]);
|
|
writer.u8(0x65);
|
|
}
|
|
writeObj(obj) {
|
|
const writer = this.writer;
|
|
writer.u8(0x64);
|
|
const keys = (0, insertion_1.sort)(Object.keys(obj));
|
|
const length = keys.length;
|
|
for (let i = 0; i < length; i++) {
|
|
const key = keys[i];
|
|
this.writeStr(key);
|
|
this.writeAny(obj[key]);
|
|
}
|
|
writer.u8(0x65);
|
|
}
|
|
writeMap(obj) {
|
|
const writer = this.writer;
|
|
writer.u8(0x64);
|
|
const keys = (0, insertion_1.sort)([...obj.keys()]);
|
|
const length = keys.length;
|
|
for (let i = 0; i < length; i++) {
|
|
const key = keys[i];
|
|
this.writeStr(key + '');
|
|
this.writeAny(obj.get(key));
|
|
}
|
|
writer.u8(0x65);
|
|
}
|
|
writeSet(set) {
|
|
this.writeArr([...set.values()]);
|
|
}
|
|
}
|
|
exports.BencodeEncoder = BencodeEncoder;
|
|
//# sourceMappingURL=BencodeEncoder.js.map
|