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
|
module.exports = File
var eos = require('end-of-stream')
var EventEmitter = require('events').EventEmitter
var FileStream = require('./file-stream')
var inherits = require('inherits')
var path = require('path')
var render = require('render-media')
var stream = require('readable-stream')
var streamToBlob = require('stream-to-blob')
var streamToBlobURL = require('stream-to-blob-url')
var streamToBuffer = require('stream-with-known-length-to-buffer')
inherits(File, EventEmitter)
function File (torrent, file) {
EventEmitter.call(this)
this._torrent = torrent
this._destroyed = false
this.name = file.name
this.path = file.path
this.length = file.length
this.offset = file.offset
this.done = false
var start = file.offset
var end = start + file.length - 1
this._startPiece = start / this._torrent.pieceLength | 0
this._endPiece = end / this._torrent.pieceLength | 0
if (this.length === 0) {
this.done = true
this.emit('done')
}
}
File.prototype.select = function (priority) {
if (this.length === 0) return
this._torrent.select(this._startPiece, this._endPiece, priority)
}
File.prototype.deselect = function () {
if (this.length === 0) return
this._torrent.deselect(this._startPiece, this._endPiece, false)
}
File.prototype.createReadStream = function (opts) {
var self = this
if (this.length === 0) {
var empty = new stream.PassThrough()
process.nextTick(function () {
empty.end()
})
return empty
}
var fileStream = new FileStream(self, opts)
self._torrent.select(fileStream._startPiece, fileStream._endPiece, true, function () {
fileStream._notify()
})
eos(fileStream, function () {
if (self._destroyed) return
if (!self._torrent.destroyed) {
self._torrent.deselect(fileStream._startPiece, fileStream._endPiece, true)
}
})
return fileStream
}
File.prototype.getBuffer = function (cb) {
streamToBuffer(this.createReadStream(), this.length, cb)
}
File.prototype.getBlob = function (cb) {
if (typeof window === 'undefined') throw new Error('browser-only method')
streamToBlob(this.createReadStream(), this._getMimeType(), cb)
}
File.prototype.getBlobURL = function (cb) {
if (typeof window === 'undefined') throw new Error('browser-only method')
streamToBlobURL(this.createReadStream(), this._getMimeType(), cb)
}
File.prototype.appendTo = function (elem, opts, cb) {
if (typeof window === 'undefined') throw new Error('browser-only method')
render.append(this, elem, opts, cb)
}
File.prototype.renderTo = function (elem, opts, cb) {
if (typeof window === 'undefined') throw new Error('browser-only method')
render.render(this, elem, opts, cb)
}
File.prototype._getMimeType = function () {
return render.mime[path.extname(this.name).toLowerCase()]
}
File.prototype._destroy = function () {
this._destroyed = true
this._torrent = null
}
|