UNPKG

@substrate-system/bencode

Version:
8 lines (7 loc) 6.69 kB
{ "version": 3, "sources": ["../src/encode.ts"], "sourcesContent": ["import { concat, text2arr, type TypedArray } from '@substrate-system/uint8-util'\nimport { getType } from './util.js'\n\n/**\n * Encodes data in bencode.\n *\n * @param {Uint8Array|Array|String|Object|Number|Boolean} data\n * @return {Uint8Array}\n */\nexport function encode (\n data?:TypedArray|any[]|string|number|boolean|object|null,\n buffer?:Uint8Array,\n offset?:number\n):Uint8Array {\n const buffers = []\n encode._encode(buffers, data)\n const result:Uint8Array = concat(buffers)\n encode.bytes = result.length\n\n if (ArrayBuffer.isView(buffer)) {\n buffer.set(result, offset)\n return buffer\n }\n\n return result\n}\n\nencode.bytes = -1\nencode._floatConversionDetected = false\n\nencode._encode = function (buffers, data) {\n if (data == null) { return }\n\n switch (getType(data)) {\n case 'object': encode.dict(buffers, data); break\n case 'map': encode.dictMap(buffers, data); break\n case 'array': encode.list(buffers, data); break\n case 'set': encode.listSet(buffers, data); break\n case 'string': encode.string(buffers, data); break\n case 'number': encode.number(buffers, data); break\n case 'boolean': encode.number(buffers, data); break\n case 'arraybufferview': encode.buffer(buffers, new Uint8Array(data.buffer, data.byteOffset, data.byteLength)); break\n case 'arraybuffer': encode.buffer(buffers, new Uint8Array(data)); break\n }\n}\n\nconst buffE = new Uint8Array([0x65])\nconst buffD = new Uint8Array([0x64])\nconst buffL = new Uint8Array([0x6C])\n\nencode.buffer = function (buffers, data) {\n buffers.push(text2arr(data.length + ':'), data)\n}\n\nencode.string = function (buffers, data) {\n buffers.push(text2arr(text2arr(data).byteLength + ':' + data))\n}\n\nencode.number = function (buffers, data) {\n if (Number.isInteger(data)) return buffers.push(text2arr('i' + BigInt(data) + 'e'))\n\n const maxLo = 0x80000000\n const hi = (data / maxLo) << 0\n const lo = (data % maxLo) << 0\n const val = hi * maxLo + lo\n\n buffers.push(text2arr('i' + val + 'e'))\n\n if (val !== data && !encode._floatConversionDetected) {\n encode._floatConversionDetected = true\n console.warn(\n 'WARNING: Possible data corruption detected with value \"' + data + '\":',\n 'Bencoding only defines support for integers, value was converted to \"' + val + '\"'\n )\n console.trace()\n }\n}\n\nencode.dict = function (buffers, data) {\n buffers.push(buffD)\n\n let j = 0\n let k\n // fix for issue #13 - sorted dicts\n const keys = Object.keys(data).sort()\n const kl = keys.length\n\n for (; j < kl; j++) {\n k = keys[j]\n if (data[k] == null) continue\n encode.string(buffers, k)\n encode._encode(buffers, data[k])\n }\n\n buffers.push(buffE)\n}\n\nencode.dictMap = function (buffers, data) {\n buffers.push(buffD)\n\n const keys = Array.from(data.keys()).sort()\n\n for (const key of keys) {\n if (data.get(key) == null) {\n continue\n }\n\n if (ArrayBuffer.isView(key)) {\n encode._encode(buffers, key)\n } else {\n encode.string(buffers, String(key))\n }\n\n encode._encode(buffers, data.get(key))\n }\n\n buffers.push(buffE)\n}\n\nencode.list = function (buffers, data) {\n let i = 0\n const c = data.length\n buffers.push(buffL)\n\n for (; i < c; i++) {\n if (data[i] == null) continue\n encode._encode(buffers, data[i])\n }\n\n buffers.push(buffE)\n}\n\nencode.listSet = function (buffers, data) {\n buffers.push(buffL)\n\n for (const item of data) {\n if (item == null) continue\n encode._encode(buffers, item)\n }\n\n buffers.push(buffE)\n}\n\nexport default encode\n"], "mappings": "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", "names": [] }