UNPKG

v_core_cache

Version:

Simple JavaScript Cache with expires/ttl and auto cleanups for Node and Web Application.

212 lines 7.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.V_Core_Cache = void 0; const { isEmptySync } = require("v_is_empty_value"); const events_1 = require("events"); const { isAlive, defineExpire } = require("./utils"); var AddRemoveEventGeneratorEnum; (function (AddRemoveEventGeneratorEnum) { AddRemoveEventGeneratorEnum["Add"] = "addListener"; AddRemoveEventGeneratorEnum["Remove"] = "removeListener"; AddRemoveEventGeneratorEnum["Prepend"] = "prependListener"; })(AddRemoveEventGeneratorEnum || (AddRemoveEventGeneratorEnum = {})); //! Type Definitions - - - - - const createHandleAddRemoveEvent = (ev, emitter) => (eventName, evCallback) => { if (!eventName || !evCallback) return false; if (ev === AddRemoveEventGeneratorEnum.Add || eventName === AddRemoveEventGeneratorEnum.Remove) emitter.emit(ev, { eventName, evCallback }); if (ev === AddRemoveEventGeneratorEnum.Remove) { if (emitter.eventNames().indexOf(eventName) === -1) return false; } const evR = emitter[ev](eventName, evCallback); return !!evR; }; class V_Core_Cache { clInt = null; purge; count; set; setSync; getAll; get; getSync; getExpire; del; delSync; has; cleanup; keys; size; stats; statsSync; purgeStats; values; entries; //? Events Management - - - - - addListener; prependListener; removeListener; on; pre; off; //! Events Management - - - - - stopCleanup; countSync; sizeSync; eventNames; removeAllListeners; purgeAllListeners; constructor(init = {}) { // super(); const emitter = new events_1.EventEmitter(); let hits = 0; let miss = 0; const cleanInterval = init.cleanInterval || false; let defExp = defineExpire(init.expires) ? init.expires : null; let $ = new Map(); //* Cache Items Count this.count = async () => $.size; this.countSync = () => $.size; //* All this.getAll = async () => $; //? Get Item this.getSync = (key) => { let data = $.get(key); let value = data !== undefined ? data.value : undefined; emitter.emit("get", { key, value }); if (value !== undefined) { if (isAlive(data.exp)) { hits++; emitter.emit("hit", { key, value }); return value; } $.delete(key); } miss++; emitter.emit("miss", { key }); return undefined; }; this.get = async (key) => this.getSync(key); //? Get Item Expire Time this.getExpire = async (key) => $.has(key) !== false ? $.get(key).exp : undefined; //? Set Item Value & Expire Time this.setSync = (key, value, exp = defExp) => { if (isEmptySync(value)) return false; $.set(key, { value: value, exp: typeof exp === "number" ? Date.now() + exp : false, }); emitter.emit("set", { key, value }); emitter.emit(`set/${key}`, value); return true; }; this.set = async (key, value, exp = defExp) => this.setSync(key, value, exp); //? Delete / Remove item from cache this.del = async (key) => $.delete(key); this.delSync = (key) => $.delete(key); //? Check if has this.has = async (key) => { let data = $.get(key); return data != undefined ? isAlive(data.exp) : false; }; //! PURGE Cache this.purge = async () => { if ($.size === 0) { emitter.emit("purge", false); return false; } $.clear(); let rez = $.size === 0; emitter.emit("purge", rez); return rez; }; this.cleanup = async () => { let affected = 0; for (let key of this.keys()) { if (!isAlive($.get(key).exp)) { $.delete(key); affected++; } } emitter.emit("cleanup", affected); return affected; }; //? Size Aproximation this.sizeSync = () => new TextEncoder().encode(JSON.stringify(Array.from($.entries()))).length; this.size = async () => this.sizeSync(); //? Stats //*> ASYNC this.stats = async () => { return { hits: hits, misses: miss, count: $.size, size: await this.size(), }; }; //*> SYNC this.statsSync = () => { return { hits: hits, misses: miss, count: $.size, size: this.sizeSync(), }; }; //? PurgeStats this.purgeStats = async () => { hits = 0; miss = 0; let stats = await this.stats(); emitter.emit("purgeStats", stats); return stats; }; //? KEYS this.keys = () => $.keys(); //? VALUES this.values = () => $.values(); //? ENTRIES this.entries = () => $.entries(); //* Add Event Listener this.addListener = createHandleAddRemoveEvent(AddRemoveEventGeneratorEnum.Add, emitter); //* Remove Event Listener this.removeListener = createHandleAddRemoveEvent(AddRemoveEventGeneratorEnum.Remove, emitter); this.prependListener = createHandleAddRemoveEvent(AddRemoveEventGeneratorEnum.Prepend, emitter); //? Aliases this.on = this.addListener; this.off = this.removeListener; this.pre = this.prependListener; //! End the cleanup interval looping this.stopCleanup = () => { if (this.clInt !== null) { clearInterval(this.clInt); this.clInt = null; return true; } return false; }; //? Get list of registered events this.eventNames = () => emitter.eventNames(); //? Remove All listeners from event [eventName] this.removeAllListeners = emitter.removeAllListeners; //! Un-Hook ALL EventNames and Listeners this.purgeAllListeners = () => { const eventNames = emitter.eventNames(); for (let i = 0; i < eventNames.length; i++) { const evName = eventNames[i]; emitter.removeAllListeners(evName); } return this.eventNames().length === 0; }; //? Start Cleanup Interval if set. if (cleanInterval !== false) { this.clInt = setInterval(this.cleanup, cleanInterval); } } } exports.V_Core_Cache = V_Core_Cache; //# sourceMappingURL=V_Core_Cache.js.map