-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.js
More file actions
executable file
·111 lines (90 loc) · 2.81 KB
/
index.js
File metadata and controls
executable file
·111 lines (90 loc) · 2.81 KB
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
111
#!/usr/bin/env node
process.title = 'ddbd'
var dwebDns = require('@dwebs/dns')()
var wss = require('websocket-stream')
var vaultr = require('@ddatabase/vaultr')
var flock = require('ddb-vaultr/flock')
var readFile = require('read-file-live')
var minimist = require('minimist')
var path = require('path')
var dWebChannel = require('@dwcore/channel')
var http = require('http')
var argv = minimist(process.argv.slice(2))
var cwd = argv.cwd || process.cwd()
var ar = vaultr(path.join(cwd, 'vaultr'), argv._[0])
var server = http.createServer()
var port = argv.port || process.env.PORT || 0
var unencryptedWebsockets = !!argv['unencrypted-websockets']
if (argv.help) {
console.log(
'Usage: ddbd [key?] [options]\n\n' +
' --cwd [folder to run in]\n' +
' --websockets [share over websockets as well]\n' +
' --port [explicit websocket port]\n' +
' --no-flock [disable flocking]\n'
)
process.exit(0)
}
if (unencryptedWebsockets) {
argv.websockets = true
}
ar.on('sync', function (ddb) {
console.log('Fully synced', ddb.key.toString('hex'))
})
ar.on('add', function (ddb) {
console.log('Adding', ddb.key.toString('hex'))
})
ar.on('remove', function (ddb) {
console.log('Removing', ddb.key.toString('hex'))
})
ar.on('changes', function (ddb) {
console.log('Vaultr key is ' + ddb.key.toString('hex'))
})
console.log('Watching %s for a list of active ddbs', path.join(cwd, 'ddbs'))
wss.createServer({server: server}, onwebsocket)
server.on('request', function (req, res) {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify({
name: 'ddbd',
version: require('./package').version
}))
})
if (argv.flock !== false) {
flock(ar, {live: true}).on('listening', function () {
console.log('Flock listening on port %d', this.address().port)
})
}
if (argv.websockets === true) {
server.listen(port, function () {
console.log('WebSocket server listening on port %d', server.address().port)
})
}
function resolveAll (links, cb) {
var keys = []
var missing = links.length
if (!missing) return cb(null, [])
for (var i = 0; i < links.length; i++) {
dwebDns.resolveName(links[i], function (_, key) {
keys.push(key)
if (!--missing) cb(null, keys.filter(Boolean))
})
}
}
readFile(path.join(cwd, 'ddbs'), function (file) {
resolveAll(file.toString().trim().split('\n'), function (err, ddbs) {
if (err) return
ar.list(function (err, keys) {
if (err || !ar.changes.writable) return
var i = 0
for (i = 0; i < keys.length; i++) {
if (ddbs.indexOf(keys[i].toString('hex')) === -1) ar.remove(keys[i])
}
for (i = 0; i < ddbs.length; i++) {
ar.add(ddbs[i])
}
})
})
})
function onwebsocket (stream) {
dWebChannel(stream, ar.replicate({live: true, encrypt: !unencryptedWebsockets}), stream)
}