diff options
author | Diego RodrÃguez Baquero <diegorbaquero@gmail.com> | 2018-08-24 18:09:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-24 18:09:07 +0300 |
commit | a57e9f3e9d4f3f4e0d92506fe1fd75df35cf9055 (patch) | |
tree | 6b0c558ded2d9dd4312ebeb8052925f785abea1d /lib | |
parent | 92ec1a249d5374178557d80c1fc013ff2c76440d (diff) | |
parent | baed9c5ba70db2d37ba9d326c885c2082633a9f0 (diff) |
Merge pull request #1479 from jimmywarting/feature/file_downloaded
calculate file downloaded correctly
Diffstat (limited to 'lib')
-rw-r--r-- | lib/file.js | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/file.js b/lib/file.js index 4d7d71a..2715fbb 100644 --- a/lib/file.js +++ b/lib/file.js @@ -36,18 +36,30 @@ class File extends EventEmitter { get downloaded () { if (!this._torrent.bitfield) return 0 - let downloaded = 0 - for (let index = this._startPiece; index <= this._endPiece; ++index) { - if (this._torrent.bitfield.get(index)) { + + const { pieces, bitfield, pieceLength } = this._torrent + const { _startPiece: start, _endPiece: end } = this + const piece = pieces[start] + + // Calculate first piece diffrently, it sometimes have a offset + let downloaded = bitfield.get(start) + ? pieceLength - this.offset + : Math.max(piece.length - piece.missing - this.offset, 0) + + for (let index = start + 1; index <= end; ++index) { + if (bitfield.get(index)) { // verified data - downloaded += (index === this._endPiece) ? this._torrent.lastPieceLength : this._torrent.pieceLength + downloaded += pieceLength } else { // "in progress" data - const piece = this._torrent.pieces[index] + const piece = pieces[index] downloaded += piece.length - piece.missing } } - return downloaded + + // We don't have a end-offset and one small file can fith in the middle + // of one chunk, so return this.length if it's oversized + return Math.min(downloaded, this.length) } get progress () { |