dat-walk
Version:
Recursive directory walker for dat archives
52 lines (42 loc) • 1.14 kB
JavaScript
var { join } = require('path')
var box = require('callbox')
module.exports = (dat, opts) => {
opts = opts || {}
var base = typeof opts === 'string' ? opts : opts.base
return walk(dat, base, opts)
}
async function * walk (dat, base, opts) {
var queue = [normalize(base)]
while (queue.length) {
var path = queue.shift()
var stats = await stat(dat, path, opts.follow)
if (stats.isDirectory()) {
var items = await readdir(dat, path)
var paths = items.map(item => join(path, item))
queue.push.apply(queue, paths)
if (!opts.dirs) continue
}
yield path
}
}
function normalize (base) {
if (!base || base === '.' || base === '/') {
return ''
}
return base
}
function stat (dat, path, follow) {
var lstat = !follow && dat.lstat
? dat.lstat.bind(dat)
: dat.stat.bind(dat)
if (lstat.constructor.name === 'AsyncFunction') {
return lstat(path)
}
return box(done => lstat(path, done))
}
function readdir (dat, path) {
if (dat.readdir.constructor.name === 'AsyncFunction') {
return dat.readdir(path)
}
return box(done => dat.readdir(path, done))
}