@warlock.js/cache 4.0.48 → 4.0.60
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/cjs/cache-manager.d.ts +159 -0
- package/cjs/cache-manager.d.ts.map +1 -0
- package/cjs/cache-manager.js +312 -0
- package/cjs/cache-manager.js.map +1 -0
- package/cjs/drivers/base-cache-driver.d.ts +144 -0
- package/cjs/drivers/base-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/base-cache-driver.js +308 -0
- package/cjs/drivers/base-cache-driver.js.map +1 -0
- package/cjs/drivers/file-cache-driver.d.ts +45 -0
- package/cjs/drivers/file-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/file-cache-driver.js +133 -0
- package/cjs/drivers/file-cache-driver.js.map +1 -0
- package/cjs/drivers/index.d.ts +8 -0
- package/cjs/drivers/index.d.ts.map +1 -0
- package/cjs/drivers/lru-memory-cache-driver.d.ts +98 -0
- package/cjs/drivers/lru-memory-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/lru-memory-cache-driver.js +252 -0
- package/cjs/drivers/lru-memory-cache-driver.js.map +1 -0
- package/cjs/drivers/memory-cache-driver.d.ts +82 -0
- package/cjs/drivers/memory-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/memory-cache-driver.js +218 -0
- package/cjs/drivers/memory-cache-driver.js.map +1 -0
- package/cjs/drivers/memory-extended-cache-driver.d.ts +13 -0
- package/cjs/drivers/memory-extended-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/memory-extended-cache-driver.js +25 -0
- package/cjs/drivers/memory-extended-cache-driver.js.map +1 -0
- package/cjs/drivers/null-cache-driver.d.ts +58 -0
- package/cjs/drivers/null-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/null-cache-driver.js +84 -0
- package/cjs/drivers/null-cache-driver.js.map +1 -0
- package/cjs/drivers/redis-cache-driver.d.ts +57 -0
- package/cjs/drivers/redis-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/redis-cache-driver.js +222 -0
- package/cjs/drivers/redis-cache-driver.js.map +1 -0
- package/cjs/index.d.ts +6 -0
- package/cjs/index.d.ts.map +1 -0
- package/cjs/index.js +1 -42
- package/cjs/index.js.map +1 -1
- package/cjs/tagged-cache.d.ts +77 -0
- package/cjs/tagged-cache.d.ts.map +1 -0
- package/cjs/tagged-cache.js +160 -0
- package/cjs/tagged-cache.js.map +1 -0
- package/cjs/types.d.ts +381 -0
- package/cjs/types.d.ts.map +1 -0
- package/cjs/types.js +36 -0
- package/cjs/types.js.map +1 -0
- package/cjs/utils.d.ts +50 -0
- package/cjs/utils.d.ts.map +1 -0
- package/cjs/utils.js +55 -0
- package/cjs/utils.js.map +1 -0
- package/esm/cache-manager.d.ts +159 -0
- package/esm/cache-manager.d.ts.map +1 -0
- package/esm/cache-manager.js +312 -0
- package/esm/cache-manager.js.map +1 -0
- package/esm/drivers/base-cache-driver.d.ts +144 -0
- package/esm/drivers/base-cache-driver.d.ts.map +1 -0
- package/esm/drivers/base-cache-driver.js +308 -0
- package/esm/drivers/base-cache-driver.js.map +1 -0
- package/esm/drivers/file-cache-driver.d.ts +45 -0
- package/esm/drivers/file-cache-driver.d.ts.map +1 -0
- package/esm/drivers/file-cache-driver.js +133 -0
- package/esm/drivers/file-cache-driver.js.map +1 -0
- package/esm/drivers/index.d.ts +8 -0
- package/esm/drivers/index.d.ts.map +1 -0
- package/esm/drivers/lru-memory-cache-driver.d.ts +98 -0
- package/esm/drivers/lru-memory-cache-driver.d.ts.map +1 -0
- package/esm/drivers/lru-memory-cache-driver.js +252 -0
- package/esm/drivers/lru-memory-cache-driver.js.map +1 -0
- package/esm/drivers/memory-cache-driver.d.ts +82 -0
- package/esm/drivers/memory-cache-driver.d.ts.map +1 -0
- package/esm/drivers/memory-cache-driver.js +218 -0
- package/esm/drivers/memory-cache-driver.js.map +1 -0
- package/esm/drivers/memory-extended-cache-driver.d.ts +13 -0
- package/esm/drivers/memory-extended-cache-driver.d.ts.map +1 -0
- package/esm/drivers/memory-extended-cache-driver.js +25 -0
- package/esm/drivers/memory-extended-cache-driver.js.map +1 -0
- package/esm/drivers/null-cache-driver.d.ts +58 -0
- package/esm/drivers/null-cache-driver.d.ts.map +1 -0
- package/esm/drivers/null-cache-driver.js +84 -0
- package/esm/drivers/null-cache-driver.js.map +1 -0
- package/esm/drivers/redis-cache-driver.d.ts +57 -0
- package/esm/drivers/redis-cache-driver.d.ts.map +1 -0
- package/esm/drivers/redis-cache-driver.js +222 -0
- package/esm/drivers/redis-cache-driver.js.map +1 -0
- package/esm/index.d.ts +6 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +1 -7
- package/esm/index.js.map +1 -1
- package/esm/tagged-cache.d.ts +77 -0
- package/esm/tagged-cache.d.ts.map +1 -0
- package/esm/tagged-cache.js +160 -0
- package/esm/tagged-cache.js.map +1 -0
- package/esm/types.d.ts +381 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/types.js +36 -0
- package/esm/types.js.map +1 -0
- package/esm/utils.d.ts +50 -0
- package/esm/utils.d.ts.map +1 -0
- package/esm/utils.js +55 -0
- package/esm/utils.js.map +1 -0
- package/package.json +38 -51
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import {BaseCacheDriver}from'./base-cache-driver.js';class CacheNode {
|
|
2
|
+
key;
|
|
3
|
+
value;
|
|
4
|
+
next = null;
|
|
5
|
+
prev = null;
|
|
6
|
+
expiresAt;
|
|
7
|
+
constructor(key, value, ttl) {
|
|
8
|
+
this.key = key;
|
|
9
|
+
this.value = value;
|
|
10
|
+
if (ttl && ttl !== Infinity) {
|
|
11
|
+
this.expiresAt = Date.now() + ttl * 1000;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
get isExpired() {
|
|
15
|
+
return this.expiresAt !== undefined && this.expiresAt < Date.now();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* LRU Memory Cache Driver
|
|
20
|
+
* The concept of LRU is to remove the least recently used data
|
|
21
|
+
* whenever the cache is full
|
|
22
|
+
* The question that resides here is how to tell the cache is full?
|
|
23
|
+
*/
|
|
24
|
+
class LRUMemoryCacheDriver extends BaseCacheDriver {
|
|
25
|
+
/**
|
|
26
|
+
* {@inheritdoc}
|
|
27
|
+
*/
|
|
28
|
+
name = "lru";
|
|
29
|
+
/**
|
|
30
|
+
* Cache map
|
|
31
|
+
*/
|
|
32
|
+
cache = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Head of the cache
|
|
35
|
+
*/
|
|
36
|
+
head = new CacheNode("", null);
|
|
37
|
+
/**
|
|
38
|
+
* Tail of the cache
|
|
39
|
+
*/
|
|
40
|
+
tail = new CacheNode("", null);
|
|
41
|
+
/**
|
|
42
|
+
* Cleanup interval reference
|
|
43
|
+
*/
|
|
44
|
+
cleanupInterval;
|
|
45
|
+
/**
|
|
46
|
+
* {@inheritdoc}
|
|
47
|
+
*/
|
|
48
|
+
constructor() {
|
|
49
|
+
super();
|
|
50
|
+
this.init();
|
|
51
|
+
this.startCleanup();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Initialize the cache
|
|
55
|
+
*/
|
|
56
|
+
init() {
|
|
57
|
+
this.head.next = this.tail;
|
|
58
|
+
this.tail.prev = this.head;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Start the cleanup process for expired items
|
|
62
|
+
*/
|
|
63
|
+
startCleanup() {
|
|
64
|
+
// Clear existing interval if any
|
|
65
|
+
if (this.cleanupInterval) {
|
|
66
|
+
clearInterval(this.cleanupInterval);
|
|
67
|
+
}
|
|
68
|
+
this.cleanupInterval = setInterval(async () => {
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
const expiredKeys = [];
|
|
71
|
+
for (const [key, node] of this.cache) {
|
|
72
|
+
if (node.expiresAt && node.expiresAt <= now) {
|
|
73
|
+
expiredKeys.push(key);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const key of expiredKeys) {
|
|
77
|
+
const node = this.cache.get(key);
|
|
78
|
+
if (node) {
|
|
79
|
+
this.removeNode(node);
|
|
80
|
+
this.cache.delete(key);
|
|
81
|
+
this.log("expired", key);
|
|
82
|
+
// Emit expired event
|
|
83
|
+
await this.emit("expired", { key });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}, 1000);
|
|
87
|
+
// do not block the process from exiting
|
|
88
|
+
this.cleanupInterval.unref();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* {@inheritdoc}
|
|
92
|
+
*/
|
|
93
|
+
async removeNamespace(_namespace) {
|
|
94
|
+
throw new Error("Namespace is not supported in LRU cache driver.");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* {@inheritdoc}
|
|
98
|
+
*/
|
|
99
|
+
async set(key, value, ttl) {
|
|
100
|
+
key = this.parseKey(key);
|
|
101
|
+
this.log("caching", key);
|
|
102
|
+
if (ttl === undefined) {
|
|
103
|
+
ttl = this.ttl;
|
|
104
|
+
}
|
|
105
|
+
const existingNode = this.cache.get(key);
|
|
106
|
+
if (existingNode) {
|
|
107
|
+
existingNode.value = value;
|
|
108
|
+
// Update TTL
|
|
109
|
+
if (ttl && ttl !== Infinity) {
|
|
110
|
+
existingNode.expiresAt = Date.now() + ttl * 1000;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
existingNode.expiresAt = undefined;
|
|
114
|
+
}
|
|
115
|
+
this.moveHead(existingNode);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const newNode = new CacheNode(key, value, ttl);
|
|
119
|
+
this.cache.set(key, newNode);
|
|
120
|
+
this.addNode(newNode);
|
|
121
|
+
if (this.cache.size > this.capacity) {
|
|
122
|
+
this.removeTail();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
this.log("cached", key);
|
|
126
|
+
// Emit set event
|
|
127
|
+
await this.emit("set", { key, value, ttl });
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Move the node to the head
|
|
132
|
+
*/
|
|
133
|
+
moveHead(node) {
|
|
134
|
+
this.removeNode(node);
|
|
135
|
+
this.addNode(node);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Remove the node from the cache
|
|
139
|
+
*/
|
|
140
|
+
removeNode(node) {
|
|
141
|
+
node.prev.next = node.next;
|
|
142
|
+
node.next.prev = node.prev;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Add the node to the head
|
|
146
|
+
*/
|
|
147
|
+
addNode(node) {
|
|
148
|
+
node.next = this.head.next;
|
|
149
|
+
node.prev = this.head;
|
|
150
|
+
this.head.next.prev = node;
|
|
151
|
+
this.head.next = node;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Remove the tail node
|
|
155
|
+
*/
|
|
156
|
+
removeTail() {
|
|
157
|
+
const node = this.tail.prev;
|
|
158
|
+
this.removeNode(node);
|
|
159
|
+
this.cache.delete(node.key);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* {@inheritdoc}
|
|
163
|
+
*/
|
|
164
|
+
async get(key) {
|
|
165
|
+
const parsedKey = this.parseKey(key);
|
|
166
|
+
this.log("fetching", parsedKey);
|
|
167
|
+
const node = this.cache.get(parsedKey);
|
|
168
|
+
if (!node) {
|
|
169
|
+
this.log("notFound", parsedKey);
|
|
170
|
+
// Emit miss event
|
|
171
|
+
await this.emit("miss", { key: parsedKey });
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
// Check if expired
|
|
175
|
+
if (node.isExpired) {
|
|
176
|
+
this.removeNode(node);
|
|
177
|
+
this.cache.delete(parsedKey);
|
|
178
|
+
this.log("expired", parsedKey);
|
|
179
|
+
// Emit expired event
|
|
180
|
+
await this.emit("expired", { key: parsedKey });
|
|
181
|
+
// Also emit miss since we're returning null
|
|
182
|
+
await this.emit("miss", { key: parsedKey });
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
this.moveHead(node);
|
|
186
|
+
this.log("fetched", parsedKey);
|
|
187
|
+
const value = node.value;
|
|
188
|
+
// Apply cloning for immutability protection
|
|
189
|
+
if (value === null || value === undefined) {
|
|
190
|
+
return value;
|
|
191
|
+
}
|
|
192
|
+
const type = typeof value;
|
|
193
|
+
if (type === "string" || type === "number" || type === "boolean") {
|
|
194
|
+
// Emit hit event
|
|
195
|
+
await this.emit("hit", { key: parsedKey, value });
|
|
196
|
+
return value;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const clonedValue = structuredClone(value);
|
|
200
|
+
// Emit hit event
|
|
201
|
+
await this.emit("hit", { key: parsedKey, value: clonedValue });
|
|
202
|
+
return clonedValue;
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
this.logError(`Failed to clone cached value for ${parsedKey}`, error);
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* {@inheritdoc}
|
|
211
|
+
*/
|
|
212
|
+
async remove(key) {
|
|
213
|
+
const parsedKey = this.parseKey(key);
|
|
214
|
+
this.log("removing", parsedKey);
|
|
215
|
+
const node = this.cache.get(parsedKey);
|
|
216
|
+
if (node) {
|
|
217
|
+
this.removeNode(node);
|
|
218
|
+
this.cache.delete(parsedKey);
|
|
219
|
+
}
|
|
220
|
+
this.log("removed", parsedKey);
|
|
221
|
+
// Emit removed event
|
|
222
|
+
await this.emit("removed", { key: parsedKey });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* {@inheritdoc}
|
|
226
|
+
*/
|
|
227
|
+
async flush() {
|
|
228
|
+
this.log("flushing");
|
|
229
|
+
this.cache.clear();
|
|
230
|
+
this.init();
|
|
231
|
+
this.log("flushed");
|
|
232
|
+
// Emit flushed event
|
|
233
|
+
await this.emit("flushed");
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get lru capacity
|
|
237
|
+
*/
|
|
238
|
+
get capacity() {
|
|
239
|
+
return this.options.capacity || 1000;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* {@inheritdoc}
|
|
243
|
+
*/
|
|
244
|
+
async disconnect() {
|
|
245
|
+
// Clear the cleanup interval to prevent memory leaks
|
|
246
|
+
if (this.cleanupInterval) {
|
|
247
|
+
clearInterval(this.cleanupInterval);
|
|
248
|
+
this.cleanupInterval = undefined;
|
|
249
|
+
}
|
|
250
|
+
await super.disconnect();
|
|
251
|
+
}
|
|
252
|
+
}export{LRUMemoryCacheDriver};//# sourceMappingURL=lru-memory-cache-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-memory-cache-driver.js","sources":["../../src/drivers/lru-memory-cache-driver.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { GenericObject } from "@mongez/reinforcements";
|
|
3
|
+
import type { CacheDriver, CacheKey, MemoryCacheOptions } from "../types";
|
|
4
|
+
import { BaseCacheDriver } from "./base-cache-driver";
|
|
5
|
+
export declare class MemoryCacheDriver extends BaseCacheDriver<MemoryCacheDriver, MemoryCacheOptions> implements CacheDriver<MemoryCacheDriver, MemoryCacheOptions> {
|
|
6
|
+
/**
|
|
7
|
+
* {@inheritdoc}
|
|
8
|
+
*/
|
|
9
|
+
name: string;
|
|
10
|
+
/**
|
|
11
|
+
* Cached data
|
|
12
|
+
*/
|
|
13
|
+
data: GenericObject;
|
|
14
|
+
/**
|
|
15
|
+
* List of data that will be cleared from cache
|
|
16
|
+
*/
|
|
17
|
+
protected temporaryData: Record<string, {
|
|
18
|
+
key: string;
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Cleanup interval reference
|
|
23
|
+
*/
|
|
24
|
+
protected cleanupInterval?: NodeJS.Timeout;
|
|
25
|
+
/**
|
|
26
|
+
* Access order tracking for LRU eviction (when maxSize is set)
|
|
27
|
+
*/
|
|
28
|
+
protected accessOrder: string[];
|
|
29
|
+
/**
|
|
30
|
+
* {@inheritdoc}
|
|
31
|
+
*/
|
|
32
|
+
constructor();
|
|
33
|
+
/**
|
|
34
|
+
* Start the cleanup process whenever a data that has a cache key is set
|
|
35
|
+
*/
|
|
36
|
+
startCleanup(): void;
|
|
37
|
+
/**
|
|
38
|
+
* {@inheritdoc}
|
|
39
|
+
*/
|
|
40
|
+
removeNamespace(namespace: string): Promise<this>;
|
|
41
|
+
/**
|
|
42
|
+
* {@inheritdoc}
|
|
43
|
+
*/
|
|
44
|
+
set(key: CacheKey, value: any, ttl?: number): Promise<this>;
|
|
45
|
+
/**
|
|
46
|
+
* {@inheritdoc}
|
|
47
|
+
*/
|
|
48
|
+
get(key: CacheKey): Promise<any>;
|
|
49
|
+
/**
|
|
50
|
+
* {@inheritdoc}
|
|
51
|
+
*/
|
|
52
|
+
remove(key: CacheKey): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* {@inheritdoc}
|
|
55
|
+
*/
|
|
56
|
+
flush(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Set the temporary data
|
|
59
|
+
*/
|
|
60
|
+
protected setTemporaryData(key: CacheKey, parsedKey: string, ttl: number): void;
|
|
61
|
+
/**
|
|
62
|
+
* Track access for LRU eviction
|
|
63
|
+
*/
|
|
64
|
+
protected trackAccess(key: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Remove key from access order tracking
|
|
67
|
+
*/
|
|
68
|
+
protected removeFromAccessOrder(key: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Enforce max size by evicting least recently used items
|
|
71
|
+
*/
|
|
72
|
+
protected enforceMaxSize(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Get current cache size (number of cached items)
|
|
75
|
+
*/
|
|
76
|
+
protected getCacheSize(): number;
|
|
77
|
+
/**
|
|
78
|
+
* {@inheritdoc}
|
|
79
|
+
*/
|
|
80
|
+
disconnect(): Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=memory-cache-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache-driver.d.ts","sourceRoot":"","sources":["../../src/drivers/memory-cache-driver.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAEV,WAAW,EACX,QAAQ,EACR,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,qBAAa,iBACX,SAAQ,eAAe,CAAC,iBAAiB,EAAE,kBAAkB,CAC7D,YAAW,WAAW,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAE7D;;OAEG;IACI,IAAI,SAAY;IAEvB;;OAEG;IACI,IAAI,EAAE,aAAa,CAAM;IAEhC;;OAEG;IACH,SAAS,CAAC,aAAa,EAAE,MAAM,CAC7B,MAAM,EACN;QACE,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;KACnB,CACF,CAAM;IAEP;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAM;IAErC;;OAEG;;IAOH;;OAEG;IACI,YAAY;IAyBnB;;OAEG;IACU,eAAe,CAAC,SAAS,EAAE,MAAM;IAY9C;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM;IAsCxD;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,QAAQ;IA6B9B;;OAEG;IACU,MAAM,CAAC,GAAG,EAAE,QAAQ;IAmBjC;;OAEG;IACU,KAAK;IAelB;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAOxE;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM;IAajC;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM;IAO3C;;OAEG;cACa,cAAc;IAmB9B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,MAAM;IAKhC;;OAEG;IACU,UAAU;CASxB"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import {unset,get,set}from'@mongez/reinforcements';import {BaseCacheDriver}from'./base-cache-driver.js';class MemoryCacheDriver extends BaseCacheDriver {
|
|
2
|
+
/**
|
|
3
|
+
* {@inheritdoc}
|
|
4
|
+
*/
|
|
5
|
+
name = "memory";
|
|
6
|
+
/**
|
|
7
|
+
* Cached data
|
|
8
|
+
*/
|
|
9
|
+
data = {};
|
|
10
|
+
/**
|
|
11
|
+
* List of data that will be cleared from cache
|
|
12
|
+
*/
|
|
13
|
+
temporaryData = {};
|
|
14
|
+
/**
|
|
15
|
+
* Cleanup interval reference
|
|
16
|
+
*/
|
|
17
|
+
cleanupInterval;
|
|
18
|
+
/**
|
|
19
|
+
* Access order tracking for LRU eviction (when maxSize is set)
|
|
20
|
+
*/
|
|
21
|
+
accessOrder = [];
|
|
22
|
+
/**
|
|
23
|
+
* {@inheritdoc}
|
|
24
|
+
*/
|
|
25
|
+
constructor() {
|
|
26
|
+
super();
|
|
27
|
+
this.startCleanup();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start the cleanup process whenever a data that has a cache key is set
|
|
31
|
+
*/
|
|
32
|
+
startCleanup() {
|
|
33
|
+
// Clear existing interval if any
|
|
34
|
+
if (this.cleanupInterval) {
|
|
35
|
+
clearInterval(this.cleanupInterval);
|
|
36
|
+
}
|
|
37
|
+
this.cleanupInterval = setInterval(async () => {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
for (const key in this.temporaryData) {
|
|
40
|
+
if (this.temporaryData[key].expiresAt <= now) {
|
|
41
|
+
await this.remove(this.temporaryData[key].key);
|
|
42
|
+
delete this.temporaryData[key];
|
|
43
|
+
this.log("expired", key);
|
|
44
|
+
// Emit expired event
|
|
45
|
+
await this.emit("expired", { key });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, 1000);
|
|
49
|
+
// do not block the process from exiting
|
|
50
|
+
this.cleanupInterval.unref();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* {@inheritdoc}
|
|
54
|
+
*/
|
|
55
|
+
async removeNamespace(namespace) {
|
|
56
|
+
this.log("clearing", namespace);
|
|
57
|
+
namespace = this.parseKey(namespace);
|
|
58
|
+
unset(this.data, [namespace]);
|
|
59
|
+
this.log("cleared", namespace);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* {@inheritdoc}
|
|
64
|
+
*/
|
|
65
|
+
async set(key, value, ttl) {
|
|
66
|
+
const parsedKey = this.parseKey(key);
|
|
67
|
+
this.log("caching", parsedKey);
|
|
68
|
+
if (ttl === undefined) {
|
|
69
|
+
ttl = this.ttl;
|
|
70
|
+
}
|
|
71
|
+
const data = this.prepareDataForStorage(value, ttl);
|
|
72
|
+
if (ttl) {
|
|
73
|
+
// it means we need to check for expiration
|
|
74
|
+
this.setTemporaryData(key, parsedKey, ttl);
|
|
75
|
+
}
|
|
76
|
+
// Check if key already exists
|
|
77
|
+
const existingData = get(this.data, parsedKey);
|
|
78
|
+
const isNewKey = !existingData;
|
|
79
|
+
set(this.data, parsedKey, data);
|
|
80
|
+
// Track access for LRU eviction
|
|
81
|
+
this.trackAccess(parsedKey);
|
|
82
|
+
// Check size limit and evict if necessary
|
|
83
|
+
if (isNewKey && this.options.maxSize) {
|
|
84
|
+
await this.enforceMaxSize();
|
|
85
|
+
}
|
|
86
|
+
this.log("cached", parsedKey);
|
|
87
|
+
// Emit set event
|
|
88
|
+
await this.emit("set", { key: parsedKey, value, ttl });
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* {@inheritdoc}
|
|
93
|
+
*/
|
|
94
|
+
async get(key) {
|
|
95
|
+
const parsedKey = this.parseKey(key);
|
|
96
|
+
this.log("fetching", parsedKey);
|
|
97
|
+
const value = get(this.data, parsedKey);
|
|
98
|
+
if (!value) {
|
|
99
|
+
this.log("notFound", parsedKey);
|
|
100
|
+
// Emit miss event
|
|
101
|
+
await this.emit("miss", { key: parsedKey });
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const result = await this.parseCachedData(parsedKey, value);
|
|
105
|
+
if (result === null) {
|
|
106
|
+
// Expired
|
|
107
|
+
await this.emit("miss", { key: parsedKey });
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Track access for LRU
|
|
111
|
+
this.trackAccess(parsedKey);
|
|
112
|
+
// Emit hit event
|
|
113
|
+
await this.emit("hit", { key: parsedKey, value: result });
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* {@inheritdoc}
|
|
119
|
+
*/
|
|
120
|
+
async remove(key) {
|
|
121
|
+
const parsedKey = this.parseKey(key);
|
|
122
|
+
this.log("removing", parsedKey);
|
|
123
|
+
unset(this.data, [parsedKey]);
|
|
124
|
+
// Clean up from temporaryData as well
|
|
125
|
+
delete this.temporaryData[parsedKey];
|
|
126
|
+
// Remove from access order
|
|
127
|
+
this.removeFromAccessOrder(parsedKey);
|
|
128
|
+
this.log("removed", parsedKey);
|
|
129
|
+
// Emit removed event
|
|
130
|
+
await this.emit("removed", { key: parsedKey });
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* {@inheritdoc}
|
|
134
|
+
*/
|
|
135
|
+
async flush() {
|
|
136
|
+
this.log("flushing");
|
|
137
|
+
if (this.options.globalPrefix) {
|
|
138
|
+
this.removeNamespace("");
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.data = {};
|
|
142
|
+
this.accessOrder = [];
|
|
143
|
+
}
|
|
144
|
+
this.log("flushed");
|
|
145
|
+
// Emit flushed event
|
|
146
|
+
await this.emit("flushed");
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Set the temporary data
|
|
150
|
+
*/
|
|
151
|
+
setTemporaryData(key, parsedKey, ttl) {
|
|
152
|
+
this.temporaryData[parsedKey] = {
|
|
153
|
+
key: JSON.stringify(key),
|
|
154
|
+
expiresAt: Date.now() + ttl * 1000,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Track access for LRU eviction
|
|
159
|
+
*/
|
|
160
|
+
trackAccess(key) {
|
|
161
|
+
if (!this.options.maxSize)
|
|
162
|
+
return;
|
|
163
|
+
// Remove key from current position
|
|
164
|
+
const index = this.accessOrder.indexOf(key);
|
|
165
|
+
if (index > -1) {
|
|
166
|
+
this.accessOrder.splice(index, 1);
|
|
167
|
+
}
|
|
168
|
+
// Add to end (most recently used)
|
|
169
|
+
this.accessOrder.push(key);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Remove key from access order tracking
|
|
173
|
+
*/
|
|
174
|
+
removeFromAccessOrder(key) {
|
|
175
|
+
const index = this.accessOrder.indexOf(key);
|
|
176
|
+
if (index > -1) {
|
|
177
|
+
this.accessOrder.splice(index, 1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Enforce max size by evicting least recently used items
|
|
182
|
+
*/
|
|
183
|
+
async enforceMaxSize() {
|
|
184
|
+
if (!this.options.maxSize)
|
|
185
|
+
return;
|
|
186
|
+
// Count actual cache items (excluding internal metadata)
|
|
187
|
+
const cacheSize = this.getCacheSize();
|
|
188
|
+
while (cacheSize > this.options.maxSize && this.accessOrder.length > 0) {
|
|
189
|
+
// Evict least recently used (first in array)
|
|
190
|
+
const lruKey = this.accessOrder.shift();
|
|
191
|
+
if (lruKey) {
|
|
192
|
+
this.log("removing", lruKey);
|
|
193
|
+
unset(this.data, [lruKey]);
|
|
194
|
+
delete this.temporaryData[lruKey];
|
|
195
|
+
this.log("removed", lruKey);
|
|
196
|
+
// Could emit 'evicted' event if we add that type
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get current cache size (number of cached items)
|
|
202
|
+
*/
|
|
203
|
+
getCacheSize() {
|
|
204
|
+
// Count top-level keys in data object
|
|
205
|
+
return Object.keys(this.data).length;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* {@inheritdoc}
|
|
209
|
+
*/
|
|
210
|
+
async disconnect() {
|
|
211
|
+
// Clear the cleanup interval to prevent memory leaks
|
|
212
|
+
if (this.cleanupInterval) {
|
|
213
|
+
clearInterval(this.cleanupInterval);
|
|
214
|
+
this.cleanupInterval = undefined;
|
|
215
|
+
}
|
|
216
|
+
await super.disconnect();
|
|
217
|
+
}
|
|
218
|
+
}export{MemoryCacheDriver};//# sourceMappingURL=memory-cache-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache-driver.js","sources":["../../src/drivers/memory-cache-driver.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CacheDriver, CacheKey, MemoryExtendedCacheOptions } from "../types";
|
|
2
|
+
import { MemoryCacheDriver } from "./memory-cache-driver";
|
|
3
|
+
export declare class MemoryExtendedCacheDriver extends MemoryCacheDriver implements CacheDriver<MemoryExtendedCacheDriver, MemoryExtendedCacheOptions> {
|
|
4
|
+
/**
|
|
5
|
+
* {@inheritdoc}
|
|
6
|
+
*/
|
|
7
|
+
name: string;
|
|
8
|
+
/**
|
|
9
|
+
* {@inheritdoc}
|
|
10
|
+
*/
|
|
11
|
+
get(key: CacheKey): Promise<any>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=memory-extended-cache-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-extended-cache-driver.d.ts","sourceRoot":"","sources":["../../src/drivers/memory-extended-cache-driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,WAAW,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBAAa,yBACX,SAAQ,iBACR,YAAW,WAAW,CAAC,yBAAyB,EAAE,0BAA0B,CAAC;IAE7E;;OAEG;IACI,IAAI,SAAoB;IAE/B;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,QAAQ;CAsB/B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {get}from'@mongez/reinforcements';import {MemoryCacheDriver}from'./memory-cache-driver.js';class MemoryExtendedCacheDriver extends MemoryCacheDriver {
|
|
2
|
+
/**
|
|
3
|
+
* {@inheritdoc}
|
|
4
|
+
*/
|
|
5
|
+
name = "memoryExtended";
|
|
6
|
+
/**
|
|
7
|
+
* {@inheritdoc}
|
|
8
|
+
*/
|
|
9
|
+
async get(key) {
|
|
10
|
+
const parsedKey = this.parseKey(key);
|
|
11
|
+
this.log("fetching", parsedKey);
|
|
12
|
+
const value = get(this.data, parsedKey);
|
|
13
|
+
if (!value) {
|
|
14
|
+
this.log("notFound", parsedKey);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const ttl = value.ttl || this.options.ttl;
|
|
18
|
+
if (ttl) {
|
|
19
|
+
// reset the expiration time
|
|
20
|
+
this.setTemporaryData(key, parsedKey, ttl);
|
|
21
|
+
value.expiresAt = this.getExpiresAt(ttl);
|
|
22
|
+
}
|
|
23
|
+
return this.parseCachedData(parsedKey, value);
|
|
24
|
+
}
|
|
25
|
+
}export{MemoryExtendedCacheDriver};//# sourceMappingURL=memory-extended-cache-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-extended-cache-driver.js","sources":["../../src/drivers/memory-extended-cache-driver.ts"],"sourcesContent":[null],"names":[],"mappings":"kGAIM,MAAO,yBACX,SAAQ,iBAAiB,CAAA;AAGzB;;AAEG;IACI,IAAI,GAAG,gBAAgB,CAAC;AAE/B;;AAEG;IACI,MAAM,GAAG,CAAC,GAAa,EAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAErC,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAc,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAChC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAE1C,QAAA,IAAI,GAAG,EAAE;;YAEP,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YAC3C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAC1C,SAAA;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAC/C;AACF"}
|