RackHD/on-core

View on GitHub
lib/services/error-publisher.js

Summary

Maintainability
B
4 hrs
Test Coverage
// Copyright 2015, EMC, Inc.

'use strict';

module.exports = ErrorPublisherFactory;

ErrorPublisherFactory.$provide = 'Services.ErrorPublisher';
ErrorPublisherFactory.$inject = [
    'Constants',
    'Promise',
    'Events',
    'Protocol.Events',
    'Logger'
];

function ErrorPublisherFactory(
    Constants,
    Promise,
    events,
    eventsProtocol,
    Logger
) {
    var logger = Logger.initialize(ErrorPublisherFactory);

    function ErrorPublisher() {
        this.started = false;

        // These are emitted by the 'Events' EventEmitter.
        this.ignoredError = this.handleIgnoredError.bind(this);
    }

    ErrorPublisher.prototype.start = function() {
        var self = this;

        events.on(Constants.Events.Ignored, this.ignoredError);

        process.on('unhandledRejection', this.handleUnhandledRejection.bind(this));

        return Promise.resolve().then(function () {
            self.started = true;
        });
    };

    ErrorPublisher.prototype.handleUnhandledRejection = function(error) {
        if (this.started) {
            eventsProtocol.publishUnhandledError(error);
        }

        logger.debug('Unhandled Rejection', { error: error });
    };

    ErrorPublisher.prototype.handleIgnoredError = function (error) {
        if (this.started) {
            eventsProtocol.publishIgnoredError(error);
        }

        logger.debug('Ignored Error', { error: error });
    };

    ErrorPublisher.prototype.stop = function() {
        var self = this;

        events.off(Constants.Events.Ignored, this.ignoredError);

        process.removeAllListeners('unhandledRejection');

        return Promise.resolve().then(function () {
            self.started = false;
        });
    };

    return new ErrorPublisher();
}