From f5028693a896a3076dd286ac0030e3d8f78f5ebf Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 25 Oct 2017 16:03:33 +0200 Subject: Use async/await in lib and initializers --- server/lib/request/abstract-request-scheduler.ts | 121 ++++++++++++----------- 1 file changed, 62 insertions(+), 59 deletions(-) (limited to 'server/lib/request/abstract-request-scheduler.ts') diff --git a/server/lib/request/abstract-request-scheduler.ts b/server/lib/request/abstract-request-scheduler.ts index ce4e2ffd2..f46682824 100644 --- a/server/lib/request/abstract-request-scheduler.ts +++ b/server/lib/request/abstract-request-scheduler.ts @@ -1,5 +1,5 @@ import { isEmpty } from 'lodash' -import * as Promise from 'bluebird' +import * as Bluebird from 'bluebird' import { database as db } from '../../initializers/database' import { logger, makeSecureRequest } from '../../helpers' @@ -76,7 +76,7 @@ abstract class AbstractRequestScheduler { // --------------------------------------------------------------------------- // Make a requests to friends of a certain type - protected makeRequest (toPod: PodInstance, requestEndpoint: string, requestsToMake: any) { + protected async makeRequest (toPod: PodInstance, requestEndpoint: string, requestsToMake: any) { const params = { toPod: toPod, method: 'POST' as 'POST', @@ -86,72 +86,75 @@ abstract class AbstractRequestScheduler { // Make multiple retry requests to all of pods // The function fire some useful callbacks - return makeSecureRequest(params) - .then(({ response, body }) => { - if (response.statusCode !== 200 && response.statusCode !== 201 && response.statusCode !== 204) { - throw new Error('Status code not 20x : ' + response.statusCode) - } - }) - .catch(err => { - logger.error('Error sending secure request to %s pod.', toPod.host, err) - - throw err - }) + try { + const { response } = await makeSecureRequest(params) + if (response.statusCode !== 200 && response.statusCode !== 201 && response.statusCode !== 204) { + throw new Error('Status code not 20x : ' + response.statusCode) + } + } catch (err) { + logger.error('Error sending secure request to %s pod.', toPod.host, err) + + throw err + } } // Make all the requests of the scheduler - protected makeRequests () { - return this.getRequestModel().listWithLimitAndRandom(this.limitPods, this.limitPerPod) - .then((requestsGrouped: T) => { - // We want to group requests by destinations pod and endpoint - const requestsToMake = this.buildRequestsObjects(requestsGrouped) - - // If there are no requests, abort - if (isEmpty(requestsToMake) === true) { - logger.info('No "%s" to make.', this.description) - return { goodPods: [], badPods: [] } - } - - logger.info('Making "%s" to friends.', this.description) - - const goodPods: number[] = [] - const badPods: number[] = [] - - return Promise.map(Object.keys(requestsToMake), hashKey => { - const requestToMake = requestsToMake[hashKey] - const toPod: PodInstance = requestToMake.toPod - - return this.makeRequest(toPod, requestToMake.endpoint, requestToMake.datas) - .then(() => { - logger.debug('Removing requests for pod %s.', requestToMake.toPod.id, { requestsIds: requestToMake.ids }) - goodPods.push(requestToMake.toPod.id) - - this.afterRequestHook() - - // Remove the pod id of these request ids - return this.getRequestToPodModel().removeByRequestIdsAndPod(requestToMake.ids, requestToMake.toPod.id) - }) - .catch(err => { - badPods.push(requestToMake.toPod.id) - logger.info('Cannot make request to %s.', toPod.host, err) - }) - }, { concurrency: REQUESTS_IN_PARALLEL }).then(() => ({ goodPods, badPods })) - }) - .then(({ goodPods, badPods }) => { - this.afterRequestsHook() - - // All the requests were made, we update the pods score - return db.Pod.updatePodsScore(goodPods, badPods) - }) - .catch(err => logger.error('Cannot get the list of "%s".', this.description, { error: err.stack })) + protected async makeRequests () { + let requestsGrouped: T + + try { + requestsGrouped = await this.getRequestModel().listWithLimitAndRandom(this.limitPods, this.limitPerPod) + } catch (err) { + logger.error('Cannot get the list of "%s".', this.description, { error: err.stack }) + throw err + } + + // We want to group requests by destinations pod and endpoint + const requestsToMake = this.buildRequestsObjects(requestsGrouped) + + // If there are no requests, abort + if (isEmpty(requestsToMake) === true) { + logger.info('No "%s" to make.', this.description) + return { goodPods: [], badPods: [] } + } + + logger.info('Making "%s" to friends.', this.description) + + const goodPods: number[] = [] + const badPods: number[] = [] + + await Bluebird.map(Object.keys(requestsToMake), async hashKey => { + const requestToMake = requestsToMake[hashKey] + const toPod: PodInstance = requestToMake.toPod + + try { + await this.makeRequest(toPod, requestToMake.endpoint, requestToMake.datas) + logger.debug('Removing requests for pod %s.', requestToMake.toPod.id, { requestsIds: requestToMake.ids }) + goodPods.push(requestToMake.toPod.id) + + this.afterRequestHook() + + // Remove the pod id of these request ids + await this.getRequestToPodModel() + .removeByRequestIdsAndPod(requestToMake.ids, requestToMake.toPod.id) + } catch (err) { + badPods.push(requestToMake.toPod.id) + logger.info('Cannot make request to %s.', toPod.host, err) + } + }, { concurrency: REQUESTS_IN_PARALLEL }) + + this.afterRequestsHook() + + // All the requests were made, we update the pods score + await db.Pod.updatePodsScore(goodPods, badPods) } protected afterRequestHook () { - // Nothing to do, let children reimplement it + // Nothing to do, let children re-implement it } protected afterRequestsHook () { - // Nothing to do, let children reimplement it + // Nothing to do, let children re-implement it } } -- cgit v1.2.3