@bernierllc/cache-manager 1.0.1
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/README.md +425 -0
- package/dist/backends/index.d.ts +4 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +27 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/memory.d.ts +21 -0
- package/dist/backends/memory.d.ts.map +1 -0
- package/dist/backends/memory.js +136 -0
- package/dist/backends/memory.js.map +1 -0
- package/dist/backends/multi-tier.d.ts +17 -0
- package/dist/backends/multi-tier.d.ts.map +1 -0
- package/dist/backends/multi-tier.js +150 -0
- package/dist/backends/multi-tier.js.map +1 -0
- package/dist/backends/redis.d.ts +18 -0
- package/dist/backends/redis.d.ts.map +1 -0
- package/dist/backends/redis.js +166 -0
- package/dist/backends/redis.js.map +1 -0
- package/dist/constants.d.ts +22 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +32 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +26 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +171 -0
- package/dist/manager.js.map +1 -0
- package/dist/serializers/binary.d.ts +6 -0
- package/dist/serializers/binary.d.ts.map +1 -0
- package/dist/serializers/binary.js +22 -0
- package/dist/serializers/binary.js.map +1 -0
- package/dist/serializers/index.d.ts +3 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/index.js +26 -0
- package/dist/serializers/index.js.map +1 -0
- package/dist/serializers/json.d.ts +6 -0
- package/dist/serializers/json.d.ts.map +1 -0
- package/dist/serializers/json.js +20 -0
- package/dist/serializers/json.js.map +1 -0
- package/dist/strategies/index.d.ts +6 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +41 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/lfu.d.ts +10 -0
- package/dist/strategies/lfu.d.ts.map +1 -0
- package/dist/strategies/lfu.js +43 -0
- package/dist/strategies/lfu.js.map +1 -0
- package/dist/strategies/lru.d.ts +11 -0
- package/dist/strategies/lru.d.ts.map +1 -0
- package/dist/strategies/lru.js +48 -0
- package/dist/strategies/lru.js.map +1 -0
- package/dist/strategies/ttl.d.ts +9 -0
- package/dist/strategies/ttl.d.ts.map +1 -0
- package/dist/strategies/ttl.js +47 -0
- package/dist/strategies/ttl.js.map +1 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +65 -0
package/dist/manager.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.CacheManager = void 0;
|
|
11
|
+
const memory_1 = require("./backends/memory");
|
|
12
|
+
const multi_tier_1 = require("./backends/multi-tier");
|
|
13
|
+
const constants_1 = require("./constants");
|
|
14
|
+
class CacheManager {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.options = { ...constants_1.DEFAULT_CACHE_OPTIONS, ...options };
|
|
17
|
+
// Initialize backend
|
|
18
|
+
if (options.backend) {
|
|
19
|
+
if (Array.isArray(options.backend)) {
|
|
20
|
+
this.backend = new multi_tier_1.MultiTierCacheBackend({ backends: options.backend });
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
this.backend = options.backend;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Default to memory backend
|
|
28
|
+
const memoryOptions = {
|
|
29
|
+
maxSize: this.options.maxSize ?? constants_1.DEFAULT_CACHE_OPTIONS.maxSize,
|
|
30
|
+
strategy: this.options.strategy ?? constants_1.DEFAULT_CACHE_OPTIONS.strategy
|
|
31
|
+
};
|
|
32
|
+
if (this.options.onEviction) {
|
|
33
|
+
memoryOptions.onEviction = this.options.onEviction;
|
|
34
|
+
}
|
|
35
|
+
if (this.options.onExpiration) {
|
|
36
|
+
memoryOptions.onExpiration = this.options.onExpiration;
|
|
37
|
+
}
|
|
38
|
+
this.backend = new memory_1.MemoryCacheBackend(memoryOptions);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async get(key) {
|
|
42
|
+
const prefixedKey = (this.options.keyPrefix || '') + key;
|
|
43
|
+
const entry = await this.backend.get(prefixedKey);
|
|
44
|
+
return entry ? entry.value : null;
|
|
45
|
+
}
|
|
46
|
+
async set(key, value, ttl, tags) {
|
|
47
|
+
const prefixedKey = (this.options.keyPrefix || '') + key;
|
|
48
|
+
const now = new Date();
|
|
49
|
+
const effectiveTtl = ttl || this.options.defaultTtl;
|
|
50
|
+
const entry = {
|
|
51
|
+
value,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
accessedAt: now,
|
|
54
|
+
...(effectiveTtl && { expiresAt: new Date(now.getTime() + effectiveTtl) }),
|
|
55
|
+
accessCount: 0,
|
|
56
|
+
...(tags && { tags }),
|
|
57
|
+
metadata: {}
|
|
58
|
+
};
|
|
59
|
+
await this.backend.set(prefixedKey, entry, effectiveTtl);
|
|
60
|
+
}
|
|
61
|
+
async delete(key) {
|
|
62
|
+
const prefixedKey = (this.options.keyPrefix || '') + key;
|
|
63
|
+
return await this.backend.delete(prefixedKey);
|
|
64
|
+
}
|
|
65
|
+
async clear() {
|
|
66
|
+
await this.backend.clear();
|
|
67
|
+
}
|
|
68
|
+
// Advanced operations
|
|
69
|
+
async mget(keys) {
|
|
70
|
+
const promises = keys.map(key => this.get(key));
|
|
71
|
+
return await Promise.all(promises);
|
|
72
|
+
}
|
|
73
|
+
async mset(entries, ttl) {
|
|
74
|
+
const promises = Object.entries(entries).map(([key, value]) => this.set(key, value, ttl));
|
|
75
|
+
await Promise.all(promises);
|
|
76
|
+
}
|
|
77
|
+
async getOrSet(key, factory, ttl) {
|
|
78
|
+
let value = await this.get(key);
|
|
79
|
+
if (value === null) {
|
|
80
|
+
value = await factory();
|
|
81
|
+
await this.set(key, value, ttl);
|
|
82
|
+
}
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
// Invalidation
|
|
86
|
+
async invalidateByTag(tag) {
|
|
87
|
+
const allKeys = await this.backend.keys();
|
|
88
|
+
for (const key of allKeys) {
|
|
89
|
+
const entry = await this.backend.get(key);
|
|
90
|
+
if (entry?.tags?.includes(tag)) {
|
|
91
|
+
await this.backend.delete(key);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async invalidateByPattern(pattern) {
|
|
96
|
+
const keys = await this.backend.keys(pattern);
|
|
97
|
+
const promises = keys.map(key => this.backend.delete(key));
|
|
98
|
+
await Promise.all(promises);
|
|
99
|
+
}
|
|
100
|
+
async touch(key) {
|
|
101
|
+
const prefixedKey = (this.options.keyPrefix || '') + key;
|
|
102
|
+
const entry = await this.backend.get(prefixedKey);
|
|
103
|
+
if (entry) {
|
|
104
|
+
entry.accessedAt = new Date();
|
|
105
|
+
entry.accessCount++;
|
|
106
|
+
await this.backend.set(prefixedKey, entry);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
// Utilities
|
|
112
|
+
async getStats() {
|
|
113
|
+
return await this.backend.getStats();
|
|
114
|
+
}
|
|
115
|
+
getBackend() {
|
|
116
|
+
return this.backend;
|
|
117
|
+
}
|
|
118
|
+
async has(key) {
|
|
119
|
+
const value = await this.get(key);
|
|
120
|
+
return value !== null;
|
|
121
|
+
}
|
|
122
|
+
async keys(pattern) {
|
|
123
|
+
const keys = await this.backend.keys(pattern);
|
|
124
|
+
const prefix = this.options.keyPrefix || '';
|
|
125
|
+
if (prefix) {
|
|
126
|
+
return keys
|
|
127
|
+
.filter(key => key.startsWith(prefix))
|
|
128
|
+
.map(key => key.substring(prefix.length));
|
|
129
|
+
}
|
|
130
|
+
return keys;
|
|
131
|
+
}
|
|
132
|
+
async size() {
|
|
133
|
+
return await this.backend.size();
|
|
134
|
+
}
|
|
135
|
+
// Cleanup operations
|
|
136
|
+
async cleanup() {
|
|
137
|
+
const allKeys = await this.backend.keys();
|
|
138
|
+
let cleanedCount = 0;
|
|
139
|
+
for (const key of allKeys) {
|
|
140
|
+
const entry = await this.backend.get(key);
|
|
141
|
+
if (entry?.expiresAt && entry.expiresAt < new Date()) {
|
|
142
|
+
const deleted = await this.backend.delete(key);
|
|
143
|
+
if (deleted) {
|
|
144
|
+
cleanedCount++;
|
|
145
|
+
if (this.options.onExpiration) {
|
|
146
|
+
this.options.onExpiration(key, entry.value);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return cleanedCount;
|
|
152
|
+
}
|
|
153
|
+
startCleanupInterval(intervalMs = 5 * 60 * 1000) {
|
|
154
|
+
this.cleanupInterval = setInterval(async () => {
|
|
155
|
+
try {
|
|
156
|
+
await this.cleanup();
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error('Cache cleanup error:', error);
|
|
160
|
+
}
|
|
161
|
+
}, intervalMs);
|
|
162
|
+
}
|
|
163
|
+
stopCleanupInterval() {
|
|
164
|
+
if (this.cleanupInterval) {
|
|
165
|
+
clearInterval(this.cleanupInterval);
|
|
166
|
+
this.cleanupInterval = undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.CacheManager = CacheManager;
|
|
171
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../src/serializers/binary.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,qBAAa,gBAAiB,YAAW,UAAU;IACjD,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAK9B,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;CAIhC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BinarySerializer = void 0;
|
|
11
|
+
class BinarySerializer {
|
|
12
|
+
serialize(value) {
|
|
13
|
+
const jsonString = JSON.stringify(value);
|
|
14
|
+
return Buffer.from(jsonString, 'utf-8');
|
|
15
|
+
}
|
|
16
|
+
deserialize(data) {
|
|
17
|
+
const jsonString = data.toString('utf-8');
|
|
18
|
+
return JSON.parse(jsonString);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.BinarySerializer = BinarySerializer;
|
|
22
|
+
//# sourceMappingURL=binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../src/serializers/binary.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAIF,MAAa,gBAAgB;IAC3B,SAAS,CAAI,KAAQ;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW,CAAI,IAAY;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAM,CAAC;IACrC,CAAC;CACF;AAVD,4CAUC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serializers/index.ts"],"names":[],"mappings":"AAQA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./json"), exports);
|
|
25
|
+
__exportStar(require("./binary"), exports);
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serializers/index.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;;;;;;;;;;;;;;AAEF,yCAAuB;AACvB,2CAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/serializers/json.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAI9B,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;CAGhC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.JSONSerializer = void 0;
|
|
11
|
+
class JSONSerializer {
|
|
12
|
+
serialize(value) {
|
|
13
|
+
return JSON.stringify(value);
|
|
14
|
+
}
|
|
15
|
+
deserialize(data) {
|
|
16
|
+
return JSON.parse(data);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.JSONSerializer = JSONSerializer;
|
|
20
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/serializers/json.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAIF,MAAa,cAAc;IACzB,SAAS,CAAI,KAAQ;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAI,IAAY;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;CACF;AARD,wCAQC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AAEtB,wBAAgB,cAAc,CAC5B,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAClC,aAAa,CASf"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.createStrategy = createStrategy;
|
|
25
|
+
const lru_1 = require("./lru");
|
|
26
|
+
const lfu_1 = require("./lfu");
|
|
27
|
+
const ttl_1 = require("./ttl");
|
|
28
|
+
__exportStar(require("./lru"), exports);
|
|
29
|
+
__exportStar(require("./lfu"), exports);
|
|
30
|
+
__exportStar(require("./ttl"), exports);
|
|
31
|
+
function createStrategy(strategyType) {
|
|
32
|
+
switch (strategyType) {
|
|
33
|
+
case 'lru':
|
|
34
|
+
return new lru_1.LRUStrategy();
|
|
35
|
+
case 'lfu':
|
|
36
|
+
return new lfu_1.LFUStrategy();
|
|
37
|
+
case 'ttl':
|
|
38
|
+
return new ttl_1.TTLStrategy();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;;;;;;;;;;;;;;AAWF,wCAWC;AAnBD,+BAAoC;AACpC,+BAAoC;AACpC,+BAAoC;AAEpC,wCAAsB;AACtB,wCAAsB;AACtB,wCAAsB;AAEtB,SAAgB,cAAc,CAC5B,YAAmC;IAEnC,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,KAAK;YACR,OAAO,IAAI,iBAAW,EAAE,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,IAAI,iBAAW,EAAE,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,IAAI,iBAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CacheStrategy, CacheEntry } from '../types';
|
|
2
|
+
export declare class LFUStrategy implements CacheStrategy {
|
|
3
|
+
private frequencies;
|
|
4
|
+
recordAccess(key: string, _entry: CacheEntry): void;
|
|
5
|
+
recordSet(key: string, _entry: CacheEntry): void;
|
|
6
|
+
recordDelete(key: string): void;
|
|
7
|
+
selectForEviction(cache: Map<string, CacheEntry>): string | null;
|
|
8
|
+
clear(): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=lfu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lfu.d.ts","sourceRoot":"","sources":["../../src/strategies/lfu.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,WAAY,YAAW,aAAa;IAC/C,OAAO,CAAC,WAAW,CAAkC;IAErD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAKhD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI;IAehE,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.LFUStrategy = void 0;
|
|
11
|
+
class LFUStrategy {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.frequencies = new Map();
|
|
14
|
+
}
|
|
15
|
+
recordAccess(key, _entry) {
|
|
16
|
+
const currentFreq = this.frequencies.get(key) || 0;
|
|
17
|
+
this.frequencies.set(key, currentFreq + 1);
|
|
18
|
+
}
|
|
19
|
+
recordSet(key, _entry) {
|
|
20
|
+
// New entries start with frequency 1
|
|
21
|
+
this.frequencies.set(key, 1);
|
|
22
|
+
}
|
|
23
|
+
recordDelete(key) {
|
|
24
|
+
this.frequencies.delete(key);
|
|
25
|
+
}
|
|
26
|
+
selectForEviction(cache) {
|
|
27
|
+
let leastFrequent = null;
|
|
28
|
+
let minFrequency = Infinity;
|
|
29
|
+
for (const [key] of cache) {
|
|
30
|
+
const frequency = this.frequencies.get(key) || 0;
|
|
31
|
+
if (frequency < minFrequency) {
|
|
32
|
+
minFrequency = frequency;
|
|
33
|
+
leastFrequent = key;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return leastFrequent;
|
|
37
|
+
}
|
|
38
|
+
clear() {
|
|
39
|
+
this.frequencies.clear();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.LFUStrategy = LFUStrategy;
|
|
43
|
+
//# sourceMappingURL=lfu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lfu.js","sourceRoot":"","sources":["../../src/strategies/lfu.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAIF,MAAa,WAAW;IAAxB;QACU,gBAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAkCvD,CAAC;IAhCC,YAAY,CAAC,GAAW,EAAE,MAAkB;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,MAAkB;QACvC,qCAAqC;QACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,iBAAiB,CAAC,KAA8B;QAC9C,IAAI,aAAa,GAAkB,IAAI,CAAC;QACxC,IAAI,YAAY,GAAG,QAAQ,CAAC;QAE5B,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,SAAS,GAAG,YAAY,EAAE,CAAC;gBAC7B,YAAY,GAAG,SAAS,CAAC;gBACzB,aAAa,GAAG,GAAG,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF;AAnCD,kCAmCC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CacheStrategy, CacheEntry } from '../types';
|
|
2
|
+
export declare class LRUStrategy implements CacheStrategy {
|
|
3
|
+
private accessOrder;
|
|
4
|
+
recordAccess(key: string, _entry: CacheEntry): void;
|
|
5
|
+
recordSet(key: string, _entry: CacheEntry): void;
|
|
6
|
+
recordDelete(key: string): void;
|
|
7
|
+
selectForEviction(cache: Map<string, CacheEntry>): string | null;
|
|
8
|
+
clear(): void;
|
|
9
|
+
private removeKey;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=lru.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../src/strategies/lru.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,WAAY,YAAW,aAAa;IAC/C,OAAO,CAAC,WAAW,CAAgB;IAEnC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMnD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMhD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI;IAUhE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.LRUStrategy = void 0;
|
|
11
|
+
class LRUStrategy {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.accessOrder = [];
|
|
14
|
+
}
|
|
15
|
+
recordAccess(key, _entry) {
|
|
16
|
+
// Move to end (most recently used)
|
|
17
|
+
this.removeKey(key);
|
|
18
|
+
this.accessOrder.push(key);
|
|
19
|
+
}
|
|
20
|
+
recordSet(key, _entry) {
|
|
21
|
+
// New entries go to end
|
|
22
|
+
this.removeKey(key);
|
|
23
|
+
this.accessOrder.push(key);
|
|
24
|
+
}
|
|
25
|
+
recordDelete(key) {
|
|
26
|
+
this.removeKey(key);
|
|
27
|
+
}
|
|
28
|
+
selectForEviction(cache) {
|
|
29
|
+
// Return least recently used (first in access order)
|
|
30
|
+
for (const key of this.accessOrder) {
|
|
31
|
+
if (cache.has(key)) {
|
|
32
|
+
return key;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
clear() {
|
|
38
|
+
this.accessOrder = [];
|
|
39
|
+
}
|
|
40
|
+
removeKey(key) {
|
|
41
|
+
const index = this.accessOrder.indexOf(key);
|
|
42
|
+
if (index > -1) {
|
|
43
|
+
this.accessOrder.splice(index, 1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.LRUStrategy = LRUStrategy;
|
|
48
|
+
//# sourceMappingURL=lru.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru.js","sourceRoot":"","sources":["../../src/strategies/lru.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAIF,MAAa,WAAW;IAAxB;QACU,gBAAW,GAAa,EAAE,CAAC;IAsCrC,CAAC;IApCC,YAAY,CAAC,GAAW,EAAE,MAAkB;QAC1C,mCAAmC;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,MAAkB;QACvC,wBAAwB;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,iBAAiB,CAAC,KAA8B;QAC9C,qDAAqD;QACrD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAvCD,kCAuCC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CacheStrategy, CacheEntry } from '../types';
|
|
2
|
+
export declare class TTLStrategy implements CacheStrategy {
|
|
3
|
+
recordAccess(_key: string, _entry: CacheEntry): void;
|
|
4
|
+
recordSet(_key: string, _entry: CacheEntry): void;
|
|
5
|
+
recordDelete(_key: string): void;
|
|
6
|
+
selectForEviction(cache: Map<string, CacheEntry>): string | null;
|
|
7
|
+
clear(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ttl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ttl.d.ts","sourceRoot":"","sources":["../../src/strategies/ttl.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,WAAY,YAAW,aAAa;IAC/C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAIpD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAIjD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI;IAuBhE,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TTLStrategy = void 0;
|
|
11
|
+
class TTLStrategy {
|
|
12
|
+
recordAccess(_key, _entry) {
|
|
13
|
+
// TTL strategy doesn't track access patterns
|
|
14
|
+
}
|
|
15
|
+
recordSet(_key, _entry) {
|
|
16
|
+
// TTL strategy doesn't track set patterns
|
|
17
|
+
}
|
|
18
|
+
recordDelete(_key) {
|
|
19
|
+
// TTL strategy doesn't track delete patterns
|
|
20
|
+
}
|
|
21
|
+
selectForEviction(cache) {
|
|
22
|
+
let earliest = null;
|
|
23
|
+
let earliestTime = null;
|
|
24
|
+
// Find entry with earliest expiration time
|
|
25
|
+
for (const [key, entry] of cache) {
|
|
26
|
+
if (entry.expiresAt) {
|
|
27
|
+
if (!earliestTime || entry.expiresAt < earliestTime) {
|
|
28
|
+
earliestTime = entry.expiresAt;
|
|
29
|
+
earliest = key;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// If no expiration, use oldest creation time
|
|
34
|
+
if (!earliestTime || entry.createdAt < earliestTime) {
|
|
35
|
+
earliestTime = entry.createdAt;
|
|
36
|
+
earliest = key;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return earliest;
|
|
41
|
+
}
|
|
42
|
+
clear() {
|
|
43
|
+
// No state to clear for TTL strategy
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.TTLStrategy = TTLStrategy;
|
|
47
|
+
//# sourceMappingURL=ttl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ttl.js","sourceRoot":"","sources":["../../src/strategies/ttl.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAIF,MAAa,WAAW;IACtB,YAAY,CAAC,IAAY,EAAE,MAAkB;QAC3C,6CAA6C;IAC/C,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,MAAkB;QACxC,0CAA0C;IAC5C,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,6CAA6C;IAC/C,CAAC;IAED,iBAAiB,CAAC,KAA8B;QAC9C,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,YAAY,GAAgB,IAAI,CAAC;QAErC,2CAA2C;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;oBACpD,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC;oBAC/B,QAAQ,GAAG,GAAG,CAAC;gBACjB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;oBACpD,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC;oBAC/B,QAAQ,GAAG,GAAG,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK;QACH,qCAAqC;IACvC,CAAC;CACF;AAvCD,kCAuCC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface CacheOptions {
|
|
2
|
+
backend?: CacheBackend | CacheBackend[];
|
|
3
|
+
strategy?: 'lru' | 'lfu' | 'ttl';
|
|
4
|
+
maxSize?: number;
|
|
5
|
+
defaultTtl?: number;
|
|
6
|
+
serializer?: Serializer;
|
|
7
|
+
compression?: boolean;
|
|
8
|
+
keyPrefix?: string;
|
|
9
|
+
onEviction?: (key: string, value: unknown) => void;
|
|
10
|
+
onExpiration?: (key: string, value: unknown) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface CacheEntry<T = unknown> {
|
|
13
|
+
value: T;
|
|
14
|
+
createdAt: Date;
|
|
15
|
+
accessedAt: Date;
|
|
16
|
+
expiresAt?: Date;
|
|
17
|
+
accessCount: number;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface CacheStats {
|
|
22
|
+
hits: number;
|
|
23
|
+
misses: number;
|
|
24
|
+
hitRate: number;
|
|
25
|
+
size: number;
|
|
26
|
+
memoryUsage: number;
|
|
27
|
+
evictions: number;
|
|
28
|
+
expirations: number;
|
|
29
|
+
}
|
|
30
|
+
export interface CacheBackend {
|
|
31
|
+
get<T>(key: string): Promise<CacheEntry<T> | null>;
|
|
32
|
+
set<T>(key: string, entry: CacheEntry<T>, ttl?: number): Promise<void>;
|
|
33
|
+
delete(key: string): Promise<boolean>;
|
|
34
|
+
clear(): Promise<void>;
|
|
35
|
+
keys(pattern?: string): Promise<string[]>;
|
|
36
|
+
size(): Promise<number>;
|
|
37
|
+
getStats(): Promise<CacheStats>;
|
|
38
|
+
}
|
|
39
|
+
export interface CacheStrategy {
|
|
40
|
+
recordAccess(key: string, entry: CacheEntry): void;
|
|
41
|
+
recordSet(key: string, entry: CacheEntry): void;
|
|
42
|
+
recordDelete(key: string): void;
|
|
43
|
+
selectForEviction(cache: Map<string, CacheEntry>): string | null;
|
|
44
|
+
clear(): void;
|
|
45
|
+
}
|
|
46
|
+
export interface Serializer {
|
|
47
|
+
serialize<T>(value: T): Buffer | string;
|
|
48
|
+
deserialize<T>(data: Buffer | string): T;
|
|
49
|
+
}
|
|
50
|
+
export interface MemoryCacheOptions {
|
|
51
|
+
maxSize?: number;
|
|
52
|
+
strategy?: 'lru' | 'lfu' | 'ttl';
|
|
53
|
+
onEviction?: (key: string, value: unknown) => void;
|
|
54
|
+
onExpiration?: (key: string, value: unknown) => void;
|
|
55
|
+
}
|
|
56
|
+
export interface RedisCacheOptions {
|
|
57
|
+
host?: string;
|
|
58
|
+
port?: number;
|
|
59
|
+
password?: string;
|
|
60
|
+
db?: number;
|
|
61
|
+
keyPrefix?: string;
|
|
62
|
+
connectionString?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface DatabaseCacheOptions {
|
|
65
|
+
connectionString: string;
|
|
66
|
+
tableName?: string;
|
|
67
|
+
keyPrefix?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface MultiTierCacheOptions {
|
|
70
|
+
backends: CacheBackend[];
|
|
71
|
+
strategy?: 'lru' | 'lfu' | 'ttl';
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
//# sourceMappingURL=types.js.map
|