ipfs-http-client
Version:
A client library for the IPFS HTTP API
38 lines • 1.05 kB
JavaScript
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);
}
}
}