@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.
Files changed (62) hide show
  1. package/README.md +425 -0
  2. package/dist/backends/index.d.ts +4 -0
  3. package/dist/backends/index.d.ts.map +1 -0
  4. package/dist/backends/index.js +27 -0
  5. package/dist/backends/index.js.map +1 -0
  6. package/dist/backends/memory.d.ts +21 -0
  7. package/dist/backends/memory.d.ts.map +1 -0
  8. package/dist/backends/memory.js +136 -0
  9. package/dist/backends/memory.js.map +1 -0
  10. package/dist/backends/multi-tier.d.ts +17 -0
  11. package/dist/backends/multi-tier.d.ts.map +1 -0
  12. package/dist/backends/multi-tier.js +150 -0
  13. package/dist/backends/multi-tier.js.map +1 -0
  14. package/dist/backends/redis.d.ts +18 -0
  15. package/dist/backends/redis.d.ts.map +1 -0
  16. package/dist/backends/redis.js +166 -0
  17. package/dist/backends/redis.js.map +1 -0
  18. package/dist/constants.d.ts +22 -0
  19. package/dist/constants.d.ts.map +1 -0
  20. package/dist/constants.js +32 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/index.d.ts +7 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +34 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/manager.d.ts +26 -0
  27. package/dist/manager.d.ts.map +1 -0
  28. package/dist/manager.js +171 -0
  29. package/dist/manager.js.map +1 -0
  30. package/dist/serializers/binary.d.ts +6 -0
  31. package/dist/serializers/binary.d.ts.map +1 -0
  32. package/dist/serializers/binary.js +22 -0
  33. package/dist/serializers/binary.js.map +1 -0
  34. package/dist/serializers/index.d.ts +3 -0
  35. package/dist/serializers/index.d.ts.map +1 -0
  36. package/dist/serializers/index.js +26 -0
  37. package/dist/serializers/index.js.map +1 -0
  38. package/dist/serializers/json.d.ts +6 -0
  39. package/dist/serializers/json.d.ts.map +1 -0
  40. package/dist/serializers/json.js +20 -0
  41. package/dist/serializers/json.js.map +1 -0
  42. package/dist/strategies/index.d.ts +6 -0
  43. package/dist/strategies/index.d.ts.map +1 -0
  44. package/dist/strategies/index.js +41 -0
  45. package/dist/strategies/index.js.map +1 -0
  46. package/dist/strategies/lfu.d.ts +10 -0
  47. package/dist/strategies/lfu.d.ts.map +1 -0
  48. package/dist/strategies/lfu.js +43 -0
  49. package/dist/strategies/lfu.js.map +1 -0
  50. package/dist/strategies/lru.d.ts +11 -0
  51. package/dist/strategies/lru.d.ts.map +1 -0
  52. package/dist/strategies/lru.js +48 -0
  53. package/dist/strategies/lru.js.map +1 -0
  54. package/dist/strategies/ttl.d.ts +9 -0
  55. package/dist/strategies/ttl.d.ts.map +1 -0
  56. package/dist/strategies/ttl.js +47 -0
  57. package/dist/strategies/ttl.js.map +1 -0
  58. package/dist/types.d.ts +73 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +10 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +65 -0
@@ -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,6 @@
1
+ import type { Serializer } from '../types';
2
+ export declare class BinarySerializer implements Serializer {
3
+ serialize<T>(value: T): Buffer;
4
+ deserialize<T>(data: Buffer): T;
5
+ }
6
+ //# sourceMappingURL=binary.d.ts.map
@@ -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,3 @@
1
+ export * from './json';
2
+ export * from './binary';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ import type { Serializer } from '../types';
2
+ export declare class JSONSerializer implements Serializer {
3
+ serialize<T>(value: T): string;
4
+ deserialize<T>(data: string): T;
5
+ }
6
+ //# sourceMappingURL=json.d.ts.map
@@ -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,6 @@
1
+ import type { CacheStrategy } from '../types';
2
+ export * from './lru';
3
+ export * from './lfu';
4
+ export * from './ttl';
5
+ export declare function createStrategy(strategyType: 'lru' | 'lfu' | 'ttl'): CacheStrategy;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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