v_core_cache
Version:
Simple JavaScript Cache with expires/ttl and auto cleanups for Node and Web Application.
212 lines • 7.26 kB
JavaScript
"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