@mohasinac/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +527 -0
- package/dist/index.d.cts +202 -0
- package/dist/index.d.ts +202 -0
- package/dist/index.js +492 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/CacheManager.d.ts +32 -0
- package/dist/types/CacheManager.d.ts.map +1 -0
- package/dist/types/EventBus.d.ts +28 -0
- package/dist/types/EventBus.d.ts.map +1 -0
- package/dist/types/Logger.d.ts +61 -0
- package/dist/types/Logger.d.ts.map +1 -0
- package/dist/types/Queue.d.ts +44 -0
- package/dist/types/Queue.d.ts.map +1 -0
- package/dist/types/StorageManager.d.ts +37 -0
- package/dist/types/StorageManager.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +32 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
CacheManager: () => CacheManager,
|
|
24
|
+
EventBus: () => EventBus,
|
|
25
|
+
Logger: () => Logger,
|
|
26
|
+
Queue: () => Queue,
|
|
27
|
+
StorageManager: () => StorageManager,
|
|
28
|
+
cacheManager: () => cacheManager,
|
|
29
|
+
eventBus: () => eventBus,
|
|
30
|
+
logger: () => logger,
|
|
31
|
+
storageManager: () => storageManager
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(index_exports);
|
|
34
|
+
|
|
35
|
+
// src/Logger.ts
|
|
36
|
+
var Logger = class _Logger {
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.logs = [];
|
|
39
|
+
this.levelPriority = {
|
|
40
|
+
debug: 0,
|
|
41
|
+
info: 1,
|
|
42
|
+
warn: 2,
|
|
43
|
+
error: 3
|
|
44
|
+
};
|
|
45
|
+
var _a, _b, _c, _d, _e;
|
|
46
|
+
const fileUrl = (_a = options == null ? void 0 : options.logFileUrl) != null ? _a : (options == null ? void 0 : options.enableFileLogging) ? "/api/logs/write" : void 0;
|
|
47
|
+
this.options = {
|
|
48
|
+
minLevel: (_b = options == null ? void 0 : options.minLevel) != null ? _b : "debug",
|
|
49
|
+
enableConsole: (_c = options == null ? void 0 : options.enableConsole) != null ? _c : true,
|
|
50
|
+
enableStorage: (_d = options == null ? void 0 : options.enableStorage) != null ? _d : false,
|
|
51
|
+
logFileUrl: fileUrl,
|
|
52
|
+
maxEntries: (_e = options == null ? void 0 : options.maxEntries) != null ? _e : 1e3,
|
|
53
|
+
sanitizer: options == null ? void 0 : options.sanitizer
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Get singleton instance */
|
|
57
|
+
static getInstance(options) {
|
|
58
|
+
if (!_Logger.instance) {
|
|
59
|
+
_Logger.instance = new _Logger(options);
|
|
60
|
+
}
|
|
61
|
+
return _Logger.instance;
|
|
62
|
+
}
|
|
63
|
+
/** Set or update the data sanitizer (e.g., for PII redaction). */
|
|
64
|
+
static setSanitizer(fn) {
|
|
65
|
+
_Logger.getInstance().options.sanitizer = fn;
|
|
66
|
+
}
|
|
67
|
+
shouldLog(level) {
|
|
68
|
+
return this.levelPriority[level] >= this.levelPriority[this.options.minLevel];
|
|
69
|
+
}
|
|
70
|
+
addLog(level, message, data) {
|
|
71
|
+
if (!this.shouldLog(level)) return;
|
|
72
|
+
const sanitized = data && this.options.sanitizer ? this.options.sanitizer(data) : data;
|
|
73
|
+
const entry = {
|
|
74
|
+
level,
|
|
75
|
+
message,
|
|
76
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
77
|
+
data: sanitized
|
|
78
|
+
};
|
|
79
|
+
this.logs.push(entry);
|
|
80
|
+
if (this.logs.length > this.options.maxEntries) {
|
|
81
|
+
this.logs.shift();
|
|
82
|
+
}
|
|
83
|
+
if (this.options.enableConsole) {
|
|
84
|
+
this.logToConsole(entry);
|
|
85
|
+
}
|
|
86
|
+
if (this.options.enableStorage && typeof window !== "undefined") {
|
|
87
|
+
this.saveToStorage();
|
|
88
|
+
}
|
|
89
|
+
if (this.options.logFileUrl && level === "error") {
|
|
90
|
+
this.writeToFile(entry).catch(() => {
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
logToConsole(entry) {
|
|
95
|
+
const prefix = `[${entry.level.toUpperCase()}] ${entry.timestamp.toISOString()}`;
|
|
96
|
+
const message = `${prefix} ${entry.message}`;
|
|
97
|
+
switch (entry.level) {
|
|
98
|
+
case "debug":
|
|
99
|
+
console.debug(message, entry.data);
|
|
100
|
+
break;
|
|
101
|
+
case "info":
|
|
102
|
+
console.info(message, entry.data);
|
|
103
|
+
break;
|
|
104
|
+
case "warn":
|
|
105
|
+
console.warn(message, entry.data);
|
|
106
|
+
break;
|
|
107
|
+
case "error":
|
|
108
|
+
console.error(message, entry.data);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
saveToStorage() {
|
|
113
|
+
try {
|
|
114
|
+
localStorage.setItem("app_logs", JSON.stringify(this.logs));
|
|
115
|
+
} catch (e) {
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async writeToFile(entry) {
|
|
119
|
+
if (typeof window === "undefined" || !this.options.logFileUrl) return;
|
|
120
|
+
try {
|
|
121
|
+
await fetch(this.options.logFileUrl, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
headers: { "Content-Type": "application/json" },
|
|
124
|
+
body: JSON.stringify({
|
|
125
|
+
level: entry.level,
|
|
126
|
+
message: entry.message,
|
|
127
|
+
timestamp: entry.timestamp.toISOString(),
|
|
128
|
+
data: entry.data
|
|
129
|
+
})
|
|
130
|
+
});
|
|
131
|
+
} catch (e) {
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
debug(message, data) {
|
|
135
|
+
this.addLog("debug", message, data);
|
|
136
|
+
}
|
|
137
|
+
info(message, data) {
|
|
138
|
+
this.addLog("info", message, data);
|
|
139
|
+
}
|
|
140
|
+
warn(message, data) {
|
|
141
|
+
this.addLog("warn", message, data);
|
|
142
|
+
}
|
|
143
|
+
error(message, data) {
|
|
144
|
+
this.addLog("error", message, data);
|
|
145
|
+
}
|
|
146
|
+
getLogs(level) {
|
|
147
|
+
if (level) return this.logs.filter((log) => log.level === level);
|
|
148
|
+
return [...this.logs];
|
|
149
|
+
}
|
|
150
|
+
clear() {
|
|
151
|
+
this.logs = [];
|
|
152
|
+
if (this.options.enableStorage && typeof window !== "undefined") {
|
|
153
|
+
localStorage.removeItem("app_logs");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export() {
|
|
157
|
+
return JSON.stringify(this.logs, null, 2);
|
|
158
|
+
}
|
|
159
|
+
getStats() {
|
|
160
|
+
return {
|
|
161
|
+
debug: this.logs.filter((l) => l.level === "debug").length,
|
|
162
|
+
info: this.logs.filter((l) => l.level === "info").length,
|
|
163
|
+
warn: this.logs.filter((l) => l.level === "warn").length,
|
|
164
|
+
error: this.logs.filter((l) => l.level === "error").length
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
var logger = Logger.getInstance();
|
|
169
|
+
|
|
170
|
+
// src/Queue.ts
|
|
171
|
+
var qLogger = Logger.getInstance();
|
|
172
|
+
var Queue = class {
|
|
173
|
+
constructor(options) {
|
|
174
|
+
this.tasks = [];
|
|
175
|
+
this.running = 0;
|
|
176
|
+
this.results = /* @__PURE__ */ new Map();
|
|
177
|
+
this.errors = /* @__PURE__ */ new Map();
|
|
178
|
+
var _a, _b;
|
|
179
|
+
this.concurrency = (_a = options == null ? void 0 : options.concurrency) != null ? _a : 1;
|
|
180
|
+
this.autoStart = (_b = options == null ? void 0 : options.autoStart) != null ? _b : true;
|
|
181
|
+
}
|
|
182
|
+
/** Add a task to the queue */
|
|
183
|
+
add(id, fn, priority = 0) {
|
|
184
|
+
this.tasks.push({ id, fn, priority });
|
|
185
|
+
this.tasks.sort((a, b) => {
|
|
186
|
+
var _a, _b;
|
|
187
|
+
return ((_a = b.priority) != null ? _a : 0) - ((_b = a.priority) != null ? _b : 0);
|
|
188
|
+
});
|
|
189
|
+
if (this.autoStart) {
|
|
190
|
+
this.process();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
process() {
|
|
194
|
+
while (this.running < this.concurrency && this.tasks.length > 0) {
|
|
195
|
+
const task = this.tasks.shift();
|
|
196
|
+
if (!task) break;
|
|
197
|
+
this.running++;
|
|
198
|
+
task.fn().then((result) => {
|
|
199
|
+
this.results.set(task.id, result);
|
|
200
|
+
}).catch((error) => {
|
|
201
|
+
this.errors.set(task.id, error);
|
|
202
|
+
}).finally(() => {
|
|
203
|
+
this.running--;
|
|
204
|
+
this.process();
|
|
205
|
+
}).catch((err) => {
|
|
206
|
+
qLogger.error("Queue.process error in finally", { err });
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
start() {
|
|
211
|
+
this.process();
|
|
212
|
+
}
|
|
213
|
+
pause() {
|
|
214
|
+
this.autoStart = false;
|
|
215
|
+
}
|
|
216
|
+
resume() {
|
|
217
|
+
this.autoStart = true;
|
|
218
|
+
this.process();
|
|
219
|
+
}
|
|
220
|
+
clear() {
|
|
221
|
+
this.tasks = [];
|
|
222
|
+
this.results.clear();
|
|
223
|
+
this.errors.clear();
|
|
224
|
+
}
|
|
225
|
+
getResult(id) {
|
|
226
|
+
return this.results.get(id);
|
|
227
|
+
}
|
|
228
|
+
getError(id) {
|
|
229
|
+
return this.errors.get(id);
|
|
230
|
+
}
|
|
231
|
+
size() {
|
|
232
|
+
return this.tasks.length;
|
|
233
|
+
}
|
|
234
|
+
getRunning() {
|
|
235
|
+
return this.running;
|
|
236
|
+
}
|
|
237
|
+
isEmpty() {
|
|
238
|
+
return this.tasks.length === 0 && this.running === 0;
|
|
239
|
+
}
|
|
240
|
+
async waitForCompletion() {
|
|
241
|
+
while (!this.isEmpty()) {
|
|
242
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
getStats() {
|
|
246
|
+
return {
|
|
247
|
+
pending: this.tasks.length,
|
|
248
|
+
running: this.running,
|
|
249
|
+
completed: this.results.size,
|
|
250
|
+
failed: this.errors.size
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// src/StorageManager.ts
|
|
256
|
+
var sLogger = Logger.getInstance();
|
|
257
|
+
var _StorageManager = class _StorageManager {
|
|
258
|
+
constructor(prefix = "app_") {
|
|
259
|
+
this.prefix = prefix;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get-or-create a StorageManager for the given prefix.
|
|
263
|
+
* Each prefix returns an independent instance.
|
|
264
|
+
*/
|
|
265
|
+
static getInstance(prefix = "") {
|
|
266
|
+
if (!_StorageManager.instances.has(prefix)) {
|
|
267
|
+
_StorageManager.instances.set(prefix, new _StorageManager(prefix));
|
|
268
|
+
}
|
|
269
|
+
return _StorageManager.instances.get(prefix);
|
|
270
|
+
}
|
|
271
|
+
getStorage(type) {
|
|
272
|
+
try {
|
|
273
|
+
if (typeof window === "undefined") return null;
|
|
274
|
+
const storage = type === "local" ? window.localStorage : window.sessionStorage;
|
|
275
|
+
return storage != null ? storage : null;
|
|
276
|
+
} catch (e) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
generateKey(key) {
|
|
281
|
+
return `${this.prefix}${key}`;
|
|
282
|
+
}
|
|
283
|
+
set(key, value, options) {
|
|
284
|
+
var _a;
|
|
285
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
286
|
+
if (!storage) return false;
|
|
287
|
+
try {
|
|
288
|
+
storage.setItem(this.generateKey(key), JSON.stringify(value));
|
|
289
|
+
return true;
|
|
290
|
+
} catch (error) {
|
|
291
|
+
sLogger.error("StorageManager.set error", { error });
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
get(key, options) {
|
|
296
|
+
var _a;
|
|
297
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
298
|
+
if (!storage) return null;
|
|
299
|
+
try {
|
|
300
|
+
const item = storage.getItem(this.generateKey(key));
|
|
301
|
+
if (item === null) return null;
|
|
302
|
+
return JSON.parse(item);
|
|
303
|
+
} catch (error) {
|
|
304
|
+
sLogger.error("StorageManager.get error", { error });
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
remove(key, options) {
|
|
309
|
+
var _a;
|
|
310
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
311
|
+
if (!storage) return false;
|
|
312
|
+
try {
|
|
313
|
+
storage.removeItem(this.generateKey(key));
|
|
314
|
+
return true;
|
|
315
|
+
} catch (error) {
|
|
316
|
+
sLogger.error("StorageManager.remove error", { error });
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
clear(options) {
|
|
321
|
+
var _a;
|
|
322
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
323
|
+
if (!storage) return false;
|
|
324
|
+
try {
|
|
325
|
+
const keys = Object.keys(storage);
|
|
326
|
+
keys.forEach((k) => {
|
|
327
|
+
if (k.startsWith(this.prefix)) storage.removeItem(k);
|
|
328
|
+
});
|
|
329
|
+
return true;
|
|
330
|
+
} catch (error) {
|
|
331
|
+
sLogger.error("StorageManager.clear error", { error });
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
has(key, options) {
|
|
336
|
+
return this.get(key, options) !== null;
|
|
337
|
+
}
|
|
338
|
+
keys(options) {
|
|
339
|
+
var _a;
|
|
340
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
341
|
+
if (!storage) return [];
|
|
342
|
+
const result = [];
|
|
343
|
+
for (let i = 0; i < storage.length; i++) {
|
|
344
|
+
const k = storage.key(i);
|
|
345
|
+
if (k == null ? void 0 : k.startsWith(this.prefix)) {
|
|
346
|
+
result.push(k.slice(this.prefix.length));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return result;
|
|
350
|
+
}
|
|
351
|
+
size(options) {
|
|
352
|
+
var _a, _b;
|
|
353
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
354
|
+
if (!storage) return 0;
|
|
355
|
+
let bytes = 0;
|
|
356
|
+
for (let i = 0; i < storage.length; i++) {
|
|
357
|
+
const k = storage.key(i);
|
|
358
|
+
if (k == null ? void 0 : k.startsWith(this.prefix)) {
|
|
359
|
+
const v = storage.getItem(k);
|
|
360
|
+
bytes += k.length + ((_b = v == null ? void 0 : v.length) != null ? _b : 0);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return bytes;
|
|
364
|
+
}
|
|
365
|
+
isAvailable(type = "local") {
|
|
366
|
+
const storage = this.getStorage(type);
|
|
367
|
+
if (!storage) return false;
|
|
368
|
+
try {
|
|
369
|
+
const testKey = "__storage_test__";
|
|
370
|
+
storage.setItem(testKey, "1");
|
|
371
|
+
storage.removeItem(testKey);
|
|
372
|
+
return true;
|
|
373
|
+
} catch (e) {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
getAll(options) {
|
|
378
|
+
var _a;
|
|
379
|
+
const storage = this.getStorage((_a = options == null ? void 0 : options.type) != null ? _a : "local");
|
|
380
|
+
if (!storage) return {};
|
|
381
|
+
const result = {};
|
|
382
|
+
for (let i = 0; i < storage.length; i++) {
|
|
383
|
+
const k = storage.key(i);
|
|
384
|
+
if (k == null ? void 0 : k.startsWith(this.prefix)) {
|
|
385
|
+
const v = this.get(k.slice(this.prefix.length), options);
|
|
386
|
+
if (v !== null) result[k.slice(this.prefix.length)] = v;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
/** Per-prefix instance map — prevents namespace collisions */
|
|
393
|
+
_StorageManager.instances = /* @__PURE__ */ new Map();
|
|
394
|
+
var StorageManager = _StorageManager;
|
|
395
|
+
var storageManager = StorageManager.getInstance("");
|
|
396
|
+
|
|
397
|
+
// src/EventBus.ts
|
|
398
|
+
var logger2 = Logger.getInstance();
|
|
399
|
+
var EventBus = class _EventBus {
|
|
400
|
+
constructor() {
|
|
401
|
+
this.events = /* @__PURE__ */ new Map();
|
|
402
|
+
}
|
|
403
|
+
static getInstance() {
|
|
404
|
+
if (!_EventBus.instance) {
|
|
405
|
+
_EventBus.instance = new _EventBus();
|
|
406
|
+
}
|
|
407
|
+
return _EventBus.instance;
|
|
408
|
+
}
|
|
409
|
+
on(event, callback) {
|
|
410
|
+
if (!this.events.has(event)) {
|
|
411
|
+
this.events.set(event, []);
|
|
412
|
+
}
|
|
413
|
+
this.events.get(event).push(callback);
|
|
414
|
+
return { unsubscribe: () => this.off(event, callback) };
|
|
415
|
+
}
|
|
416
|
+
once(event, callback) {
|
|
417
|
+
const wrapped = (...args) => {
|
|
418
|
+
callback(...args);
|
|
419
|
+
this.off(event, wrapped);
|
|
420
|
+
};
|
|
421
|
+
return this.on(event, wrapped);
|
|
422
|
+
}
|
|
423
|
+
off(event, callback) {
|
|
424
|
+
const callbacks = this.events.get(event);
|
|
425
|
+
if (!callbacks) return;
|
|
426
|
+
const idx = callbacks.indexOf(callback);
|
|
427
|
+
if (idx > -1) callbacks.splice(idx, 1);
|
|
428
|
+
if (callbacks.length === 0) this.events.delete(event);
|
|
429
|
+
}
|
|
430
|
+
emit(event, ...args) {
|
|
431
|
+
const callbacks = this.events.get(event);
|
|
432
|
+
if (!callbacks) return;
|
|
433
|
+
callbacks.forEach((cb) => {
|
|
434
|
+
try {
|
|
435
|
+
cb(...args);
|
|
436
|
+
} catch (error) {
|
|
437
|
+
logger2.error(`EventBus: error in handler for "${event}"`, { error });
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
removeAllListeners(event) {
|
|
442
|
+
if (event) {
|
|
443
|
+
this.events.delete(event);
|
|
444
|
+
} else {
|
|
445
|
+
this.events.clear();
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
listenerCount(event) {
|
|
449
|
+
var _a, _b;
|
|
450
|
+
return (_b = (_a = this.events.get(event)) == null ? void 0 : _a.length) != null ? _b : 0;
|
|
451
|
+
}
|
|
452
|
+
eventNames() {
|
|
453
|
+
return Array.from(this.events.keys());
|
|
454
|
+
}
|
|
455
|
+
hasListeners(event) {
|
|
456
|
+
return this.listenerCount(event) > 0;
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
var eventBus = EventBus.getInstance();
|
|
460
|
+
|
|
461
|
+
// src/CacheManager.ts
|
|
462
|
+
var CacheManager = class _CacheManager {
|
|
463
|
+
constructor(maxSize = 100) {
|
|
464
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
465
|
+
this.maxSize = maxSize;
|
|
466
|
+
}
|
|
467
|
+
static getInstance(maxSize) {
|
|
468
|
+
if (!_CacheManager.instance) {
|
|
469
|
+
_CacheManager.instance = new _CacheManager(maxSize);
|
|
470
|
+
}
|
|
471
|
+
return _CacheManager.instance;
|
|
472
|
+
}
|
|
473
|
+
set(key, value, options) {
|
|
474
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
475
|
+
const firstKey = this.cache.keys().next().value;
|
|
476
|
+
if (firstKey !== void 0) this.cache.delete(firstKey);
|
|
477
|
+
}
|
|
478
|
+
this.cache.set(key, { value, timestamp: Date.now(), ttl: options == null ? void 0 : options.ttl });
|
|
479
|
+
}
|
|
480
|
+
get(key) {
|
|
481
|
+
const entry = this.cache.get(key);
|
|
482
|
+
if (!entry) return null;
|
|
483
|
+
if (entry.ttl && Date.now() - entry.timestamp > entry.ttl) {
|
|
484
|
+
this.cache.delete(key);
|
|
485
|
+
return null;
|
|
486
|
+
}
|
|
487
|
+
return entry.value;
|
|
488
|
+
}
|
|
489
|
+
has(key) {
|
|
490
|
+
return this.get(key) !== null;
|
|
491
|
+
}
|
|
492
|
+
delete(key) {
|
|
493
|
+
return this.cache.delete(key);
|
|
494
|
+
}
|
|
495
|
+
clear() {
|
|
496
|
+
this.cache.clear();
|
|
497
|
+
}
|
|
498
|
+
size() {
|
|
499
|
+
return this.cache.size;
|
|
500
|
+
}
|
|
501
|
+
keys() {
|
|
502
|
+
return Array.from(this.cache.keys());
|
|
503
|
+
}
|
|
504
|
+
cleanExpired() {
|
|
505
|
+
let cleaned = 0;
|
|
506
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
507
|
+
if (entry.ttl && Date.now() - entry.timestamp > entry.ttl) {
|
|
508
|
+
this.cache.delete(key);
|
|
509
|
+
cleaned++;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return cleaned;
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
var cacheManager = CacheManager.getInstance();
|
|
516
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
517
|
+
0 && (module.exports = {
|
|
518
|
+
CacheManager,
|
|
519
|
+
EventBus,
|
|
520
|
+
Logger,
|
|
521
|
+
Queue,
|
|
522
|
+
StorageManager,
|
|
523
|
+
cacheManager,
|
|
524
|
+
eventBus,
|
|
525
|
+
logger,
|
|
526
|
+
storageManager
|
|
527
|
+
});
|