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
135
|
import fs from 'fs'
import fixtures from 'webtorrent-fixtures'
import MemoryChunkStore from 'memory-chunk-store'
import series from 'run-series'
import test from 'tape'
import TrackerServer from 'bittorrent-tracker/server.js'
import WebTorrent from '../../index.js'
test('Download using UDP tracker (via magnet uri)', t => {
magnetDownloadTest(t, 'udp')
})
test('Download using HTTP tracker (via magnet uri)', t => {
magnetDownloadTest(t, 'http')
})
function magnetDownloadTest (t, serverType) {
t.plan(10)
const tracker = new TrackerServer(
serverType === 'udp' ? { http: false, ws: false } : { udp: false, ws: false }
)
tracker.on('error', err => { t.fail(err) })
tracker.on('warning', err => { t.fail(err) })
let trackerStartCount = 0
tracker.on('start', () => {
trackerStartCount += 1
})
const parsedTorrent = Object.assign({}, fixtures.leaves.parsedTorrent)
let magnetURI, client1, client2
series([
cb => {
tracker.listen(cb)
},
cb => {
const port = tracker[serverType].address().port
const announceUrl = serverType === 'http'
? `http://127.0.0.1:${port}/announce`
: `udp://127.0.0.1:${port}`
parsedTorrent.announce = [announceUrl]
magnetURI = `magnet:?xt=urn:btih:${parsedTorrent.infoHash}&tr=${encodeURIComponent(announceUrl)}`
client1 = new WebTorrent({ dht: false, lsd: false })
client1.on('error', err => { t.fail(err) })
client1.on('warning', err => { t.fail(err) })
client1.on('torrent', torrent => {
let noPeersDone = false
let torrentLoaded = false
// torrent metadata has been fetched -- sanity check it
t.equal(torrent.name, 'Leaves of Grass by Walt Whitman.epub')
const names = [
'Leaves of Grass by Walt Whitman.epub'
]
torrent.once('noPeers', announceType => {
t.equal(announceType, 'tracker', 'noPeers event seen with correct announceType')
noPeersDone = true
maybeDone()
})
t.deepEqual(torrent.files.map(file => file.name), names)
torrent.load(fs.createReadStream(fixtures.leaves.contentPath), () => {
torrentLoaded = true
maybeDone()
})
function maybeDone () {
if (noPeersDone && torrentLoaded) cb(null)
}
})
client1.add(parsedTorrent, { store: MemoryChunkStore })
},
cb => {
client2 = new WebTorrent({ dht: false, lsd: false })
client2.on('error', err => { t.fail(err) })
client2.on('warning', err => { t.fail(err) })
client2.on('torrent', torrent => {
let gotBuffer = false
let torrentDone = false
torrent.files.forEach(file => {
file.getBuffer((err, buf) => {
if (err) throw err
t.deepEqual(buf, fixtures.leaves.content, 'downloaded correct content')
gotBuffer = true
maybeDone()
})
})
torrent.once('done', () => {
t.pass('client2 downloaded torrent from client1')
torrentDone = true
maybeDone()
})
function maybeDone () {
if (gotBuffer && torrentDone) cb(null)
}
})
client2.add(magnetURI, { store: MemoryChunkStore })
}
], err => {
t.error(err)
t.equal(trackerStartCount, 2)
tracker.close(() => {
t.pass('tracker closed')
})
client1.destroy(err => {
t.error(err, 'client1 destroyed')
})
client2.destroy(err => {
t.error(err, 'client2 destroyed')
})
})
}
|