UNPKG

ipfs-http-client

Version:
38 lines 1.05 kB
import { CID } from 'multiformats/cid'; import errCode from 'err-code'; export async function* resolve(cid, path, codecs, getBlock, options) { const load = async cid => { const codec = await codecs.getCodec(cid.code); const block = await getBlock(cid, options); return codec.decode(block); }; const parts = path.split('/').filter(Boolean); let value = await load(cid); let lastCid = cid; if (!parts.length) { yield { value, remainderPath: '' }; } while (parts.length) { const key = parts.shift(); if (!key) { throw errCode(new Error(`Could not resolve path "${ path }"`), 'ERR_INVALID_PATH'); } if (Object.prototype.hasOwnProperty.call(value, key)) { value = value[key]; yield { value, remainderPath: parts.join('/') }; } else { throw errCode(new Error(`no link named "${ key }" under ${ lastCid }`), 'ERR_NO_LINK'); } const cid = CID.asCID(value); if (cid) { lastCid = cid; value = await load(value); } } }