UNPKG

angular-caching

Version:

Lightweight library for data caching

50 lines 7.62 kB
import { Observable } from 'rxjs'; import { publishReplay, refCount, take } from 'rxjs/operators'; export function InMemoryCache(params = {}) { let originalFunc; const cacheSize = params.cacheSize || 1; const chacheTTL = params.ttl; const cacheMap = new Map(); const timersMap = new Map(); return function (target, propertyKey, descriptor) { originalFunc = descriptor.value; descriptor.value = function (...args) { if (!args.length && cacheSize > 1) { throw new Error(`If you don't provide arguments, cache size could not be bigger then 1`); } const id = JSON.stringify(args); const currentCacheSize = cacheMap.size; let 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(() => { cacheMap.set(id, data); }); } if (chacheTTL || chacheTTL === 0) { const timerId = setTimeout(() => { cacheMap.delete(id); timersMap.delete(id); }, chacheTTL); timersMap.set(id, timerId); } } return data; }; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5tZW1vcnktY2FjaGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1jYWNoaW5nL2lubWVtb3J5LWNhY2hlLyIsInNvdXJjZXMiOlsiaW5tZW1vcnktY2FjaGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVL0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxTQUErQixFQUFFO0lBQzdELElBQUksWUFBc0IsQ0FBQztJQUMzQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUN4QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDO0lBRW5FLE9BQU8sVUFDTCxNQUFXLEVBQ1gsV0FBbUIsRUFDbkIsVUFBOEI7UUFFOUIsWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFaEMsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsSUFBSTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLHVFQUF1RSxDQUN4RSxDQUFDO2FBQ0g7WUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN2QyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUV0QyxJQUFJLElBQUksWUFBWSxVQUFVLEVBQUU7b0JBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekQ7Z0JBQ0QsSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLEVBQUU7b0JBQ2pDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDckMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDaEQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEM7b0JBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckM7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFO29CQUNmLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDTCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDMUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7b0JBQ2hDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQzlCLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3BCLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3ZCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDZCxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDNUI7YUFDRjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgcHVibGlzaFJlcGxheSwgcmVmQ291bnQsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEluTWVtb3J5Q2FjaGVPcHRpb25zIHtcclxuICB0dGw/OiBudW1iZXI7XHJcbiAgY2FjaGVTaXplPzogbnVtYmVyO1xyXG4gIHN5bmM/OiBib29sZWFuO1xyXG59XHJcblxyXG50eXBlIENhY2hlZERhdGEgPSBQcm9taXNlPGFueT4gfCBPYnNlcnZhYmxlPGFueT4gfCBhbnk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSW5NZW1vcnlDYWNoZShwYXJhbXM6IEluTWVtb3J5Q2FjaGVPcHRpb25zID0ge30pIHtcclxuICBsZXQgb3JpZ2luYWxGdW5jOiBGdW5jdGlvbjtcclxuICBjb25zdCBjYWNoZVNpemUgPSBwYXJhbXMuY2FjaGVTaXplIHx8IDE7XHJcbiAgY29uc3QgY2hhY2hlVFRMID0gcGFyYW1zLnR0bDtcclxuICBjb25zdCBjYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWREYXRhPigpO1xyXG4gIGNvbnN0IHRpbWVyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4oKTtcclxuXHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChcclxuICAgIHRhcmdldDogYW55LFxyXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcclxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxyXG4gICkge1xyXG4gICAgb3JpZ2luYWxGdW5jID0gZGVzY3JpcHRvci52YWx1ZTtcclxuXHJcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICAgICAgaWYgKCFhcmdzLmxlbmd0aCAmJiBjYWNoZVNpemUgPiAxKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgYElmIHlvdSBkb24ndCBwcm92aWRlIGFyZ3VtZW50cywgY2FjaGUgc2l6ZSBjb3VsZCBub3QgYmUgYmlnZ2VyIHRoZW4gMWBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGlkID0gSlNPTi5zdHJpbmdpZnkoYXJncyk7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRDYWNoZVNpemUgPSBjYWNoZU1hcC5zaXplO1xyXG4gICAgICBsZXQgZGF0YSA9IGNhY2hlTWFwLmdldChpZCk7XHJcbiAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgIGRhdGEgPSBvcmlnaW5hbEZ1bmMuYXBwbHkodGhpcywgYXJncyk7XHJcblxyXG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xyXG4gICAgICAgICAgZGF0YSA9IGRhdGEucGlwZShwdWJsaXNoUmVwbGF5KDEpLCByZWZDb3VudCgpLCB0YWtlKDEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnRDYWNoZVNpemUgPj0gY2FjaGVTaXplKSB7XHJcbiAgICAgICAgICBpZiAodGltZXJzTWFwLmhhcyhjYWNoZU1hcC5rZXlzKClbMF0pKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcnNNYXAuZ2V0KGNhY2hlTWFwLmtleXMoKVswXSkpO1xyXG4gICAgICAgICAgICB0aW1lcnNNYXAuZGVsZXRlKGNhY2hlTWFwLmtleXMoKVswXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYWNoZU1hcC5kZWxldGUoY2FjaGVNYXAua2V5cygpWzBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmFtcy5zeW5jKSB7XHJcbiAgICAgICAgICBjYWNoZU1hcC5zZXQoaWQsIGRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgY2FjaGVNYXAuc2V0KGlkLCBkYXRhKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hhY2hlVFRMIHx8IGNoYWNoZVRUTCA9PT0gMCkge1xyXG4gICAgICAgICAgY29uc3QgdGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjYWNoZU1hcC5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICB0aW1lcnNNYXAuZGVsZXRlKGlkKTtcclxuICAgICAgICAgIH0sIGNoYWNoZVRUTCk7XHJcbiAgICAgICAgICB0aW1lcnNNYXAuc2V0KGlkLCB0aW1lcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9O1xyXG4gIH07XHJcbn1cclxuIl19