UNPKG

bitdrive-cli

Version:

A Bitspace service that for managing Bitdrives over FUSE.

74 lines (63 loc) 2.12 kB
const fs = require('fs').promises const p = require('path') const mirrorFolder = require('mirror-folder') const { IMPORT_KEY_FILE_PATH, EXPORT_KEY_FILE_PATH } = require('./constants') module.exports = async function importDirectory (client, key, dir, opts = {}) { if (!key) key = await loadKeyFromFile(dir) var closed = false const drive = await client._createDrive({ key }) const discoveryKey = drive.discoveryKey if (!opts.noSeed) { await client.seed(null, { discoveryKey, lookup: true, announce: true, remember: true }) } if (!drive.writable) { throw new Error('The target drive is not writable.') } await saveKeyToFile(dir, drive.key) const progress = mirrorFolder(dir, { fs: drive, name: '/' }, { watch: !!opts.watch, dereference: true, // When going from fs -> drive, it should overwrite. keepExisting: false, ignore: (file, stat, cb) => { if (shouldIgnore(file)) return process.nextTick(cb, null, true) return process.nextTick(cb, null, false) } }) progress.on('skip', (src, dst) => { if (src && (shouldIgnore(src.name) || src.name === '/')) return if (dst && (shouldIgnore(dst.name) || dst.name === '/')) return progress.emit('skip-not-ignored', src, dst) }) progress.on('pending', ({ name }) => { if (shouldIgnore(name)) return progress.emit('pending-not-ignored', name) }) return { progress, drive, cleanup } async function cleanup () { if (closed) return closed = true progress.destroy() await drive.close() } } async function loadKeyFromFile (dir) { const keyPath = p.join(dir, IMPORT_KEY_FILE_PATH) try { const key = await fs.readFile(keyPath) return key } catch (err) { if (err && err.code !== 'ENOENT') throw err return null } } function saveKeyToFile (dir, key) { const keyPath = p.join(dir, IMPORT_KEY_FILE_PATH) return fs.writeFile(keyPath, key) } function shouldIgnore (name) { if (!name) return true if (name.indexOf(EXPORT_KEY_FILE_PATH) !== -1) return true else if (name.indexOf(IMPORT_KEY_FILE_PATH) !== -1) return true return false }