@explorins/pers-sdk 1.6.10 → 1.6.12
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/chunks/{explorer.utils-GpskbLl1.cjs → explorer.utils-BfWBpq26.cjs} +224 -214
- package/dist/chunks/explorer.utils-BfWBpq26.cjs.map +1 -0
- package/dist/chunks/{explorer.utils-Ckll15ja.js → explorer.utils-O4TGwQB1.js} +224 -214
- package/dist/chunks/explorer.utils-O4TGwQB1.js.map +1 -0
- package/dist/chunks/index-60201NKa.js +265 -0
- package/dist/chunks/index-60201NKa.js.map +1 -0
- package/dist/chunks/index-CcQkbZBZ.cjs +269 -0
- package/dist/chunks/index-CcQkbZBZ.cjs.map +1 -0
- package/dist/chunks/{pers-sdk-DOuNyWFC.js → pers-sdk-CpK-yTid.js} +31 -99
- package/dist/chunks/pers-sdk-CpK-yTid.js.map +1 -0
- package/dist/chunks/{pers-sdk-kb7j1DVU.cjs → pers-sdk-nfljnU3z.cjs} +35 -103
- package/dist/chunks/pers-sdk-nfljnU3z.cjs.map +1 -0
- package/dist/chunks/{web3-chain-service-D75TcHkh.cjs → web3-chain-service-CCs1U95-.cjs} +191 -109
- package/dist/chunks/web3-chain-service-CCs1U95-.cjs.map +1 -0
- package/dist/chunks/{web3-chain-service-Dp5Z8p9I.js → web3-chain-service-DniirmTp.js} +190 -110
- package/dist/chunks/web3-chain-service-DniirmTp.js.map +1 -0
- package/dist/core/auth/default-auth-provider.d.ts.map +1 -1
- package/dist/core/auth/refresh-manager.d.ts.map +1 -1
- package/dist/core/auth/services/auth-service.d.ts +5 -0
- package/dist/core/auth/services/auth-service.d.ts.map +1 -1
- package/dist/core/cache/cache.service.d.ts +82 -0
- package/dist/core/cache/cache.service.d.ts.map +1 -0
- package/dist/core/cache/index.d.ts +13 -0
- package/dist/core/cache/index.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/pers-api-client.d.ts.map +1 -1
- package/dist/core/pers-config.d.ts +4 -0
- package/dist/core/pers-config.d.ts.map +1 -1
- package/dist/core.cjs +7 -3
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +4 -3
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +9 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/web3/application/web3-application.service.d.ts.map +1 -1
- package/dist/web3/domain/models/index.d.ts +1 -1
- package/dist/web3/domain/models/index.d.ts.map +1 -1
- package/dist/web3/domain/services/metadata-domain.service.d.ts +6 -1
- package/dist/web3/domain/services/metadata-domain.service.d.ts.map +1 -1
- package/dist/web3/domain/services/token-domain.service.d.ts +30 -14
- package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/ipfs-api.d.ts +6 -1
- package/dist/web3/infrastructure/api/ipfs-api.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/web3-api.d.ts.map +1 -1
- package/dist/web3-chain/api/web3-chain-api.d.ts +0 -1
- package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -1
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts +2 -10
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -1
- package/dist/web3-chain/services/web3-chain-service.d.ts +11 -5
- package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -1
- package/dist/web3-chain.cjs +2 -1
- package/dist/web3-chain.cjs.map +1 -1
- package/dist/web3-chain.js +2 -1
- package/dist/web3-chain.js.map +1 -1
- package/dist/web3.cjs +2 -1
- package/dist/web3.cjs.map +1 -1
- package/dist/web3.js +2 -1
- package/dist/web3.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/explorer.utils-Ckll15ja.js.map +0 -1
- package/dist/chunks/explorer.utils-GpskbLl1.cjs.map +0 -1
- package/dist/chunks/pers-sdk-DOuNyWFC.js.map +0 -1
- package/dist/chunks/pers-sdk-kb7j1DVU.cjs.map +0 -1
- package/dist/chunks/web3-chain-service-D75TcHkh.cjs.map +0 -1
- package/dist/chunks/web3-chain-service-Dp5Z8p9I.js.map +0 -1
- package/dist/web3-chain/services/ethers-provider.service.d.ts +0 -11
- package/dist/web3-chain/services/ethers-provider.service.d.ts.map +0 -1
- package/dist/web3-chain/services/public-http-provider.service.d.ts +0 -1
- package/dist/web3-chain/services/public-http-provider.service.d.ts.map +0 -1
- package/dist/web3-chain/services/web3-provider.service.d.ts +0 -1
- package/dist/web3-chain/services/web3-provider.service.d.ts.map +0 -1
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Cache Service for PERS SDK
|
|
3
|
+
* Provides unified caching with memory management and consistent policies
|
|
4
|
+
*/
|
|
5
|
+
// Default cache configuration constants
|
|
6
|
+
const DEFAULT_CACHE_CONFIG = {
|
|
7
|
+
defaultTtl: 30 * 60 * 1000, // 30 minutes
|
|
8
|
+
maxMemoryMB: 50, // 50MB cache limit
|
|
9
|
+
cleanupInterval: 5 * 60 * 1000, // Cleanup every 5 minutes
|
|
10
|
+
enableLRU: true
|
|
11
|
+
};
|
|
12
|
+
class CacheService {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.cache = new Map();
|
|
15
|
+
this.cleanupTimer = null;
|
|
16
|
+
this.config = { ...DEFAULT_CACHE_CONFIG, ...config };
|
|
17
|
+
this.startCleanupTimer();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Set a value in cache with optional TTL
|
|
21
|
+
*/
|
|
22
|
+
set(key, value, ttl) {
|
|
23
|
+
if (!key || typeof key !== 'string') {
|
|
24
|
+
throw new Error('Cache key must be a non-empty string');
|
|
25
|
+
}
|
|
26
|
+
if (value === undefined) {
|
|
27
|
+
console.warn('Cache: Attempted to cache undefined value for key:', key);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const entry = {
|
|
31
|
+
value,
|
|
32
|
+
timestamp: Date.now(),
|
|
33
|
+
ttl: ttl || this.config.defaultTtl,
|
|
34
|
+
accessCount: 1,
|
|
35
|
+
lastAccessed: Date.now()
|
|
36
|
+
};
|
|
37
|
+
this.cache.set(key, entry);
|
|
38
|
+
this.enforceMemoryLimit();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get a value from cache
|
|
42
|
+
*/
|
|
43
|
+
get(key) {
|
|
44
|
+
const entry = this.cache.get(key);
|
|
45
|
+
if (!entry) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// Check if expired
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
if (now - entry.timestamp > entry.ttl) {
|
|
51
|
+
this.cache.delete(key);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
// Update access statistics for LRU
|
|
55
|
+
entry.accessCount++;
|
|
56
|
+
entry.lastAccessed = now;
|
|
57
|
+
return entry.value;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get or set pattern - common caching pattern
|
|
61
|
+
*/
|
|
62
|
+
async getOrSet(key, fetcher, ttl) {
|
|
63
|
+
const cached = this.get(key);
|
|
64
|
+
if (cached !== null) {
|
|
65
|
+
return cached;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const value = await fetcher();
|
|
69
|
+
// Only cache non-undefined values
|
|
70
|
+
if (value !== undefined) {
|
|
71
|
+
this.set(key, value, ttl);
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(`Cache: Error in fetcher for key '${key}':`, error);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Delete a specific key
|
|
82
|
+
*/
|
|
83
|
+
delete(key) {
|
|
84
|
+
return this.cache.delete(key);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Clear all keys matching a prefix
|
|
88
|
+
*/
|
|
89
|
+
clearByPrefix(prefix) {
|
|
90
|
+
let count = 0;
|
|
91
|
+
for (const key of this.cache.keys()) {
|
|
92
|
+
if (key.startsWith(prefix)) {
|
|
93
|
+
this.cache.delete(key);
|
|
94
|
+
count++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return count;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Clear all cache
|
|
101
|
+
*/
|
|
102
|
+
clear() {
|
|
103
|
+
this.cache.clear();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get cache statistics
|
|
107
|
+
*/
|
|
108
|
+
getStats() {
|
|
109
|
+
const entries = Array.from(this.cache.values());
|
|
110
|
+
if (entries.length === 0) {
|
|
111
|
+
return {
|
|
112
|
+
size: 0,
|
|
113
|
+
memoryUsageMB: 0,
|
|
114
|
+
hitRate: 0,
|
|
115
|
+
oldestEntry: 0
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const totalAccess = entries.reduce((sum, entry) => sum + entry.accessCount, 0);
|
|
119
|
+
const entriesWithHits = entries.filter(entry => entry.accessCount > 1).length;
|
|
120
|
+
return {
|
|
121
|
+
size: this.cache.size,
|
|
122
|
+
memoryUsageMB: this.estimateMemoryUsage(),
|
|
123
|
+
hitRate: totalAccess > entries.length ? entriesWithHits / entries.length : 0,
|
|
124
|
+
oldestEntry: Math.min(...entries.map(entry => entry.timestamp))
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Force cleanup of expired entries
|
|
129
|
+
*/
|
|
130
|
+
cleanup() {
|
|
131
|
+
const now = Date.now();
|
|
132
|
+
let cleanedCount = 0;
|
|
133
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
134
|
+
if (now - entry.timestamp > entry.ttl) {
|
|
135
|
+
this.cache.delete(key);
|
|
136
|
+
cleanedCount++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return cleanedCount;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Start automatic cleanup timer
|
|
143
|
+
*/
|
|
144
|
+
startCleanupTimer() {
|
|
145
|
+
this.cleanupTimer = setInterval(() => {
|
|
146
|
+
this.cleanup();
|
|
147
|
+
this.enforceMemoryLimit();
|
|
148
|
+
}, this.config.cleanupInterval);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Stop automatic cleanup timer
|
|
152
|
+
*/
|
|
153
|
+
destroy() {
|
|
154
|
+
if (this.cleanupTimer) {
|
|
155
|
+
clearInterval(this.cleanupTimer);
|
|
156
|
+
this.cleanupTimer = null;
|
|
157
|
+
}
|
|
158
|
+
this.clear();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Estimate memory usage (rough calculation)
|
|
162
|
+
*/
|
|
163
|
+
estimateMemoryUsage() {
|
|
164
|
+
let totalSize = 0;
|
|
165
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
166
|
+
try {
|
|
167
|
+
// Key size (UTF-16 characters)
|
|
168
|
+
totalSize += key.length * 2;
|
|
169
|
+
// Value size estimation
|
|
170
|
+
const serializedValue = JSON.stringify(entry.value);
|
|
171
|
+
totalSize += serializedValue.length * 2;
|
|
172
|
+
// Cache entry metadata overhead
|
|
173
|
+
totalSize += 64;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
// If JSON.stringify fails, use rough estimation
|
|
177
|
+
console.warn('Cache: Failed to serialize entry for size estimation:', error);
|
|
178
|
+
totalSize += key.length * 2 + 1024; // Conservative estimate
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return totalSize / (1024 * 1024); // Convert to MB
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Enforce memory limit using LRU eviction
|
|
185
|
+
*/
|
|
186
|
+
enforceMemoryLimit() {
|
|
187
|
+
const memoryUsage = this.estimateMemoryUsage();
|
|
188
|
+
if (memoryUsage <= this.config.maxMemoryMB || !this.config.enableLRU) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Target 80% of limit to avoid frequent evictions
|
|
192
|
+
const targetSize = this.config.maxMemoryMB * 0.8;
|
|
193
|
+
// Sort by last accessed time (LRU) - oldest first
|
|
194
|
+
const sortedEntries = Array.from(this.cache.entries())
|
|
195
|
+
.sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);
|
|
196
|
+
// Remove oldest entries until memory is under target
|
|
197
|
+
let currentMemory = memoryUsage;
|
|
198
|
+
let evictedCount = 0;
|
|
199
|
+
for (const [key] of sortedEntries) {
|
|
200
|
+
if (currentMemory <= targetSize)
|
|
201
|
+
break;
|
|
202
|
+
this.cache.delete(key);
|
|
203
|
+
evictedCount++;
|
|
204
|
+
// Re-estimate periodically for performance
|
|
205
|
+
if (evictedCount % 10 === 0) {
|
|
206
|
+
currentMemory = this.estimateMemoryUsage();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (evictedCount > 0) {
|
|
210
|
+
console.debug(`Cache: Evicted ${evictedCount} entries to enforce memory limit`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create a namespaced cache interface for services
|
|
215
|
+
*/
|
|
216
|
+
createNamespace(namespace) {
|
|
217
|
+
if (!namespace || typeof namespace !== 'string') {
|
|
218
|
+
throw new Error('Namespace must be a non-empty string');
|
|
219
|
+
}
|
|
220
|
+
if (namespace.includes(':')) {
|
|
221
|
+
throw new Error('Namespace cannot contain colon (:) character');
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
set: (key, value, ttl) => {
|
|
225
|
+
if (!key)
|
|
226
|
+
throw new Error('Cache key cannot be empty');
|
|
227
|
+
return this.set(`${namespace}:${key}`, value, ttl);
|
|
228
|
+
},
|
|
229
|
+
get: (key) => {
|
|
230
|
+
if (!key)
|
|
231
|
+
throw new Error('Cache key cannot be empty');
|
|
232
|
+
return this.get(`${namespace}:${key}`);
|
|
233
|
+
},
|
|
234
|
+
getOrSet: (key, fetcher, ttl) => {
|
|
235
|
+
if (!key)
|
|
236
|
+
throw new Error('Cache key cannot be empty');
|
|
237
|
+
return this.getOrSet(`${namespace}:${key}`, fetcher, ttl);
|
|
238
|
+
},
|
|
239
|
+
delete: (key) => {
|
|
240
|
+
if (!key)
|
|
241
|
+
throw new Error('Cache key cannot be empty');
|
|
242
|
+
return this.delete(`${namespace}:${key}`);
|
|
243
|
+
},
|
|
244
|
+
clear: () => this.clearByPrefix(`${namespace}:`)
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Singleton instance with default configuration
|
|
249
|
+
const globalCacheService = new CacheService();
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Cache module exports
|
|
253
|
+
*/
|
|
254
|
+
// Predefined cache TTL constants
|
|
255
|
+
const CacheTTL = {
|
|
256
|
+
SHORT: 5 * 60 * 1000, // 5 minutes
|
|
257
|
+
MEDIUM: 30 * 60 * 1000, // 30 minutes
|
|
258
|
+
LONG: 24 * 60 * 60 * 1000, // 24 hours
|
|
259
|
+
METADATA: 24 * 60 * 60 * 1000, // 24 hours - IPFS metadata is immutable
|
|
260
|
+
GATEWAY: 30 * 60 * 1000, // 30 minutes - Gateway config can change
|
|
261
|
+
PROVIDER: 60 * 60 * 1000, // 1 hour - Provider connections with auth
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
export { CacheTTL as C, CacheService as a, globalCacheService as g };
|
|
265
|
+
//# sourceMappingURL=index-60201NKa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-60201NKa.js","sources":["../../src/core/cache/cache.service.ts","../../src/core/cache/index.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Centralized Cache Service for PERS SDK
|
|
5
|
+
* Provides unified caching with memory management and consistent policies
|
|
6
|
+
*/
|
|
7
|
+
// Default cache configuration constants
|
|
8
|
+
const DEFAULT_CACHE_CONFIG = {
|
|
9
|
+
defaultTtl: 30 * 60 * 1000, // 30 minutes
|
|
10
|
+
maxMemoryMB: 50, // 50MB cache limit
|
|
11
|
+
cleanupInterval: 5 * 60 * 1000, // Cleanup every 5 minutes
|
|
12
|
+
enableLRU: true
|
|
13
|
+
};
|
|
14
|
+
class CacheService {
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.cache = new Map();
|
|
17
|
+
this.cleanupTimer = null;
|
|
18
|
+
this.config = { ...DEFAULT_CACHE_CONFIG, ...config };
|
|
19
|
+
this.startCleanupTimer();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set a value in cache with optional TTL
|
|
23
|
+
*/
|
|
24
|
+
set(key, value, ttl) {
|
|
25
|
+
if (!key || typeof key !== 'string') {
|
|
26
|
+
throw new Error('Cache key must be a non-empty string');
|
|
27
|
+
}
|
|
28
|
+
if (value === undefined) {
|
|
29
|
+
console.warn('Cache: Attempted to cache undefined value for key:', key);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const entry = {
|
|
33
|
+
value,
|
|
34
|
+
timestamp: Date.now(),
|
|
35
|
+
ttl: ttl || this.config.defaultTtl,
|
|
36
|
+
accessCount: 1,
|
|
37
|
+
lastAccessed: Date.now()
|
|
38
|
+
};
|
|
39
|
+
this.cache.set(key, entry);
|
|
40
|
+
this.enforceMemoryLimit();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get a value from cache
|
|
44
|
+
*/
|
|
45
|
+
get(key) {
|
|
46
|
+
const entry = this.cache.get(key);
|
|
47
|
+
if (!entry) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
// Check if expired
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
if (now - entry.timestamp > entry.ttl) {
|
|
53
|
+
this.cache.delete(key);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// Update access statistics for LRU
|
|
57
|
+
entry.accessCount++;
|
|
58
|
+
entry.lastAccessed = now;
|
|
59
|
+
return entry.value;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get or set pattern - common caching pattern
|
|
63
|
+
*/
|
|
64
|
+
async getOrSet(key, fetcher, ttl) {
|
|
65
|
+
const cached = this.get(key);
|
|
66
|
+
if (cached !== null) {
|
|
67
|
+
return cached;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const value = await fetcher();
|
|
71
|
+
// Only cache non-undefined values
|
|
72
|
+
if (value !== undefined) {
|
|
73
|
+
this.set(key, value, ttl);
|
|
74
|
+
}
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error(`Cache: Error in fetcher for key '${key}':`, error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Delete a specific key
|
|
84
|
+
*/
|
|
85
|
+
delete(key) {
|
|
86
|
+
return this.cache.delete(key);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Clear all keys matching a prefix
|
|
90
|
+
*/
|
|
91
|
+
clearByPrefix(prefix) {
|
|
92
|
+
let count = 0;
|
|
93
|
+
for (const key of this.cache.keys()) {
|
|
94
|
+
if (key.startsWith(prefix)) {
|
|
95
|
+
this.cache.delete(key);
|
|
96
|
+
count++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return count;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Clear all cache
|
|
103
|
+
*/
|
|
104
|
+
clear() {
|
|
105
|
+
this.cache.clear();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get cache statistics
|
|
109
|
+
*/
|
|
110
|
+
getStats() {
|
|
111
|
+
const entries = Array.from(this.cache.values());
|
|
112
|
+
if (entries.length === 0) {
|
|
113
|
+
return {
|
|
114
|
+
size: 0,
|
|
115
|
+
memoryUsageMB: 0,
|
|
116
|
+
hitRate: 0,
|
|
117
|
+
oldestEntry: 0
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const totalAccess = entries.reduce((sum, entry) => sum + entry.accessCount, 0);
|
|
121
|
+
const entriesWithHits = entries.filter(entry => entry.accessCount > 1).length;
|
|
122
|
+
return {
|
|
123
|
+
size: this.cache.size,
|
|
124
|
+
memoryUsageMB: this.estimateMemoryUsage(),
|
|
125
|
+
hitRate: totalAccess > entries.length ? entriesWithHits / entries.length : 0,
|
|
126
|
+
oldestEntry: Math.min(...entries.map(entry => entry.timestamp))
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Force cleanup of expired entries
|
|
131
|
+
*/
|
|
132
|
+
cleanup() {
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
let cleanedCount = 0;
|
|
135
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
136
|
+
if (now - entry.timestamp > entry.ttl) {
|
|
137
|
+
this.cache.delete(key);
|
|
138
|
+
cleanedCount++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return cleanedCount;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Start automatic cleanup timer
|
|
145
|
+
*/
|
|
146
|
+
startCleanupTimer() {
|
|
147
|
+
this.cleanupTimer = setInterval(() => {
|
|
148
|
+
this.cleanup();
|
|
149
|
+
this.enforceMemoryLimit();
|
|
150
|
+
}, this.config.cleanupInterval);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Stop automatic cleanup timer
|
|
154
|
+
*/
|
|
155
|
+
destroy() {
|
|
156
|
+
if (this.cleanupTimer) {
|
|
157
|
+
clearInterval(this.cleanupTimer);
|
|
158
|
+
this.cleanupTimer = null;
|
|
159
|
+
}
|
|
160
|
+
this.clear();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Estimate memory usage (rough calculation)
|
|
164
|
+
*/
|
|
165
|
+
estimateMemoryUsage() {
|
|
166
|
+
let totalSize = 0;
|
|
167
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
168
|
+
try {
|
|
169
|
+
// Key size (UTF-16 characters)
|
|
170
|
+
totalSize += key.length * 2;
|
|
171
|
+
// Value size estimation
|
|
172
|
+
const serializedValue = JSON.stringify(entry.value);
|
|
173
|
+
totalSize += serializedValue.length * 2;
|
|
174
|
+
// Cache entry metadata overhead
|
|
175
|
+
totalSize += 64;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
// If JSON.stringify fails, use rough estimation
|
|
179
|
+
console.warn('Cache: Failed to serialize entry for size estimation:', error);
|
|
180
|
+
totalSize += key.length * 2 + 1024; // Conservative estimate
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return totalSize / (1024 * 1024); // Convert to MB
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Enforce memory limit using LRU eviction
|
|
187
|
+
*/
|
|
188
|
+
enforceMemoryLimit() {
|
|
189
|
+
const memoryUsage = this.estimateMemoryUsage();
|
|
190
|
+
if (memoryUsage <= this.config.maxMemoryMB || !this.config.enableLRU) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Target 80% of limit to avoid frequent evictions
|
|
194
|
+
const targetSize = this.config.maxMemoryMB * 0.8;
|
|
195
|
+
// Sort by last accessed time (LRU) - oldest first
|
|
196
|
+
const sortedEntries = Array.from(this.cache.entries())
|
|
197
|
+
.sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);
|
|
198
|
+
// Remove oldest entries until memory is under target
|
|
199
|
+
let currentMemory = memoryUsage;
|
|
200
|
+
let evictedCount = 0;
|
|
201
|
+
for (const [key] of sortedEntries) {
|
|
202
|
+
if (currentMemory <= targetSize)
|
|
203
|
+
break;
|
|
204
|
+
this.cache.delete(key);
|
|
205
|
+
evictedCount++;
|
|
206
|
+
// Re-estimate periodically for performance
|
|
207
|
+
if (evictedCount % 10 === 0) {
|
|
208
|
+
currentMemory = this.estimateMemoryUsage();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (evictedCount > 0) {
|
|
212
|
+
console.debug(`Cache: Evicted ${evictedCount} entries to enforce memory limit`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Create a namespaced cache interface for services
|
|
217
|
+
*/
|
|
218
|
+
createNamespace(namespace) {
|
|
219
|
+
if (!namespace || typeof namespace !== 'string') {
|
|
220
|
+
throw new Error('Namespace must be a non-empty string');
|
|
221
|
+
}
|
|
222
|
+
if (namespace.includes(':')) {
|
|
223
|
+
throw new Error('Namespace cannot contain colon (:) character');
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
set: (key, value, ttl) => {
|
|
227
|
+
if (!key)
|
|
228
|
+
throw new Error('Cache key cannot be empty');
|
|
229
|
+
return this.set(`${namespace}:${key}`, value, ttl);
|
|
230
|
+
},
|
|
231
|
+
get: (key) => {
|
|
232
|
+
if (!key)
|
|
233
|
+
throw new Error('Cache key cannot be empty');
|
|
234
|
+
return this.get(`${namespace}:${key}`);
|
|
235
|
+
},
|
|
236
|
+
getOrSet: (key, fetcher, ttl) => {
|
|
237
|
+
if (!key)
|
|
238
|
+
throw new Error('Cache key cannot be empty');
|
|
239
|
+
return this.getOrSet(`${namespace}:${key}`, fetcher, ttl);
|
|
240
|
+
},
|
|
241
|
+
delete: (key) => {
|
|
242
|
+
if (!key)
|
|
243
|
+
throw new Error('Cache key cannot be empty');
|
|
244
|
+
return this.delete(`${namespace}:${key}`);
|
|
245
|
+
},
|
|
246
|
+
clear: () => this.clearByPrefix(`${namespace}:`)
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Singleton instance with default configuration
|
|
251
|
+
const globalCacheService = new CacheService();
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Cache module exports
|
|
255
|
+
*/
|
|
256
|
+
// Predefined cache TTL constants
|
|
257
|
+
const CacheTTL = {
|
|
258
|
+
SHORT: 5 * 60 * 1000, // 5 minutes
|
|
259
|
+
MEDIUM: 30 * 60 * 1000, // 30 minutes
|
|
260
|
+
LONG: 24 * 60 * 60 * 1000, // 24 hours
|
|
261
|
+
METADATA: 24 * 60 * 60 * 1000, // 24 hours - IPFS metadata is immutable
|
|
262
|
+
GATEWAY: 30 * 60 * 1000, // 30 minutes - Gateway config can change
|
|
263
|
+
PROVIDER: 60 * 60 * 1000, // 1 hour - Provider connections with auth
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
exports.CacheService = CacheService;
|
|
267
|
+
exports.CacheTTL = CacheTTL;
|
|
268
|
+
exports.globalCacheService = globalCacheService;
|
|
269
|
+
//# sourceMappingURL=index-CcQkbZBZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CcQkbZBZ.cjs","sources":["../../src/core/cache/cache.service.ts","../../src/core/cache/index.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
|