From 9db17957f90d95f706b1415ac1494f6b5c09541f Mon Sep 17 00:00:00 2001 From: Joe Hand Date: Thu, 22 Mar 2018 11:36:14 -0700 Subject: [PATCH] upgrade to hyperdb --- cli.js | 159 +++++++++++---------------------------------------- index.js | 32 ++++------- package.json | 4 +- readme.md | 2 +- storage.js | 33 +++++------ ui.js | 48 ++++++++-------- 6 files changed, 88 insertions(+), 190 deletions(-) diff --git a/cli.js b/cli.js index f75f232..079139f 100755 --- a/cli.js +++ b/cli.js @@ -1,12 +1,13 @@ #!/usr/bin/env node +var path = require('path') var minimist = require('minimist') var pretty = require('prettier-bytes') var speed = require('speedometer') var progress = require('progress-string') var cliTruncate = require('cli-truncate') var neatLog = require('neat-log') -var output = require('neat-log/output') +var mirror = require('mirror-folder') var debug = require('debug')('dat-next') var view = require('./ui') @@ -29,149 +30,53 @@ var quiet = debug.enabled || !!process.env.DEBUG if (!argv._.length || argv.help) return usage() +runDat() -var neat = neatLog([view.main, view.progress], { - logspeed: logspeed, - quiet: quiet -}) -neat.use(runDat) -neat.use(trackNetwork) -neat.use(trackProgress) - -function runDat (state, bus) { - state.opts = argv - state.title = 'Starting Dat program...' - bus.emit('render') - +function runDat () { Dat(src, dest, argv, function (err, dat) { if (err) { - bus.clear() console.error('ERROR:', err) process.exit(1) } - state.archive = dat.archive - state.network = dat.network - state.importer = dat.importer - state.stats = dat.stats - state.writable = dat.writable - if (dat.archive.content) { - bus.emit('archive:content') - } else { - dat.archive.once('content', function () { - bus.emit('archive:content') - }) - } - dat.archive.metadata.on('append', function () { - bus.emit('render') - }) - - if (dat.writable) state.title = `dat://${dat.key.toString('hex')}` - else state.title = 'Dat!' - - bus.emit('archive') - bus.emit('render') - }) -} -function trackProgress (state, bus) { - bus.once('archive:content', function () { - if (state.archive.metadata.writable) trackImport() - else trackDownload() - }) - - function trackDownload () { - state.downloading = true - state.modified = false - - state.archive.content.on('clear', function () { - state.modified = true - }) - - state.archive.content.on('download', function (index, data) { - state.modified = true + var network = dat.joinNetwork() + network.once('connection', function () { + console.log('new connection') }) - state.archive.on('sync', function () { - state.nsync = true - if (state.modified && !argv.live) { - state.downloadExit = true - bus.render() - process.exit() - } - bus.emit('render') - }) - - state.archive.on('update', function () { - state.nsync = false - bus.emit('render') - bus.emit('archive:update') - }) - } - - function trackImport () { - state.importing = true - var progress = state.importer - var counting = setInterval(function () { - // Update file count while we are going (for big dirs) - bus.emit('render') - }, logspeed) + if (dat.owner) share() + else download() - progress.once('count', function (count) { - clearInterval(counting) - state.count = count - bus.emit('render') - }) - - progress.on('put', function (src, dst) { - if (src.stat.isDirectory()) return - state.fileImport = { - src: src, - dst: dst, - progress: 0, - type: 'put' - } - bus.emit('render') - }) - - progress.on('put-data', function (chunk, src, dst) { - state.fileImport.progress += chunk.length - bus.emit('render') - }) - - progress.on('put-end', function (src, dst) { - // state.fileImport = null - bus.emit('render') - }) - - progress.on('end', function (src, dst) { - // state.fileImport = null - bus.emit('render') - }) - } -} + function download () { + console.log(`Downloading: ${dat.key.toString('hex')}`) + console.log('to:', path.resolve(dest), '\n') + var progress = mirror({fs: dat.archive, name: '/'}, dest, function (err) { + if (err) throw err + console.log('Done') + }) + progress.on('put', function (src) { + console.log('Downloading', src.name) + }) + } -function trackNetwork (state, bus) { - bus.on('archive:content', function () { - var network = state.network + function share () { + console.log('sharing', path.resolve(src)) - network.on('connection', function (peer) { - bus.emit('render') - peer.on('close', function () { - bus.emit('render') + var progress = dat.importFiles(src, { + ignore: ['node_modules', '.dat'] + }, function (err) { + if (err) throw err + console.log('Done importing') + }) + progress.on('put', function (src, dest) { + console.log('Added', dest.name) }) - }) - - var speed = state.stats.network - setInterval(function () { - state.uploadSpeed = speed.uploadSpeed - state.downloadSpeed = speed.downloadSpeed - bus.emit('render') - }, logspeed) + console.log(`Sharing: ${dat.key.toString('hex')}\n`) + } }) } - function usage () { console.error('dat-next!') console.error(' dat-next SHARE directory') diff --git a/index.js b/index.js index aef8354..c8b0ff8 100644 --- a/index.js +++ b/index.js @@ -5,16 +5,9 @@ var storage = require('./storage') module.exports = run -/** - * Run dat-next - * @param {string} src directory or key (for downloading) - * @param {string} dest directory to download to, required for download - * @param {object} opts options - * @param {Function} cb callback(err, archive, swarm, progress) - */ function run (src, dest, opts, cb) { opts = Object.assign({ - latest: true + latest: false }, opts) if (dest) { @@ -26,25 +19,24 @@ function run (src, dest, opts, cb) { return cb(new Error('Invalid dat link')) } src = null - opts.secretKey = false // turns off dat secret storage for local download testing - } else { - opts.indexing = true + opts.temp= true // use memory for downloads right now } Dat(storage(src || dest, opts), opts, function (err, dat) { if (err) return cb(err) - if (!dat.writable && !dest) { - return cb(new Error('Archive is not writable and no destination provided.')) + if (!dat.owner && !dest) { + return cb(new Error('Not archive owner and no destination provided.')) } dat.joinNetwork(opts) - dat.trackStats() - if (dat.writable) { - dat.importFiles(src, { - watch: opts.watch, - dereference: true - }) - } + // TODO + // dat.trackStats() + // if (dat.owner) { + // dat.importFiles(src, { + // watch: opts.watch, + // dereference: true + // }) + // } cb(null, dat) }) diff --git a/package.json b/package.json index 21342ea..f01dbc6 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,12 @@ "dependencies": { "cli-truncate": "^1.0.0", "dat-encoding": "^4.0.2", - "dat-node": "^3.1.0", + "dat-node": "github:datproject/dat-node#hyperdb", "dat-storage": "^1.0.0", "debug": "^2.4.5", "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "neat-log": "^1.1.0", + "neat-log": "github:joehand/neat-log#diffy", "prettier-bytes": "^1.0.3", "progress-string": "^1.2.1", "random-access-memory": "^2.3.0", diff --git a/readme.md b/readme.md index ad6e9b7..1184b1c 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ The next version of the `dat` command line tool. -**WITH SLEEP!!**  😴 +**WITH HYPERDB!!** 🌟 Current version at [datproject/dat](https://github.com/datproject/dat). diff --git a/storage.js b/storage.js index cbc5be2..d9ce85c 100644 --- a/storage.js +++ b/storage.js @@ -1,25 +1,26 @@ var fs = require('fs') +var path = require('path') var ram = require('random-access-memory') -var datStore = require('dat-storage') +// var datStore = require('dat-storage') var mkdirp = require('mkdirp') module.exports = storage function storage (dir, opts) { if (opts.temp) return ram - if (typeof opts.sleep === 'string') return opts.sleep - - mkdirp.sync(dir) - try { - var isDir = fs.statSync(dir).isDirectory() - if (isDir) return datStore(dir) - error() - } catch (e) { - throw e - } - - function error () { - // TODO: single file sleep storage - throw new Error('Specify dir for sleep files: --sleep ') - } + var datDir = path.join(dir, '.dat') + mkdirp.sync(datDir) + return datDir + // TODO dat-storage + // try { + // var isDir = fs.statSync(dir).isDirectory() + // if (isDir) return datStore(dir) + // error() + // } catch (e) { + // throw e + // } + // function error () { + // // TODO: single file sleep storage + // throw new Error('Specify dir for sleep files: --sleep ') + // } } diff --git a/ui.js b/ui.js index 365e668..3e9a2f7 100644 --- a/ui.js +++ b/ui.js @@ -9,35 +9,35 @@ module.exports = { } function mainView (state) { - return output` + return output(` ${state.title} ${archiveUI(state)} ${networkUI(state)} - ` + `) } function progressView (state) { if (state.downloading) return downloadUI(state) else if (state.importer) { - return output` + return output(` ${importUI(state)} ${fileImport(state)} - ` + `) } return '' } function archiveUI (state) { - if (!state.archive) return '' + if (!state.archive || !state.stats) return '' var archive = state.archive var stats = state.stats.get() var size = stats.byteLength || 0 var files = stats.files - return output` + return output(` ${state.downloading ? 'Downloading' : 'Syncing'} Archive: ${files} files (${pretty(size)}) - ` + `) } function networkUI (state) { @@ -47,29 +47,29 @@ function networkUI (state) { if (state.writable) return '\nNo Connections'// '\nWaiting for Connections...' return '\nConnecting...' } - return output` + return output(` ${state.archive.content.peers.length} peers ${speed()} - ` + `) function speed () { - var output = '' + var display = '' var upSpeed = state.uploadSpeed || 0 var downSpeed = state.downloadSpeed || 0 - output += `Uploading ${pretty(upSpeed)}/s ` - output += `Downloading ${pretty(downSpeed)}/s` - if (output.length) output = '| ' + output - return output + display += `Uploading ${pretty(upSpeed)}/s ` + display += `Downloading ${pretty(downSpeed)}/s` + if (display.length) display = '| ' + display + return display } } function downloadUI (state) { if (state.nsync) { - return output` + return output(` Archive up to date. ${state.opts.live ? 'Waiting for changes...' : ''} - ` + `) } var stats = state.stats.get() if (!stats.downloaded) { @@ -79,10 +79,10 @@ function downloadUI (state) { makeBar() state.archive.on('update', makeBar) } - return output` + return output(` ${state.downloadBar(stats.downloaded)} - ` + `) function makeBar () { var total = stats.length @@ -105,10 +105,10 @@ function importUI (state) { } else { if (!state.importer.count.files) return `Checking for file updates ...` var indexSpeed = state.importer.indexSpeed ? `(${pretty(state.importer.indexSpeed)}/s)` : '' - return output` + return output(` Imported ${state.importer.putDone.files} of ${state.importer.count.files} files ${indexSpeed} (Calculating total import count...) - ` + `) } var total = state.count.bytes @@ -119,10 +119,10 @@ function importUI (state) { } }) - return output` + return output(` Importing ${state.count.files} files to Archive (${pretty(state.importer.indexSpeed)}/s) ${totalBar(state.importer.putDone.bytes)} - ` + `) } function fileImport (state) { @@ -143,9 +143,9 @@ function fileImport (state) { // >500 mb show progress to if (total < 5e8) size = `(${pretty(total)})` else size = `(${pretty(state.fileImport.progress)} / ${pretty(total)})` - return output` + return output(` ADD: ${cliTruncate(name, process.stdout.columns - 7 - size.length, {position: 'start'})} ${size} - ` + `) // ${bar(state.fileImport.progress)} }