Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support seeding entire folders (string path to folder) #213

Merged
merged 4 commits into from Dec 22, 2014
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.

Always

Just for now

@@ -266,10 +266,9 @@ Start seeding a new torrent.
- path to the file or folder on filesystem (string)
- W3C [File](https://developer.mozilla.org/en-US/docs/Web/API/File) object (from an `<input>` or drag and drop)
- W3C [FileList](https://developer.mozilla.org/en-US/docs/Web/API/FileList) object (basically an array of `File` objects)
- W3C [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) object
- Node [Buffer](http://nodejs.org/api/buffer.html) object (works in [the browser](https://www.npmjs.org/package/buffer))

Or, an **array of `File`, `Blob`, or `Buffer` objects**.
Or, an **array of `File` or `Buffer` objects**.

If `opts` is specified, it should contain the following types of options:

@@ -121,15 +121,6 @@ WebTorrent.prototype.get = function (torrentId) {

/**
* Start downloading a new torrent. Aliased as `client.download`.
*
* `torrentId` can be one of:
* - magnet uri (utf8 string)
* - torrent file (buffer)
* - info hash (hex string or buffer)
* - parsed torrent (from [parse-torrent](https://github.com/feross/parse-torrent))
* - http/https url to a torrent file (string)
* - filesystem path to a torrent file (string)
*
* @param {string|Buffer|Object} torrentId
* @param {Object} opts torrent-specific options
* @param {function=} ontorrent called when the torrent is ready (has metadata)
@@ -179,14 +170,7 @@ WebTorrent.prototype.download = function (torrentId, opts, ontorrent) {

/**
* Start seeding a new torrent.
*
* `input` can be any of the following:
* - path to the file or folder on filesystem (string)
* - W3C File object (from an `<input>` or drag and drop)
* - W3C FileList object (basically an array of `File` objects)
* - Array of `File` objects
*
* @param {string|File|FileList|Blob|Buffer|Array.<File|Blob|Buffer>} input
* @param {string|File|FileList|Buffer|Array.<File|Buffer>} input
* @param {Object} opts
* @param {function} onseed
*/
@@ -199,53 +183,33 @@ WebTorrent.prototype.seed = function (input, opts, onseed) {
if (!opts) opts = {}

// TODO: support an array of paths
// TODO: support path to folder (currently, only path to file supported)

if (typeof FileList !== 'undefined' && input instanceof FileList)
input = Array.prototype.slice.call(input)

if (isBlob(input) || Buffer.isBuffer(input))
input = [ input ]

var streams
if (Array.isArray(input) && input.length > 0) {
streams = input.map(function (item) {
if (isBlob(item)) return new FileReadStream(item)
else if (Buffer.isBuffer(item)) {
var s = new stream.PassThrough()
s.end(item)
return s
} else {
throw new Error('Array must contain only File|Blob|Buffer objects')
}
})
} else if (typeof input === 'string') {
streams = [ fs.createReadStream(input) ]
} else {
throw new Error('invalid input type')
}

createTorrent(input, opts, function (err, torrentBuf) {
createTorrent.parseInput(input, opts, function (err, files) {
if (err) return self.emit('error', err)
self.add(torrentBuf, opts, function (torrent) {
var tasks = [function (cb) {
torrent.storage.load(streams, cb)
}]
if (self.dht) tasks.push(function (cb) {
torrent.on('dhtAnnounce', cb)
})
parallel(tasks, function (err) {
if (err) return self.emit('error', err)
if (onseed) onseed(torrent)
self.emit('seed', torrent)
var streams = files.map(function (file) { return file.getStream })

createTorrent(input, opts, function (err, torrentBuf) {
if (err) return self.emit('error', err)

self.add(torrentBuf, opts, function (torrent) {
var tasks = [function (cb) {
torrent.storage.load(streams, cb)
}]
if (self.dht) tasks.push(function (cb) {
torrent.on('dhtAnnounce', cb)
})
parallel(tasks, function (err) {
if (err) return self.emit('error', err)
if (onseed) onseed(torrent)
self.emit('seed', torrent)
})
})
})
})
}

/**
* Remove a torrent from the client.
*
* @param {string|Buffer} torrentId
* @param {function} cb
*/
@@ -260,8 +224,6 @@ WebTorrent.prototype.remove = function (torrentId, cb) {

/**
* Destroy the client, including all torrents and connections to peers.
*
* @override
* @param {function} cb
*/
WebTorrent.prototype.destroy = function (cb) {
@@ -282,7 +244,7 @@ WebTorrent.prototype.destroy = function (cb) {
}

/**
* Check if `obj` is a W3C Blob object (which is the superclass of W3C File)
* Check if `obj` is a W3C Blob object (which is the superclass of W3C File).
* @param {*} obj
* @return {boolean}
*/
@@ -32,7 +32,7 @@
"block-stream": "0.0.7",
"clivas": "^0.1.4",
"concat-stream": "^1.4.6",
"create-torrent": "^3.1.0",
"create-torrent": "^3.4.0",
"debug": "^2.1.0",
"dezalgo": "^1.0.1",
"end-of-stream": "^1.0.0",
@@ -9,6 +9,7 @@ var leavesPath = __dirname + '/torrents/leaves.torrent'
var leaves = fs.readFileSync(leavesPath)
var leavesTorrent = parseTorrent(leaves)
var leavesBookPath = __dirname + '/content/Leaves of Grass by Walt Whitman.epub'
var numbersPath = __dirname + '/content/numbers'

test('client.add (http url to a torrent file (string))', function (t) {
t.plan(1)
@@ -50,3 +51,21 @@ test('client.seed (filesystem path to file (string))', function (t) {
client.destroy()
})
})

test('client.seed (filesystem path to folder (string))', function (t) {
t.plan(1)

var opts = {
pieceLength: 32768, // force piece length to 32KB so info-hash will
// match what transmission generated, since we use
// a different algo for picking piece length

private: false // also force `private: false` to match transmission
}

var client = new WebTorrent({ dht: false, tracker: false })
client.seed(numbersPath, opts, function (torrent) {
t.equal(torrent.infoHash, '80562f38656b385ea78959010e51a2cc9db41ea0')
client.destroy()
})
})
@@ -52,13 +52,7 @@ test('client.seed (Buffer, Blob)', function (t) {
// Blob
if (typeof Blob !== 'undefined') {
var client2 = new WebTorrent({ dht: false, tracker: false })
var blob = new Blob([ leavesBook ])

// TODO: just pass name in the opts object – this should work
// Doing it this way until we use the create-torrent code to process inputs
// in client.seed
blob.name = opts.name
client2.seed(blob, function (torrent) {
client2.seed(new Blob([ leavesBook ]), opts, function (torrent) {
verify(t, client2, torrent)
})
} else {
@@ -0,0 +1 @@
1
@@ -0,0 +1 @@
22
@@ -0,0 +1 @@
333
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.