angular-caching
Version:
Lightweight library for data caching
63 lines (59 loc) • 2.31 kB
JavaScript
import { Observable } from 'rxjs';
import { publishReplay, refCount, take } from 'rxjs/operators';
function InMemoryCache(params) {
if (params === void 0) { params = {}; }
var originalFunc;
var cacheSize = params.cacheSize || 1;
var chacheTTL = params.ttl;
var cacheMap = new Map();
var timersMap = new Map();
return function (target, propertyKey, descriptor) {
originalFunc = descriptor.value;
descriptor.value = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (!args.length && cacheSize > 1) {
throw new Error("If you don't provide arguments, cache size could not be bigger then 1");
}
var id = JSON.stringify(args);
var currentCacheSize = cacheMap.size;
var data = cacheMap.get(id);
if (!data) {
data = originalFunc.apply(this, args);
if (data instanceof Observable) {
data = data.pipe(publishReplay(1), refCount(), take(1));
}
if (currentCacheSize >= cacheSize) {
if (timersMap.has(cacheMap.keys()[0])) {
clearTimeout(timersMap.get(cacheMap.keys()[0]));
timersMap.delete(cacheMap.keys()[0]);
}
cacheMap.delete(cacheMap.keys()[0]);
}
if (params.sync) {
cacheMap.set(id, data);
}
else {
Promise.resolve().then(function () {
cacheMap.set(id, data);
});
}
if (chacheTTL || chacheTTL === 0) {
var timerId = setTimeout(function () {
cacheMap.delete(id);
timersMap.delete(id);
}, chacheTTL);
timersMap.set(id, timerId);
}
}
return data;
};
};
}
/**
* Generated bundle index. Do not edit.
*/
export { InMemoryCache };
//# sourceMappingURL=angular-caching-inmemory-cache.js.map