| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 'use strict';
- var database = require('lowdb');
- var util = require('util');
- function create(options) {
- return new Cache(options || {});
- }
- exports.create = create;
- var Cache = (function () {
- function Cache(options) {
- this.set = function (key, value, options) {
- var record = this._createRecord(key, value, options || {});
- this.expire(key); // remove previous
- this.db.get('index').push(record).value();
- return this;
- };
- this.get = function (key) {
- var record = this.db.get('index').find({ key: key }).value();
- if (!record)
- return null;
- if (record.life < this._createTimestamp()) {
- this.expire(key);
- return null; // expired
- }
- return record.val;
- };
- /**
- * Clears all records from cache storage
- */
- this.clear = function () {
- this.db.set('index', []).value();
- return this;
- };
- this.config = this._merge({
- file: 'store.json',
- life: 3600 // one hour
- }, options || {});
- this.db = database(this.config.file);
- this.db.defaults({
- index: []
- }).value();
- }
- /**
- * Removes records from cache storage
- */
- Cache.prototype.expire = function (value) {
- var _ = this.db._;
- var removed, staying;
- switch (true) {
- case util.isFunction(value):
- // remove by filter callback
- removed = this.db.get('index')
- .filter(value)
- .map('key')
- .value();
- break;
- case util.isArray(value):
- // remove by tags
- removed = this.db.get('index')
- .filter(function (record) { return _.intersection(record.tags, value).length; })
- .map('key')
- .value();
- break;
- case util.isString(value):
- // remove by key
- removed = this.db.get('index')
- .filter(function (record) { return record.key === value; })
- .map('key')
- .value();
- break;
- default:
- throw new Error('Unsupported expiration method: ' + (typeof value));
- }
- staying = this.db.get('index')
- .filter(function (record) { return removed.indexOf(record.key) < 0; })
- .value();
- this._set(staying);
- return this;
- };
- Cache.prototype.size = function () {
- return this.db.get('index').value().length;
- };
- Cache.prototype.values = function() {
- let values = [];
- var content = this.db.get('index').value();
- content.forEach((item) => {
- values.push(item.val);
- });
- return values;
- }
- Cache.prototype._set = function (records) {
- this.db.set('index', records).value();
- };
- Cache.prototype._createRecord = function (key, value, options) {
- var tags = options.tags || [];
- var span = options.life || this.config.life;
- var life = span * 1000 + this._createTimestamp();
- return {
- key: key,
- val: value,
- life: life,
- tags: tags
- };
- };
- Cache.prototype._createTimestamp = function () {
- return new Date().getTime();
- };
- Cache.prototype._merge = function (a, b) {
- for (var p in b) {
- try {
- if (b[p].constructor === Object) {
- a[p] = this._merge(a[p], b[p]);
- }
- else {
- a[p] = b[p];
- }
- }
- catch (e) {
- a[p] = b[p];
- }
- }
- return a;
- };
- return Cache;
- }());
- exports.Cache = Cache;
- //# sourceMappingURL=index.js.map
|