UNPKG

@kolodny/lru-ttl-cache

Version:

Fast LRU and TTL cache with upsert and promise option

1 lines 22.8 kB
{"version":3,"sources":["index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import MS from 'ms';\nimport Bytes from 'bytes';\n/**\n * LRU & TTL fast in-mermory cache\n * Promise supported\n * Upsert supported\n * Permanent items supported\n */\n\n/** Options */\nexport interface ConstOptions<K,V>{\n /** Max entries @default Infinity */\n max?: number\n /** Max bytes @default Infinity */\n maxBytes?: number|string\n /** Time to live @default Infinity */\n ttl?: number|string\n /** TTL check interval. @default 60s */\n ttlInterval?: number|string\n /** Upsert callback: enables to create missing elements */\n upsert?: ((key: K, additionalArgs?: any[])=> UpserResult<V> | Promise<UpserResult<V>>) | undefined\n}\n\n/** Upsert result */\nexport interface UpserResult<V>{\n value: V,\n bytes?: number,\n isPermanent?: boolean\n}\n\n/** NodeChain */\ninterface NodeChain{\n /** Previous element */\n _prev?: NodeChain,\n /** Next element */\n _next?: NodeChain\n}\n\n/** Node interface for LRU */\ninterface Node<K, V> extends NodeChain{\n value: V | Promise<V>\n key: K\n /** Object size */\n bytes: number\n /** Created timestamp */\n createdAt: number\n /** Last access */\n lastAccess: number\n /** Is permanent node */\n isPermanent: Boolean\n}\n\ntype NodeReadOnly<K,V>= Readonly<Node<K,V>>\n\n/** Main interface */\nexport default class LRU_TTL<K, V> implements NodeChain{\n private _map: Map<K, Node<K, V>>= new Map<K, Node<K, V>>();\n\t/** Max temp elements */\n private _max: number\n private _maxBytes: number // max bytes for temp entries\n /** TLL */\n private _ttl: number\n private _ttlInterval: number\n private _ttlP?: NodeJS.Timeout= undefined;\n private _upsert?: ConstOptions<K,V>[\"upsert\"]\n\n\t/** Temp elements count */\n\tprivate _tmpSize:number = 0;\n /** Total bytes inside the cache */\n private _totalBytes: number= 0\n /** Temp entries bytes */\n private _tmpBytes: number= 0\n /** Last used element */\n _next: NodeChain= this\n /** Least used element */\n _prev: NodeChain= this\n\n constructor(options?: ConstOptions<K, V>){\n // Set config\n if(options){\n // max entries\n this._max= options.max==null? Infinity : options.max;\n // max bytes\n var a: string|number|undefined= options.maxBytes;\n this._maxBytes= a==null? Infinity : typeof a=== 'number' ? a : Bytes.parse(a);\n // TTL\n a= options.ttl;\n this._ttl= a==null? Infinity : typeof a=== 'number' ? a : MS(a);\n // TTL interval\n a= options.ttlInterval;\n this._ttlInterval= a==null? Infinity : typeof a=== 'number' ? a : MS(a);\n this._upsert= options.upsert;\n } else {\n this._max= Infinity;\n this._maxBytes= Infinity;\n this._ttl= Infinity;\n this._ttlInterval= 60000;\n }\n\t\t// fix ttl interval\n\t\tif(this.ttlInterval > this.ttl)\n\t\t\tthis.ttlInterval= this.ttl;\n\t\t// init chain\n\t\tthis._prev= this._next= this;\n }\n\n /** Set max */\n get max(){return this._max}\n set max(max: number){\n this._max= max\n }\n\n get maxBytes(){ return this._maxBytes }\n set maxBytes(maxBytes: number|string){\n this._maxBytes= typeof maxBytes === 'number'? maxBytes : Bytes.parse(maxBytes);\n }\n\n get ttl(){ return this._ttl }\n set ttl(ttl: number|string){\n this._ttl= typeof ttl ==='number' ? ttl : MS(ttl);\n }\n\n get ttlInterval(){ return this._ttlInterval }\n set ttlInterval(ttlInterval: number|string){\n this._ttlInterval= typeof ttlInterval==='number' ? ttlInterval : MS(ttlInterval);\n\t\t// fix ttl interval\n\t\tif(this.ttlInterval > this.ttl)\n\t\t\tthis.ttlInterval= this.ttl;\n\t\t// reload cleaner\n if(this._ttlP){\n clearInterval(this._ttlP);\n this._ttlP= setInterval(this._ttlClean.bind(this), this._ttlInterval);\n }\n }\n\n get upsertCb(){ return this._upsert }\n set upsertCb(cb: ConstOptions<K,V>[\"upsert\"]){ this._upsert= cb; }\n\n /** Get total bytes */\n get bytes(){ return this._totalBytes }\n /** Temp entries bytes */\n get tmpBytes(){ return this._tmpBytes }\n\n /** Get cache size */\n get size(): number{ return this._map.size }\n\n\t/** Get temp elements count */\n\tget tmpSize(): number{ return this._tmpSize }\n\n /** Check if cache has key */\n has(key: K){ return this._map.has(key) }\n\n /** Set value */\n set(key: K, value: V|Promise<V>, bytes:number=0, isPermanent= false): this{\n var item;\n if(item= this._map.get(key)){\n if(item.value === value && item.bytes=== bytes && item.isPermanent=== isPermanent){\n item.lastAccess= Date.now();\n return this\n }\n this._delete(item);\n }\n this._set(key, value, bytes, isPermanent);\n return this;\n }\n\n /** Add permanent element to the cache (will persist until user removes it manually) */\n setPermanent(key: K, value: V, bytes:number=0): this{\n return this.set(key, value, bytes, true);\n }\n\n /** @private Insert new item */\n private _set(key: K, value: V|Promise<V>, bytes:number, isPermanent:boolean): Node<K, V>{\n var now= Date.now();\n var ele: Node<K, V>={\n key, value, bytes,\n createdAt: now,\n lastAccess: now,\n isPermanent: isPermanent,\n _prev: undefined,\n _next: undefined\n }\n // add to map\n this._map.set(key, ele);\n // Flags\n this._totalBytes+= bytes;\n // add to chain\n if(!isPermanent){\n var p= this._next;\n\t\t\tp._prev= ele;\n\t\t\tele._next= p;\n ele._prev= this;\n this._next= ele;\n // Flags\n\t\t\tthis._tmpSize++; // inc tmp counter\n this._tmpBytes+= bytes;\n // remove last permanent element\n if(this._tmpSize > this._max)\n this._delete(this._prev as Node<K,V>) // Remove least used element\n // remove until maxBytes\n while(this._tmpBytes > this._maxBytes && this._prev!= this){\n this._delete(this._prev as Node<K,V>);\n }\n // Run TTL\n if(!this._ttlP)\n this._ttlP= setInterval(this._ttlClean.bind(this), this._ttlInterval)\n }\n return ele;\n }\n\n /** Get element from the cache */\n get(key: K, upsert?: boolean, additionalUpsertCbArgs?: any[]):V|Promise<V>|undefined{\n var ele: Node<K, V>|undefined;\n var p: NodeChain;\n var p2: NodeChain;\n if(ele= this._map.get(key)){\n ele.lastAccess= Date.now();\n if(!ele.isPermanent && ele._prev!== this){\n // Remove from chain\n p= ele._next!;\n p2= ele._prev!;\n p2!._next= p\n p._prev= p2\n // bring forword\n p= this._next\n\t\t\t\tp._prev= ele\n ele._next= p;\n ele._prev= this;\n this._next= ele\n }\n return ele.value;\n } else if (upsert){\n if(typeof this._upsert !== 'function')\n throw new Error('Missing upsert callback!');\n var upsertResult= this._upsert(key, additionalUpsertCbArgs);\n if(upsertResult instanceof Promise){\n ele= this._set(key, upsertResult.then(({value})=> value), 0, true);\n return upsertResult.then((r: UpserResult<V>)=>{\n // Check object not modified\n if(ele=== this._map.get(key)){\n this._delete(ele!);\n this._set(key, r.value, r.bytes||0, !!r.isPermanent);\n }\n return r.value;\n });\n }\n else {\n this._set(key, upsertResult.value, upsertResult.bytes||0, !!upsertResult.isPermanent);\n return upsertResult.value;\n }\n }\n else return undefined;\n }\n /** Get element from the cache without changing it's timeout and LRU */\n peek(key: K): V|Promise<V>|undefined{\n return this._map.get(key)?.value;\n }\n\n /** Get and remove Least used element */\n pop(): V | Promise<V> |undefined{\n if(this._prev!==this){\n var oldest= this._prev as Node<K, V>;\n this._delete(oldest);\n return oldest.value;\n }\n return undefined;\n }\n \n /** Get least recently used item */\n getLRU(){\n return this._prev !== this ? (this._prev as Node<K,V>).value : undefined\n }\n\n /** Upsert element in the cache */\n upsert(\n\t\t/** Cache key */\n\t\tkey: K,\n\t\t/** Additional args for upsert callback */\n\t\t... args: any[]\n\t): V|Promise<V>{\n return this.get(key, true, args)!;\n }\n\n /** Delete element from the cache */\n delete(key: K): this{\n var el;\n if(el= this._map.get(key))\n this._delete(el);\n return this;\n }\n\n /** @private remove element from cache */\n private _delete(ele: Node<K, V>){\n // remove from map\n this._map.delete(ele.key);\n // remove from chain\n var bytes= ele.bytes;\n if(!ele.isPermanent){\n var p = ele._next!;\n\t\t\tvar p2= ele._prev!;\n p._prev= p2;\n p2._next= p;\n // adjust cache bytes\n this._tmpBytes-= bytes;\n\t\t\tthis._tmpSize--;\n }\n // Adjust total bytes\n this._totalBytes-= bytes;\n }\n\n /** Clear all the cache excluding permanent items */\n clearTemp(){\n var el= this._prev as NodeChain;\n var map= this._map;\n // @ts-ignore\n while(el !== this){\n map.delete((el as Node<K, V>).key);\n el= el._next!;\n }\n this._next= this._prev= this;\n this._totalBytes-= this._tmpBytes;\n this._tmpBytes= 0;\n\t\tthis._tmpSize= 0;\n }\n\n /** Clear all items in the cache including permanent items */\n clearAll(){\n this._next= this._prev= this;\n this._map.clear();\n this._tmpBytes= this._tmpSize= this._totalBytes= 0;\n }\n\n /** Get entries */\n *entries():IterableIterator<[K, V|Promise<V>]>{\n var it= this._map.entries();\n var p= it.next();\n var v;\n while(!p.done){\n v= p.value;\n yield [v[0], v[1].value];\n p= it.next();\n }\n }\n\n /** Get all keys */\n keys(): IterableIterator<K>{ return this._map.keys() }\n\n /** Values */\n *values():IterableIterator<V|Promise<V>>{\n var it= this._map.values();\n var p= it.next()\n while(!p.done){\n yield p.value.value;\n }\n }\n\n /** ForEach */\n forEach(cb: (value: V|Promise<V>, key: K) => void, thisArg: any){\n var it= this._map.values();\n var p= it.next()\n if(arguments.length===1) thisArg= this;\n while(!p.done){\n var e= p.value;\n cb.call(thisArg, e.value, e.key);\n }\n }\n\n /** TTL CLean */\n _ttlClean(){\n // Find last node to keep\n var expires= Date.now() - this._ttl;\n var p= this._prev as Node<K,V>;\n var bytes= 0;\n var map= this._map;\n while((p as NodeChain)!== this && p.lastAccess < expires){\n bytes+= p.bytes;\n map.delete(p.key);\n p= p._prev as Node<K,V>;\n }\n // Remove other nodes\n if((p as NodeChain)===this){\n // Remove all nodes\n this._prev= this._next= this\n this._totalBytes-= bytes;\n if(this._totalBytes<0) this._totalBytes= 0\n this._tmpBytes= this._tmpSize= 0;\n // Break ttl\n clearInterval(this._ttlP!);\n this._ttlP= undefined;\n } else {\n this._prev= p;\n p._next= this;\n }\n }\n\n /** For(of) */\n *[Symbol.iterator](){\n var it= this._map.values();\n var v= it.next();\n while(!v.done){\n var entry= v.value\n yield [entry.key, entry.value];\n }\n }\n\n\t/** Get element metadata */\n\tgetMetadata(key: K): NodeReadOnly<K,V>|undefined{\n\t\treturn this._map.get(key);\n\t}\n}"]}