ZEST / base.resolver / Source: resolver/unloader.js

'use strict';
/**
 * @fileOverview The base-resolver/unloader module is used for registering unloaders. This module is responsible for
 * invoking all handlers registered to unload dependency and executing them in the proper sequence on unload.
 * @module base-resolver/unloader
 * @requires {@link external:q}
 * @requires {@link external:base-logger}
 */
var q = require('q');
var logger = require('base.logger')('RESOLVER/unloader');
/**
 * This function creates a new Unloader and returns it.
 * @returns {module:base-resolver/unloader~Unloader} the resolver with one resolve method
 */
module.exports = function () {
    var unloaders = [];
    /**
     * Unloader is returned by {@link module:base-resolver/unloader}
     * @namespace module:base-resolver/unloader~Unloader
     */
    return {
        /**
         * This function is used to register a callback function to the unloader. We inject this function as a
         * dependency when unloader is requested by a component.
         * @param {callback} callback - the function to execute when resolver is unloaded.
         * @memberof module:base-resolver/unloader~Unloader
         */
        register: function (callback) {
            logger.debug('registering unloader');
            unloaders.push(callback);
        },
        /**
         * This function is called when the resolver is unloaded.
         * @return {external:q} a promise that resolves when all callbacks registeres are executed.
         * @memberof module:base-resolver/unloader~Unloader
         */
        unload: function () {
            var retVal = q(true);
            var eatError = function (unloaderFn) {
                return function (error) {
                    logger.error('error while unloading...');
                    logger.error(error);
                    return unloaderFn();
                };
            };
            var unloaderFn;
            logger.debug('executing unloaders...');
            while (unloaders.length) {
                unloaderFn = unloaders.pop();
                retVal = retVal.then(unloaderFn, eatError(unloaderFn));
            }
            return retVal.then(
                function () {
                    logger.debug('All registered unloaders executed successfully.');
                }, eatError(
                    function () {
                        return;
                    }
                )
            );
        }
    };
};