Welcome to mirror list, hosted at ThFree Co, Russian Federation.

download-tracker-magnet.js « node « test - github.com/webtorrent/webtorrent.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 90b8b920058a7a46071c2c8ced776325ccefcd06 (plain)
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')
    })
  })
}