mirror of
https://github.com/webtorrent/bittorrent-tracker.git
synced 2025-01-18 20:21:36 +00:00
Merge branch 'master' of ssh://github.com/webtorrent/bittorrent-tracker into add_gitignore
This commit is contained in:
commit
7658a1b87f
23
.github/workflows/ci.yml
vendored
Normal file
23
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
name: ci
|
||||||
|
'on':
|
||||||
|
- push
|
||||||
|
- pull_request
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Node ${{ matrix.node }} / ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- ubuntu-latest
|
||||||
|
node:
|
||||||
|
- '14'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node }}
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run build --if-present
|
||||||
|
- run: npm test
|
@ -1,6 +1,6 @@
|
|||||||
.travis.yml
|
|
||||||
CONTRIBUTING.md
|
CONTRIBUTING.md
|
||||||
examples/
|
examples/
|
||||||
img/
|
img/
|
||||||
test/
|
test/
|
||||||
tools/
|
tools/
|
||||||
|
.github/
|
||||||
|
10
.travis.yml
10
.travis.yml
@ -1,10 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
sudo: false
|
|
||||||
node_js:
|
|
||||||
- lts/*
|
|
||||||
before_script:
|
|
||||||
# Add an IPv6 config - see the corresponding Travis issue
|
|
||||||
# https://github.com/travis-ci/travis-ci/issues/8361
|
|
||||||
- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
|
|
||||||
sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6';
|
|
||||||
fi
|
|
@ -1,7 +1,7 @@
|
|||||||
# bittorrent-tracker [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
|
# bittorrent-tracker [![ci][ci-image]][ci-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
|
||||||
|
|
||||||
[travis-image]: https://img.shields.io/travis/webtorrent/bittorrent-tracker/master.svg
|
[ci-image]: https://img.shields.io/github/workflow/status/webtorrent/bittorrent-tracker/ci/master
|
||||||
[travis-url]: https://travis-ci.org/webtorrent/bittorrent-tracker
|
[ci-url]: https://github.com/webtorrent/bittorrent-tracker/actions
|
||||||
[npm-image]: https://img.shields.io/npm/v/bittorrent-tracker.svg
|
[npm-image]: https://img.shields.io/npm/v/bittorrent-tracker.svg
|
||||||
[npm-url]: https://npmjs.org/package/bittorrent-tracker
|
[npm-url]: https://npmjs.org/package/bittorrent-tracker
|
||||||
[downloads-image]: https://img.shields.io/npm/dm/bittorrent-tracker.svg
|
[downloads-image]: https://img.shields.io/npm/dm/bittorrent-tracker.svg
|
||||||
|
@ -3,6 +3,7 @@ const EventEmitter = require('events')
|
|||||||
const once = require('once')
|
const once = require('once')
|
||||||
const parallel = require('run-parallel')
|
const parallel = require('run-parallel')
|
||||||
const Peer = require('simple-peer')
|
const Peer = require('simple-peer')
|
||||||
|
const queueMicrotask = require('queue-microtask')
|
||||||
|
|
||||||
const common = require('./lib/common')
|
const common = require('./lib/common')
|
||||||
const HTTPTracker = require('./lib/client/http-tracker') // empty object in browser
|
const HTTPTracker = require('./lib/client/http-tracker') // empty object in browser
|
||||||
@ -76,7 +77,7 @@ class Client extends EventEmitter {
|
|||||||
const webrtcSupport = this._wrtc !== false && (!!this._wrtc || Peer.WEBRTC_SUPPORT)
|
const webrtcSupport = this._wrtc !== false && (!!this._wrtc || Peer.WEBRTC_SUPPORT)
|
||||||
|
|
||||||
const nextTickWarn = err => {
|
const nextTickWarn = err => {
|
||||||
process.nextTick(() => {
|
queueMicrotask(() => {
|
||||||
this.emit('warning', err)
|
this.emit('warning', err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ class WebSocketTracker extends Tracker {
|
|||||||
this._send(params)
|
this._send(params)
|
||||||
} else {
|
} else {
|
||||||
// Limit the number of offers that are generated, since it can be slow
|
// Limit the number of offers that are generated, since it can be slow
|
||||||
const numwant = Math.min(opts.numwant, 10)
|
const numwant = Math.min(opts.numwant, 5)
|
||||||
|
|
||||||
this._generateOffers(numwant, offers => {
|
this._generateOffers(numwant, offers => {
|
||||||
params.numwant = numwant
|
params.numwant = numwant
|
||||||
@ -278,8 +278,8 @@ class WebSocketTracker extends Tracker {
|
|||||||
if (this._trackerId) params.trackerid = this._trackerId
|
if (this._trackerId) params.trackerid = this._trackerId
|
||||||
this._send(params)
|
this._send(params)
|
||||||
})
|
})
|
||||||
peer.signal(data.offer)
|
|
||||||
this.client.emit('peer', peer)
|
this.client.emit('peer', peer)
|
||||||
|
peer.signal(data.offer)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.answer && data.peer_id) {
|
if (data.answer && data.peer_id) {
|
||||||
@ -287,8 +287,8 @@ class WebSocketTracker extends Tracker {
|
|||||||
peer = this.peers[offerId]
|
peer = this.peers[offerId]
|
||||||
if (peer) {
|
if (peer) {
|
||||||
peer.id = common.binaryToHex(data.peer_id)
|
peer.id = common.binaryToHex(data.peer_id)
|
||||||
peer.signal(data.answer)
|
|
||||||
this.client.emit('peer', peer)
|
this.client.emit('peer', peer)
|
||||||
|
peer.signal(data.answer)
|
||||||
|
|
||||||
clearTimeout(peer.trackerTimeout)
|
clearTimeout(peer.trackerTimeout)
|
||||||
peer.trackerTimeout = null
|
peer.trackerTimeout = null
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "bittorrent-tracker",
|
"name": "bittorrent-tracker",
|
||||||
"description": "Simple, robust, BitTorrent tracker (client & server) implementation",
|
"description": "Simple, robust, BitTorrent tracker (client & server) implementation",
|
||||||
"version": "9.15.0",
|
"version": "9.17.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "WebTorrent LLC",
|
"name": "WebTorrent LLC",
|
||||||
"email": "feross@webtorrent.io",
|
"email": "feross@webtorrent.io",
|
||||||
@ -34,6 +34,7 @@
|
|||||||
"lru": "^3.1.0",
|
"lru": "^3.1.0",
|
||||||
"minimist": "^1.2.5",
|
"minimist": "^1.2.5",
|
||||||
"once": "^1.4.0",
|
"once": "^1.4.0",
|
||||||
|
"queue-microtask": "^1.2.2",
|
||||||
"random-iterate": "^1.0.1",
|
"random-iterate": "^1.0.1",
|
||||||
"randombytes": "^2.1.0",
|
"randombytes": "^2.1.0",
|
||||||
"run-parallel": "^1.1.9",
|
"run-parallel": "^1.1.9",
|
||||||
|
57
server.js
57
server.js
@ -23,14 +23,14 @@ const hasOwnProperty = Object.prototype.hasOwnProperty
|
|||||||
* metrics from clients that help the tracker keep overall statistics about the torrent.
|
* metrics from clients that help the tracker keep overall statistics about the torrent.
|
||||||
* Responses include a peer list that helps the client participate in the torrent.
|
* Responses include a peer list that helps the client participate in the torrent.
|
||||||
*
|
*
|
||||||
* @param {Object} opts options object
|
* @param {Object} opts options object
|
||||||
* @param {Number} opts.interval tell clients to announce on this interval (ms)
|
* @param {Number} opts.interval tell clients to announce on this interval (ms)
|
||||||
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
|
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
|
||||||
* @param {boolean} opts.http start an http server? (default: true)
|
* @param {boolean|Object} opts.http start an http server?, or options for http.createServer (default: true)
|
||||||
* @param {boolean} opts.udp start a udp server? (default: true)
|
* @param {boolean|Object} opts.udp start a udp server?, or extra options for dgram.createSocket (default: true)
|
||||||
* @param {boolean} opts.ws start a websocket server? (default: true)
|
* @param {boolean|Object} opts.ws start a websocket server?, or extra options for new WebSocketServer (default: true)
|
||||||
* @param {boolean} opts.stats enable web-based statistics? (default: true)
|
* @param {boolean} opts.stats enable web-based statistics? (default: true)
|
||||||
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
|
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
|
||||||
*/
|
*/
|
||||||
class Server extends EventEmitter {
|
class Server extends EventEmitter {
|
||||||
constructor (opts = {}) {
|
constructor (opts = {}) {
|
||||||
@ -59,7 +59,7 @@ class Server extends EventEmitter {
|
|||||||
|
|
||||||
// start an http tracker unless the user explictly says no
|
// start an http tracker unless the user explictly says no
|
||||||
if (opts.http !== false) {
|
if (opts.http !== false) {
|
||||||
this.http = http.createServer()
|
this.http = http.createServer(isObject(opts.http) ? opts.http : undefined)
|
||||||
this.http.on('error', err => { this._onError(err) })
|
this.http.on('error', err => { this._onError(err) })
|
||||||
this.http.on('listening', onListening)
|
this.http.on('listening', onListening)
|
||||||
|
|
||||||
@ -75,18 +75,20 @@ class Server extends EventEmitter {
|
|||||||
|
|
||||||
// start a udp tracker unless the user explicitly says no
|
// start a udp tracker unless the user explicitly says no
|
||||||
if (opts.udp !== false) {
|
if (opts.udp !== false) {
|
||||||
const isNode10 = /^v0.10./.test(process.version)
|
this.udp4 = this.udp = dgram.createSocket({
|
||||||
|
type: 'udp4',
|
||||||
this.udp4 = this.udp = dgram.createSocket(
|
reuseAddr: true,
|
||||||
isNode10 ? 'udp4' : { type: 'udp4', reuseAddr: true }
|
...(isObject(opts.udp) ? opts.udp : undefined)
|
||||||
)
|
})
|
||||||
this.udp4.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
|
this.udp4.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
|
||||||
this.udp4.on('error', err => { this._onError(err) })
|
this.udp4.on('error', err => { this._onError(err) })
|
||||||
this.udp4.on('listening', onListening)
|
this.udp4.on('listening', onListening)
|
||||||
|
|
||||||
this.udp6 = dgram.createSocket(
|
this.udp6 = dgram.createSocket({
|
||||||
isNode10 ? 'udp6' : { type: 'udp6', reuseAddr: true }
|
type: 'udp6',
|
||||||
)
|
reuseAddr: true,
|
||||||
|
...(isObject(opts.udp) ? opts.udp : undefined)
|
||||||
|
})
|
||||||
this.udp6.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
|
this.udp6.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
|
||||||
this.udp6.on('error', err => { this._onError(err) })
|
this.udp6.on('error', err => { this._onError(err) })
|
||||||
this.udp6.on('listening', onListening)
|
this.udp6.on('listening', onListening)
|
||||||
@ -94,7 +96,8 @@ class Server extends EventEmitter {
|
|||||||
|
|
||||||
// start a websocket tracker (for WebTorrent) unless the user explicitly says no
|
// start a websocket tracker (for WebTorrent) unless the user explicitly says no
|
||||||
if (opts.ws !== false) {
|
if (opts.ws !== false) {
|
||||||
if (!this.http) {
|
const noServer = isObject(opts.ws) && opts.ws.noServer
|
||||||
|
if (!this.http && !noServer) {
|
||||||
this.http = http.createServer()
|
this.http = http.createServer()
|
||||||
this.http.on('error', err => { this._onError(err) })
|
this.http.on('error', err => { this._onError(err) })
|
||||||
this.http.on('listening', onListening)
|
this.http.on('listening', onListening)
|
||||||
@ -112,13 +115,19 @@ class Server extends EventEmitter {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.ws = new WebSocketServer({
|
this.ws = new WebSocketServer({
|
||||||
server: this.http,
|
server: noServer ? undefined : this.http,
|
||||||
perMessageDeflate: false,
|
perMessageDeflate: false,
|
||||||
clientTracking: false
|
clientTracking: false,
|
||||||
|
...(isObject(opts.ws) ? opts.ws : undefined)
|
||||||
})
|
})
|
||||||
|
|
||||||
this.ws.address = () => {
|
this.ws.address = () => {
|
||||||
|
if (noServer) {
|
||||||
|
throw new Error('address() unavailable with { noServer: true }')
|
||||||
|
}
|
||||||
return this.http.address()
|
return this.http.address()
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ws.on('error', err => { this._onError(err) })
|
this.ws.on('error', err => { this._onError(err) })
|
||||||
this.ws.on('connection', (socket, req) => {
|
this.ws.on('connection', (socket, req) => {
|
||||||
// Note: socket.upgradeReq was removed in ws@3.0.0, so re-add it.
|
// Note: socket.upgradeReq was removed in ws@3.0.0, so re-add it.
|
||||||
@ -297,10 +306,6 @@ class Server extends EventEmitter {
|
|||||||
|
|
||||||
debug('listen (port: %o hostname: %o)', port, hostname)
|
debug('listen (port: %o hostname: %o)', port, hostname)
|
||||||
|
|
||||||
function isObject (obj) {
|
|
||||||
return typeof obj === 'object' && obj !== null
|
|
||||||
}
|
|
||||||
|
|
||||||
const httpPort = isObject(port) ? (port.http || 0) : port
|
const httpPort = isObject(port) ? (port.http || 0) : port
|
||||||
const udpPort = isObject(port) ? (port.udp || 0) : port
|
const udpPort = isObject(port) ? (port.udp || 0) : port
|
||||||
|
|
||||||
@ -801,6 +806,10 @@ function makeUdpPacket (params) {
|
|||||||
return packet
|
return packet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isObject (obj) {
|
||||||
|
return typeof obj === 'object' && obj !== null
|
||||||
|
}
|
||||||
|
|
||||||
function toNumber (x) {
|
function toNumber (x) {
|
||||||
x = Number(x)
|
x = Number(x)
|
||||||
return x >= 0 ? x : false
|
return x >= 0 ? x : false
|
||||||
|
Loading…
Reference in New Issue
Block a user