var _ = require('./utility'); /* * Notifier - the internal object responsible for delegating between the client exposed API, the * chain of transforms necessary to turn an item into something that can be sent to Rollbar, and the * queue which handles the communcation with the Rollbar API servers. * * @param queue - an object that conforms to the interface: addItem(item, callback) * @param options - an object representing the options to be set for this notifier, this should have * any defaults already set by the caller */ function Notifier(queue, options) { this.queue = queue; this.options = options; this.transforms = []; this.diagnostic = {}; } /* * configure - updates the options for this notifier with the passed in object * * @param options - an object which gets merged with the current options set on this notifier * @returns this */ Notifier.prototype.configure = function(options) { this.queue && this.queue.configure(options); var oldOptions = this.options; this.options = _.merge(oldOptions, options); return this; }; /* * addTransform - adds a transform onto the end of the queue of transforms for this notifier * * @param transform - a function which takes three arguments: * * item: An Object representing the data to eventually be sent to Rollbar * * options: The current value of the options for this notifier * * callback: function(err: (Null|Error), item: (Null|Object)) the transform must call this * callback with a null value for error if it wants the processing chain to continue, otherwise * with an error to terminate the processing. The item should be the updated item after this * transform is finished modifying it. */ Notifier.prototype.addTransform = function(transform) { if (_.isFunction(transform)) { this.transforms.push(transform); } return this; }; /* * log - the internal log function which applies the configured transforms and then pushes onto the * queue to be sent to the backend. * * @param item - An object with the following structure: * message [String] - An optional string to be sent to rollbar * error [Error] - An optional error * * @param callback - A function of type function(err, resp) which will be called with exactly one * null argument and one non-null argument. The callback will be called once, either during the * transform stage if an error occurs inside a transform, or in response to the communication with * the backend. The second argument will be the response from the backend in case of success. */ Notifier.prototype.log = function(item, callback) { if (!callback || !_.isFunction(callback)) { callback = function() {}; } if (!this.options.enabled) { return callback(new Error('Rollbar is not enabled')); } this.queue.addPendingItem(item); var originalError = item.err; this._applyTransforms(item, function(err, i) { if (err) { this.queue.removePendingItem(item); return callback(err, null); } this.queue.addItem(i, callback, originalError, item); }.bind(this)); }; /* Internal */ /* * _applyTransforms - Applies the transforms that have been added to this notifier sequentially. See * `addTransform` for more information. * * @param item - An item to be transformed * @param callback - A function of type function(err, item) which will be called with a non-null * error and a null item in the case of a transform failure, or a null error and non-null item after * all transforms have been applied. */ Notifier.prototype._applyTransforms = function(item, callback) { var transformIndex = -1; var transformsLength = this.transforms.length; var transforms = this.transforms; var options = this.options; var cb = function(err, i) { if (err) { callback(err, null); return; } transformIndex++; if (transformIndex === transformsLength) { callback(null, i); return; } transforms[transformIndex](i, options, cb); }; cb(null, item); }; module.exports = Notifier;