'use strict';
module.exports = function(Fireproof) {
/**
* Provides methods for gathering Firebase usage statistics.
* @module Fireproof.stats
*/
Fireproof.stats = { };
/**
* Resets the count of Firebase operations back to 0.
* @method Fireproof.stats:reset
*/
Fireproof.stats.reset = function() {
Fireproof.stats.events = {
read: [],
write: [],
update: []
};
};
/**
* Resets the count of Firebase listeners back to 0.
* @method Fireproof.stats:resetListeners
*/
Fireproof.stats.resetListeners = function() {
Fireproof.stats.listeners = {};
};
/**
* Records a Firebase operation.
* @private
* @method Fireproof.stats:_record
* @param {String} kind The kind of event (read, write, or update).
* @param {String} path The Firebase path to the event.
*/
Fireproof.stats._record = function(name, path) {
Fireproof.stats.events[name].push({ path: path, time: Date.now() });
};
/**
* Adds a Firebase listener.
* @private
* @method Fireproof.stats:_addListener
* @param {String} path The Firebase path of the listener.
*/
Fireproof.stats._addListener = function(path) {
if (!Fireproof.stats.listeners[path]) {
Fireproof.stats.listeners[path] = 1;
} else {
Fireproof.stats.listeners[path]++;
}
};
/**
* Removes a Firebase listener.
* @private
* @method Fireproof.stats:_removeListener
* @param {String} path The Firebase path of the listener.
*/
Fireproof.stats._removeListener = function(path) {
if (Fireproof.stats.listeners[path] === 1) {
delete Fireproof.stats.listeners[path];
} else if (Fireproof.stats.listeners[path]) {
Fireproof.stats.listeners[path]--;
}
};
/**
* Gets data about listeners on Firebase locations.
* @method Fireproof.stats:getListeners
* @returns {Object} Listener counts keyed by Firebase path.
*/
Fireproof.stats.getListeners = function() {
return Object.keys(Fireproof.stats.listeners)
.reduce(function(acc, k) {
acc[k] = Fireproof.stats.listeners[k];
return acc;
}, {});
};
/**
* Gets the total number of listeners on Firebase locations.
* @method Fireproof.stats:getListenerCount
* @returns {Number} The total number of Firebase listeners presently operating.
*/
Fireproof.stats.getListenerCount = function() {
return Object.keys(Fireproof.stats.listeners)
.reduce(function(acc, k) {
return acc + Fireproof.stats.listeners[k];
}, 0);
};
/**
* Gets the per-operation, per-path counts of Firebase operations.
* @method Fireproof.stats:getPathCounts
* @returns {Object} An object with three keys: "read", "write",
* and "update". Each key has an object value, of which the keys are Firebase
* paths and the values are counts.
*/
Fireproof.stats.getPathCounts = function() {
return Object.keys(Fireproof.stats.events)
.reduce(function(result, statName) {
result[statName] = Fireproof.stats.events[statName]
.reduce(function(acc, datum) {
if (acc[datum.path]) {
acc[datum.path]++;
} else {
acc[datum.path] = 1;
}
return acc;
}, {});
return result;
}, {});
};
/**
* Gets the per-operation counts of Firebase operations.
* @methods Fireproof.stats:getCounts
* @returns {Object} An object with three keys: "read", "write", and
* "update". The values are the counts of operations under those headings.
*/
Fireproof.stats.getCounts = function() {
return Object.keys(Fireproof.stats.events)
.reduce(function(result, statName) {
result[statName] = Fireproof.stats.events[statName].length;
return result;
}, {});
};
Fireproof.stats.reset();
Fireproof.stats.resetListeners();
};