forked from mafintosh/peervisionary
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bin.js
executable file
·134 lines (110 loc) · 2.96 KB
/
bin.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env node
var fs = require('fs')
var peervision = require('peervision')
var airswarm = require('airswarm')
var signalhub = require('signalhub')
var net = require('net')
var thunky = require('thunky')
var choppa = require('choppa')
var minimist = require('minimist')
var pump = require('pump')
var DHT = require('bittorrent-dht')
var dht = new DHT()
var argv = minimist(process.argv)
var id = argv._[2]
var vision = peervision(id ? new Buffer(id, 'hex') : null)
var debug = argv.debug ? console.error.bind(console, 'DEBUG:') : function () {}
if (argv.webrtc) {
var wrtc = require('wrtc')
var swarm = require('webrtc-swarm')
var sw = swarm(signalhub('pv-' + vision.id.toString('hex'), ['https://signalhub.mafintosh.com']), {wrtc: wrtc})
sw.on('peer', function (p) {
debug('WebRTC peer')
pump(p, vision.createStream(), p)
})
}
var server = airswarm('pv-' + vision.id.toString('hex'), function (p) {
debug('Airswarm peer')
pump(p, vision.createStream(), p)
})
dht.on('ready', function () {
debug('DHT ready')
lookup()
announce()
setInterval(lookup, 10000)
setInterval(announce, 20000)
function lookup () {
dht.lookup(vision.id.slice(0, 20))
}
function announce () {
dht.announce(vision.id.slice(0, 20), server.address().port)
}
})
var peers = {}
dht.on('peer', function (peer) {
if (peers[peer]) return
peers[peer] = true
var socket = net.connect(Number(peer.split(':')[1]), peer.split(':')[0])
pump(socket, vision.createStream(), socket)
})
vision.on('upload', function (index) {
debug('Uploading block #' + index)
})
vision.on('download', function (index) {
debug('Downloading block #' + index)
})
var blocks = 0
if (!id) {
console.error('Stream id is', vision.id.toString('hex'))
if (argv.stdin) {
if (argv.chunks) {
process.stdin.pipe(choppa(Number(argv.chunks))).on('data', function (data) {
vision.append(data)
})
} else {
process.stdin.on('data', function (data) {
vision.append(data)
})
}
return
}
console.error('Enter the files you want to stream:')
process.stdin.on('data', function (data) {
fs.createReadStream(data.toString().trim()).pipe(choppa(Number(argv.chunks || 16 * 1024))).on('data', function (data) {
blocks++
vision.append(data)
}).on('end', function () {
debug('Appended', blocks, 'blocks')
})
})
} else {
var offset = Number(argv.offset || 0)
var buffer = 5
var fetching = {}
loop()
function noop () {}
function add (i) {
var fetch = thunky(function (cb) {
vision.get(i, cb)
})
fetch()
fetching[i] = fetch
}
function fetch (i, cb) {
if (fetching[i]) {
var get = fetching[i]
delete fetching[i]
get(cb)
} else {
vision.get(i, cb)
}
}
function loop () {
for (var i = 0; i < buffer; i++) add(offset + i + 1)
fetch(offset, function (err, data) {
if (err) throw err
offset++
process.stdout.write(data, loop)
})
}
}