angular-caching
Version:
Lightweight library for data caching
55 lines • 7.85 kB
JavaScript
import { Observable } from 'rxjs';
import { publishReplay, refCount, take } from 'rxjs/operators';
export 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;
};
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5tZW1vcnktY2FjaGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1jYWNoaW5nL2lubWVtb3J5LWNhY2hlLyIsInNvdXJjZXMiOlsiaW5tZW1vcnktY2FjaGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVL0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFpQztJQUFqQyx1QkFBQSxFQUFBLFdBQWlDO0lBQzdELElBQUksWUFBc0IsQ0FBQztJQUMzQixJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUN4QyxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQzdCLElBQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQy9DLElBQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDO0lBRW5FLE9BQU8sVUFDTCxNQUFXLEVBQ1gsV0FBbUIsRUFDbkIsVUFBOEI7UUFFOUIsWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFaEMsVUFBVSxDQUFDLEtBQUssR0FBRztZQUFVLGNBQU87aUJBQVAsVUFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTztnQkFBUCx5QkFBTzs7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtnQkFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQzthQUNIO1lBQ0QsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFdEMsSUFBSSxJQUFJLFlBQVksVUFBVSxFQUFFO29CQUM5QixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pEO2dCQUNELElBQUksZ0JBQWdCLElBQUksU0FBUyxFQUFFO29CQUNqQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ3JDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3RDO29CQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JDO2dCQUNELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtvQkFDZixRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDckIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7b0JBQ2hDLElBQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQzt3QkFDekIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDcEIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdkIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNkLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUM1QjthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBwdWJsaXNoUmVwbGF5LCByZWZDb3VudCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5NZW1vcnlDYWNoZU9wdGlvbnMge1xyXG4gIHR0bD86IG51bWJlcjtcclxuICBjYWNoZVNpemU/OiBudW1iZXI7XHJcbiAgc3luYz86IGJvb2xlYW47XHJcbn1cclxuXHJcbnR5cGUgQ2FjaGVkRGF0YSA9IFByb21pc2U8YW55PiB8IE9ic2VydmFibGU8YW55PiB8IGFueTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBJbk1lbW9yeUNhY2hlKHBhcmFtczogSW5NZW1vcnlDYWNoZU9wdGlvbnMgPSB7fSkge1xyXG4gIGxldCBvcmlnaW5hbEZ1bmM6IEZ1bmN0aW9uO1xyXG4gIGNvbnN0IGNhY2hlU2l6ZSA9IHBhcmFtcy5jYWNoZVNpemUgfHwgMTtcclxuICBjb25zdCBjaGFjaGVUVEwgPSBwYXJhbXMudHRsO1xyXG4gIGNvbnN0IGNhY2hlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZERhdGE+KCk7XHJcbiAgY29uc3QgdGltZXJzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+PigpO1xyXG5cclxuICByZXR1cm4gZnVuY3Rpb24gKFxyXG4gICAgdGFyZ2V0OiBhbnksXHJcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxyXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXHJcbiAgKSB7XHJcbiAgICBvcmlnaW5hbEZ1bmMgPSBkZXNjcmlwdG9yLnZhbHVlO1xyXG5cclxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJncykge1xyXG4gICAgICBpZiAoIWFyZ3MubGVuZ3RoICYmIGNhY2hlU2l6ZSA+IDEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgSWYgeW91IGRvbid0IHByb3ZpZGUgYXJndW1lbnRzLCBjYWNoZSBzaXplIGNvdWxkIG5vdCBiZSBiaWdnZXIgdGhlbiAxYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaWQgPSBKU09OLnN0cmluZ2lmeShhcmdzKTtcclxuICAgICAgY29uc3QgY3VycmVudENhY2hlU2l6ZSA9IGNhY2hlTWFwLnNpemU7XHJcbiAgICAgIGxldCBkYXRhID0gY2FjaGVNYXAuZ2V0KGlkKTtcclxuICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgZGF0YSA9IG9yaWdpbmFsRnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XHJcbiAgICAgICAgICBkYXRhID0gZGF0YS5waXBlKHB1Ymxpc2hSZXBsYXkoMSksIHJlZkNvdW50KCksIHRha2UoMSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudENhY2hlU2l6ZSA+PSBjYWNoZVNpemUpIHtcclxuICAgICAgICAgIGlmICh0aW1lcnNNYXAuaGFzKGNhY2hlTWFwLmtleXMoKVswXSkpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyc01hcC5nZXQoY2FjaGVNYXAua2V5cygpWzBdKSk7XHJcbiAgICAgICAgICAgIHRpbWVyc01hcC5kZWxldGUoY2FjaGVNYXAua2V5cygpWzBdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhY2hlTWFwLmRlbGV0ZShjYWNoZU1hcC5rZXlzKClbMF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyYW1zLnN5bmMpIHtcclxuICAgICAgICAgIGNhY2hlTWFwLnNldChpZCwgZGF0YSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBjYWNoZU1hcC5zZXQoaWQsIGRhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaGFjaGVUVEwgfHwgY2hhY2hlVFRMID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCB0aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNhY2hlTWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIHRpbWVyc01hcC5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgfSwgY2hhY2hlVFRMKTtcclxuICAgICAgICAgIHRpbWVyc01hcC5zZXQoaWQsIHRpbWVySWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH07XHJcbiAgfTtcclxufVxyXG4iXX0=