]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - src/webTorrentNode.js
Off the events of the ipc task done in webtorrent node
[github/Chocobozzz/PeerTube.git] / src / webTorrentNode.js
index 03bff780381c69619e01149748a9bdc798a31353..bc77872ceae73e83e290e8d6566e9479e585c75e 100644 (file)
@@ -8,16 +8,8 @@
 
   var logger = require('./logger')
 
-  var host
-  var port
-
-  try {
-    host = config.get('webserver.host')
-    port = config.get('webserver.port')
-  } catch (e) {
-    host = 'client'
-    port = 1
-  }
+  var host = config.get('webserver.host')
+  var port = config.get('webserver.port')
 
   var nodeKey = 'webtorrentnode' + port
   var processKey = 'webtorrent' + port
   // Useful to kill it
   webtorrentnode.app = null
 
-  webtorrentnode.create = function (callback) {
+  webtorrentnode.create = function (options, callback) {
+    if (typeof options === 'function') {
+      callback = options
+      options = {}
+    }
+
+    // Override options
+    if (options.host) host = options.host
+    if (options.port) {
+      port = options.port
+      nodeKey = 'webtorrentnode' + port
+      processKey = 'webtorrent' + port
+      ipc.config.id = nodeKey
+    }
+
     ipc.serve(function () {
       if (!webtorrentnode.silent) logger.info('IPC server ready.')
 
+      // Run a timeout of 30s after which we exit the process
+      var timeout_webtorrent_process = setTimeout(function () {
+        logger.error('Timeout : cannot run the webtorrent process. Please ensure you have electron-prebuilt npm package installed with xvfb-run.')
+        process.exit()
+      }, 30000)
+
       ipc.server.on(processKey + '.ready', function () {
         if (!webtorrentnode.silent) logger.info('Webtorrent process ready.')
+        clearTimeout(timeout_webtorrent_process)
         callback()
       })
 
+      ipc.server.on(processKey + '.exception', function (data) {
+        logger.error('Received exception error from webtorrent process.', { exception: data.exception })
+        process.exit()
+      })
+
       var webtorrent_process = spawn(__dirname + '/webtorrent.js', host, port, { detached: true })
       webtorrent_process.stderr.on('data', function (data) {
         // logger.debug('Webtorrent process stderr: ', data.toString())
         // logger.debug('Webtorrent process:', data.toString())
       })
 
-      function exitChildProcess () {
-        if (!webtorrentnode.silent) logger.info('Gracefully exit child')
-        process.kill(-webtorrent_process.pid)
-        process.exit(0)
-      }
-
-      process.on('SIGINT', exitChildProcess)
-      process.on('SIGTERM', exitChildProcess)
-
       webtorrentnode.app = webtorrent_process
     })
 
@@ -79,7 +88,8 @@
     if (!webtorrentnode.silent) logger.debug('Node wants to seed ' + data._id)
 
     // Finish signal
-    ipc.server.on(nodeKey + '.seedDone.' + data._id, function (received) {
+    var event_key = nodeKey + '.seedDone.' + data._id
+    ipc.server.on(event_key, function listener (received) {
       if (!webtorrentnode.silent) logger.debug('Process seeded torrent ' + received.magnetUri)
 
       // This is a fake object, we just use the magnetUri in this project
@@ -87,6 +97,7 @@
         magnetURI: received.magnetUri
       }
 
+      ipc.server.off(event_key)
       callback(torrent)
     })
 
     if (!webtorrentnode.silent) logger.debug('Node wants to add ' + data._id)
 
     // Finish signal
-    ipc.server.on(nodeKey + '.addDone.' + data._id, function (received) {
+    var event_key = nodeKey + '.addDone.' + data._id
+    ipc.server.on(event_key, function (received) {
       if (!webtorrentnode.silent) logger.debug('Process added torrent')
 
       // This is a fake object, we just use the magnetUri in this project
         files: received.files
       }
 
+      ipc.server.off(event_key)
       callback(torrent)
     })
 
     if (!webtorrentnode.silent) logger.debug('Node wants to stop seeding ' + data._id)
 
     // Finish signal
-    ipc.server.on(nodeKey + '.removeDone.' + data._id, function (received) {
+    var event_key = nodeKey + '.removeDone.' + data._id
+    ipc.server.on(event_key, function (received) {
       if (!webtorrentnode.silent) logger.debug('Process removed torrent ' + data._id)
 
       var err = null
       if (received.err) err = received.err
 
+      ipc.server.off(event_key)
       callback(err)
     })