Source: Report/ChunkedReport.js

"use strict";

const chunk = require("chunk");
const Promise = require("bluebird");

const AbstractReport = require("./AbstractReport");

/**
 * @extends {AbstractReport}
 */
class ChunkedReport extends AbstractReport {

    /**
     * Process single chunk element
     *
     * @param {AbstractLoader[]} loadersChunk
     * @returns {Promise<T>}
     * @private
     */
    _processChunk(loadersChunk) {
        let loaderNames = loadersChunk;
        let promises = [];

        for (let i = 0; i < loaderNames.length; i++) {
            let loaderName = loaderNames[i];
            promises.push(
                this.loaders[loaderName].start()
            )
        }

        return Promise.all(promises)
            .then(() => {
                return null;
            })
            .catch(e => {
                console.error(e);
            });
    }

    /**
     * Process all chunks
     *
     * @param {Array[]} loaderChunk
     * @private
     */
    _processChunks(loaderChunk) {
        let chunk = loaderChunk.pop();

        return this._processChunk(chunk)
            .then(() => {
                if (loaderChunk.length > 0) {
                    return this._processChunks(loaderChunk);
                }
                return null;
            })
    }

    /**
     * run all loaders to create a report
     *
     * @param {Array} enabledLoaders array of loader names
     * @returns {Promise}
     */
    create(enabledLoaders) {
        let chunkSize = this.config.chunkSize || 3;
        this.isCompleted = false;
        let loaders = Object.values(this.loaders).splice(0);
        let loadersToProcess = [];

        if (enabledLoaders.length === 0) {
            throw new Error('No loaders given');
        }

        enabledLoaders = chunk(enabledLoaders, chunkSize);
        return this._processChunks(enabledLoaders)
            .then(() => {
                this.createdAt = Date.now();
                this.isCompleted = true;
            })
            .catch((e) => {
                this.isCompleted = false;
                throw e;
            })
    }
}

module.exports = ChunkedReport;