diff --git a/lib/friends.js b/lib/friends.js index 8cc1a3151..006a64404 100644 --- a/lib/friends.js +++ b/lib/friends.js @@ -54,110 +54,18 @@ function makeFriends (callback) { var urls = config.get('network.friends') - async.each(urls, computeForeignPodsList, function (err) { + async.each(urls, function (url, callback) { + computeForeignPodsList(url, pods_score, callback) + }, function (err) { if (err) return callback(err) logger.debug('Pods scores computed.', { pods_score: pods_score }) var pods_list = computeWinningPods(urls, pods_score) logger.debug('Pods that we keep computed.', { pods_to_keep: pods_list }) - makeRequestsToWinningPods(cert, pods_list) + makeRequestsToWinningPods(cert, pods_list, callback) }) }) - - // ----------------------------------------------------------------------- - - function computeForeignPodsList (url, callback) { - // Let's give 1 point to the pod we ask the friends list - pods_score[url] = 1 - - getForeignPodsList(url, function (err, foreign_pods_list) { - if (err) return callback(err) - if (foreign_pods_list.length === 0) return callback() - - async.each(foreign_pods_list, function (foreign_pod, callback_each) { - var foreign_url = foreign_pod.url - - if (pods_score[foreign_url]) pods_score[foreign_url]++ - else pods_score[foreign_url] = 1 - - callback_each() - }, function () { - callback() - }) - }) - } - - function computeWinningPods (urls, pods_score) { - // Build the list of pods to add - // Only add a pod if it exists in more than a half base pods - var pods_list = [] - var base_score = urls.length / 2 - Object.keys(pods_score).forEach(function (pod) { - if (pods_score[pod] > base_score) pods_list.push({ url: pod }) - }) - - return pods_list - } - - function makeRequestsToWinningPods (cert, pods_list) { - // Stop pool requests - poolRequests.deactivate() - // Flush pool requests - poolRequests.forceSend() - - // Get the list of our videos to send to our new friends - Videos.listOwned(function (err, videos_list) { - if (err) { - logger.error('Cannot get the list of videos we own.') - return callback(err) - } - - var data = { - url: http + '://' + host + ':' + port, - publicKey: cert, - videos: videos_list - } - - requests.makeMultipleRetryRequest( - { method: 'POST', path: '/api/' + constants.API_VERSION + '/pods/', data: data }, - - pods_list, - - function eachRequest (err, response, body, url, pod, callback_each_request) { - // We add the pod if it responded correctly with its public certificate - if (!err && response.statusCode === 200) { - Pods.add({ url: pod.url, publicKey: body.cert, score: constants.FRIEND_BASE_SCORE }, function (err) { - if (err) logger.error('Error with adding %s pod.', pod.url, { error: err }) - - Videos.addRemotes(body.videos, function (err) { - if (err) logger.error('Error with adding videos of pod.', pod.url, { error: err }) - - logger.debug('Adding remote videos from %s.', pod.url, { videos: body.videos }) - return callback_each_request() - }) - }) - } else { - logger.error('Error with adding %s pod.', pod.url, { error: err || new Error('Status not 200') }) - return callback_each_request() - } - }, - - function endRequests (err) { - // Now we made new friends, we can re activate the pool of requests - poolRequests.activate() - - if (err) { - logger.error('There was some errors when we wanted to make friends.') - return callback(err) - } - - logger.debug('makeRequestsToWinningPods finished.') - return callback(null) - } - ) - }) - } } function quitFriends (callback) { @@ -211,6 +119,39 @@ module.exports = pods // --------------------------------------------------------------------------- +function computeForeignPodsList (url, pods_score, callback) { + // Let's give 1 point to the pod we ask the friends list + pods_score[url] = 1 + + getForeignPodsList(url, function (err, foreign_pods_list) { + if (err) return callback(err) + if (foreign_pods_list.length === 0) return callback() + + async.each(foreign_pods_list, function (foreign_pod, callback_each) { + var foreign_url = foreign_pod.url + + if (pods_score[foreign_url]) pods_score[foreign_url]++ + else pods_score[foreign_url] = 1 + + callback_each() + }, function () { + callback() + }) + }) +} + +function computeWinningPods (urls, pods_score) { + // Build the list of pods to add + // Only add a pod if it exists in more than a half base pods + var pods_list = [] + var base_score = urls.length / 2 + Object.keys(pods_score).forEach(function (pod) { + if (pods_score[pod] > base_score) pods_list.push({ url: pod }) + }) + + return pods_list +} + function getForeignPodsList (url, callback) { var path = '/api/' + constants.API_VERSION + '/pods' @@ -220,3 +161,68 @@ function getForeignPodsList (url, callback) { callback(null, JSON.parse(body)) }) } + +function makeRequestsToWinningPods (cert, pods_list, callback) { + // Stop pool requests + poolRequests.deactivate() + // Flush pool requests + poolRequests.forceSend() + + // Get the list of our videos to send to our new friends + Videos.listOwned(function (err, videos_list) { + if (err) { + logger.error('Cannot get the list of videos we own.') + return callback(err) + } + + var data = { + url: http + '://' + host + ':' + port, + publicKey: cert, + videos: videos_list + } + + requests.makeMultipleRetryRequest( + { method: 'POST', path: '/api/' + constants.API_VERSION + '/pods/', data: data }, + + pods_list, + + function eachRequest (err, response, body, url, pod, callback_each_request) { + // We add the pod if it responded correctly with its public certificate + if (!err && response.statusCode === 200) { + Pods.add({ url: pod.url, publicKey: body.cert, score: constants.FRIEND_BASE_SCORE }, function (err) { + if (err) { + logger.error('Error with adding %s pod.', pod.url, { error: err }) + return callback_each_request() + } + + Videos.addRemotes(body.videos, function (err) { + if (err) { + logger.error('Error with adding videos of pod.', pod.url, { error: err }) + return callback_each_request() + } + + logger.debug('Adding remote videos from %s.', pod.url, { videos: body.videos }) + return callback_each_request() + }) + }) + } else { + logger.error('Error with adding %s pod.', pod.url, { error: err || new Error('Status not 200') }) + return callback_each_request() + } + }, + + function endRequests (err) { + // Now we made new friends, we can re activate the pool of requests + poolRequests.activate() + + if (err) { + logger.error('There was some errors when we wanted to make friends.') + return callback(err) + } + + logger.debug('makeRequestsToWinningPods finished.') + return callback(null) + } + ) + }) +}