82 lines
1.1 KiB
JavaScript
82 lines
1.1 KiB
JavaScript
|
|
||
|
/*!
|
||
|
* Connect - Cache
|
||
|
* Copyright(c) 2011 Sencha Inc.
|
||
|
* MIT Licensed
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Expose `Cache`.
|
||
|
*/
|
||
|
|
||
|
module.exports = Cache;
|
||
|
|
||
|
/**
|
||
|
* LRU cache store.
|
||
|
*
|
||
|
* @param {Number} limit
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
function Cache(limit) {
|
||
|
this.store = {};
|
||
|
this.keys = [];
|
||
|
this.limit = limit;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Touch `key`, promoting the object.
|
||
|
*
|
||
|
* @param {String} key
|
||
|
* @param {Number} i
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
Cache.prototype.touch = function(key, i){
|
||
|
this.keys.splice(i,1);
|
||
|
this.keys.push(key);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Remove `key`.
|
||
|
*
|
||
|
* @param {String} key
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
Cache.prototype.remove = function(key){
|
||
|
delete this.store[key];
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Get the object stored for `key`.
|
||
|
*
|
||
|
* @param {String} key
|
||
|
* @return {Array}
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
Cache.prototype.get = function(key){
|
||
|
return this.store[key];
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Add a cache `key`.
|
||
|
*
|
||
|
* @param {String} key
|
||
|
* @return {Array}
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
Cache.prototype.add = function(key){
|
||
|
// initialize store
|
||
|
var len = this.keys.push(key);
|
||
|
|
||
|
// limit reached, invalidate LRU
|
||
|
if (len > this.limit) this.remove(this.keys.shift());
|
||
|
|
||
|
var arr = this.store[key] = [];
|
||
|
arr.createdAt = new Date;
|
||
|
return arr;
|
||
|
};
|