2016-02-07 11:23:23 +01:00
|
|
|
'use strict'
|
|
|
|
|
2016-03-16 22:29:27 +01:00
|
|
|
const ipc = require('node-ipc')
|
|
|
|
const pathUtils = require('path')
|
|
|
|
const spawn = require('electron-spawn')
|
2016-02-07 11:23:23 +01:00
|
|
|
|
2016-08-19 21:34:51 +02:00
|
|
|
const constants = require('../initializers/constants')
|
2016-03-16 22:29:27 +01:00
|
|
|
const logger = require('../helpers/logger')
|
2016-02-07 11:23:23 +01:00
|
|
|
|
2016-08-19 21:34:51 +02:00
|
|
|
let host = constants.CONFIG.WEBSERVER.HOST
|
|
|
|
let port = constants.CONFIG.WEBSERVER.PORT
|
2016-03-16 22:29:27 +01:00
|
|
|
let nodeKey = 'webtorrentnode' + port
|
|
|
|
let processKey = 'webtorrentprocess' + port
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.config.silent = true
|
|
|
|
ipc.config.id = nodeKey
|
|
|
|
|
2016-03-16 22:29:27 +01:00
|
|
|
const webtorrent = {
|
2016-02-07 11:23:23 +01:00
|
|
|
add: add,
|
|
|
|
app: null, // Pid of the app
|
|
|
|
create: create,
|
|
|
|
remove: remove,
|
|
|
|
seed: seed,
|
|
|
|
silent: false // Useful for beautiful tests
|
|
|
|
}
|
|
|
|
|
|
|
|
function create (options, callback) {
|
|
|
|
if (typeof options === 'function') {
|
|
|
|
callback = options
|
|
|
|
options = {}
|
2016-02-06 16:22:39 +01:00
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// Override options
|
|
|
|
if (options.host) host = options.host
|
|
|
|
if (options.port) {
|
|
|
|
port = options.port
|
|
|
|
nodeKey = 'webtorrentnode' + port
|
|
|
|
processKey = 'webtorrentprocess' + port
|
|
|
|
ipc.config.id = nodeKey
|
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.serve(function () {
|
|
|
|
if (!webtorrent.silent) logger.info('IPC server ready.')
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// Run a timeout of 30s after which we exit the process
|
2016-05-11 21:19:34 +02:00
|
|
|
const timeoutWebtorrentProcess = setTimeout(function () {
|
2016-02-07 12:01:40 +01:00
|
|
|
throw new Error('Timeout : cannot run the webtorrent process. Please ensure you have electron-prebuilt npm package installed with xvfb-run.')
|
2016-02-07 11:23:23 +01:00
|
|
|
}, 30000)
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.server.on(processKey + '.ready', function () {
|
|
|
|
if (!webtorrent.silent) logger.info('Webtorrent process ready.')
|
2016-05-11 21:19:34 +02:00
|
|
|
clearTimeout(timeoutWebtorrentProcess)
|
2016-02-07 11:23:23 +01:00
|
|
|
callback()
|
|
|
|
})
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.server.on(processKey + '.exception', function (data) {
|
2016-03-19 09:08:10 +01:00
|
|
|
throw new Error('Received exception error from webtorrent process : ' + data.exception)
|
2016-02-07 11:23:23 +01:00
|
|
|
})
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-07-01 16:22:36 +02:00
|
|
|
const webtorrentProcess = spawn(pathUtils.join(__dirname, 'webtorrent-process.js'), host, port, { detached: true })
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-08-19 21:34:51 +02:00
|
|
|
if (constants.CONFIG.ELECTRON.DEBUG === true) {
|
2016-05-11 21:19:34 +02:00
|
|
|
webtorrentProcess.stderr.on('data', function (data) {
|
2016-05-11 20:43:07 +02:00
|
|
|
logger.debug('Webtorrent process stderr: ', data.toString())
|
|
|
|
})
|
|
|
|
|
2016-05-11 21:19:34 +02:00
|
|
|
webtorrentProcess.stdout.on('data', function (data) {
|
2016-05-11 20:43:07 +02:00
|
|
|
logger.debug('Webtorrent process:', data.toString())
|
|
|
|
})
|
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-05-11 21:19:34 +02:00
|
|
|
webtorrent.app = webtorrentProcess
|
2016-02-07 11:23:23 +01:00
|
|
|
})
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.server.start()
|
|
|
|
}
|
|
|
|
|
|
|
|
function seed (path, callback) {
|
2016-03-16 22:29:27 +01:00
|
|
|
const extension = pathUtils.extname(path)
|
|
|
|
const basename = pathUtils.basename(path, extension)
|
|
|
|
const data = {
|
2016-02-07 11:23:23 +01:00
|
|
|
_id: basename,
|
|
|
|
args: {
|
|
|
|
path: path
|
2015-06-09 17:41:40 +02:00
|
|
|
}
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
if (!webtorrent.silent) logger.debug('Node wants to seed %s.', data._id)
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// Finish signal
|
2016-05-11 21:19:34 +02:00
|
|
|
const eventKey = nodeKey + '.seedDone.' + data._id
|
|
|
|
ipc.server.on(eventKey, function listener (received) {
|
2016-02-07 11:23:23 +01:00
|
|
|
if (!webtorrent.silent) logger.debug('Process seeded torrent %s.', received.magnetUri)
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// This is a fake object, we just use the magnetUri in this project
|
2016-03-16 22:29:27 +01:00
|
|
|
const torrent = {
|
2016-02-07 11:23:23 +01:00
|
|
|
magnetURI: received.magnetUri
|
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-07-18 16:16:47 +02:00
|
|
|
ipc.server.off(eventKey, '*')
|
2016-02-07 11:23:23 +01:00
|
|
|
callback(torrent)
|
|
|
|
})
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.server.broadcast(processKey + '.seed', data)
|
|
|
|
}
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
function add (magnetUri, callback) {
|
2016-03-16 22:29:27 +01:00
|
|
|
const data = {
|
2016-02-07 11:23:23 +01:00
|
|
|
_id: magnetUri,
|
|
|
|
args: {
|
|
|
|
magnetUri: magnetUri
|
2015-06-09 17:41:40 +02:00
|
|
|
}
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
if (!webtorrent.silent) logger.debug('Node wants to add ' + data._id)
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// Finish signal
|
2016-05-11 21:19:34 +02:00
|
|
|
const eventKey = nodeKey + '.addDone.' + data._id
|
|
|
|
ipc.server.on(eventKey, function (received) {
|
2016-02-07 11:23:23 +01:00
|
|
|
if (!webtorrent.silent) logger.debug('Process added torrent.')
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// This is a fake object, we just use the magnetUri in this project
|
2016-03-16 22:29:27 +01:00
|
|
|
const torrent = {
|
2016-02-07 11:23:23 +01:00
|
|
|
files: received.files
|
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-07-18 16:16:47 +02:00
|
|
|
ipc.server.off(eventKey, '*')
|
2016-02-07 11:23:23 +01:00
|
|
|
callback(torrent)
|
|
|
|
})
|
2015-11-02 22:19:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.server.broadcast(processKey + '.add', data)
|
|
|
|
}
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
function remove (magnetUri, callback) {
|
2016-03-16 22:29:27 +01:00
|
|
|
const data = {
|
2016-02-07 11:23:23 +01:00
|
|
|
_id: magnetUri,
|
|
|
|
args: {
|
|
|
|
magnetUri: magnetUri
|
2016-02-06 16:22:39 +01:00
|
|
|
}
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
if (!webtorrent.silent) logger.debug('Node wants to stop seeding %s.', data._id)
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// Finish signal
|
2016-05-11 21:19:34 +02:00
|
|
|
const eventKey = nodeKey + '.removeDone.' + data._id
|
|
|
|
ipc.server.on(eventKey, function (received) {
|
2016-02-07 11:23:23 +01:00
|
|
|
if (!webtorrent.silent) logger.debug('Process removed torrent %s.', data._id)
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-03-16 22:29:27 +01:00
|
|
|
let err = null
|
2016-02-07 11:23:23 +01:00
|
|
|
if (received.err) err = received.err
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-07-18 16:16:47 +02:00
|
|
|
ipc.server.off(eventKey, '*')
|
2016-02-07 11:23:23 +01:00
|
|
|
callback(err)
|
|
|
|
})
|
2016-02-06 16:22:39 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
ipc.server.broadcast(processKey + '.remove', data)
|
|
|
|
}
|
2016-01-31 11:23:52 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// ---------------------------------------------------------------------------
|
2016-01-31 11:23:52 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
module.exports = webtorrent
|