micro-analytics-adapter-flat-file-db
Version:
Store your micro-analytics data in flat-file-db!
220 lines (177 loc) • 6.55 kB
JavaScript
;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var path = require('path');
var flatfile = require('flat-file-db');
var promisify = require('then-flat-file-db');
var Observable = require('zen-observable');
var _require = require('micro-analytics-adapter-utils'),
filterPaths = _require.filterPaths,
filterViews = _require.filterViews;
var db = void 0;
function init(options) {
db = promisify(flatfile.sync(path.resolve(process.cwd(), options.dbName || 'views.db')));
}
// This is here for backwards compatability should be removed at some point
init({ dbName: process.env.DB_NAME });
var handlers = [];
var observable = new Observable(function (observer) {
handlers.push(function (data) {
return observer.next(data);
});
var index = handlers.length;
return function () {
handlers = [].concat(_toConsumableArray(handlers.slice(0, index)), _toConsumableArray(handlers.slice(index)));
};
});
module.exports = {
options: [{
name: 'db-name',
description: 'The name of the flat-file-db file.',
defaultValue: process.env.DB_NAME || 'views.db'
}],
init: init,
put: function put(key, value) {
handlers.forEach(function (handler) {
handler({ key: key, value: value });
});
return db.put(key, value);
},
has: function has(key) {
return Promise.resolve(db.has(key));
},
keys: function keys() {
return Promise.resolve(db.keys());
},
// Get a value and filter it
get: function () {
var _ref = _asyncToGenerator(_regenerator2.default.mark(function _callee(key, options) {
var value;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
value = void 0;
_context.prev = 1;
_context.next = 4;
return db.get(key);
case 4:
_context.t0 = _context.sent;
if (_context.t0) {
_context.next = 7;
break;
}
_context.t0 = {};
case 7:
value = _context.t0;
_context.next = 13;
break;
case 10:
_context.prev = 10;
_context.t1 = _context['catch'](1);
value = { views: [] };
case 13:
return _context.abrupt('return', {
views: filterViews(value.views, options)
});
case 14:
case 'end':
return _context.stop();
}
}
}, _callee, undefined, [[1, 10]]);
}));
return function get(_x, _x2) {
return _ref.apply(this, arguments);
};
}(),
// Get all values starting with a certain pathname and filter their views
getAll: function () {
var _ref2 = _asyncToGenerator(_regenerator2.default.mark(function _callee2(options) {
var data, keys, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, key;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
data = {};
_context2.t0 = filterPaths;
_context2.next = 4;
return module.exports.keys();
case 4:
_context2.t1 = _context2.sent;
_context2.t2 = options;
keys = (0, _context2.t0)(_context2.t1, _context2.t2);
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context2.prev = 10;
_iterator = keys[Symbol.iterator]();
case 12:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context2.next = 20;
break;
}
key = _step.value;
_context2.next = 16;
return module.exports.get(key, {
before: options.before,
after: options.after
});
case 16:
data[key] = _context2.sent;
case 17:
_iteratorNormalCompletion = true;
_context2.next = 12;
break;
case 20:
_context2.next = 26;
break;
case 22:
_context2.prev = 22;
_context2.t3 = _context2['catch'](10);
_didIteratorError = true;
_iteratorError = _context2.t3;
case 26:
_context2.prev = 26;
_context2.prev = 27;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 29:
_context2.prev = 29;
if (!_didIteratorError) {
_context2.next = 32;
break;
}
throw _iteratorError;
case 32:
return _context2.finish(29);
case 33:
return _context2.finish(26);
case 34:
_context2.next = 36;
return Promise.all(keys);
case 36:
return _context2.abrupt('return', data);
case 37:
case 'end':
return _context2.stop();
}
}
}, _callee2, this, [[10, 22, 26, 34], [27,, 29, 33]]);
}));
function getAll(_x3) {
return _ref2.apply(this, arguments);
}
return getAll;
}(),
subscribe: function subscribe(cb) {
return observable.subscribe(cb);
},
clear: function clear() {
db.clear();
}
};