node-ejs-renderer/node_modules/@jsonjoy.com/json-pack/lib/bencode/BencodeEncoder.js

147 lines
4.2 KiB
JavaScript
Raw Permalink Normal View History

2024-06-09 13:55:01 -04:00
"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