diff options
author | Jimmy Wärting <jimmy@warting.se> | 2018-08-26 12:22:52 +0300 |
---|---|---|
committer | Jimmy Wärting <jimmy@warting.se> | 2018-08-26 12:22:52 +0300 |
commit | 40ca1578a7703448264a4f22832520d23b3118e4 (patch) | |
tree | 0f8207ae2db13f8c33dab56e821975ec61d563a2 /lib | |
parent | a57e9f3e9d4f3f4e0d92506fe1fd75df35cf9055 (diff) |
modernize lib/rarity-map.jsj
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rarity-map.js | 182 |
1 files changed, 87 insertions, 95 deletions
diff --git a/lib/rarity-map.js b/lib/rarity-map.js index 430f62f..f97e602 100644 --- a/lib/rarity-map.js +++ b/lib/rarity-map.js @@ -1,121 +1,113 @@ -module.exports = RarityMap /** * Mapping of torrent pieces to their respective availability in the torrent swarm. Used * by the torrent manager for implementing the rarest piece first selection strategy. */ -function RarityMap (torrent) { - var self = this +class RarityMap { + constructor (torrent) { + const self = this - self._torrent = torrent - self._numPieces = torrent.pieces.length - self._pieces = [] + self._torrent = torrent + self._numPieces = torrent.pieces.length + self._pieces = new Array(self._numPieces).fill(0) - self._onWire = function (wire) { - self.recalculate() - self._initWire(wire) - } - self._onWireHave = function (index) { - self._pieces[index] += 1 - } - self._onWireBitfield = function () { + self._onWire = wire => { + self.recalculate() + self._initWire(wire) + } + self._onWireHave = index => { + self._pieces[index] += 1 + } + self._onWireBitfield = () => { + self.recalculate() + } + + self._torrent.wires.forEach(wire => { + self._initWire(wire) + }) + self._torrent.on('wire', self._onWire) self.recalculate() } - self._torrent.wires.forEach(function (wire) { - self._initWire(wire) - }) - self._torrent.on('wire', self._onWire) - self.recalculate() -} - -/** - * Get the index of the rarest piece. Optionally, pass a filter function to exclude - * certain pieces (for instance, those that we already have). - * - * @param {function} pieceFilterFunc - * @return {number} index of rarest piece, or -1 - */ -RarityMap.prototype.getRarestPiece = function (pieceFilterFunc) { - if (!pieceFilterFunc) pieceFilterFunc = trueFn - - var candidates = [] - var min = Infinity - - for (var i = 0; i < this._numPieces; ++i) { - if (!pieceFilterFunc(i)) continue + /** + * Get the index of the rarest piece. Optionally, pass a filter function to exclude + * certain pieces (for instance, those that we already have). + * + * @param {function} pieceFilterFunc + * @return {number} index of rarest piece, or -1 + */ + getRarestPiece (pieceFilterFunc) { + let candidates = [] + let min = Infinity + + for (let i = 0; i < this._numPieces; ++i) { + if (pieceFilterFunc && !pieceFilterFunc(i)) continue + + const availability = this._pieces[i] + if (availability === min) { + candidates.push(i) + } else if (availability < min) { + candidates = [ i ] + min = availability + } + } - var availability = this._pieces[i] - if (availability === min) { - candidates.push(i) - } else if (availability < min) { - candidates = [ i ] - min = availability + if (candidates.length) { + // if there are multiple pieces with the same availability, choose one randomly + return candidates[Math.random() * candidates.length | 0] + } else { + return -1 } } - if (candidates.length > 0) { - // if there are multiple pieces with the same availability, choose one randomly - return candidates[Math.random() * candidates.length | 0] - } else { - return -1 + destroy () { + const self = this + self._torrent.removeListener('wire', self._onWire) + self._torrent.wires.forEach(wire => { + self._cleanupWireEvents(wire) + }) + self._torrent = null + self._pieces = null + + self._onWire = null + self._onWireHave = null + self._onWireBitfield = null } -} - -RarityMap.prototype.destroy = function () { - var self = this - self._torrent.removeListener('wire', self._onWire) - self._torrent.wires.forEach(function (wire) { - self._cleanupWireEvents(wire) - }) - self._torrent = null - self._pieces = null - - self._onWire = null - self._onWireHave = null - self._onWireBitfield = null -} -RarityMap.prototype._initWire = function (wire) { - var self = this + _initWire (wire) { + const self = this - wire._onClose = function () { - self._cleanupWireEvents(wire) - for (var i = 0; i < this._numPieces; ++i) { - self._pieces[i] -= wire.peerPieces.get(i) + wire._onClose = function () { + self._cleanupWireEvents(wire) + for (let i = 0; i < this._numPieces; ++i) { + self._pieces[i] -= wire.peerPieces.get(i) + } } - } - - wire.on('have', self._onWireHave) - wire.on('bitfield', self._onWireBitfield) - wire.once('close', wire._onClose) -} -/** - * Recalculates piece availability across all peers in the torrent. - */ -RarityMap.prototype.recalculate = function () { - var i - for (i = 0; i < this._numPieces; ++i) { - this._pieces[i] = 0 + wire.on('have', self._onWireHave) + wire.on('bitfield', self._onWireBitfield) + wire.once('close', wire._onClose) } - var numWires = this._torrent.wires.length - for (i = 0; i < numWires; ++i) { - var wire = this._torrent.wires[i] - for (var j = 0; j < this._numPieces; ++j) { - this._pieces[j] += wire.peerPieces.get(j) + /** + * Recalculates piece availability across all peers in the torrent. + */ + recalculate () { + this._pieces.fill(0) + + for (const wire of this._torrent.wires) { + for (let i = 0; i < this._numPieces; ++i) { + this._pieces[i] += wire.peerPieces.get(i) + } } } -} -RarityMap.prototype._cleanupWireEvents = function (wire) { - wire.removeListener('have', this._onWireHave) - wire.removeListener('bitfield', this._onWireBitfield) - if (wire._onClose) wire.removeListener('close', wire._onClose) - wire._onClose = null + _cleanupWireEvents (wire) { + wire.removeListener('have', this._onWireHave) + wire.removeListener('bitfield', this._onWireBitfield) + if (wire._onClose) wire.removeListener('close', wire._onClose) + wire._onClose = null + } } -function trueFn () { - return true -} +module.exports = RarityMap |