UNPKG

@substrate-system/bencode

Version:
151 lines (150 loc) 4.62 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var encode_exports = {}; __export(encode_exports, { default: () => encode_default, encode: () => encode }); module.exports = __toCommonJS(encode_exports); var import_uint8_util = require("@substrate-system/uint8-util"); var import_util = require("./util.js"); function encode(data, buffer, offset) { const buffers = []; encode._encode(buffers, data); const result = (0, import_uint8_util.concat)(buffers); encode.bytes = result.length; if (ArrayBuffer.isView(buffer)) { buffer.set(result, offset); return buffer; } return result; } __name(encode, "encode"); encode.bytes = -1; encode._floatConversionDetected = false; encode._encode = function(buffers, data) { if (data == null) { return; } switch ((0, import_util.getType)(data)) { case "object": encode.dict(buffers, data); break; case "map": encode.dictMap(buffers, data); break; case "array": encode.list(buffers, data); break; case "set": encode.listSet(buffers, data); break; case "string": encode.string(buffers, data); break; case "number": encode.number(buffers, data); break; case "boolean": encode.number(buffers, data); break; case "arraybufferview": encode.buffer(buffers, new Uint8Array(data.buffer, data.byteOffset, data.byteLength)); break; case "arraybuffer": encode.buffer(buffers, new Uint8Array(data)); break; } }; const buffE = new Uint8Array([101]); const buffD = new Uint8Array([100]); const buffL = new Uint8Array([108]); encode.buffer = function(buffers, data) { buffers.push((0, import_uint8_util.text2arr)(data.length + ":"), data); }; encode.string = function(buffers, data) { buffers.push((0, import_uint8_util.text2arr)((0, import_uint8_util.text2arr)(data).byteLength + ":" + data)); }; encode.number = function(buffers, data) { if (Number.isInteger(data)) return buffers.push((0, import_uint8_util.text2arr)("i" + BigInt(data) + "e")); const maxLo = 2147483648; const hi = data / maxLo << 0; const lo = data % maxLo << 0; const val = hi * maxLo + lo; buffers.push((0, import_uint8_util.text2arr)("i" + val + "e")); if (val !== data && !encode._floatConversionDetected) { encode._floatConversionDetected = true; console.warn( 'WARNING: Possible data corruption detected with value "' + data + '":', 'Bencoding only defines support for integers, value was converted to "' + val + '"' ); console.trace(); } }; encode.dict = function(buffers, data) { buffers.push(buffD); let j = 0; let k; const keys = Object.keys(data).sort(); const kl = keys.length; for (; j < kl; j++) { k = keys[j]; if (data[k] == null) continue; encode.string(buffers, k); encode._encode(buffers, data[k]); } buffers.push(buffE); }; encode.dictMap = function(buffers, data) { buffers.push(buffD); const keys = Array.from(data.keys()).sort(); for (const key of keys) { if (data.get(key) == null) { continue; } if (ArrayBuffer.isView(key)) { encode._encode(buffers, key); } else { encode.string(buffers, String(key)); } encode._encode(buffers, data.get(key)); } buffers.push(buffE); }; encode.list = function(buffers, data) { let i = 0; const c = data.length; buffers.push(buffL); for (; i < c; i++) { if (data[i] == null) continue; encode._encode(buffers, data[i]); } buffers.push(buffE); }; encode.listSet = function(buffers, data) { buffers.push(buffL); for (const item of data) { if (item == null) continue; encode._encode(buffers, item); } buffers.push(buffE); }; var encode_default = encode; //# sourceMappingURL=encode.cjs.map