const each = require('async/each')
const eachLimit = require('async/eachLimit')
const eachSeries = require('async/eachSeries')
-const fs = require('fs')
const request = require('request')
const waterfall = require('async/waterfall')
const constants = require('../initializers/constants')
const db = require('../initializers/database')
const logger = require('../helpers/logger')
+const peertubeCrypto = require('../helpers/peertube-crypto')
const requests = require('../helpers/requests')
+const utils = require('../helpers/utils')
+const RequestScheduler = require('./request-scheduler')
+const RequestVideoQaduScheduler = require('./request-video-qadu-scheduler')
+const RequestVideoEventScheduler = require('./request-video-event-scheduler')
const ENDPOINT_ACTIONS = constants.REQUEST_ENDPOINT_ACTIONS[constants.REQUEST_ENDPOINTS.VIDEOS]
+const requestScheduler = new RequestScheduler()
+const requestSchedulerVideoQadu = new RequestVideoQaduScheduler()
+const requestSchedulerVideoEvent = new RequestVideoEventScheduler()
+
const friends = {
+ activate,
addVideoToFriends,
updateVideoToFriends,
reportAbuseVideoToFriend,
+ quickAndDirtyUpdateVideoToFriends,
+ addEventToRemoteVideo,
hasFriends,
- getMyCertificate,
makeFriends,
quitFriends,
removeVideoToFriends,
sendOwnedVideosToPod
}
+function activate () {
+ requestScheduler.activate()
+ requestSchedulerVideoQadu.activate()
+ requestSchedulerVideoEvent.activate()
+}
+
function addVideoToFriends (videoData, transaction, callback) {
const options = {
type: ENDPOINT_ACTIONS.ADD,
createRequest(options)
}
+function quickAndDirtyUpdateVideoToFriends (videoId, type, transaction, callback) {
+ const options = {
+ videoId,
+ type,
+ transaction
+ }
+ return createVideoQaduRequest(options, callback)
+}
+
+function addEventToRemoteVideo (videoId, type, transaction, callback) {
+ const options = {
+ videoId,
+ type,
+ transaction
+ }
+ createVideoEventRequest(options, callback)
+}
+
function hasFriends (callback) {
db.Pod.countAll(function (err, count) {
if (err) return callback(err)
})
}
-function getMyCertificate (callback) {
- fs.readFile(constants.CONFIG.STORAGE.CERT_DIR + 'peertube.pub', 'utf8', callback)
-}
-
function makeFriends (hosts, callback) {
const podsScore = {}
logger.info('Make friends!')
- getMyCertificate(function (err, cert) {
+ peertubeCrypto.getMyPublicCert(function (err, cert) {
if (err) {
logger.error('Cannot read public cert.')
return callback(err)
function quitFriends (callback) {
// Stop pool requests
- db.Request.deactivate()
+ requestScheduler.deactivate()
waterfall([
function flushRequests (callbackAsync) {
- db.Request.flush(callbackAsync)
+ requestScheduler.flush(err => callbackAsync(err))
+ },
+
+ function flushVideoQaduRequests (callbackAsync) {
+ requestSchedulerVideoQadu.flush(err => callbackAsync(err))
},
function getPodsList (callbackAsync) {
}
], function (err) {
// Don't forget to re activate the scheduler, even if there was an error
- db.Request.activate()
+ requestScheduler.activate()
if (err) return callback(err)
else podsScore[foreignPodHost] = 1
})
- callback()
+ return callback()
})
}
// Only add a pod if it exists in more than a half base pods
const podsList = []
const baseScore = hosts.length / 2
+
Object.keys(podsScore).forEach(function (podHost) {
// If the pod is not me and with a good score we add it
if (isMe(podHost) === false && podsScore[podHost] > baseScore) {
function makeRequestsToWinningPods (cert, podsList, callback) {
// Stop pool requests
- db.Request.deactivate()
+ requestScheduler.deactivate()
// Flush pool requests
- db.Request.forceSend()
+ requestScheduler.forceSend()
eachLimit(podsList, constants.REQUESTS_IN_PARALLEL, function (pod, callbackEach) {
const params = {
method: 'POST',
json: {
host: constants.CONFIG.WEBSERVER.HOST,
+ email: constants.CONFIG.ADMIN.EMAIL,
publicKey: cert
}
}
}
if (res.statusCode === 200) {
- const podObj = db.Pod.build({ host: pod.host, publicKey: body.cert })
+ const podObj = db.Pod.build({ host: pod.host, publicKey: body.cert, email: body.email })
podObj.save().asCallback(function (err, podCreated) {
if (err) {
logger.error('Cannot add friend %s pod.', pod.host, { error: err })
}, function endRequests () {
// Final callback, we've ended all the requests
// Now we made new friends, we can re activate the pool of requests
- db.Request.activate()
+ requestScheduler.activate()
logger.debug('makeRequestsToWinningPods finished.')
return callback()
// { type, endpoint, data, toIds, transaction }
function createRequest (options, callback) {
if (!callback) callback = function () {}
- if (options.toIds) return _createRequest(options, callback)
+ if (options.toIds) return requestScheduler.createRequest(options, callback)
// If the "toIds" pods is not specified, we send the request to all our friends
db.Pod.listAllIds(options.transaction, function (err, podIds) {
}
const newOptions = Object.assign(options, { toIds: podIds })
- return _createRequest(newOptions, callback)
+ return requestScheduler.createRequest(newOptions, callback)
})
}
-// { type, endpoint, data, toIds, transaction }
-function _createRequest (options, callback) {
- const type = options.type
- const endpoint = options.endpoint
- const data = options.data
- const toIds = options.toIds
- const transaction = options.transaction
-
- const pods = []
-
- // If there are no destination pods abort
- if (toIds.length === 0) return callback(null)
-
- toIds.forEach(function (toPod) {
- pods.push(db.Pod.build({ id: toPod }))
- })
-
- const createQuery = {
- endpoint,
- request: {
- type: type,
- data: data
- }
- }
+function createVideoQaduRequest (options, callback) {
+ if (!callback) callback = utils.createEmptyCallback()
- const dbRequestOptions = {
- transaction
- }
+ requestSchedulerVideoQadu.createRequest(options, callback)
+}
- return db.Request.create(createQuery, dbRequestOptions).asCallback(function (err, request) {
- if (err) return callback(err)
+function createVideoEventRequest (options, callback) {
+ if (!callback) callback = utils.createEmptyCallback()
- return request.setPods(pods, dbRequestOptions).asCallback(callback)
- })
+ requestSchedulerVideoEvent.createRequest(options, callback)
}
function isMe (host) {