ipfs-http-client
Version:
A client library for the IPFS HTTP API
75 lines • 2.15 kB
JavaScript
import { CID } from 'multiformats/cid';
import { configure } from './lib/configure.js';
import { toUrlSearchParams } from './lib/to-url-search-params.js';
import { createStat } from './files/stat.js';
export const createLs = configure((api, opts) => {
async function* ls(path, options = {}) {
const pathStr = `${ path instanceof Uint8Array ? CID.decode(path) : path }`;
async function mapLink(link) {
let hash = link.Hash;
if (hash.includes('/')) {
const ipfsPath = hash.startsWith('/ipfs/') ? hash : `/ipfs/${ hash }`;
const stats = await createStat(opts)(ipfsPath);
hash = stats.cid;
} else {
hash = CID.parse(hash);
}
const entry = {
name: link.Name,
path: pathStr + (link.Name ? `/${ link.Name }` : ''),
size: link.Size,
cid: hash,
type: typeOf(link)
};
if (link.Mode) {
entry.mode = parseInt(link.Mode, 8);
}
if (link.Mtime !== undefined && link.Mtime !== null) {
entry.mtime = { secs: link.Mtime };
if (link.MtimeNsecs !== undefined && link.MtimeNsecs !== null) {
entry.mtime.nsecs = link.MtimeNsecs;
}
}
return entry;
}
const res = await api.post('ls', {
signal: options.signal,
searchParams: toUrlSearchParams({
arg: pathStr,
...options
}),
headers: options.headers
});
for await (let result of res.ndjson()) {
result = result.Objects;
if (!result) {
throw new Error('expected .Objects in results');
}
result = result[0];
if (!result) {
throw new Error('expected one array in results.Objects');
}
const links = result.Links;
if (!Array.isArray(links)) {
throw new Error('expected one array in results.Objects[0].Links');
}
if (!links.length) {
yield mapLink(result);
return;
}
yield* links.map(mapLink);
}
}
return ls;
});
function typeOf(link) {
switch (link.Type) {
case 1:
case 5:
return 'dir';
case 2:
return 'file';
default:
return 'file';
}
}