@xbg.solutions/bpsk-utils-api-client 1.2.3
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/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +14 -0
- package/lib/index.js.map +1 -0
- package/lib/services/api/api.service.d.ts +67 -0
- package/lib/services/api/api.service.d.ts.map +1 -0
- package/lib/services/api/api.service.js +344 -0
- package/lib/services/api/api.service.js.map +1 -0
- package/lib/services/api/index.d.ts +13 -0
- package/lib/services/api/index.d.ts.map +1 -0
- package/lib/services/api/index.js +15 -0
- package/lib/services/api/index.js.map +1 -0
- package/lib/services/api/request-handler.d.ts +17 -0
- package/lib/services/api/request-handler.d.ts.map +1 -0
- package/lib/services/api/request-handler.js +289 -0
- package/lib/services/api/request-handler.js.map +1 -0
- package/lib/services/api/response-handler.d.ts +16 -0
- package/lib/services/api/response-handler.d.ts.map +1 -0
- package/lib/services/api/response-handler.js +254 -0
- package/lib/services/api/response-handler.js.map +1 -0
- package/lib/services/caching/api-cache.service.d.ts +97 -0
- package/lib/services/caching/api-cache.service.d.ts.map +1 -0
- package/lib/services/caching/api-cache.service.js +294 -0
- package/lib/services/caching/api-cache.service.js.map +1 -0
- package/lib/services/caching/cache.service.d.ts +86 -0
- package/lib/services/caching/cache.service.d.ts.map +1 -0
- package/lib/services/caching/cache.service.js +519 -0
- package/lib/services/caching/cache.service.js.map +1 -0
- package/lib/services/caching/index.d.ts +5 -0
- package/lib/services/caching/index.d.ts.map +1 -0
- package/lib/services/caching/index.js +3 -0
- package/lib/services/caching/index.js.map +1 -0
- package/lib/stores/api.service.d.ts +6 -0
- package/lib/stores/api.service.d.ts.map +1 -0
- package/lib/stores/api.service.js +6 -0
- package/lib/stores/api.service.js.map +1 -0
- package/lib/stores/request-handler.d.ts +6 -0
- package/lib/stores/request-handler.d.ts.map +1 -0
- package/lib/stores/request-handler.js +6 -0
- package/lib/stores/request-handler.js.map +1 -0
- package/lib/stores/response-handler.d.ts +6 -0
- package/lib/stores/response-handler.d.ts.map +1 -0
- package/lib/stores/response-handler.js +6 -0
- package/lib/stores/response-handler.js.map +1 -0
- package/lib/utils/cache-helpers.d.ts +112 -0
- package/lib/utils/cache-helpers.d.ts.map +1 -0
- package/lib/utils/cache-helpers.js +302 -0
- package/lib/utils/cache-helpers.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Response Caching Service
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent caching for API responses with support for
|
|
5
|
+
* different caching strategies and automatic cache invalidation.
|
|
6
|
+
*/
|
|
7
|
+
import { type CacheOptions } from './cache.service';
|
|
8
|
+
export interface APIResponse<T = any> {
|
|
9
|
+
data: T;
|
|
10
|
+
status: number;
|
|
11
|
+
statusText: string;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
cached?: boolean;
|
|
14
|
+
cacheTimestamp?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface APICacheOptions extends Omit<CacheOptions, 'storage'> {
|
|
17
|
+
method?: string;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
body?: any;
|
|
20
|
+
strategy?: 'cache-first' | 'network-first' | 'cache-only' | 'network-only';
|
|
21
|
+
staleWhileRevalidate?: boolean;
|
|
22
|
+
storage?: 'memory' | 'localStorage' | 'sessionStorage' | 'indexedDB';
|
|
23
|
+
keyPrefix?: string;
|
|
24
|
+
}
|
|
25
|
+
declare class APICacheService {
|
|
26
|
+
private logger;
|
|
27
|
+
/**
|
|
28
|
+
* Generate cache key for request
|
|
29
|
+
*/
|
|
30
|
+
private generateCacheKey;
|
|
31
|
+
/**
|
|
32
|
+
* Check if response should be cached
|
|
33
|
+
*/
|
|
34
|
+
private shouldCache;
|
|
35
|
+
/**
|
|
36
|
+
* Get TTL from response headers
|
|
37
|
+
*/
|
|
38
|
+
private getTTLFromHeaders;
|
|
39
|
+
/**
|
|
40
|
+
* Create response object from Response
|
|
41
|
+
*/
|
|
42
|
+
private createAPIResponse;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch with caching
|
|
45
|
+
*/
|
|
46
|
+
fetch<T = any>(url: string, options?: APICacheOptions): Promise<APIResponse<T>>;
|
|
47
|
+
/**
|
|
48
|
+
* Fetch from network
|
|
49
|
+
*/
|
|
50
|
+
private fetchFromNetwork;
|
|
51
|
+
/**
|
|
52
|
+
* Cache response if appropriate
|
|
53
|
+
*/
|
|
54
|
+
private cacheResponse;
|
|
55
|
+
/**
|
|
56
|
+
* Invalidate cache for URL pattern
|
|
57
|
+
*/
|
|
58
|
+
invalidate(urlPattern: string, options?: Partial<APICacheOptions>): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Invalidate by URL pattern with wildcards
|
|
61
|
+
*/
|
|
62
|
+
private invalidateByPattern;
|
|
63
|
+
/**
|
|
64
|
+
* Invalidate cache by tags
|
|
65
|
+
*/
|
|
66
|
+
invalidateByTags(tags: string[], storage?: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Prefetch and cache API responses
|
|
69
|
+
*/
|
|
70
|
+
prefetch<T = any>(urls: string[], options?: APICacheOptions): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Warmup cache with common requests
|
|
73
|
+
*/
|
|
74
|
+
warmup(requests: Array<{
|
|
75
|
+
url: string;
|
|
76
|
+
options?: APICacheOptions;
|
|
77
|
+
}>): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* GET request with caching
|
|
80
|
+
*/
|
|
81
|
+
get<T = any>(url: string, options?: Omit<APICacheOptions, 'method'>): Promise<APIResponse<T>>;
|
|
82
|
+
/**
|
|
83
|
+
* POST request (typically not cached)
|
|
84
|
+
*/
|
|
85
|
+
post<T = any>(url: string, body?: any, options?: Omit<APICacheOptions, 'method' | 'body'>): Promise<APIResponse<T>>;
|
|
86
|
+
/**
|
|
87
|
+
* PUT request with cache invalidation
|
|
88
|
+
*/
|
|
89
|
+
put<T = any>(url: string, body?: any, options?: Omit<APICacheOptions, 'method' | 'body'>): Promise<APIResponse<T>>;
|
|
90
|
+
/**
|
|
91
|
+
* DELETE request with cache invalidation
|
|
92
|
+
*/
|
|
93
|
+
delete<T = any>(url: string, options?: Omit<APICacheOptions, 'method'>): Promise<APIResponse<T>>;
|
|
94
|
+
}
|
|
95
|
+
export declare const apiCacheService: APICacheService;
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=api-cache.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-cache.service.d.ts","sourceRoot":"","sources":["../../../src/services/caching/api-cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Response Caching Service
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent caching for API responses with support for
|
|
5
|
+
* different caching strategies and automatic cache invalidation.
|
|
6
|
+
*/
|
|
7
|
+
import { cacheService } from './cache.service';
|
|
8
|
+
import { loggerService } from '@xbg.solutions/bpsk-core';
|
|
9
|
+
class APICacheService {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.logger = loggerService.withContext('APICacheService');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate cache key for request
|
|
15
|
+
*/
|
|
16
|
+
generateCacheKey(url, options) {
|
|
17
|
+
const key = `${options.keyPrefix || 'api'}:${options.method || 'GET'}:${url}`;
|
|
18
|
+
// Include body and relevant headers in key for uniqueness
|
|
19
|
+
if (options.body) {
|
|
20
|
+
const bodyKey = typeof options.body === 'string'
|
|
21
|
+
? options.body
|
|
22
|
+
: JSON.stringify(options.body);
|
|
23
|
+
return `${key}:${btoa(bodyKey).substring(0, 16)}`;
|
|
24
|
+
}
|
|
25
|
+
return key;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if response should be cached
|
|
29
|
+
*/
|
|
30
|
+
shouldCache(response, options) {
|
|
31
|
+
// Don't cache errors by default
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
// Don't cache non-GET requests by default
|
|
36
|
+
const method = options.method?.toUpperCase() || 'GET';
|
|
37
|
+
if (method !== 'GET' && method !== 'HEAD') {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
// Check cache-control headers
|
|
41
|
+
const cacheControl = response.headers.get('cache-control');
|
|
42
|
+
if (cacheControl?.includes('no-cache') || cacheControl?.includes('no-store')) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get TTL from response headers
|
|
49
|
+
*/
|
|
50
|
+
getTTLFromHeaders(response, defaultTTL = 5 * 60 * 1000) {
|
|
51
|
+
const cacheControl = response.headers.get('cache-control');
|
|
52
|
+
if (cacheControl) {
|
|
53
|
+
const maxAgeMatch = cacheControl.match(/max-age=(\d+)/);
|
|
54
|
+
if (maxAgeMatch) {
|
|
55
|
+
return parseInt(maxAgeMatch[1]) * 1000; // Convert seconds to milliseconds
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const expires = response.headers.get('expires');
|
|
59
|
+
if (expires) {
|
|
60
|
+
const expiresTime = new Date(expires).getTime();
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
if (expiresTime > now) {
|
|
63
|
+
return expiresTime - now;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return defaultTTL;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create response object from Response
|
|
70
|
+
*/
|
|
71
|
+
async createAPIResponse(response, cached = false, cacheTimestamp) {
|
|
72
|
+
const data = await response.json();
|
|
73
|
+
const headers = {};
|
|
74
|
+
response.headers.forEach((value, key) => {
|
|
75
|
+
headers[key] = value;
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
data,
|
|
79
|
+
status: response.status,
|
|
80
|
+
statusText: response.statusText,
|
|
81
|
+
headers,
|
|
82
|
+
cached,
|
|
83
|
+
cacheTimestamp
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fetch with caching
|
|
88
|
+
*/
|
|
89
|
+
async fetch(url, options = {}) {
|
|
90
|
+
const cacheKey = this.generateCacheKey(url, options);
|
|
91
|
+
const strategy = options.strategy || 'cache-first';
|
|
92
|
+
const storage = options.storage || 'memory';
|
|
93
|
+
// Cache-only strategy
|
|
94
|
+
if (strategy === 'cache-only') {
|
|
95
|
+
const cached = await cacheService.get(cacheKey, storage);
|
|
96
|
+
if (cached) {
|
|
97
|
+
this.logger.debug('Cache hit (cache-only)', { url, cacheKey });
|
|
98
|
+
return { ...cached, cached: true };
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`No cached response for ${url}`);
|
|
101
|
+
}
|
|
102
|
+
// Network-only strategy
|
|
103
|
+
if (strategy === 'network-only') {
|
|
104
|
+
return this.fetchFromNetwork(url, options);
|
|
105
|
+
}
|
|
106
|
+
// Cache-first strategy
|
|
107
|
+
if (strategy === 'cache-first') {
|
|
108
|
+
const cached = await cacheService.get(cacheKey, storage);
|
|
109
|
+
if (cached) {
|
|
110
|
+
this.logger.debug('Cache hit (cache-first)', { url, cacheKey });
|
|
111
|
+
// Stale while revalidate
|
|
112
|
+
if (options.staleWhileRevalidate) {
|
|
113
|
+
this.fetchFromNetwork(url, options).then(response => {
|
|
114
|
+
this.cacheResponse(cacheKey, response, options);
|
|
115
|
+
}).catch(error => {
|
|
116
|
+
this.logger.warn('Background revalidation failed', error);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return { ...cached, cached: true };
|
|
120
|
+
}
|
|
121
|
+
this.logger.debug('Cache miss (cache-first)', { url, cacheKey });
|
|
122
|
+
const response = await this.fetchFromNetwork(url, options);
|
|
123
|
+
await this.cacheResponse(cacheKey, response, options);
|
|
124
|
+
return response;
|
|
125
|
+
}
|
|
126
|
+
// Network-first strategy
|
|
127
|
+
if (strategy === 'network-first') {
|
|
128
|
+
try {
|
|
129
|
+
const response = await this.fetchFromNetwork(url, options);
|
|
130
|
+
await this.cacheResponse(cacheKey, response, options);
|
|
131
|
+
return response;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
this.logger.warn('Network request failed, falling back to cache', error);
|
|
135
|
+
const cached = await cacheService.get(cacheKey, storage);
|
|
136
|
+
if (cached) {
|
|
137
|
+
this.logger.debug('Cache hit (network-first fallback)', { url, cacheKey });
|
|
138
|
+
return { ...cached, cached: true };
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
throw new Error(`Unknown cache strategy: ${strategy}`);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Fetch from network
|
|
147
|
+
*/
|
|
148
|
+
async fetchFromNetwork(url, options) {
|
|
149
|
+
const fetchOptions = {
|
|
150
|
+
method: options.method || 'GET',
|
|
151
|
+
headers: options.headers,
|
|
152
|
+
body: options.body
|
|
153
|
+
};
|
|
154
|
+
const response = await fetch(url, fetchOptions);
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
157
|
+
}
|
|
158
|
+
return this.createAPIResponse(response);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Cache response if appropriate
|
|
162
|
+
*/
|
|
163
|
+
async cacheResponse(cacheKey, response, options) {
|
|
164
|
+
const mockResponse = new Response(JSON.stringify(response.data), {
|
|
165
|
+
status: response.status,
|
|
166
|
+
statusText: response.statusText,
|
|
167
|
+
headers: response.headers
|
|
168
|
+
});
|
|
169
|
+
if (!this.shouldCache(mockResponse, options)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const ttl = options.ttl || this.getTTLFromHeaders(mockResponse);
|
|
173
|
+
const cacheOptions = {
|
|
174
|
+
ttl,
|
|
175
|
+
tags: options.tags,
|
|
176
|
+
storage: options.storage || 'memory'
|
|
177
|
+
};
|
|
178
|
+
await cacheService.set(cacheKey, response, cacheOptions);
|
|
179
|
+
this.logger.debug('Response cached', {
|
|
180
|
+
cacheKey,
|
|
181
|
+
ttl,
|
|
182
|
+
storage: cacheOptions.storage
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Invalidate cache for URL pattern
|
|
187
|
+
*/
|
|
188
|
+
async invalidate(urlPattern, options = {}) {
|
|
189
|
+
const storage = options.storage || 'memory';
|
|
190
|
+
const keyPrefix = options.keyPrefix || 'api';
|
|
191
|
+
// Simple pattern matching - could be enhanced with regex
|
|
192
|
+
const pattern = `${keyPrefix}:${options.method || 'GET'}:${urlPattern}`;
|
|
193
|
+
if (pattern.includes('*')) {
|
|
194
|
+
// Wildcard invalidation
|
|
195
|
+
await this.invalidateByPattern(pattern, storage);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Exact match invalidation
|
|
199
|
+
await cacheService.delete(pattern, storage);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Invalidate by URL pattern with wildcards
|
|
204
|
+
*/
|
|
205
|
+
async invalidateByPattern(pattern, storage) {
|
|
206
|
+
// Convert pattern to regex
|
|
207
|
+
const regexPattern = pattern.replace(/\*/g, '.*');
|
|
208
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
209
|
+
// This is a simplified implementation
|
|
210
|
+
// In a production system, you might want to use tags for more efficient invalidation
|
|
211
|
+
const allKeys = await cacheService.keys(storage);
|
|
212
|
+
const matchingKeys = allKeys.filter(key => regex.test(key));
|
|
213
|
+
await Promise.all(matchingKeys.map(key => cacheService.delete(key, storage)));
|
|
214
|
+
this.logger.info(`Invalidated ${matchingKeys.length} cached responses`, { pattern, storage });
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Invalidate cache by tags
|
|
218
|
+
*/
|
|
219
|
+
async invalidateByTags(tags, storage = 'memory') {
|
|
220
|
+
await cacheService.invalidateByTags(tags, storage);
|
|
221
|
+
this.logger.info('Invalidated cache by tags', { tags, storage });
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Prefetch and cache API responses
|
|
225
|
+
*/
|
|
226
|
+
async prefetch(urls, options = {}) {
|
|
227
|
+
const prefetchOptions = {
|
|
228
|
+
...options,
|
|
229
|
+
strategy: 'network-first'
|
|
230
|
+
};
|
|
231
|
+
const promises = urls.map(url => this.fetch(url, prefetchOptions).catch(error => {
|
|
232
|
+
this.logger.warn(`Prefetch failed for ${url}`, error);
|
|
233
|
+
}));
|
|
234
|
+
await Promise.allSettled(promises);
|
|
235
|
+
this.logger.info(`Prefetched ${urls.length} URLs`);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Warmup cache with common requests
|
|
239
|
+
*/
|
|
240
|
+
async warmup(requests) {
|
|
241
|
+
const promises = requests.map(({ url, options = {} }) => this.fetch(url, { ...options, strategy: 'network-first' }).catch(error => {
|
|
242
|
+
this.logger.warn(`Warmup failed for ${url}`, error);
|
|
243
|
+
}));
|
|
244
|
+
await Promise.allSettled(promises);
|
|
245
|
+
this.logger.info(`Warmed up cache with ${requests.length} requests`);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* GET request with caching
|
|
249
|
+
*/
|
|
250
|
+
async get(url, options = {}) {
|
|
251
|
+
return this.fetch(url, { ...options, method: 'GET' });
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* POST request (typically not cached)
|
|
255
|
+
*/
|
|
256
|
+
async post(url, body, options = {}) {
|
|
257
|
+
return this.fetch(url, {
|
|
258
|
+
...options,
|
|
259
|
+
method: 'POST',
|
|
260
|
+
body: typeof body === 'string' ? body : JSON.stringify(body),
|
|
261
|
+
strategy: 'network-only' // POST requests shouldn't be cached by default
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* PUT request with cache invalidation
|
|
266
|
+
*/
|
|
267
|
+
async put(url, body, options = {}) {
|
|
268
|
+
const response = await this.fetch(url, {
|
|
269
|
+
...options,
|
|
270
|
+
method: 'PUT',
|
|
271
|
+
body: typeof body === 'string' ? body : JSON.stringify(body),
|
|
272
|
+
strategy: 'network-only'
|
|
273
|
+
});
|
|
274
|
+
// Invalidate related cache entries
|
|
275
|
+
await this.invalidate(url.split('?')[0] + '*', options);
|
|
276
|
+
return response;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* DELETE request with cache invalidation
|
|
280
|
+
*/
|
|
281
|
+
async delete(url, options = {}) {
|
|
282
|
+
const response = await this.fetch(url, {
|
|
283
|
+
...options,
|
|
284
|
+
method: 'DELETE',
|
|
285
|
+
strategy: 'network-only'
|
|
286
|
+
});
|
|
287
|
+
// Invalidate related cache entries
|
|
288
|
+
await this.invalidate(url.split('?')[0] + '*', options);
|
|
289
|
+
return response;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Export singleton instance
|
|
293
|
+
export const apiCacheService = new APICacheService();
|
|
294
|
+
//# sourceMappingURL=api-cache.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-cache.service.js","sourceRoot":"","sources":["../../../src/services/caching/api-cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caching Service
|
|
3
|
+
*
|
|
4
|
+
* Provides multiple levels of caching: memory, localStorage, sessionStorage,
|
|
5
|
+
* and IndexedDB for different use cases and data sizes.
|
|
6
|
+
*/
|
|
7
|
+
import { type Writable } from 'svelte/store';
|
|
8
|
+
export interface CacheItem<T = any> {
|
|
9
|
+
key: string;
|
|
10
|
+
value: T;
|
|
11
|
+
expiresAt: number;
|
|
12
|
+
createdAt: number;
|
|
13
|
+
tags?: string[];
|
|
14
|
+
size?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface CacheOptions {
|
|
17
|
+
ttl?: number;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
storage?: 'memory' | 'localStorage' | 'sessionStorage' | 'indexedDB';
|
|
20
|
+
compress?: boolean;
|
|
21
|
+
maxSize?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CacheStats {
|
|
24
|
+
hitCount: number;
|
|
25
|
+
missCount: number;
|
|
26
|
+
hitRate: number;
|
|
27
|
+
itemCount: number;
|
|
28
|
+
totalSize: number;
|
|
29
|
+
evictedCount: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Main cache service
|
|
33
|
+
*/
|
|
34
|
+
declare class CacheService {
|
|
35
|
+
private storages;
|
|
36
|
+
private stats;
|
|
37
|
+
private logger;
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Get item from cache
|
|
41
|
+
*/
|
|
42
|
+
get<T = any>(key: string, storage?: string): Promise<T | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Set item in cache
|
|
45
|
+
*/
|
|
46
|
+
set<T = any>(key: string, value: T, options?: CacheOptions): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Delete item from cache
|
|
49
|
+
*/
|
|
50
|
+
delete(key: string, storage?: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Clear all items from cache
|
|
53
|
+
*/
|
|
54
|
+
clear(storage?: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Get or set cached value
|
|
57
|
+
*/
|
|
58
|
+
getOrSet<T = any>(key: string, factory: () => Promise<T> | T, options?: CacheOptions): Promise<T>;
|
|
59
|
+
/**
|
|
60
|
+
* Invalidate cache by tags
|
|
61
|
+
*/
|
|
62
|
+
invalidateByTags(tags: string[], storage?: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Clean up expired items
|
|
65
|
+
*/
|
|
66
|
+
cleanupExpired(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get all keys from a specific storage
|
|
69
|
+
*/
|
|
70
|
+
keys(storage?: string): Promise<string[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Get cache statistics
|
|
73
|
+
*/
|
|
74
|
+
getStats(): Writable<CacheStats>;
|
|
75
|
+
/**
|
|
76
|
+
* Estimate object size in bytes
|
|
77
|
+
*/
|
|
78
|
+
private estimateSize;
|
|
79
|
+
/**
|
|
80
|
+
* Update cache statistics
|
|
81
|
+
*/
|
|
82
|
+
private updateStats;
|
|
83
|
+
}
|
|
84
|
+
export declare const cacheService: CacheService;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=cache.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../../src/services/caching/cache.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,QAAQ,GAAG,cAAc,GAAG,gBAAgB,GAAG,WAAW,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AA2UD;;GAEG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,KAAK,CAOV;IACH,OAAO,CAAC,MAAM,CAA6C;;IAc3D;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IA+B9E;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BpF;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,GAAG,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAC7B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC;IAWb;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjF;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BrC;;OAEG;IACG,IAAI,CAAC,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMzD;;OAEG;IACH,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC;IAIhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,WAAW;CAcpB;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|