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)}
}