-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathcli.js
executable file
·110 lines (99 loc) · 2.89 KB
/
cli.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env node
var Health = require('./')
var debug = require('debug')('hyperhealth')
var pretty = require('pretty-bytes')
var logger = require('status-logger')
var progress = require('progress-string')
var hypercore = require('hypercore')
var hyperdrive = require('hyperdrive')
var ram = require('random-access-memory')
var pick = require('lodash.pick')
var datLink = require('dat-link-resolve')
var discovery = require('hyperdiscovery')
var messages = require('hyperdrive/lib/messages')
var key = process.argv.slice(2)[0]
if (!key) {
console.error('hyperhealth <link>')
process.exit(1)
}
var output = ['Watching ' + key, 'Connecting...']
var peerOutput = []
var log = logger([output, peerOutput])
var bars = {}
var health = null
debug('key', key)
datLink(key, function (err, key) {
if (err) throw err
var core = hypercore(ram, key, { sparse: true })
debug('getting key', key)
core.on('ready', () => {
var swarm = discovery(core)
getHyperdriveKey(core, function (isHyperdrive) {
debug('got hyperdrive key', isHyperdrive)
if (!isHyperdrive) return loop(core)
var archive = hyperdrive(ram, key, { metadata: core, sparse: true })
swarm = discovery(archive)
archive.on('ready', () => loop(archive))
})
})
})
function loop (feed) {
health = Health(feed)
setInterval(function () {
getHealth()
log.print()
}, 100)
}
function getHyperdriveKey (core, cb) {
if (core.length) return get()
debug('updating')
core.update(get)
function get () {
debug('getting index message')
core.get(0, {valueEncoding: messages.Index}, async (err, index) => {
if (err) return cb()
if (index && index.type === 'hyperdrive') {
var contentKey = index.content.toString('hex')
debug('contentKey', contentKey)
return cb(contentKey)
}
debug('calling back')
return cb()
})
}
}
function getHealth () {
// if (!health) return
var data = health.get()
if (!data || !data.peers.length) {
output[1] = '\nNo peers.'
bars = {}
peerOutput.length = 0
return
}
output[1] = 'Size: ' + pretty(data.byteLength) + '\n'
var connectedPeerIds = []
for (var i = 0; i < data.peers.length; i++) {
var peer = data.peers[i]
var bar = bars[peer.id] ? bars[peer.id] : addPeerBar(peer.id, data.length)
var msg = 'Peer ' + (i + 1) + ': ' + bar(peer.have) + ' (' + peer.have + '/' + peer.length + ')'
peerOutput[i] = msg
connectedPeerIds.push(peer.id)
}
if (connectedPeerIds.length !== Object.keys(bars).length) {
// remove the dropped peer bars
bars = pick(bars, connectedPeerIds)
peerOutput.pop()
}
}
function addPeerBar (id, length) {
bars[id] = progress({
width: 50,
total: length, // TODO: what if total size changes for existing bars
style: function (complete, incomplete) {
return '[' + complete + incomplete + ']'
}
})
peerOutput.push()
return bars[id]
}