Skip to content

Commit 7658a1b

Browse files
committed
Merge branch 'master' of ssh://github.com/webtorrent/bittorrent-tracker into add_gitignore
2 parents 3eafbbe + 2a12b75 commit 7658a1b

File tree

8 files changed

+67
-43
lines changed

8 files changed

+67
-43
lines changed

.github/workflows/ci.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: ci
2+
'on':
3+
- push
4+
- pull_request
5+
jobs:
6+
test:
7+
name: Node ${{ matrix.node }} / ${{ matrix.os }}
8+
runs-on: ${{ matrix.os }}
9+
strategy:
10+
fail-fast: false
11+
matrix:
12+
os:
13+
- ubuntu-latest
14+
node:
15+
- '14'
16+
steps:
17+
- uses: actions/checkout@v2
18+
- uses: actions/setup-node@v2
19+
with:
20+
node-version: ${{ matrix.node }}
21+
- run: npm install
22+
- run: npm run build --if-present
23+
- run: npm test

.npmignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
.travis.yml
21
CONTRIBUTING.md
32
examples/
43
img/
54
test/
65
tools/
6+
.github/

.travis.yml

Lines changed: 0 additions & 10 deletions
This file was deleted.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# bittorrent-tracker [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
1+
# bittorrent-tracker [![ci][ci-image]][ci-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
22

3-
[travis-image]: https://img.shields.io/travis/webtorrent/bittorrent-tracker/master.svg
4-
[travis-url]: https://travis-ci.org/webtorrent/bittorrent-tracker
3+
[ci-image]: https://img.shields.io/github/workflow/status/webtorrent/bittorrent-tracker/ci/master
4+
[ci-url]: https://github.com/webtorrent/bittorrent-tracker/actions
55
[npm-image]: https://img.shields.io/npm/v/bittorrent-tracker.svg
66
[npm-url]: https://npmjs.org/package/bittorrent-tracker
77
[downloads-image]: https://img.shields.io/npm/dm/bittorrent-tracker.svg

client.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const EventEmitter = require('events')
33
const once = require('once')
44
const parallel = require('run-parallel')
55
const Peer = require('simple-peer')
6+
const queueMicrotask = require('queue-microtask')
67

78
const common = require('./lib/common')
89
const HTTPTracker = require('./lib/client/http-tracker') // empty object in browser
@@ -76,7 +77,7 @@ class Client extends EventEmitter {
7677
const webrtcSupport = this._wrtc !== false && (!!this._wrtc || Peer.WEBRTC_SUPPORT)
7778

7879
const nextTickWarn = err => {
79-
process.nextTick(() => {
80+
queueMicrotask(() => {
8081
this.emit('warning', err)
8182
})
8283
}

lib/client/websocket-tracker.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class WebSocketTracker extends Tracker {
5656
this._send(params)
5757
} else {
5858
// Limit the number of offers that are generated, since it can be slow
59-
const numwant = Math.min(opts.numwant, 10)
59+
const numwant = Math.min(opts.numwant, 5)
6060

6161
this._generateOffers(numwant, offers => {
6262
params.numwant = numwant
@@ -278,17 +278,17 @@ class WebSocketTracker extends Tracker {
278278
if (this._trackerId) params.trackerid = this._trackerId
279279
this._send(params)
280280
})
281-
peer.signal(data.offer)
282281
this.client.emit('peer', peer)
282+
peer.signal(data.offer)
283283
}
284284

285285
if (data.answer && data.peer_id) {
286286
const offerId = common.binaryToHex(data.offer_id)
287287
peer = this.peers[offerId]
288288
if (peer) {
289289
peer.id = common.binaryToHex(data.peer_id)
290-
peer.signal(data.answer)
291290
this.client.emit('peer', peer)
291+
peer.signal(data.answer)
292292

293293
clearTimeout(peer.trackerTimeout)
294294
peer.trackerTimeout = null

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "bittorrent-tracker",
33
"description": "Simple, robust, BitTorrent tracker (client & server) implementation",
4-
"version": "9.15.0",
4+
"version": "9.17.0",
55
"author": {
66
"name": "WebTorrent LLC",
77
"email": "[email protected]",
@@ -34,6 +34,7 @@
3434
"lru": "^3.1.0",
3535
"minimist": "^1.2.5",
3636
"once": "^1.4.0",
37+
"queue-microtask": "^1.2.2",
3738
"random-iterate": "^1.0.1",
3839
"randombytes": "^2.1.0",
3940
"run-parallel": "^1.1.9",

server.js

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ const hasOwnProperty = Object.prototype.hasOwnProperty
2323
* metrics from clients that help the tracker keep overall statistics about the torrent.
2424
* Responses include a peer list that helps the client participate in the torrent.
2525
*
26-
* @param {Object} opts options object
27-
* @param {Number} opts.interval tell clients to announce on this interval (ms)
28-
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
29-
* @param {boolean} opts.http start an http server? (default: true)
30-
* @param {boolean} opts.udp start a udp server? (default: true)
31-
* @param {boolean} opts.ws start a websocket server? (default: true)
32-
* @param {boolean} opts.stats enable web-based statistics? (default: true)
33-
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
26+
* @param {Object} opts options object
27+
* @param {Number} opts.interval tell clients to announce on this interval (ms)
28+
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
29+
* @param {boolean|Object} opts.http start an http server?, or options for http.createServer (default: true)
30+
* @param {boolean|Object} opts.udp start a udp server?, or extra options for dgram.createSocket (default: true)
31+
* @param {boolean|Object} opts.ws start a websocket server?, or extra options for new WebSocketServer (default: true)
32+
* @param {boolean} opts.stats enable web-based statistics? (default: true)
33+
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
3434
*/
3535
class Server extends EventEmitter {
3636
constructor (opts = {}) {
@@ -59,7 +59,7 @@ class Server extends EventEmitter {
5959

6060
// start an http tracker unless the user explictly says no
6161
if (opts.http !== false) {
62-
this.http = http.createServer()
62+
this.http = http.createServer(isObject(opts.http) ? opts.http : undefined)
6363
this.http.on('error', err => { this._onError(err) })
6464
this.http.on('listening', onListening)
6565

@@ -75,26 +75,29 @@ class Server extends EventEmitter {
7575

7676
// start a udp tracker unless the user explicitly says no
7777
if (opts.udp !== false) {
78-
const isNode10 = /^v0.10./.test(process.version)
79-
80-
this.udp4 = this.udp = dgram.createSocket(
81-
isNode10 ? 'udp4' : { type: 'udp4', reuseAddr: true }
82-
)
78+
this.udp4 = this.udp = dgram.createSocket({
79+
type: 'udp4',
80+
reuseAddr: true,
81+
...(isObject(opts.udp) ? opts.udp : undefined)
82+
})
8383
this.udp4.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
8484
this.udp4.on('error', err => { this._onError(err) })
8585
this.udp4.on('listening', onListening)
8686

87-
this.udp6 = dgram.createSocket(
88-
isNode10 ? 'udp6' : { type: 'udp6', reuseAddr: true }
89-
)
87+
this.udp6 = dgram.createSocket({
88+
type: 'udp6',
89+
reuseAddr: true,
90+
...(isObject(opts.udp) ? opts.udp : undefined)
91+
})
9092
this.udp6.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
9193
this.udp6.on('error', err => { this._onError(err) })
9294
this.udp6.on('listening', onListening)
9395
}
9496

9597
// start a websocket tracker (for WebTorrent) unless the user explicitly says no
9698
if (opts.ws !== false) {
97-
if (!this.http) {
99+
const noServer = isObject(opts.ws) && opts.ws.noServer
100+
if (!this.http && !noServer) {
98101
this.http = http.createServer()
99102
this.http.on('error', err => { this._onError(err) })
100103
this.http.on('listening', onListening)
@@ -112,13 +115,19 @@ class Server extends EventEmitter {
112115
})
113116
}
114117
this.ws = new WebSocketServer({
115-
server: this.http,
118+
server: noServer ? undefined : this.http,
116119
perMessageDeflate: false,
117-
clientTracking: false
120+
clientTracking: false,
121+
...(isObject(opts.ws) ? opts.ws : undefined)
118122
})
123+
119124
this.ws.address = () => {
125+
if (noServer) {
126+
throw new Error('address() unavailable with { noServer: true }')
127+
}
120128
return this.http.address()
121129
}
130+
122131
this.ws.on('error', err => { this._onError(err) })
123132
this.ws.on('connection', (socket, req) => {
124133
// Note: socket.upgradeReq was removed in [email protected], so re-add it.
@@ -297,10 +306,6 @@ class Server extends EventEmitter {
297306

298307
debug('listen (port: %o hostname: %o)', port, hostname)
299308

300-
function isObject (obj) {
301-
return typeof obj === 'object' && obj !== null
302-
}
303-
304309
const httpPort = isObject(port) ? (port.http || 0) : port
305310
const udpPort = isObject(port) ? (port.udp || 0) : port
306311

@@ -801,6 +806,10 @@ function makeUdpPacket (params) {
801806
return packet
802807
}
803808

809+
function isObject (obj) {
810+
return typeof obj === 'object' && obj !== null
811+
}
812+
804813
function toNumber (x) {
805814
x = Number(x)
806815
return x >= 0 ? x : false

0 commit comments

Comments
 (0)