UNPKG

@substrate-system/bencode

Version:
8 lines (7 loc) 6.89 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": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,WAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAAkD,wCAClDC,EAAwB,qBAQjB,SAASC,EACZC,EACAC,EACAC,EACS,CACT,MAAMC,EAAU,CAAC,EACjBJ,EAAO,QAAQI,EAASH,CAAI,EAC5B,MAAMI,KAAoB,UAAOD,CAAO,EAGxC,OAFAJ,EAAO,MAAQK,EAAO,OAElB,YAAY,OAAOH,CAAM,GACzBA,EAAO,IAAIG,EAAQF,CAAM,EAClBD,GAGJG,CACX,CAhBgBC,EAAAN,EAAA,UAkBhBA,EAAO,MAAQ,GACfA,EAAO,yBAA2B,GAElCA,EAAO,QAAU,SAAUI,EAASH,EAAM,CACtC,GAAIA,GAAQ,KAEZ,UAAQ,WAAQA,CAAI,EAAG,CACnB,IAAK,SAAUD,EAAO,KAAKI,EAASH,CAAI,EAAG,MAC3C,IAAK,MAAOD,EAAO,QAAQI,EAASH,CAAI,EAAG,MAC3C,IAAK,QAASD,EAAO,KAAKI,EAASH,CAAI,EAAG,MAC1C,IAAK,MAAOD,EAAO,QAAQI,EAASH,CAAI,EAAG,MAC3C,IAAK,SAAUD,EAAO,OAAOI,EAASH,CAAI,EAAG,MAC7C,IAAK,SAAUD,EAAO,OAAOI,EAASH,CAAI,EAAG,MAC7C,IAAK,UAAWD,EAAO,OAAOI,EAASH,CAAI,EAAG,MAC9C,IAAK,kBAAmBD,EAAO,OAAOI,EAAS,IAAI,WAAWH,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,CAAC,EAAG,MAC/G,IAAK,cAAeD,EAAO,OAAOI,EAAS,IAAI,WAAWH,CAAI,CAAC,EAAG,KACtE,CACJ,EAEA,MAAMM,EAAQ,IAAI,WAAW,CAAC,GAAI,CAAC,EAC7BC,EAAQ,IAAI,WAAW,CAAC,GAAI,CAAC,EAC7BC,EAAQ,IAAI,WAAW,CAAC,GAAI,CAAC,EAEnCT,EAAO,OAAS,SAAUI,EAASH,EAAM,CACrCG,EAAQ,QAAK,YAASH,EAAK,OAAS,GAAG,EAAGA,CAAI,CAClD,EAEAD,EAAO,OAAS,SAAUI,EAASH,EAAM,CACrCG,EAAQ,QAAK,eAAS,YAASH,CAAI,EAAE,WAAa,IAAMA,CAAI,CAAC,CACjE,EAEAD,EAAO,OAAS,SAAUI,EAASH,EAAM,CACrC,GAAI,OAAO,UAAUA,CAAI,EAAG,OAAOG,EAAQ,QAAK,YAAS,IAAM,OAAOH,CAAI,EAAI,GAAG,CAAC,EAElF,MAAMS,EAAQ,WACRC,EAAMV,EAAOS,GAAU,EACvBE,EAAMX,EAAOS,GAAU,EACvBG,EAAMF,EAAKD,EAAQE,EAEzBR,EAAQ,QAAK,YAAS,IAAMS,EAAM,GAAG,CAAC,EAElCA,IAAQZ,GAAQ,CAACD,EAAO,2BACxBA,EAAO,yBAA2B,GAClC,QAAQ,KACJ,0DAA4DC,EAAO,KACnE,wEAA0EY,EAAM,GACpF,EACA,QAAQ,MAAM,EAEtB,EAEAb,EAAO,KAAO,SAAUI,EAASH,EAAM,CACnCG,EAAQ,KAAKI,CAAK,EAElB,IAAIM,EAAI,EACJC,EAEJ,MAAMC,EAAO,OAAO,KAAKf,CAAI,EAAE,KAAK,EAC9BgB,EAAKD,EAAK,OAEhB,KAAOF,EAAIG,EAAIH,IACXC,EAAIC,EAAKF,CAAC,EACNb,EAAKc,CAAC,GAAK,OACff,EAAO,OAAOI,EAASW,CAAC,EACxBf,EAAO,QAAQI,EAASH,EAAKc,CAAC,CAAC,GAGnCX,EAAQ,KAAKG,CAAK,CACtB,EAEAP,EAAO,QAAU,SAAUI,EAASH,EAAM,CACtCG,EAAQ,KAAKI,CAAK,EAElB,MAAMQ,EAAO,MAAM,KAAKf,EAAK,KAAK,CAAC,EAAE,KAAK,EAE1C,UAAWiB,KAAOF,EACVf,EAAK,IAAIiB,CAAG,GAAK,OAIjB,YAAY,OAAOA,CAAG,EACtBlB,EAAO,QAAQI,EAASc,CAAG,EAE3BlB,EAAO,OAAOI,EAAS,OAAOc,CAAG,CAAC,EAGtClB,EAAO,QAAQI,EAASH,EAAK,IAAIiB,CAAG,CAAC,GAGzCd,EAAQ,KAAKG,CAAK,CACtB,EAEAP,EAAO,KAAO,SAAUI,EAASH,EAAM,CACnC,IAAIkB,EAAI,EACR,MAAMC,EAAInB,EAAK,OAGf,IAFAG,EAAQ,KAAKK,CAAK,EAEXU,EAAIC,EAAGD,IACNlB,EAAKkB,CAAC,GAAK,MACfnB,EAAO,QAAQI,EAASH,EAAKkB,CAAC,CAAC,EAGnCf,EAAQ,KAAKG,CAAK,CACtB,EAEAP,EAAO,QAAU,SAAUI,EAASH,EAAM,CACtCG,EAAQ,KAAKK,CAAK,EAElB,UAAWY,KAAQpB,EACXoB,GAAQ,MACZrB,EAAO,QAAQI,EAASiB,CAAI,EAGhCjB,EAAQ,KAAKG,CAAK,CACtB,EAEA,IAAOe,EAAQtB", "names": ["encode_exports", "__export", "encode_default", "encode", "__toCommonJS", "import_uint8_util", "import_util", "encode", "data", "buffer", "offset", "buffers", "result", "__name", "buffE", "buffD", "buffL", "maxLo", "hi", "lo", "val", "j", "k", "keys", "kl", "key", "i", "c", "item", "encode_default"] }