{"version":3,"file":"index.modern.mjs","sources":["../src/error.ts","../src/index.ts"],"sourcesContent":["/**\n * Indicates resolution could not continue because\n */\nexport class DeadEndError extends Error {\n  /**\n   * The path at which resolution failed\n   */\n  at: string;\n\n  /**\n   * The remaining path which could not get resolved\n   */\n  remaining: string;\n\n  /**\n   * The CID of the block at which the error happened\n   */\n  cid: any;\n\n  constructor(msg: string, cid: any, at: string, remaining: string) {\n    super(msg);\n    Object.setPrototypeOf(this, DeadEndError.prototype);\n\n    this.cid = cid;\n    this.at = at;\n    this.remaining = remaining;\n  }\n}\n","import { CID } from \"multiformats\";\nimport { Block } from \"multiformats/block\";\n\nimport type { API as BlockAPI } from \"ipfs-core-types/block\";\nimport type { API as NameAPI } from \"ipfs-core-types/name\";\nimport { BlockMulticodec, Multidecoder } from \"multiformat-multicodec\";\n\nimport * as json from \"@ipld/dag-json\";\nimport * as cbor from \"@ipld/dag-cbor\";\nimport * as pb from \"@ipld/dag-pb\";\nimport { BlockDecoder } from \"multiformats/codecs/interface\";\nimport { Hasher } from \"multiformats/hashes/hasher\";\n\nimport { DeadEndError } from \"./error\";\n\n// The code for `libp2p-key-codec'.\nconst kLibp2pKeyCodec = 0x72;\n\n/**\n * Factory function that takes in its dynamic dependencies and returns a library\n * object.\n * @param block The `block` API of an IPFS Core impl. Only needs to exist `block::get()`\n * @param name The `name` API of an IPFS Core impl. Only needs to exist `name::resolve()`\n * @param [multidecoder] Either an impl of the [Multidecoder]{@link Multidecoder} interface, or an object containing an array of `decoders` and `hashers` that will be added to the default Multidecoder.\n * @returns Library object\n */\nexport default function (\n  block: Pick<BlockAPI, \"get\">,\n  name: Pick<NameAPI, \"resolve\">,\n  multidecoder: Multidecoder<any> & {\n    decoders: BlockDecoder<any, any>[];\n    hashers: Hasher<any, any>[];\n  } = undefined as any\n) {\n  const defaultMultidecoder = new BlockMulticodec<any>({\n    codecs: [json, cbor, pb],\n  });\n\n  // Use the user-given multidecoder, or add the user's decoders/hashers\n  let decoder: Multidecoder<any> = defaultMultidecoder;\n  if (\n    typeof multidecoder === \"object\" &&\n    !(\"decoders\" in multidecoder) &&\n    !(\"hashers\" in multidecoder)\n  ) {\n    decoder = multidecoder;\n  } else {\n    if (multidecoder?.decoders)\n      multidecoder.decoders.forEach((d) => decoder.addDecoder(d));\n    if (multidecoder?.hashers)\n      multidecoder.hashers.forEach((h) => decoder.addHasher(h));\n  }\n\n  return {\n    /**\n     * Resolves a CID as if it were an IPNS link until it resolves into a regular block CID.\n     * @param {CID | string} cid The CID which to resolve\n     * @param {number} [timeout] Max timeout on the recursive query\n     * @throws Will throw if `cid` is invalid, or resolution otherwise fails.\n     */\n    async resolveIpns(cid: CID | string, timeout?: number): Promise<CID> {\n      let ipnsAddr = \"/ipns/\";\n      if (typeof cid === \"string\") ipnsAddr += cid;\n      else ipnsAddr += cid.toString();\n\n      let r = null;\n      for await (const i of name.resolve(ipnsAddr, {\n        recursive: true,\n        timeout,\n      }))\n        r = i;\n\n      // Cut out the /ipns/ from the start\n      return CID.parse(r.slice(6));\n    },\n\n    /**\n     * Resolve an IPLD value starting from a CID, following a path.\n     * Will traverse DAG-PB (UnixFS) by treating path segments as UnixFS path segments (i.e. it will follow *files*, and not nodes).\n     *\n     * Will dereference CIDs in non-UnixFS nodes.\n     * CIDs are detected if:\n     *  - The node is a string, and `CID.parse()` succeeds\n     *  - The node is an object, and `CID.asCID()` succeeds\n     * @see CID.parse\n     * @see CID.asCID\n     *\n     * @param {CID} cid Starting block CID\n     * @param {string} [path] The path which to resolve. Defaults to `/` (doesn't move)\n     * @param {Object} [options] Resolution configuration\n     * @param {boolean} [options.followPb] Whether or not to follow path across DAG-PB nodes. Defaults to `true`\n     * @param {boolean} [options.followIpld] Whether or not to follow path across non-DAG-PB (regular) nodes. Defaults to `true`\n     *\n     * @throws {TypeError} Passed CID has codec `libp2p-key` (0x72). Currently, this is treated as only being used for IPNS. Please submit a bug report if you have a different use case.\n     * @throws {DeadEndError} Resolution can't move forward because of missing object entry\n     */\n    async resolve<T = any>(\n      cid: CID,\n      path: string = \"/\",\n      options?: { followPb?: boolean; followIpld?: boolean }\n    ): Promise<{ value: T; cid: CID; block: Block<any> }> {\n      // TODO: maybe there is a non IPNS use for this\n      if (cid.code === kLibp2pKeyCodec) {\n        throw TypeError(\n          \"Received CID with codec for 'libp2p-key'. \" +\n            \"If you need to resolve IPNS into a CID, call resolveIpns() first\"\n        );\n      }\n\n      const bytes = await block.get(cid);\n      const decoded = await decoder.decode({\n        codec: cid.code,\n        hasher: cid.multihash.code,\n        bytes,\n      });\n\n      // TODO: optimise by wrapping `CID -> [PathSeg] -> Promise`\n      const segs = path.split(/\\/+/).filter((s) => s.length);\n      const [curr, ...rest] = segs;\n\n      // Bail out early\n      if (!segs.length)\n        return { value: decoded.value, cid: decoded.cid, block: decoded };\n\n      // This is a DAG-PB file node, traverse it differently\n      if (cid.code === pb.code) {\n        if (options?.followPb === false) {\n          throw new DeadEndError(\n            `Resolution hit dead end at CID ${cid.toString()}: node is a DAG-PB node, but 'followPb' is set to 'false'`,\n            cid,\n            curr,\n            rest.join(\"/\")\n          );\n        }\n\n        const node = decoded.value as pb.PBNode;\n        const child = node.Links.find((n) => n.Name === curr);\n\n        if (child) {\n          // Found a link matching the leftmost path segment\n          return await this.resolve(child.Hash, rest.join(\"/\"), options);\n        } else {\n          // No link: give up\n          throw new DeadEndError(\n            `Resolution hit dead end at CID ${cid.toString()}: no link to ${curr}`,\n            cid,\n            curr,\n            rest.join(\"/\")\n          );\n        }\n      }\n\n      // This is a \"regular\" codec block\n      else {\n        if (options?.followIpld === false) {\n          throw new DeadEndError(\n            `Resolution hit dead end at CID ${cid.toString()}: node is an IPLD node, but 'followIpld' is set to 'false'`,\n            cid,\n            curr,\n            rest.join(\"/\")\n          );\n        }\n\n        let node = decoded.value;\n        for (const [i, seg] of segs.entries()) {\n          if (Array.isArray(node)) {\n            // Arrays are indexed by numbers\n            node = node[JSON.parse(seg)];\n          } else node = node[seg];\n\n          if (node === undefined) {\n            throw new DeadEndError(\n              `Resolution hit dead end at CID ${cid.toString()}: object has no property at path /${segs\n                .slice(0, i)\n                .reduce((acc, x) => acc + \"/\" + x)}`,\n              cid,\n              curr,\n              rest.join(\"/\")\n            );\n          }\n\n          // TODO: how are CIDs canonically stored in IPLD?\n          const asCid = CID.asCID(node);\n          if (asCid) {\n            return await this.resolve(asCid, segs.slice(i).join(\"/\"), options);\n          }\n\n          let cidStr = null;\n          try {\n            cidStr = CID.parse(node);\n          } catch {}\n          if (cidStr) {\n            return await this.resolve(cidStr, segs.slice(i).join(\"/\"), options);\n          }\n        }\n\n        return { value: node, cid, block: decoded };\n      }\n    },\n  };\n}\n"],"names":["DeadEndError","Error","constructor","msg","cid","at","remaining","Object","setPrototypeOf","prototype","kLibp2pKeyCodec","block","name","multidecoder","undefined","defaultMultidecoder","BlockMulticodec","codecs","json","cbor","pb","decoder","decoders","forEach","d","addDecoder","hashers","h","addHasher","resolveIpns","timeout","ipnsAddr","toString","r","resolve","recursive","i","CID","parse","slice","path","options","code","TypeError","bytes","get","decoded","decode","codec","hasher","multihash","segs","split","filter","s","length","curr","rest","value","followPb","join","node","child","Links","find","n","Name","Hash","followIpld","seg","entries","Array","isArray","JSON","reduce","acc","x","asCid","asCID","cidStr"],"mappings":"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"}