{
  "version": 3,
  "sources": ["../src/decode.ts"],
  "sourcesContent": ["import { arr2text, text2arr, arr2hex } from '@substrate-system/uint8-util'\n\nconst INTEGER_START = 0x69  // 'i'\nconst STRING_DELIM = 0x3A  // ':'\nconst DICTIONARY_START = 0x64  // 'd'\nconst LIST_START = 0x6C  // 'l'\nconst END_OF_TYPE = 0x65  // 'e'\n\nexport type Decoded =\n    | Record<string, any>\n    | Array<any>\n    | string\n    | number;\n\nexport interface Decoder {\n    (data:Uint8Array|string):Decoded|null\n    (data:Uint8Array|string, encoding:string):Decoded|null\n    (data:Uint8Array|string, start:number, encoding:string):Decoded|null\n    (data:Uint8Array|string, start:number, end:number, encoding:string):Decoded|null\n    data:Uint8Array|null;\n    bytes:number;\n    position:number;\n    encoding:string|null;\n    next:()=>Record<string, any>|Array<any>|Uint8Array|string|number|null;\n    dictionary:()=>Record<string, any>|null;\n    list:()=>any[];\n    buffer:()=>Uint8Array|string;\n    find:(ch:number)=>number|null;\n    integer:()=>number;\n}\n\n/**\n * Decode bencoded data.\n *\n * @param  {Uint8Array|string} data The buffer to decode\n * @param  {number} [start] Optional start index\n * @param  {number} [end] Optional end index\n * @param  {string} [encoding] Optional encoding type (utf8, etc)\n * @return {Decoded}\n */\nconst decode:Decoder = function decode (\n    data:Uint8Array|string,\n    start?:number|string,\n    end?:number|string,\n    encoding?:string\n):Decoded|null {\n    if (!data || data.length === 0) {\n        throw new Error('Missing data to decode.')\n    }\n\n    if (typeof start !== 'number' && encoding == null) {\n        encoding = start\n        start = undefined\n    }\n\n    if (typeof end !== 'number' && encoding == null) {\n        encoding = end\n        end = undefined\n    }\n\n    decode.position = 0\n    decode.encoding = encoding || null\n\n    decode.data = !(ArrayBuffer.isView(data)) ?\n        text2arr(data) :\n        new Uint8Array(data.slice(\n            start as number|undefined,\n            end as number|undefined)\n        )\n\n    decode.bytes = decode.data.length\n\n    return decode.next()\n}\n\ndecode.bytes = 0\ndecode.position = 0\ndecode.data = null\ndecode.encoding = null\n\ndecode.next = function ():Record<string, any>|Array<any>|Uint8Array|string|number|null {\n    switch (decode.data![decode.position]) {\n        case DICTIONARY_START:\n            return decode.dictionary()\n        case LIST_START:\n            return decode.list()\n        case INTEGER_START:\n            return decode.integer()\n        default:\n            return decode.buffer()\n    }\n}\n\ndecode.find = function (chr:number):number|null {\n    if (!decode.data?.length) return null\n    let i = decode.position\n    const c = decode.data.length\n    const d = decode.data\n\n    while (i < c) {\n        if (d[i] === chr) return i\n        i++\n    }\n\n    throw new Error(\n        'Invalid data: Missing delimiter \"' +\n        String.fromCharCode(chr) + '\" [0x' +\n        chr.toString(16) + ']'\n    )\n}\n\ndecode.dictionary = function ():Record<string, any>|null {\n    if (!decode.data) return null\n    decode.position++\n\n    const dict = {}\n\n    while (decode.data[decode.position] !== END_OF_TYPE) {\n        const buffer = decode.buffer()\n        if (typeof buffer === 'string') {\n            dict[buffer] = decode.next()\n            continue\n        }\n        let key = arr2text(buffer)\n        if (key.includes('\\uFFFD')) key = arr2hex(buffer)\n        dict[key] = decode.next()\n    }\n\n    decode.position++\n\n    return dict\n}\n\ndecode.list = function ():any[] {\n    decode.position++\n\n    const lst:any[] = []\n\n    while (decode.data![decode.position] !== END_OF_TYPE) {\n        lst.push(decode.next())\n    }\n\n    decode.position++\n\n    return lst\n}\n\ndecode.integer = function () {\n    const end = decode.find(END_OF_TYPE)\n    const number = getIntFromBuffer(decode.data, decode.position + 1, end)\n    if (!end) throw new Error('not end')\n\n    decode.position += end + 1 - decode.position\n\n    return number\n}\n\ndecode.buffer = function ():Uint8Array|string {\n    const sep = decode.find(STRING_DELIM)\n    const newIndex = (sep || 0) + 1\n    const length = getIntFromBuffer(decode.data, decode.position, sep)\n    const end = newIndex + length\n\n    decode.position = end\n\n    return decode.encoding ?\n        arr2text(decode.data!.slice(newIndex, end)) :\n        decode.data!.slice(newIndex, end)\n}\n\nexport default decode\n\n/**\n * replaces parseInt(buffer.toString('ascii', start, end)).\n * For strings with less then ~30 charachters, this is actually a lot faster.\n *\n * @param {Uint8Array} data\n * @param {Number} start\n * @param {Number} end\n * @return {Number} calculated number\n */\nfunction getIntFromBuffer (buffer, start, end) {\n    let sum = 0\n    let sign = 1\n\n    for (let i = start; i < end; i++) {\n        const num = buffer[i]\n\n        if (num < 58 && num >= 48) {\n            sum = sum * 10 + (num - 48)\n            continue\n        }\n\n        if (i === start && num === 43) { // +\n            continue\n        }\n\n        if (i === start && num === 45) { // -\n            sign = -1\n            continue\n        }\n\n        if (num === 46) { // .\n            // its a float. break here.\n            break\n        }\n\n        throw new Error('not a number: buffer[' + i + '] = ' + num)\n    }\n\n    return sum * sign\n}\n"],
  "mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA4C,wCAE5C,MAAMC,EAAgB,IAChBC,EAAe,GACfC,EAAmB,IACnBC,EAAa,IACbC,EAAc,IAkCdC,EAAiBC,EAAA,SAASD,EAC5BE,EACAC,EACAC,EACAC,EACW,CACX,GAAI,CAACH,GAAQA,EAAK,SAAW,EACzB,MAAM,IAAI,MAAM,yBAAyB,EAG7C,OAAI,OAAOC,GAAU,UAAYE,GAAY,OACzCA,EAAWF,EACXA,EAAQ,QAGR,OAAOC,GAAQ,UAAYC,GAAY,OACvCA,EAAWD,EACXA,EAAM,QAGVJ,EAAO,SAAW,EAClBA,EAAO,SAAWK,GAAY,KAE9BL,EAAO,KAAS,YAAY,OAAOE,CAAI,EAEnC,IAAI,WAAWA,EAAK,MAChBC,EACAC,CAAuB,CAC3B,KAJA,YAASF,CAAI,EAMjBF,EAAO,MAAQA,EAAO,KAAK,OAEpBA,EAAO,KAAK,CACvB,EAjCuB,UAmCvBA,EAAO,MAAQ,EACfA,EAAO,SAAW,EAClBA,EAAO,KAAO,KACdA,EAAO,SAAW,KAElBA,EAAO,KAAO,UAAyE,CACnF,OAAQA,EAAO,KAAMA,EAAO,QAAQ,EAAG,CACnC,KAAKH,EACD,OAAOG,EAAO,WAAW,EAC7B,KAAKF,EACD,OAAOE,EAAO,KAAK,EACvB,KAAKL,EACD,OAAOK,EAAO,QAAQ,EAC1B,QACI,OAAOA,EAAO,OAAO,CAC7B,CACJ,EAEAA,EAAO,KAAO,SAAUM,EAAwB,CAC5C,GAAI,CAACN,EAAO,MAAM,OAAQ,OAAO,KACjC,IAAIO,EAAIP,EAAO,SACf,MAAMQ,EAAIR,EAAO,KAAK,OAChBS,EAAIT,EAAO,KAEjB,KAAOO,EAAIC,GAAG,CACV,GAAIC,EAAEF,CAAC,IAAMD,EAAK,OAAOC,EACzBA,GACJ,CAEA,MAAM,IAAI,MACN,oCACA,OAAO,aAAaD,CAAG,EAAI,QAC3BA,EAAI,SAAS,EAAE,EAAI,GACvB,CACJ,EAEAN,EAAO,WAAa,UAAqC,CACrD,GAAI,CAACA,EAAO,KAAM,OAAO,KACzBA,EAAO,WAEP,MAAMU,EAAO,CAAC,EAEd,KAAOV,EAAO,KAAKA,EAAO,QAAQ,IAAMD,GAAa,CACjD,MAAMY,EAASX,EAAO,OAAO,EAC7B,GAAI,OAAOW,GAAW,SAAU,CAC5BD,EAAKC,CAAM,EAAIX,EAAO,KAAK,EAC3B,QACJ,CACA,IAAIY,KAAM,YAASD,CAAM,EACrBC,EAAI,SAAS,QAAQ,IAAGA,KAAM,WAAQD,CAAM,GAChDD,EAAKE,CAAG,EAAIZ,EAAO,KAAK,CAC5B,CAEA,OAAAA,EAAO,WAEAU,CACX,EAEAV,EAAO,KAAO,UAAkB,CAC5BA,EAAO,WAEP,MAAMa,EAAY,CAAC,EAEnB,KAAOb,EAAO,KAAMA,EAAO,QAAQ,IAAMD,GACrCc,EAAI,KAAKb,EAAO,KAAK,CAAC,EAG1B,OAAAA,EAAO,WAEAa,CACX,EAEAb,EAAO,QAAU,UAAY,CACzB,MAAMI,EAAMJ,EAAO,KAAKD,CAAW,EAC7Be,EAASC,EAAiBf,EAAO,KAAMA,EAAO,SAAW,EAAGI,CAAG,EACrE,GAAI,CAACA,EAAK,MAAM,IAAI,MAAM,SAAS,EAEnC,OAAAJ,EAAO,UAAYI,EAAM,EAAIJ,EAAO,SAE7Bc,CACX,EAEAd,EAAO,OAAS,UAA8B,CAC1C,MAAMgB,EAAMhB,EAAO,KAAKJ,CAAY,EAC9BqB,GAAYD,GAAO,GAAK,EACxBE,EAASH,EAAiBf,EAAO,KAAMA,EAAO,SAAUgB,CAAG,EAC3DZ,EAAMa,EAAWC,EAEvB,OAAAlB,EAAO,SAAWI,EAEXJ,EAAO,YACV,YAASA,EAAO,KAAM,MAAMiB,EAAUb,CAAG,CAAC,EAC1CJ,EAAO,KAAM,MAAMiB,EAAUb,CAAG,CACxC,EAEA,IAAOe,EAAQnB,EAWf,SAASe,EAAkBJ,EAAQR,EAAOC,EAAK,CAC3C,IAAIgB,EAAM,EACNC,EAAO,EAEX,QAASd,EAAIJ,EAAOI,EAAIH,EAAKG,IAAK,CAC9B,MAAMe,EAAMX,EAAOJ,CAAC,EAEpB,GAAIe,EAAM,IAAMA,GAAO,GAAI,CACvBF,EAAMA,EAAM,IAAME,EAAM,IACxB,QACJ,CAEA,GAAI,EAAAf,IAAMJ,GAASmB,IAAQ,IAI3B,IAAIf,IAAMJ,GAASmB,IAAQ,GAAI,CAC3BD,EAAO,GACP,QACJ,CAEA,GAAIC,IAAQ,GAER,MAGJ,MAAM,IAAI,MAAM,wBAA0Bf,EAAI,OAASe,CAAG,EAC9D,CAEA,OAAOF,EAAMC,CACjB,CA9BSpB,EAAAc,EAAA",
  "names": ["decode_exports", "__export", "decode_default", "__toCommonJS", "import_uint8_util", "INTEGER_START", "STRING_DELIM", "DICTIONARY_START", "LIST_START", "END_OF_TYPE", "decode", "__name", "data", "start", "end", "encoding", "chr", "i", "c", "d", "dict", "buffer", "key", "lst", "number", "getIntFromBuffer", "sep", "newIndex", "length", "decode_default", "sum", "sign", "num"]
}
