Skip to content

Commit

Permalink
upgrade to hyperdb
Browse files Browse the repository at this point in the history
  • Loading branch information
joehand committed Mar 22, 2018
1 parent c2dd04f commit 9db1795
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 190 deletions.
159 changes: 32 additions & 127 deletions cli.js
Original file line number Diff line number Diff line change
@@ -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')

Expand All @@ -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 <dir> SHARE directory')
Expand Down
32 changes: 12 additions & 20 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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)
})
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand Down
33 changes: 17 additions & 16 deletions storage.js
Original file line number Diff line number Diff line change
@@ -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 <dir>')
}
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 <dir>')
// }
}
Loading

0 comments on commit 9db1795

Please sign in to comment.