aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/checker.js2
-rw-r--r--src/logger.js3
-rw-r--r--src/pods.js154
-rw-r--r--src/utils.js39
-rw-r--r--src/videos.js35
-rw-r--r--src/webTorrentNode.js12
6 files changed, 136 insertions, 109 deletions
diff --git a/src/checker.js b/src/checker.js
index fd828ca8c..7a3a53616 100644
--- a/src/checker.js
+++ b/src/checker.js
@@ -25,7 +25,7 @@
25 } 25 }
26 26
27 // Create directories for the storage if it doesn't exist 27 // Create directories for the storage if it doesn't exist
28 checker.createDirectories = function () { 28 checker.createDirectoriesIfNotExist = function () {
29 var storages = config.get('storage') 29 var storages = config.get('storage')
30 30
31 for (var key of Object.keys(storages)) { 31 for (var key of Object.keys(storages)) {
diff --git a/src/logger.js b/src/logger.js
index b1384e8b9..850af10cb 100644
--- a/src/logger.js
+++ b/src/logger.js
@@ -1,10 +1,9 @@
1;(function () { 1;(function () {
2 // Thanks http://tostring.it/2014/06/23/advanced-logging-with-nodejs/ 2 // Thanks http://tostring.it/2014/06/23/advanced-logging-with-nodejs/
3
4 'use strict' 3 'use strict'
5 4
6 var winston = require('winston')
7 var config = require('config') 5 var config = require('config')
6 var winston = require('winston')
8 7
9 var logDir = __dirname + '/../' + config.get('storage.logs') 8 var logDir = __dirname + '/../' + config.get('storage.logs')
10 9
diff --git a/src/pods.js b/src/pods.js
index db159a466..b4325ebcf 100644
--- a/src/pods.js
+++ b/src/pods.js
@@ -1,16 +1,17 @@
1;(function () { 1;(function () {
2 'use strict' 2 'use strict'
3 3
4 var fs = require('fs')
5 var config = require('config')
6 var async = require('async') 4 var async = require('async')
5 var config = require('config')
6 var fs = require('fs')
7 var request = require('request') 7 var request = require('request')
8 8
9 var logger = require('./logger') 9 var logger = require('./logger')
10 var utils = require('./utils')
11 var PodsDB = require('./database').PodsDB 10 var PodsDB = require('./database').PodsDB
11 var utils = require('./utils')
12 12
13 var pods = {} 13 var pods = {}
14
14 var http = config.get('webserver.https') ? 'https' : 'http' 15 var http = config.get('webserver.https') ? 'https' : 'http'
15 var host = config.get('webserver.host') 16 var host = config.get('webserver.host')
16 var port = config.get('webserver.port') 17 var port = config.get('webserver.port')
@@ -27,6 +28,7 @@
27 } 28 }
28 29
29 // ----------- Public functions ----------- 30 // ----------- Public functions -----------
31
30 pods.list = function (callback) { 32 pods.list = function (callback) {
31 PodsDB.find(function (err, pods_list) { 33 PodsDB.find(function (err, pods_list) {
32 if (err) { 34 if (err) {
@@ -73,18 +75,27 @@
73 } 75 }
74 76
75 logger.debug('Make multiple requests.') 77 logger.debug('Make multiple requests.')
78
79 var params = {
80 encrypt: true,
81 sign: true,
82 method: data.method,
83 path: data.path,
84 data: data.data
85 }
86
76 utils.makeMultipleRetryRequest( 87 utils.makeMultipleRetryRequest(
77 { encrypt: true, sign: true, method: data.method, path: data.path, data: data.data }, 88 params,
78 89
79 urls, 90 urls,
80 91
81 function (err, response, body, url) { 92 function callbackEachPodFinished (err, response, body, url) {
82 if (err || response.statusCode !== 200) { 93 if (err || response.statusCode !== 200) {
83 logger.error('Error sending secure request to %s/%s pod.', url, data.path, { error: err }) 94 logger.error('Error sending secure request to %s/%s pod.', url, data.path, { error: err })
84 } 95 }
85 }, 96 },
86 97
87 function (err) { 98 function callbackAllPodsFinished (err) {
88 if (err) { 99 if (err) {
89 logger.error('There was some errors when sending the video meta data.', { error: err }) 100 logger.error('There was some errors when sending the video meta data.', { error: err })
90 return callback(err) 101 return callback(err)
@@ -98,7 +109,9 @@
98 } 109 }
99 110
100 pods.makeFriends = function (callback) { 111 pods.makeFriends = function (callback) {
101 logger.debug('Read public key...') 112 var pods_score = {}
113
114 logger.info('Make friends!')
102 fs.readFile(utils.certDir + 'peertube.pub', 'utf8', function (err, cert) { 115 fs.readFile(utils.certDir + 'peertube.pub', 'utf8', function (err, cert) {
103 if (err) { 116 if (err) {
104 logger.error('Cannot read public cert.', { error: err }) 117 logger.error('Cannot read public cert.', { error: err })
@@ -106,71 +119,86 @@
106 } 119 }
107 120
108 var urls = config.get('network.friends') 121 var urls = config.get('network.friends')
109 var pods_score = {}
110 122
111 async.each(urls, function (url, callback) { 123 async.each(urls, computeForeignPodsList, function () {
112 // Always add a trust pod 124 logger.debug('Pods scores computed.', { pods_score: pods_score })
113 pods_score[url] = Infinity 125 var pods_list = computeWinningPods(urls, pods_score)
126 logger.debug('Pods that we keep computed.', { pods_to_keep: pods_list })
127
128 logger.debug('Make requests...')
129 makeRequestsToWinningPods(cert, pods_list)
130 })
131 })
132
133 // -----------------------------------------------------------------------
114 134
115 getForeignPodsList(url, function (foreign_pods_list) { 135 function computeForeignPodsList (url, callback) {
116 if (foreign_pods_list.length === 0) return callback() 136 // Always add a trust pod
137 pods_score[url] = Infinity
117 138
118 async.each(foreign_pods_list, function (foreign_pod, callback) { 139 getForeignPodsList(url, function (foreign_pods_list) {
119 var foreign_url = foreign_pod.url 140 if (foreign_pods_list.length === 0) return callback()
120 if (pods_score[foreign_url]) pods_score[foreign_url]++ 141
121 else pods_score[foreign_url] = 1 142 async.each(foreign_pods_list, function (foreign_pod, callback_each) {
122 callback() 143 var foreign_url = foreign_pod.url
123 }, callback) 144
124 }) 145 if (pods_score[foreign_url]) pods_score[foreign_url]++
125 }, function () { 146 else pods_score[foreign_url] = 1
126 logger.debug('Pods score', { pods_score: pods_score }) 147
127 148 callback_each()
128 // Build the list of pods to add 149 }, function () {
129 // Only add a pod if it exists in more than a half base pods 150 callback()
130 var pods_list = []
131 var base_score = urls.length / 2
132 Object.keys(pods_score).forEach(function (pod) {
133 if (pods_score[pod] > base_score) pods_list.push({ url: pod })
134 }) 151 })
152 })
153 }
135 154
136 logger.debug('Pods that we keep', { pods: pods_list }) 155 function computeWinningPods (urls, pods_score) {
156 // Build the list of pods to add
157 // Only add a pod if it exists in more than a half base pods
158 var pods_list = []
159 var base_score = urls.length / 2
160 Object.keys(pods_score).forEach(function (pod) {
161 if (pods_score[pod] > base_score) pods_list.push({ url: pod })
162 })
137 163
138 var data = { 164 return pods_list
139 url: http + '://' + host + ':' + port, 165 }
140 publicKey: cert
141 }
142 166
143 logger.debug('Make requests...') 167 function makeRequestsToWinningPods (cert, pods_list) {
168 var data = {
169 url: http + '://' + host + ':' + port,
170 publicKey: cert
171 }
144 172
145 utils.makeMultipleRetryRequest( 173 utils.makeMultipleRetryRequest(
146 { method: 'POST', path: '/api/' + global.API_VERSION + '/pods/', data: data }, 174 { method: 'POST', path: '/api/' + global.API_VERSION + '/pods/', data: data },
147 175
148 pods_list, 176 pods_list,
149 177
150 function eachRequest (err, response, body, url) { 178 function eachRequest (err, response, body, url) {
151 if (!err && response.statusCode === 200) { 179 // We add the pod if it responded correctly with its public certificate
152 pods.add({ url: url, publicKey: body.cert }, function (err) { 180 if (!err && response.statusCode === 200) {
153 if (err) { 181 pods.add({ url: url, publicKey: body.cert }, function (err) {
154 logger.error('Error with adding %s pod.', url, { error: err }) 182 if (err) {
155 } 183 logger.error('Error with adding %s pod.', url, { error: err })
156 }) 184 }
157 } else { 185 })
158 logger.error('Error with adding %s pod.', url) 186 } else {
159 } 187 logger.error('Error with adding %s pod.', url, { error: err || new Error('Status not 200') })
160 },
161
162 function endRequests (err) {
163 if (err) {
164 logger.error('There was some errors when we wanted to make friends.', { error: err })
165 return callback(err)
166 }
167
168 logger.debug('Finished')
169 callback(null)
170 } 188 }
171 ) 189 },
172 }) 190
173 }) 191 function endRequests (err) {
192 if (err) {
193 logger.error('There was some errors when we wanted to make friends.', { error: err })
194 return callback(err)
195 }
196
197 logger.debug('makeRequestsToWinningPods finished.')
198 return callback(null)
199 }
200 )
201 }
174 } 202 }
175 203
176 module.exports = pods 204 module.exports = pods
diff --git a/src/utils.js b/src/utils.js
index 8ce1789f9..d6b26db4b 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -1,23 +1,23 @@
1;(function () { 1;(function () {
2 'use strict' 2 'use strict'
3 3
4 var request = require('request')
5 var replay = require('request-replay')
6 var ursa = require('ursa')
7 var config = require('config') 4 var config = require('config')
5 var crypto = require('crypto')
8 var fs = require('fs') 6 var fs = require('fs')
9 var openssl = require('openssl-wrapper') 7 var openssl = require('openssl-wrapper')
10 var crypto = require('crypto') 8 var request = require('request')
9 var replay = require('request-replay')
10 var ursa = require('ursa')
11 11
12 var logger = require('./logger') 12 var logger = require('./logger')
13 13
14 var utils = {}
15
14 var http = config.get('webserver.https') ? 'https' : 'http' 16 var http = config.get('webserver.https') ? 'https' : 'http'
15 var host = config.get('webserver.host') 17 var host = config.get('webserver.host')
16 var port = config.get('webserver.port') 18 var port = config.get('webserver.port')
17 var algorithm = 'aes-256-ctr' 19 var algorithm = 'aes-256-ctr'
18 20
19 var utils = {}
20
21 // ----------- Private functions ---------- 21 // ----------- Private functions ----------
22 22
23 function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) { 23 function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) {
@@ -29,7 +29,7 @@
29 } 29 }
30 } 30 }
31 31
32 logger.debug('Sending informations to %s', to_pod.url, { params: params }) 32 logger.debug('Sending informations to %s.', to_pod.url, { params: params })
33 33
34 // Replay 15 times, with factor 3 34 // Replay 15 times, with factor 3
35 replay( 35 replay(
@@ -52,7 +52,7 @@
52 utils.certDir = __dirname + '/../' + config.get('storage.certs') 52 utils.certDir = __dirname + '/../' + config.get('storage.certs')
53 53
54 // { path, data } 54 // { path, data }
55 utils.makeMultipleRetryRequest = function (all, pods, callbackEach, callback) { 55 utils.makeMultipleRetryRequest = function (all_data, pods, callbackEach, callback) {
56 if (!callback) { 56 if (!callback) {
57 callback = callbackEach 57 callback = callbackEach
58 callbackEach = function () {} 58 callbackEach = function () {}
@@ -61,8 +61,8 @@
61 var url = http + '://' + host + ':' + port 61 var url = http + '://' + host + ':' + port
62 var signature 62 var signature
63 63
64 // Signature ? 64 // Add signature if it is specified in the params
65 if (all.method === 'POST' && all.data && all.sign === true) { 65 if (all_data.method === 'POST' && all_data.data && all_data.sign === true) {
66 var myKey = ursa.createPrivateKey(fs.readFileSync(utils.certDir + 'peertube.key.pem')) 66 var myKey = ursa.createPrivateKey(fs.readFileSync(utils.certDir + 'peertube.key.pem'))
67 signature = myKey.hashAndSign('sha256', url, 'utf8', 'hex') 67 signature = myKey.hashAndSign('sha256', url, 'utf8', 'hex')
68 } 68 }
@@ -70,22 +70,21 @@
70 // Make a request for each pod 70 // Make a request for each pod
71 for (var pod of pods) { 71 for (var pod of pods) {
72 var params = { 72 var params = {
73 url: pod.url + all.path, 73 url: pod.url + all_data.path,
74 method: all.method 74 method: all_data.method
75 } 75 }
76 76
77 // Add data with POST requst ? 77 // Add data with POST requst ?
78 if (all.method === 'POST' && all.data) { 78 if (all_data.method === 'POST' && all_data.data) {
79 logger.debug('Make a POST request.') 79 logger.debug('Make a POST request.')
80 80
81 // Encrypt data ? 81 // Encrypt data ?
82 if (all.encrypt === true) { 82 if (all_data.encrypt === true) {
83 logger.debug(pod.publicKey)
84 var crt = ursa.createPublicKey(pod.publicKey) 83 var crt = ursa.createPublicKey(pod.publicKey)
85 84
86 // TODO: ES6 with let 85 // TODO: ES6 with let
87 ;(function (crt_copy, copy_params, copy_url, copy_pod, copy_signature) { 86 ;(function (crt_copy, copy_params, copy_url, copy_pod, copy_signature) {
88 utils.symetricEncrypt(JSON.stringify(all.data), function (err, dataEncrypted) { 87 utils.symetricEncrypt(JSON.stringify(all_data.data), function (err, dataEncrypted) {
89 if (err) throw err 88 if (err) throw err
90 89
91 var passwordEncrypted = crt_copy.encrypt(dataEncrypted.password, 'utf8', 'hex') 90 var passwordEncrypted = crt_copy.encrypt(dataEncrypted.password, 'utf8', 'hex')
@@ -98,7 +97,7 @@
98 }) 97 })
99 })(crt, params, url, pod, signature) 98 })(crt, params, url, pod, signature)
100 } else { 99 } else {
101 params.json = { data: all.data } 100 params.json = { data: all_data.data }
102 makeRetryRequest(params, url, pod, signature, callbackEach) 101 makeRetryRequest(params, url, pod, signature, callbackEach)
103 } 102 }
104 } else { 103 } else {
@@ -124,20 +123,22 @@
124 return callback(new Error(string)) 123 return callback(new Error(string))
125 } 124 }
126 125
127 logger.debug('Gen RSA keys...') 126 logger.info('Generating a RSA key...')
128 openssl.exec('genrsa', { 'out': utils.certDir + 'peertube.key.pem', '2048': false }, function (err) { 127 openssl.exec('genrsa', { 'out': utils.certDir + 'peertube.key.pem', '2048': false }, function (err) {
129 if (err) { 128 if (err) {
130 logger.error('Cannot create private key on this pod.', { error: err }) 129 logger.error('Cannot create private key on this pod.', { error: err })
131 return callback(err) 130 return callback(err)
132 } 131 }
132 logger.info('RSA key generated.')
133 133
134 logger.debug('Manage public key...') 134 logger.info('Manage public key...')
135 openssl.exec('rsa', { 'in': utils.certDir + 'peertube.key.pem', 'pubout': true, 'out': utils.certDir + 'peertube.pub' }, function (err) { 135 openssl.exec('rsa', { 'in': utils.certDir + 'peertube.key.pem', 'pubout': true, 'out': utils.certDir + 'peertube.pub' }, function (err) {
136 if (err) { 136 if (err) {
137 logger.error('Cannot create public key on this pod .', { error: err }) 137 logger.error('Cannot create public key on this pod .', { error: err })
138 return callback(err) 138 return callback(err)
139 } 139 }
140 140
141 logger.info('Public key managed.')
141 return callback(null) 142 return callback(null)
142 }) 143 })
143 }) 144 })
diff --git a/src/videos.js b/src/videos.js
index f787ae49c..b95219c39 100644
--- a/src/videos.js
+++ b/src/videos.js
@@ -1,27 +1,27 @@
1;(function () { 1;(function () {
2 'use strict' 2 'use strict'
3 3
4 var async = require('async')
5 var config = require('config')
4 var fs = require('fs') 6 var fs = require('fs')
5 var webtorrent = require('./webTorrentNode') 7 var webtorrent = require('./webTorrentNode')
6 var config = require('config')
7 var async = require('async')
8 8
9 var logger = require('./logger') 9 var logger = require('./logger')
10 var VideosDB = require('./database').VideosDB
11 var pods = require('./pods') 10 var pods = require('./pods')
11 var VideosDB = require('./database').VideosDB
12 12
13 var videos = {} 13 var videos = {}
14 // Public url 14
15 var http = config.get('webserver.https') === true ? 'https' : 'http' 15 var http = config.get('webserver.https') === true ? 'https' : 'http'
16 var host = config.get('webserver.host') 16 var host = config.get('webserver.host')
17 var port = config.get('webserver.port') 17 var port = config.get('webserver.port')
18 18
19 // ----------- Private functions ----------- 19 // ----------- Private functions -----------
20 function seedVideo (path, callback) { 20 function seedVideo (path, callback) {
21 logger.debug('Seeding : %s', path) 21 logger.info('Seeding %s...', path)
22 22
23 webtorrent.seed(path, function (torrent) { 23 webtorrent.seed(path, function (torrent) {
24 logger.debug('Seeded : %s', torrent.magnetURI) 24 logger.info('%s seeded (%s).', path, torrent.magnetURI)
25 25
26 return callback(null, torrent) 26 return callback(null, torrent)
27 }) 27 })
@@ -46,7 +46,7 @@
46 var video_file = data.video 46 var video_file = data.video
47 var video_data = data.data 47 var video_data = data.data
48 48
49 logger.debug('Path: %s', video_file.path) 49 logger.info('Adding %s video.', video_file.path)
50 seedVideo(video_file.path, function (err, torrent) { 50 seedVideo(video_file.path, function (err, torrent) {
51 if (err) { 51 if (err) {
52 logger.error('Cannot seed this video.', { error: err }) 52 logger.error('Cannot seed this video.', { error: err })
@@ -70,7 +70,7 @@
70 // Now we'll send the video's meta data 70 // Now we'll send the video's meta data
71 params.namePath = null 71 params.namePath = null
72 72
73 logger.debug('Sending this video Uri to friends...') 73 logger.info('Sending %s video to friends.', video_file.path)
74 74
75 var data = { 75 var data = {
76 path: '/api/' + global.API_VERSION + '/remotevideos/add', 76 path: '/api/' + global.API_VERSION + '/remotevideos/add',
@@ -91,7 +91,7 @@
91 } 91 }
92 92
93 videos.remove = function (id, callback) { 93 videos.remove = function (id, callback) {
94 // Maybe the torrent is not seeding, it doesn't have importance 94 // Maybe the torrent is not seeded, but we catch the error to don't stop the removing process
95 function removeTorrent (magnetUri, callback) { 95 function removeTorrent (magnetUri, callback) {
96 try { 96 try {
97 webtorrent.remove(magnetUri, callback) 97 webtorrent.remove(magnetUri, callback)
@@ -114,7 +114,7 @@
114 return callback(new Error(error_string)) 114 return callback(new Error(error_string))
115 } 115 }
116 116
117 logger.debug('Removing video %s', video.magnetUri) 117 logger.info('Removing %s video', video.name)
118 118
119 removeTorrent(video.magnetUri, function () { 119 removeTorrent(video.magnetUri, function () {
120 VideosDB.findByIdAndRemove(id, function (err) { 120 VideosDB.findByIdAndRemove(id, function (err) {
@@ -154,16 +154,15 @@
154 154
155 // Use the magnet Uri because the _id field is not the same on different servers 155 // Use the magnet Uri because the _id field is not the same on different servers
156 videos.removeRemote = function (fromUrl, magnetUri, callback) { 156 videos.removeRemote = function (fromUrl, magnetUri, callback) {
157 // TODO : check if the remote server has the rights to remove this video
158
159 VideosDB.findOne({ magnetUri: magnetUri }, function (err, video) { 157 VideosDB.findOne({ magnetUri: magnetUri }, function (err, video) {
160 if (err || !video) { 158 if (err || !video) {
161 logger.error('Cannot find the torrent URI of this remote video.') 159 logger.error('Cannot find the torrent URI of this remote video.')
162 return callback(err) 160 return callback(err)
163 } 161 }
164 162
163 // TODO: move to reqValidators middleware ?
165 if (video.podUrl !== fromUrl) { 164 if (video.podUrl !== fromUrl) {
166 logger.error('The pod has not rights on this video.') 165 logger.error('The pod has not the rights on this video.')
167 return callback(err) 166 return callback(err)
168 } 167 }
169 168
@@ -222,23 +221,23 @@
222 }) 221 })
223 } 222 }
224 223
225 videos.seedAll = function (final_callback) { 224 videos.seedAll = function (callback) {
226 VideosDB.find({ namePath: { $ne: null } }, function (err, videos_list) { 225 VideosDB.find({ namePath: { $ne: null } }, function (err, videos_list) {
227 if (err) { 226 if (err) {
228 logger.error('Cannot get list of the videos to seed.', { error: err }) 227 logger.error('Cannot get list of the videos to seed.', { error: err })
229 return final_callback(err) 228 return callback(err)
230 } 229 }
231 230
232 async.each(videos_list, function (video, callback) { 231 async.each(videos_list, function (video, each_callback) {
233 seedVideo(videos.uploadDir + video.namePath, function (err) { 232 seedVideo(videos.uploadDir + video.namePath, function (err) {
234 if (err) { 233 if (err) {
235 logger.error('Cannot seed this video.', { error: err }) 234 logger.error('Cannot seed this video.', { error: err })
236 return callback(err) 235 return callback(err)
237 } 236 }
238 237
239 callback(null) 238 each_callback(null)
240 }) 239 })
241 }, final_callback) 240 }, callback)
242 }) 241 })
243 } 242 }
244 243
diff --git a/src/webTorrentNode.js b/src/webTorrentNode.js
index bc77872ce..d6801d0fb 100644
--- a/src/webTorrentNode.js
+++ b/src/webTorrentNode.js
@@ -1,10 +1,10 @@
1;(function () { 1;(function () {
2 'use strict' 2 'use strict'
3 3
4 var spawn = require('electron-spawn')
5 var config = require('config') 4 var config = require('config')
6 var ipc = require('node-ipc') 5 var ipc = require('node-ipc')
7 var pathUtils = require('path') 6 var pathUtils = require('path')
7 var spawn = require('electron-spawn')
8 8
9 var logger = require('./logger') 9 var logger = require('./logger')
10 10
@@ -85,12 +85,12 @@
85 } 85 }
86 } 86 }
87 87
88 if (!webtorrentnode.silent) logger.debug('Node wants to seed ' + data._id) 88 if (!webtorrentnode.silent) logger.debug('Node wants to seed %s.', data._id)
89 89
90 // Finish signal 90 // Finish signal
91 var event_key = nodeKey + '.seedDone.' + data._id 91 var event_key = nodeKey + '.seedDone.' + data._id
92 ipc.server.on(event_key, function listener (received) { 92 ipc.server.on(event_key, function listener (received) {
93 if (!webtorrentnode.silent) logger.debug('Process seeded torrent ' + received.magnetUri) 93 if (!webtorrentnode.silent) logger.debug('Process seeded torrent %s.', received.magnetUri)
94 94
95 // This is a fake object, we just use the magnetUri in this project 95 // This is a fake object, we just use the magnetUri in this project
96 var torrent = { 96 var torrent = {
@@ -117,7 +117,7 @@
117 // Finish signal 117 // Finish signal
118 var event_key = nodeKey + '.addDone.' + data._id 118 var event_key = nodeKey + '.addDone.' + data._id
119 ipc.server.on(event_key, function (received) { 119 ipc.server.on(event_key, function (received) {
120 if (!webtorrentnode.silent) logger.debug('Process added torrent') 120 if (!webtorrentnode.silent) logger.debug('Process added torrent.')
121 121
122 // This is a fake object, we just use the magnetUri in this project 122 // This is a fake object, we just use the magnetUri in this project
123 var torrent = { 123 var torrent = {
@@ -139,12 +139,12 @@
139 } 139 }
140 } 140 }
141 141
142 if (!webtorrentnode.silent) logger.debug('Node wants to stop seeding ' + data._id) 142 if (!webtorrentnode.silent) logger.debug('Node wants to stop seeding %s.', data._id)
143 143
144 // Finish signal 144 // Finish signal
145 var event_key = nodeKey + '.removeDone.' + data._id 145 var event_key = nodeKey + '.removeDone.' + data._id
146 ipc.server.on(event_key, function (received) { 146 ipc.server.on(event_key, function (received) {
147 if (!webtorrentnode.silent) logger.debug('Process removed torrent ' + data._id) 147 if (!webtorrentnode.silent) logger.debug('Process removed torrent %s.', data._id)
148 148
149 var err = null 149 var err = null
150 if (received.err) err = received.err 150 if (received.err) err = received.err