@xbg.solutions/utils-cache-connector 1.0.0

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 (33) hide show
  1. package/lib/cache-connector.d.ts +139 -0
  2. package/lib/cache-connector.d.ts.map +1 -0
  3. package/lib/cache-connector.js +277 -0
  4. package/lib/cache-connector.js.map +1 -0
  5. package/lib/index.d.ts +52 -0
  6. package/lib/index.d.ts.map +1 -0
  7. package/lib/index.js +103 -0
  8. package/lib/index.js.map +1 -0
  9. package/lib/providers/base-cache-provider.d.ts +95 -0
  10. package/lib/providers/base-cache-provider.d.ts.map +1 -0
  11. package/lib/providers/base-cache-provider.js +120 -0
  12. package/lib/providers/base-cache-provider.js.map +1 -0
  13. package/lib/providers/firestore-cache-provider.d.ts +58 -0
  14. package/lib/providers/firestore-cache-provider.d.ts.map +1 -0
  15. package/lib/providers/firestore-cache-provider.js +418 -0
  16. package/lib/providers/firestore-cache-provider.js.map +1 -0
  17. package/lib/providers/memory-cache-provider.d.ts +57 -0
  18. package/lib/providers/memory-cache-provider.d.ts.map +1 -0
  19. package/lib/providers/memory-cache-provider.js +217 -0
  20. package/lib/providers/memory-cache-provider.js.map +1 -0
  21. package/lib/providers/noop-cache-provider.d.ts +21 -0
  22. package/lib/providers/noop-cache-provider.d.ts.map +1 -0
  23. package/lib/providers/noop-cache-provider.js +42 -0
  24. package/lib/providers/noop-cache-provider.js.map +1 -0
  25. package/lib/providers/redis-cache-provider.d.ts +64 -0
  26. package/lib/providers/redis-cache-provider.d.ts.map +1 -0
  27. package/lib/providers/redis-cache-provider.js +414 -0
  28. package/lib/providers/redis-cache-provider.js.map +1 -0
  29. package/lib/types.d.ts +342 -0
  30. package/lib/types.d.ts.map +1 -0
  31. package/lib/types.js +8 -0
  32. package/lib/types.js.map +1 -0
  33. package/package.json +31 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Base Cache Provider
3
+ *
4
+ * Abstract base class that all cache providers extend.
5
+ * Provides common functionality and enforces interface compliance.
6
+ */
7
+ import { CacheProviderType, ICacheProvider, CacheSetOptions, CacheEntry, CacheStats, CacheEntryMetadata } from '../types';
8
+ export declare abstract class BaseCacheProvider implements ICacheProvider {
9
+ protected stats: CacheStats;
10
+ /**
11
+ * Get the provider type
12
+ */
13
+ abstract getType(): CacheProviderType;
14
+ /**
15
+ * Get a value from cache
16
+ */
17
+ abstract get<T>(key: string): Promise<T | null>;
18
+ /**
19
+ * Get a value with metadata
20
+ */
21
+ abstract getWithMetadata<T>(key: string): Promise<CacheEntry<T> | null>;
22
+ /**
23
+ * Set a value in cache
24
+ */
25
+ abstract set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;
26
+ /**
27
+ * Delete a specific key
28
+ */
29
+ abstract delete(key: string): Promise<boolean>;
30
+ /**
31
+ * Check if a key exists
32
+ */
33
+ abstract has(key: string): Promise<boolean>;
34
+ /**
35
+ * Invalidate cache entries by tags
36
+ */
37
+ abstract invalidateByTags(tags: string[]): Promise<number>;
38
+ /**
39
+ * Invalidate cache entries by pattern
40
+ */
41
+ abstract invalidateByPattern(pattern: string, mode?: 'prefix' | 'suffix' | 'contains'): Promise<number>;
42
+ /**
43
+ * Clear all cache entries
44
+ */
45
+ abstract clear(): Promise<void>;
46
+ /**
47
+ * Get cache statistics
48
+ */
49
+ getStats(): Promise<CacheStats>;
50
+ /**
51
+ * Record a cache hit
52
+ */
53
+ protected recordHit(): void;
54
+ /**
55
+ * Record a cache miss
56
+ */
57
+ protected recordMiss(): void;
58
+ /**
59
+ * Record an eviction
60
+ */
61
+ protected recordEviction(): void;
62
+ /**
63
+ * Record an expiration
64
+ */
65
+ protected recordExpiration(): void;
66
+ /**
67
+ * Update entry count
68
+ */
69
+ protected updateEntryCount(count: number): void;
70
+ /**
71
+ * Update cache size
72
+ */
73
+ protected updateSize(size: number): void;
74
+ /**
75
+ * Check if an entry is expired
76
+ */
77
+ protected isExpired(expiresAt: Date): boolean;
78
+ /**
79
+ * Calculate TTL in milliseconds
80
+ */
81
+ protected calculateExpiresAt(ttl: number): Date;
82
+ /**
83
+ * Create cache entry metadata
84
+ */
85
+ protected createMetadata(ttl: number, tags?: string[]): CacheEntryMetadata;
86
+ /**
87
+ * Estimate size of a value in bytes
88
+ */
89
+ protected estimateSize(value: any): number;
90
+ /**
91
+ * Match key against pattern
92
+ */
93
+ protected matchPattern(key: string, pattern: string, mode: 'prefix' | 'suffix' | 'contains'): boolean;
94
+ }
95
+ //# sourceMappingURL=base-cache-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-cache-provider.d.ts","sourceRoot":"","sources":["../../src/providers/base-cache-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,EACV,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAElB,8BAAsB,iBAAkB,YAAW,cAAc;IAC/D,SAAS,CAAC,KAAK,EAAE,UAAU,CAQzB;IAEF;;OAEG;IACH,QAAQ,CAAC,OAAO,IAAI,iBAAiB;IAErC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/C;;OAEG;IACH,QAAQ,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEvE;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhF;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE3C;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAE1D;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GACtC,OAAO,CAAC,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAE/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAQrC;;OAEG;IACH,SAAS,CAAC,SAAS,IAAI,IAAI;IAI3B;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,IAAI;IAI5B;;OAEG;IACH,SAAS,CAAC,cAAc,IAAI,IAAI;IAIhC;;OAEG;IACH,SAAS,CAAC,gBAAgB,IAAI,IAAI;IAIlC;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/C;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO;IAI7C;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/C;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,kBAAkB;IAW9E;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAQ1C;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO;CAYtG"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * Base Cache Provider
4
+ *
5
+ * Abstract base class that all cache providers extend.
6
+ * Provides common functionality and enforces interface compliance.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.BaseCacheProvider = void 0;
10
+ class BaseCacheProvider {
11
+ constructor() {
12
+ this.stats = {
13
+ hits: 0,
14
+ misses: 0,
15
+ hitRatio: 0,
16
+ entryCount: 0,
17
+ size: 0,
18
+ evictions: 0,
19
+ expirations: 0,
20
+ };
21
+ }
22
+ /**
23
+ * Get cache statistics
24
+ */
25
+ async getStats() {
26
+ // Calculate hit ratio
27
+ const total = this.stats.hits + this.stats.misses;
28
+ this.stats.hitRatio = total > 0 ? this.stats.hits / total : 0;
29
+ return Object.assign({}, this.stats);
30
+ }
31
+ /**
32
+ * Record a cache hit
33
+ */
34
+ recordHit() {
35
+ this.stats.hits++;
36
+ }
37
+ /**
38
+ * Record a cache miss
39
+ */
40
+ recordMiss() {
41
+ this.stats.misses++;
42
+ }
43
+ /**
44
+ * Record an eviction
45
+ */
46
+ recordEviction() {
47
+ this.stats.evictions++;
48
+ }
49
+ /**
50
+ * Record an expiration
51
+ */
52
+ recordExpiration() {
53
+ this.stats.expirations++;
54
+ }
55
+ /**
56
+ * Update entry count
57
+ */
58
+ updateEntryCount(count) {
59
+ this.stats.entryCount = count;
60
+ }
61
+ /**
62
+ * Update cache size
63
+ */
64
+ updateSize(size) {
65
+ this.stats.size = size;
66
+ }
67
+ /**
68
+ * Check if an entry is expired
69
+ */
70
+ isExpired(expiresAt) {
71
+ return expiresAt.getTime() < Date.now();
72
+ }
73
+ /**
74
+ * Calculate TTL in milliseconds
75
+ */
76
+ calculateExpiresAt(ttl) {
77
+ return new Date(Date.now() + ttl * 1000);
78
+ }
79
+ /**
80
+ * Create cache entry metadata
81
+ */
82
+ createMetadata(ttl, tags = []) {
83
+ const now = new Date();
84
+ return {
85
+ createdAt: now,
86
+ expiresAt: this.calculateExpiresAt(ttl),
87
+ hitCount: 0,
88
+ lastAccessedAt: now,
89
+ tags,
90
+ };
91
+ }
92
+ /**
93
+ * Estimate size of a value in bytes
94
+ */
95
+ estimateSize(value) {
96
+ try {
97
+ return JSON.stringify(value).length * 2; // Rough estimate (UTF-16)
98
+ }
99
+ catch (_a) {
100
+ return 0;
101
+ }
102
+ }
103
+ /**
104
+ * Match key against pattern
105
+ */
106
+ matchPattern(key, pattern, mode) {
107
+ switch (mode) {
108
+ case 'prefix':
109
+ return key.startsWith(pattern);
110
+ case 'suffix':
111
+ return key.endsWith(pattern);
112
+ case 'contains':
113
+ return key.includes(pattern);
114
+ default:
115
+ return false;
116
+ }
117
+ }
118
+ }
119
+ exports.BaseCacheProvider = BaseCacheProvider;
120
+ //# sourceMappingURL=base-cache-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-cache-provider.js","sourceRoot":"","sources":["../../src/providers/base-cache-provider.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAWH,MAAsB,iBAAiB;IAAvC;QACY,UAAK,GAAe;YAC5B,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;SACf,CAAC;IA6JJ,CAAC;IA3GC;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,sBAAsB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,yBAAY,IAAI,CAAC,KAAK,EAAG;IAC3B,CAAC;IAED;;OAEG;IACO,SAAS;QACjB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACO,UAAU;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACO,cAAc;QACtB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACO,gBAAgB;QACxB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,KAAa;QACtC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;IAChC,CAAC;IAED;;OAEG;IACO,UAAU,CAAC,IAAY;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACO,SAAS,CAAC,SAAe;QACjC,OAAO,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACO,kBAAkB,CAAC,GAAW;QACtC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACO,cAAc,CAAC,GAAW,EAAE,OAAiB,EAAE;QACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO;YACL,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YACvC,QAAQ,EAAE,CAAC;YACX,cAAc,EAAE,GAAG;YACnB,IAAI;SACL,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,KAAU;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,0BAA0B;QACrE,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,GAAW,EAAE,OAAe,EAAE,IAAsC;QACzF,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,QAAQ;gBACX,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,KAAK,UAAU;gBACb,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAtKD,8CAsKC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Firestore Cache Provider
3
+ *
4
+ * Firestore-based cache provider for distributed caching across function instances.
5
+ *
6
+ * Features:
7
+ * - Shared cache across all function instances
8
+ * - Persistent across cold starts
9
+ * - TTL-based expiration using Firestore timestamps
10
+ * - Tag-based invalidation
11
+ * - Automatic cleanup of expired entries
12
+ *
13
+ * Best for:
14
+ * - Medium-traffic repositories
15
+ * - Data that needs to be shared across instances
16
+ * - Cache data that should survive cold starts
17
+ *
18
+ * Trade-offs:
19
+ * - Latency: ~50-100ms (vs memory ~1-5ms)
20
+ * - Cost: Firestore read/write operations
21
+ * - Size limit: 1MB per document
22
+ */
23
+ import { BaseCacheProvider } from './base-cache-provider';
24
+ import { CacheProviderType, CacheSetOptions, CacheEntry, FirestoreCacheProviderConfig } from '../types';
25
+ export declare class FirestoreCacheProvider extends BaseCacheProvider {
26
+ private config;
27
+ private db;
28
+ private cleanupInterval;
29
+ constructor(config: FirestoreCacheProviderConfig);
30
+ getType(): CacheProviderType;
31
+ /**
32
+ * Get collection reference
33
+ */
34
+ private getCollection;
35
+ get<T>(key: string): Promise<T | null>;
36
+ getWithMetadata<T>(key: string): Promise<CacheEntry<T> | null>;
37
+ set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;
38
+ delete(key: string): Promise<boolean>;
39
+ has(key: string): Promise<boolean>;
40
+ invalidateByTags(tags: string[]): Promise<number>;
41
+ invalidateByPattern(pattern: string, mode?: 'prefix' | 'suffix' | 'contains'): Promise<number>;
42
+ clear(): Promise<void>;
43
+ cleanup(): Promise<number>;
44
+ getStats(): Promise<any>;
45
+ /**
46
+ * Start automatic cleanup of expired entries
47
+ */
48
+ private startCleanup;
49
+ /**
50
+ * Stop automatic cleanup
51
+ */
52
+ stopCleanup(): void;
53
+ /**
54
+ * Cleanup on provider destruction
55
+ */
56
+ destroy(): void;
57
+ }
58
+ //# sourceMappingURL=firestore-cache-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore-cache-provider.d.ts","sourceRoot":"","sources":["../../src/providers/firestore-cache-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,4BAA4B,EAC7B,MAAM,UAAU,CAAC;AAclB,qBAAa,sBAAuB,SAAQ,iBAAiB;IAI/C,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,eAAe,CAA+B;gBAElC,MAAM,EAAE,4BAA4B;IAaxD,OAAO,IAAI,iBAAiB;IAI5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAIf,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkDtC,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAiD9D,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B3E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgClC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BjD,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,QAAQ,GAAG,QAAQ,GAAG,UAAqB,GAChD,OAAO,CAAC,MAAM,CAAC;IA6CZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBtB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAiC1B,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IA2B9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}