@bhushanpawar/sqldb 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.
- package/LICENSE +21 -0
- package/README.md +811 -0
- package/dist/best-practice-example.d.ts +35 -0
- package/dist/best-practice-example.d.ts.map +1 -0
- package/dist/best-practice-example.js +171 -0
- package/dist/best-practice-example.js.map +1 -0
- package/dist/cache/cache-key-builder.d.ts +17 -0
- package/dist/cache/cache-key-builder.d.ts.map +1 -0
- package/dist/cache/cache-key-builder.js +100 -0
- package/dist/cache/cache-key-builder.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +22 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +124 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/invalidation.d.ts +15 -0
- package/dist/cache/invalidation.d.ts.map +1 -0
- package/dist/cache/invalidation.js +59 -0
- package/dist/cache/invalidation.js.map +1 -0
- package/dist/client.d.ts +40 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +146 -0
- package/dist/client.js.map +1 -0
- package/dist/connection/mariadb.d.ts +17 -0
- package/dist/connection/mariadb.d.ts.map +1 -0
- package/dist/connection/mariadb.js +116 -0
- package/dist/connection/mariadb.js.map +1 -0
- package/dist/connection/redis.d.ts +20 -0
- package/dist/connection/redis.d.ts.map +1 -0
- package/dist/connection/redis.js +168 -0
- package/dist/connection/redis.js.map +1 -0
- package/dist/demo-debug.d.ts +2 -0
- package/dist/demo-debug.d.ts.map +1 -0
- package/dist/demo-debug.js +36 -0
- package/dist/demo-debug.js.map +1 -0
- package/dist/discovery/dependency-graph.d.ts +20 -0
- package/dist/discovery/dependency-graph.d.ts.map +1 -0
- package/dist/discovery/dependency-graph.js +89 -0
- package/dist/discovery/dependency-graph.js.map +1 -0
- package/dist/discovery/relationship-parser.d.ts +10 -0
- package/dist/discovery/relationship-parser.d.ts.map +1 -0
- package/dist/discovery/relationship-parser.js +40 -0
- package/dist/discovery/relationship-parser.js.map +1 -0
- package/dist/discovery/schema-reader.d.ts +15 -0
- package/dist/discovery/schema-reader.d.ts.map +1 -0
- package/dist/discovery/schema-reader.js +82 -0
- package/dist/discovery/schema-reader.js.map +1 -0
- package/dist/hooks/hooks-manager.d.ts +22 -0
- package/dist/hooks/hooks-manager.d.ts.map +1 -0
- package/dist/hooks/hooks-manager.js +117 -0
- package/dist/hooks/hooks-manager.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/query/operations.d.ts +31 -0
- package/dist/query/operations.d.ts.map +1 -0
- package/dist/query/operations.js +204 -0
- package/dist/query/operations.js.map +1 -0
- package/dist/query/query-builder.d.ts +15 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/query-builder.js +169 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-tracker.d.ts +13 -0
- package/dist/query/query-tracker.d.ts.map +1 -0
- package/dist/query/query-tracker.js +84 -0
- package/dist/query/query-tracker.js.map +1 -0
- package/dist/query/table-proxy.d.ts +11 -0
- package/dist/query/table-proxy.d.ts.map +1 -0
- package/dist/query/table-proxy.js +25 -0
- package/dist/query/table-proxy.js.map +1 -0
- package/dist/smart-cache/cache/cache-key-builder.d.ts +17 -0
- package/dist/smart-cache/cache/cache-key-builder.d.ts.map +1 -0
- package/dist/smart-cache/cache/cache-key-builder.js +100 -0
- package/dist/smart-cache/cache/cache-key-builder.js.map +1 -0
- package/dist/smart-cache/cache/cache-manager.d.ts +22 -0
- package/dist/smart-cache/cache/cache-manager.d.ts.map +1 -0
- package/dist/smart-cache/cache/cache-manager.js +124 -0
- package/dist/smart-cache/cache/cache-manager.js.map +1 -0
- package/dist/smart-cache/cache/invalidation.d.ts +15 -0
- package/dist/smart-cache/cache/invalidation.d.ts.map +1 -0
- package/dist/smart-cache/cache/invalidation.js +59 -0
- package/dist/smart-cache/cache/invalidation.js.map +1 -0
- package/dist/smart-cache/client.d.ts +36 -0
- package/dist/smart-cache/client.d.ts.map +1 -0
- package/dist/smart-cache/client.js +138 -0
- package/dist/smart-cache/client.js.map +1 -0
- package/dist/smart-cache/connection/mariadb.d.ts +14 -0
- package/dist/smart-cache/connection/mariadb.d.ts.map +1 -0
- package/dist/smart-cache/connection/mariadb.js +82 -0
- package/dist/smart-cache/connection/mariadb.js.map +1 -0
- package/dist/smart-cache/connection/redis.d.ts +20 -0
- package/dist/smart-cache/connection/redis.d.ts.map +1 -0
- package/dist/smart-cache/connection/redis.js +168 -0
- package/dist/smart-cache/connection/redis.js.map +1 -0
- package/dist/smart-cache/discovery/dependency-graph.d.ts +20 -0
- package/dist/smart-cache/discovery/dependency-graph.d.ts.map +1 -0
- package/dist/smart-cache/discovery/dependency-graph.js +89 -0
- package/dist/smart-cache/discovery/dependency-graph.js.map +1 -0
- package/dist/smart-cache/discovery/relationship-parser.d.ts +10 -0
- package/dist/smart-cache/discovery/relationship-parser.d.ts.map +1 -0
- package/dist/smart-cache/discovery/relationship-parser.js +40 -0
- package/dist/smart-cache/discovery/relationship-parser.js.map +1 -0
- package/dist/smart-cache/discovery/schema-reader.d.ts +15 -0
- package/dist/smart-cache/discovery/schema-reader.d.ts.map +1 -0
- package/dist/smart-cache/discovery/schema-reader.js +82 -0
- package/dist/smart-cache/discovery/schema-reader.js.map +1 -0
- package/dist/smart-cache/examples/basic-usage.d.ts +3 -0
- package/dist/smart-cache/examples/basic-usage.d.ts.map +1 -0
- package/dist/smart-cache/examples/basic-usage.js +105 -0
- package/dist/smart-cache/examples/basic-usage.js.map +1 -0
- package/dist/smart-cache/examples/hooks-example.d.ts +3 -0
- package/dist/smart-cache/examples/hooks-example.d.ts.map +1 -0
- package/dist/smart-cache/examples/hooks-example.js +133 -0
- package/dist/smart-cache/examples/hooks-example.js.map +1 -0
- package/dist/smart-cache/examples/relationships-example.d.ts +3 -0
- package/dist/smart-cache/examples/relationships-example.d.ts.map +1 -0
- package/dist/smart-cache/examples/relationships-example.js +88 -0
- package/dist/smart-cache/examples/relationships-example.js.map +1 -0
- package/dist/smart-cache/hooks/hooks-manager.d.ts +22 -0
- package/dist/smart-cache/hooks/hooks-manager.d.ts.map +1 -0
- package/dist/smart-cache/hooks/hooks-manager.js +117 -0
- package/dist/smart-cache/hooks/hooks-manager.js.map +1 -0
- package/dist/smart-cache/index.d.ts +19 -0
- package/dist/smart-cache/index.d.ts.map +1 -0
- package/dist/smart-cache/index.js +49 -0
- package/dist/smart-cache/index.js.map +1 -0
- package/dist/smart-cache/query/operations.d.ts +31 -0
- package/dist/smart-cache/query/operations.d.ts.map +1 -0
- package/dist/smart-cache/query/operations.js +187 -0
- package/dist/smart-cache/query/operations.js.map +1 -0
- package/dist/smart-cache/query/query-builder.d.ts +15 -0
- package/dist/smart-cache/query/query-builder.d.ts.map +1 -0
- package/dist/smart-cache/query/query-builder.js +169 -0
- package/dist/smart-cache/query/query-builder.js.map +1 -0
- package/dist/smart-cache/query/table-proxy.d.ts +11 -0
- package/dist/smart-cache/query/table-proxy.d.ts.map +1 -0
- package/dist/smart-cache/query/table-proxy.js +25 -0
- package/dist/smart-cache/query/table-proxy.js.map +1 -0
- package/dist/smart-cache/types/cache.d.ts +29 -0
- package/dist/smart-cache/types/cache.d.ts.map +1 -0
- package/dist/smart-cache/types/cache.js +10 -0
- package/dist/smart-cache/types/cache.js.map +1 -0
- package/dist/smart-cache/types/config.d.ts +47 -0
- package/dist/smart-cache/types/config.d.ts.map +1 -0
- package/dist/smart-cache/types/config.js +27 -0
- package/dist/smart-cache/types/config.js.map +1 -0
- package/dist/smart-cache/types/query.d.ts +36 -0
- package/dist/smart-cache/types/query.d.ts.map +1 -0
- package/dist/smart-cache/types/query.js +3 -0
- package/dist/smart-cache/types/query.js.map +1 -0
- package/dist/smart-cache/types/schema.d.ts +25 -0
- package/dist/smart-cache/types/schema.d.ts.map +1 -0
- package/dist/smart-cache/types/schema.js +3 -0
- package/dist/smart-cache/types/schema.js.map +1 -0
- package/dist/trial.d.ts +7 -0
- package/dist/trial.d.ts.map +1 -0
- package/dist/trial.js +30 -0
- package/dist/trial.js.map +1 -0
- package/dist/types/cache.d.ts +29 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +10 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/config.d.ts +47 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +27 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/query.d.ts +55 -0
- package/dist/types/query.d.ts.map +1 -0
- package/dist/types/query.js +3 -0
- package/dist/types/query.js.map +1 -0
- package/dist/types/schema.d.ts +25 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +3 -0
- package/dist/types/schema.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best Practice Example for MariaDB Cache
|
|
3
|
+
*
|
|
4
|
+
* Key Performance Tips:
|
|
5
|
+
* 1. Create pool once and reuse it (singleton pattern)
|
|
6
|
+
* 2. Use appropriate TTL based on your data update frequency
|
|
7
|
+
* 3. Set maxSize based on your query patterns
|
|
8
|
+
* 4. Enable debug in development, disable in production
|
|
9
|
+
* 5. Monitor cache hit rates and adjust settings
|
|
10
|
+
*/
|
|
11
|
+
declare class DatabaseService {
|
|
12
|
+
private static instance;
|
|
13
|
+
private pool;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(): DatabaseService;
|
|
16
|
+
getUsers(limit?: number): Promise<any>;
|
|
17
|
+
getUserById(userId: number | string): Promise<any>;
|
|
18
|
+
searchUsers(username: string): Promise<any>;
|
|
19
|
+
updateUser(userId: number | string, data: any): Promise<any>;
|
|
20
|
+
getCachePerformance(): {
|
|
21
|
+
hitRate: string;
|
|
22
|
+
efficiency: string;
|
|
23
|
+
size: number;
|
|
24
|
+
maxSize: number;
|
|
25
|
+
ttl: number;
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
hits?: number;
|
|
28
|
+
misses?: number;
|
|
29
|
+
evictions?: number;
|
|
30
|
+
};
|
|
31
|
+
resetStats(): void;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
export default DatabaseService;
|
|
35
|
+
//# sourceMappingURL=best-practice-example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"best-practice-example.d.ts","sourceRoot":"","sources":["../src/best-practice-example.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,cAAM,eAAe;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,IAAI,CAAe;IAE3B,OAAO;WAqBO,WAAW,IAAI,eAAe;IAQtC,QAAQ,CAAC,KAAK,GAAE,MAAW;IAK3B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKnC,WAAW,CAAC,QAAQ,EAAE,MAAM;IAQ5B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG;IAWnD,mBAAmB;;;;;;;;;;;IAcnB,UAAU;IAKJ,KAAK;CAGd;AAoHD,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("./index");
|
|
4
|
+
/**
|
|
5
|
+
* Best Practice Example for MariaDB Cache
|
|
6
|
+
*
|
|
7
|
+
* Key Performance Tips:
|
|
8
|
+
* 1. Create pool once and reuse it (singleton pattern)
|
|
9
|
+
* 2. Use appropriate TTL based on your data update frequency
|
|
10
|
+
* 3. Set maxSize based on your query patterns
|
|
11
|
+
* 4. Enable debug in development, disable in production
|
|
12
|
+
* 5. Monitor cache hit rates and adjust settings
|
|
13
|
+
*/
|
|
14
|
+
class DatabaseService {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.pool = (0, index_1.createPool)({
|
|
17
|
+
host: process.env.DB_HOST || 'localhost',
|
|
18
|
+
user: process.env.DB_USER || 'root',
|
|
19
|
+
password: process.env.DB_PASSWORD || 'password',
|
|
20
|
+
database: process.env.DB_NAME || 'mydb',
|
|
21
|
+
port: parseInt(process.env.DB_PORT || '3306'),
|
|
22
|
+
connectionLimit: 10,
|
|
23
|
+
// Performance optimizations
|
|
24
|
+
compress: true, // Enable compression for large result sets
|
|
25
|
+
}, {
|
|
26
|
+
// Cache configuration
|
|
27
|
+
ttl: 30000, // 30 seconds - adjust based on data freshness needs
|
|
28
|
+
maxSize: 100, // Cache up to 100 different queries
|
|
29
|
+
enabled: true, // Enable caching
|
|
30
|
+
debug: process.env.NODE_ENV === 'development', // Debug only in dev
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
// Singleton pattern - create pool once, reuse everywhere
|
|
34
|
+
static getInstance() {
|
|
35
|
+
if (!DatabaseService.instance) {
|
|
36
|
+
DatabaseService.instance = new DatabaseService();
|
|
37
|
+
}
|
|
38
|
+
return DatabaseService.instance;
|
|
39
|
+
}
|
|
40
|
+
// Get users - frequently accessed, good for caching
|
|
41
|
+
async getUsers(limit = 10) {
|
|
42
|
+
return this.pool.query('SELECT * FROM user LIMIT ?', [limit]);
|
|
43
|
+
}
|
|
44
|
+
// Get user by ID - perfect for caching (same query repeated often)
|
|
45
|
+
async getUserById(userId) {
|
|
46
|
+
return this.pool.query('SELECT * FROM users WHERE id = ?', [userId]);
|
|
47
|
+
}
|
|
48
|
+
// Search users - less predictable, but still cacheable
|
|
49
|
+
async searchUsers(username) {
|
|
50
|
+
return this.pool.query('SELECT * FROM users WHERE username LIKE ? LIMIT 20', [`%${username}%`]);
|
|
51
|
+
}
|
|
52
|
+
// Update user - mutations should NOT use cache
|
|
53
|
+
async updateUser(userId, data) {
|
|
54
|
+
// Clear related cache entries after mutation
|
|
55
|
+
this.pool.clearCache('SELECT * FROM users WHERE id');
|
|
56
|
+
return this.pool.query('UPDATE users SET updated_at = NOW() WHERE id = ?', [userId]);
|
|
57
|
+
}
|
|
58
|
+
// Get cache statistics - monitor performance
|
|
59
|
+
getCachePerformance() {
|
|
60
|
+
const stats = this.pool.getCacheStats();
|
|
61
|
+
const hitRate = stats.hits && stats.misses
|
|
62
|
+
? ((stats.hits / (stats.hits + stats.misses)) * 100).toFixed(2)
|
|
63
|
+
: '0.00';
|
|
64
|
+
return {
|
|
65
|
+
...stats,
|
|
66
|
+
hitRate: `${hitRate}%`,
|
|
67
|
+
efficiency: hitRate,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Reset stats - useful for testing
|
|
71
|
+
resetStats() {
|
|
72
|
+
this.pool.resetStats();
|
|
73
|
+
}
|
|
74
|
+
// Graceful shutdown
|
|
75
|
+
async close() {
|
|
76
|
+
await this.pool.end();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Example usage
|
|
80
|
+
async function demonstratePerformance() {
|
|
81
|
+
const db = DatabaseService.getInstance();
|
|
82
|
+
console.log('\n=== Performance Demonstration ===\n');
|
|
83
|
+
// First query - CACHE MISS (will take ~2000ms for remote DB)
|
|
84
|
+
console.log('1. First query (Cache Miss - hits database):');
|
|
85
|
+
console.time('Query 1');
|
|
86
|
+
await db.getUserById('b5a0179c-556c-4884-9243-00293be5656f');
|
|
87
|
+
console.timeEnd('Query 1');
|
|
88
|
+
// Second query - CACHE HIT (will take <1ms)
|
|
89
|
+
console.log('\n2. Same query again (Cache Hit - returns instantly):');
|
|
90
|
+
console.time('Query 2');
|
|
91
|
+
await db.getUserById('b5a0179c-556c-4884-9243-00293be5656f');
|
|
92
|
+
console.timeEnd('Query 2');
|
|
93
|
+
// Third query - Different parameter (CACHE MISS)
|
|
94
|
+
console.log('\n3. Different user (Cache Miss - hits database):');
|
|
95
|
+
console.time('Query 3');
|
|
96
|
+
await db.getUserById('7fe2df00-0157-4c3f-a5ba-00360a60af97');
|
|
97
|
+
console.timeEnd('Query 3');
|
|
98
|
+
// Fourth query - Previous query (CACHE HIT)
|
|
99
|
+
console.log('\n4. Previous user again (Cache Hit - instant):');
|
|
100
|
+
console.time('Query 4');
|
|
101
|
+
await db.getUserById('7fe2df00-0157-4c3f-a5ba-00360a60af97');
|
|
102
|
+
console.timeEnd('Query 4');
|
|
103
|
+
// Get multiple users - demonstrate list queries
|
|
104
|
+
console.log('\n5. Get list of users (Cache Miss):');
|
|
105
|
+
console.time('Query 5');
|
|
106
|
+
await db.getUsers(5);
|
|
107
|
+
console.timeEnd('Query 5');
|
|
108
|
+
console.log('\n6. Same list again (Cache Hit):');
|
|
109
|
+
console.time('Query 6');
|
|
110
|
+
await db.getUsers(5);
|
|
111
|
+
console.timeEnd('Query 6');
|
|
112
|
+
// Performance stats
|
|
113
|
+
console.log('\n=== Cache Performance Stats ===');
|
|
114
|
+
const stats = db.getCachePerformance();
|
|
115
|
+
console.log(stats);
|
|
116
|
+
console.log(`\nHit Rate: ${stats.hitRate}`);
|
|
117
|
+
console.log(`Cache Size: ${stats.size}/${stats.maxSize}`);
|
|
118
|
+
console.log(`Total Queries: ${stats.hits + stats.misses}`);
|
|
119
|
+
console.log(`Database Hits Avoided: ${stats.hits}`);
|
|
120
|
+
// Calculate time saved (approximate)
|
|
121
|
+
const avgDbTime = 2000; // ms
|
|
122
|
+
const avgCacheTime = 0.5; // ms
|
|
123
|
+
const timeSaved = (stats.hits || 0) * (avgDbTime - avgCacheTime);
|
|
124
|
+
console.log(`\nEstimated Time Saved: ~${timeSaved.toFixed(0)}ms`);
|
|
125
|
+
await db.close();
|
|
126
|
+
}
|
|
127
|
+
// Best practices summary
|
|
128
|
+
async function bestPracticesDemo() {
|
|
129
|
+
const db = DatabaseService.getInstance();
|
|
130
|
+
console.log('\n=== Best Practices ===\n');
|
|
131
|
+
// ✅ DO: Reuse the same pool instance
|
|
132
|
+
console.log('✅ DO: Use singleton pattern for pool');
|
|
133
|
+
console.log(' const db = DatabaseService.getInstance();');
|
|
134
|
+
// ✅ DO: Cache frequently accessed data
|
|
135
|
+
console.log('\n✅ DO: Cache read-heavy queries');
|
|
136
|
+
await db.getUserById('b5a0179c-556c-4884-9243-00293be5656f');
|
|
137
|
+
await db.getUserById('b5a0179c-556c-4884-9243-00293be5656f'); // Cached!
|
|
138
|
+
// ✅ DO: Clear cache after mutations
|
|
139
|
+
console.log('\n✅ DO: Clear cache after updates');
|
|
140
|
+
await db.updateUser('b5a0179c-556c-4884-9243-00293be5656f', {});
|
|
141
|
+
// ✅ DO: Monitor cache performance
|
|
142
|
+
console.log('\n✅ DO: Monitor cache hit rate');
|
|
143
|
+
const stats = db.getCachePerformance();
|
|
144
|
+
console.log(` Hit Rate: ${stats.hitRate}`);
|
|
145
|
+
// ✅ DO: Set appropriate TTL
|
|
146
|
+
console.log('\n✅ DO: Set TTL based on data update frequency');
|
|
147
|
+
console.log(' - User profiles: 30-60s');
|
|
148
|
+
console.log(' - Static data: 5-10min');
|
|
149
|
+
console.log(' - Real-time data: 1-5s or disable cache');
|
|
150
|
+
// ❌ DON\'T: Create new pool for each request
|
|
151
|
+
console.log('\n❌ DON\'T: Create pool per request (very slow!)');
|
|
152
|
+
console.log(' // BAD: new MariaDBCache(...) on every request');
|
|
153
|
+
// ❌ DON\'T: Cache data that changes frequently
|
|
154
|
+
console.log('\n❌ DON\'T: Cache highly volatile data');
|
|
155
|
+
console.log(' - Real-time analytics');
|
|
156
|
+
console.log(' - Live counters');
|
|
157
|
+
console.log(' - Session data');
|
|
158
|
+
await db.close();
|
|
159
|
+
}
|
|
160
|
+
// Uncomment to run demonstrations
|
|
161
|
+
if (require.main === module) {
|
|
162
|
+
demonstratePerformance()
|
|
163
|
+
.then(() => console.log('\n✓ Performance demo complete'))
|
|
164
|
+
.catch(console.error);
|
|
165
|
+
// Or run:
|
|
166
|
+
// bestPracticesDemo()
|
|
167
|
+
// .then(() => console.log('\n✓ Best practices demo complete'))
|
|
168
|
+
// .catch(console.error);
|
|
169
|
+
}
|
|
170
|
+
exports.default = DatabaseService;
|
|
171
|
+
//# sourceMappingURL=best-practice-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"best-practice-example.js","sourceRoot":"","sources":["../src/best-practice-example.ts"],"names":[],"mappings":";;AAAA,mCAAmD;AAEnD;;;;;;;;;GASG;AAEH,MAAM,eAAe;IAIjB;QACI,IAAI,CAAC,IAAI,GAAG,IAAA,kBAAU,EAAC;YACnB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;YACxC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM;YACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU;YAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM;YACvC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;YAC7C,eAAe,EAAE,EAAE;YAEnB,4BAA4B;YAC5B,QAAQ,EAAE,IAAI,EAAG,2CAA2C;SAC/D,EAAE;YACC,sBAAsB;YACtB,GAAG,EAAE,KAAK,EAAO,oDAAoD;YACrE,OAAO,EAAE,GAAG,EAAK,oCAAoC;YACrD,OAAO,EAAE,IAAI,EAAI,iBAAiB;YAClC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,oBAAoB;SACtE,CAAC,CAAC;IACP,CAAC;IAED,yDAAyD;IAClD,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC5B,eAAe,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,eAAe,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,WAAW,CAAC,MAAuB;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,WAAW,CAAC,QAAgB;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAClB,oDAAoD,EACpD,CAAC,IAAI,QAAQ,GAAG,CAAC,CACpB,CAAC;IACN,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,UAAU,CAAC,MAAuB,EAAE,IAAS;QAC/C,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;QAErD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAClB,kDAAkD,EAClD,CAAC,MAAM,CAAC,CACX,CAAC;IACN,CAAC;IAED,6CAA6C;IAC7C,mBAAmB;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM;YACtC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,MAAM,CAAC;QAEb,OAAO;YACH,GAAG,KAAK;YACR,OAAO,EAAE,GAAG,OAAO,GAAG;YACtB,UAAU,EAAE,OAAO;SACtB,CAAC;IACN,CAAC;IAED,mCAAmC;IACnC,UAAU;QACN,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,KAAK;QACP,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;CACJ;AAED,gBAAgB;AAChB,KAAK,UAAU,sBAAsB;IACjC,MAAM,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAErD,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC7D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3B,4CAA4C;IAC5C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC7D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3B,iDAAiD;IACjD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC7D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3B,4CAA4C;IAC5C,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC7D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3B,gDAAgD;IAChD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3B,oBAAoB;IACpB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAK,GAAG,KAAK,CAAC,MAAO,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAEpD,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK;IAC7B,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,KAAK;IAC/B,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,yBAAyB;AACzB,KAAK,UAAU,iBAAiB;IAC5B,MAAM,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,qCAAqC;IACrC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAE5D,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC,CAAC,UAAU;IAExE,oCAAoC;IACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,UAAU,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;IAEhE,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,6CAA6C;IAC7C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,kCAAkC;AAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC1B,sBAAsB,EAAE;SACnB,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;SACxD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE1B,UAAU;IACV,sBAAsB;IACtB,mEAAmE;IACnE,6BAA6B;AACjC,CAAC;AAED,kBAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class CacheKeyBuilder {
|
|
2
|
+
private prefix;
|
|
3
|
+
constructor(prefix?: string);
|
|
4
|
+
buildKey(table: string, operation: string, params: any): string;
|
|
5
|
+
buildIdKey(table: string, id: string | number): string;
|
|
6
|
+
buildTablePattern(table: string): string;
|
|
7
|
+
buildOperationPattern(table: string, operation: string): string;
|
|
8
|
+
private generateHash;
|
|
9
|
+
private normalizeParams;
|
|
10
|
+
parseKey(key: string): {
|
|
11
|
+
table: string;
|
|
12
|
+
operation: string;
|
|
13
|
+
hash: string;
|
|
14
|
+
} | null;
|
|
15
|
+
matchesPattern(key: string, pattern: string): boolean;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=cache-key-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-key-builder.d.ts","sourceRoot":"","sources":["../../src/cache/cache-key-builder.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,MAAc;IAIlC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM;IAK/D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAItD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIxC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAI/D,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,eAAe;IAuBvB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAchF,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAItD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CacheKeyBuilder = void 0;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
38
|
+
class CacheKeyBuilder {
|
|
39
|
+
constructor(prefix = 'sdc') {
|
|
40
|
+
this.prefix = prefix;
|
|
41
|
+
}
|
|
42
|
+
buildKey(table, operation, params) {
|
|
43
|
+
const hash = this.generateHash(params);
|
|
44
|
+
return `${this.prefix}:${table}:${operation}:${hash}`;
|
|
45
|
+
}
|
|
46
|
+
buildIdKey(table, id) {
|
|
47
|
+
return `${this.prefix}:${table}:id:${id}`;
|
|
48
|
+
}
|
|
49
|
+
buildTablePattern(table) {
|
|
50
|
+
return `${this.prefix}:${table}:*`;
|
|
51
|
+
}
|
|
52
|
+
buildOperationPattern(table, operation) {
|
|
53
|
+
return `${this.prefix}:${table}:${operation}:*`;
|
|
54
|
+
}
|
|
55
|
+
generateHash(params) {
|
|
56
|
+
// Normalize the params for consistent hashing
|
|
57
|
+
const normalized = this.normalizeParams(params);
|
|
58
|
+
const jsonString = JSON.stringify(normalized);
|
|
59
|
+
// For short strings, use the string directly
|
|
60
|
+
if (jsonString.length <= 50) {
|
|
61
|
+
return Buffer.from(jsonString).toString('base64url').substring(0, 20);
|
|
62
|
+
}
|
|
63
|
+
// For longer strings, use MD5 hash
|
|
64
|
+
return crypto.createHash('md5').update(jsonString).digest('hex').substring(0, 16);
|
|
65
|
+
}
|
|
66
|
+
normalizeParams(params) {
|
|
67
|
+
if (params === null || params === undefined) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
if (Array.isArray(params)) {
|
|
71
|
+
return params.map((item) => this.normalizeParams(item));
|
|
72
|
+
}
|
|
73
|
+
if (typeof params === 'object') {
|
|
74
|
+
const normalized = {};
|
|
75
|
+
const keys = Object.keys(params).sort();
|
|
76
|
+
for (const key of keys) {
|
|
77
|
+
normalized[key] = this.normalizeParams(params[key]);
|
|
78
|
+
}
|
|
79
|
+
return normalized;
|
|
80
|
+
}
|
|
81
|
+
return params;
|
|
82
|
+
}
|
|
83
|
+
parseKey(key) {
|
|
84
|
+
const parts = key.split(':');
|
|
85
|
+
if (parts.length < 4 || parts[0] !== this.prefix) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
table: parts[1],
|
|
90
|
+
operation: parts[2],
|
|
91
|
+
hash: parts[3],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
matchesPattern(key, pattern) {
|
|
95
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
96
|
+
return regex.test(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.CacheKeyBuilder = CacheKeyBuilder;
|
|
100
|
+
//# sourceMappingURL=cache-key-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-key-builder.js","sourceRoot":"","sources":["../../src/cache/cache-key-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RedisConnectionManager } from '../connection/redis';
|
|
2
|
+
import { CacheConfig } from '../types/config';
|
|
3
|
+
import { CacheStats } from '../types/cache';
|
|
4
|
+
import { CacheKeyBuilder } from './cache-key-builder';
|
|
5
|
+
export declare class CacheManager {
|
|
6
|
+
private redis;
|
|
7
|
+
private config;
|
|
8
|
+
private keyBuilder;
|
|
9
|
+
private stats;
|
|
10
|
+
constructor(redis: RedisConnectionManager, config: Required<CacheConfig>, keyPrefix?: string);
|
|
11
|
+
get<T = any>(key: string): Promise<T | null>;
|
|
12
|
+
set(key: string, value: any, ttl?: number): Promise<void>;
|
|
13
|
+
delete(key: string): Promise<void>;
|
|
14
|
+
deletePattern(pattern: string): Promise<number>;
|
|
15
|
+
exists(key: string): Promise<boolean>;
|
|
16
|
+
getKeyBuilder(): CacheKeyBuilder;
|
|
17
|
+
getStats(): CacheStats;
|
|
18
|
+
resetStats(): void;
|
|
19
|
+
isEnabled(): boolean;
|
|
20
|
+
clear(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cache-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAIX;gBAGA,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC7B,SAAS,CAAC,EAAE,MAAM;IAOd,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAsB5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa3C,aAAa,IAAI,eAAe;IAIhC,QAAQ,IAAI,UAAU;IAetB,UAAU,IAAI,IAAI;IAMlB,SAAS,IAAI,OAAO;IAId,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CacheManager = void 0;
|
|
4
|
+
const cache_key_builder_1 = require("./cache-key-builder");
|
|
5
|
+
class CacheManager {
|
|
6
|
+
constructor(redis, config, keyPrefix) {
|
|
7
|
+
this.stats = {
|
|
8
|
+
hits: 0,
|
|
9
|
+
misses: 0,
|
|
10
|
+
evictions: 0,
|
|
11
|
+
};
|
|
12
|
+
this.redis = redis;
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.keyBuilder = new cache_key_builder_1.CacheKeyBuilder(keyPrefix);
|
|
15
|
+
}
|
|
16
|
+
async get(key) {
|
|
17
|
+
if (!this.config.enabled || !this.redis.isConnected()) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const cached = await this.redis.get(key);
|
|
22
|
+
if (cached === null) {
|
|
23
|
+
this.stats.misses++;
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
this.stats.hits++;
|
|
27
|
+
return JSON.parse(cached);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error('[CacheManager] Get error:', error);
|
|
31
|
+
this.stats.misses++;
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async set(key, value, ttl) {
|
|
36
|
+
if (!this.config.enabled || !this.redis.isConnected()) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const serialized = JSON.stringify(value);
|
|
41
|
+
const ttlSeconds = ttl || this.config.defaultTTL;
|
|
42
|
+
await this.redis.set(key, serialized, ttlSeconds);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('[CacheManager] Set error:', error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async delete(key) {
|
|
49
|
+
if (!this.redis.isConnected()) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
await this.redis.del(key);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error('[CacheManager] Delete error:', error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async deletePattern(pattern) {
|
|
60
|
+
if (!this.redis.isConnected()) {
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const count = await this.redis.deletePattern(pattern);
|
|
65
|
+
this.stats.evictions += count;
|
|
66
|
+
return count;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('[CacheManager] DeletePattern error:', error);
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async exists(key) {
|
|
74
|
+
if (!this.redis.isConnected()) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
return await this.redis.exists(key);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('[CacheManager] Exists error:', error);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
getKeyBuilder() {
|
|
86
|
+
return this.keyBuilder;
|
|
87
|
+
}
|
|
88
|
+
getStats() {
|
|
89
|
+
const total = this.stats.hits + this.stats.misses;
|
|
90
|
+
const hitRate = total > 0
|
|
91
|
+
? ((this.stats.hits / total) * 100).toFixed(2)
|
|
92
|
+
: '0.00';
|
|
93
|
+
return {
|
|
94
|
+
hits: this.stats.hits,
|
|
95
|
+
misses: this.stats.misses,
|
|
96
|
+
evictions: this.stats.evictions,
|
|
97
|
+
size: 0, // Redis doesn't provide easy size lookup
|
|
98
|
+
hitRate: `${hitRate}%`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
resetStats() {
|
|
102
|
+
this.stats.hits = 0;
|
|
103
|
+
this.stats.misses = 0;
|
|
104
|
+
this.stats.evictions = 0;
|
|
105
|
+
}
|
|
106
|
+
isEnabled() {
|
|
107
|
+
return this.config.enabled && this.redis.isConnected();
|
|
108
|
+
}
|
|
109
|
+
async clear() {
|
|
110
|
+
if (!this.redis.isConnected()) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
// Clear all keys with our prefix
|
|
115
|
+
const count = await this.redis.deletePattern('*');
|
|
116
|
+
this.stats.evictions += count;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error('[CacheManager] Clear error:', error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.CacheManager = CacheManager;
|
|
124
|
+
//# sourceMappingURL=cache-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CacheManager } from './cache-manager';
|
|
2
|
+
import { DependencyGraph } from '../discovery/dependency-graph';
|
|
3
|
+
import { InvalidationOptions } from '../types/cache';
|
|
4
|
+
export declare class InvalidationManager {
|
|
5
|
+
private cacheManager;
|
|
6
|
+
private dependencyGraph;
|
|
7
|
+
constructor(cacheManager: CacheManager, dependencyGraph: DependencyGraph);
|
|
8
|
+
invalidateTable(table: string, options?: InvalidationOptions): Promise<void>;
|
|
9
|
+
private invalidateTableCache;
|
|
10
|
+
invalidatePattern(pattern: string): Promise<number>;
|
|
11
|
+
invalidateKey(key: string): Promise<void>;
|
|
12
|
+
invalidateMultipleTables(tables: string[], cascade?: boolean): Promise<void>;
|
|
13
|
+
invalidateAll(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=invalidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation.d.ts","sourceRoot":"","sources":["../../src/cache/invalidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAwB,MAAM,gBAAgB,CAAC;AAE3E,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;gBAE7B,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAKlE,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC;YA2BF,oBAAoB;IAK5B,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,wBAAwB,CAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,OAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAiBV,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidationManager = void 0;
|
|
4
|
+
const cache_1 = require("../types/cache");
|
|
5
|
+
class InvalidationManager {
|
|
6
|
+
constructor(cacheManager, dependencyGraph) {
|
|
7
|
+
this.cacheManager = cacheManager;
|
|
8
|
+
this.dependencyGraph = dependencyGraph;
|
|
9
|
+
}
|
|
10
|
+
async invalidateTable(table, options = {}) {
|
|
11
|
+
const { cascade = true, strategy = cache_1.InvalidationStrategy.IMMEDIATE, } = options;
|
|
12
|
+
if (strategy === cache_1.InvalidationStrategy.TTL_ONLY) {
|
|
13
|
+
// Don't actively invalidate, rely on TTL
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const tablesToInvalidate = cascade
|
|
17
|
+
? this.dependencyGraph.getInvalidationTargets(table)
|
|
18
|
+
: [table];
|
|
19
|
+
if (strategy === cache_1.InvalidationStrategy.LAZY) {
|
|
20
|
+
// Mark for invalidation but don't delete immediately
|
|
21
|
+
// This could be implemented with a flag or separate tracking
|
|
22
|
+
// For now, we'll do immediate invalidation
|
|
23
|
+
}
|
|
24
|
+
// Invalidate cache for all affected tables
|
|
25
|
+
for (const targetTable of tablesToInvalidate) {
|
|
26
|
+
await this.invalidateTableCache(targetTable);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async invalidateTableCache(table) {
|
|
30
|
+
const pattern = this.cacheManager.getKeyBuilder().buildTablePattern(table);
|
|
31
|
+
await this.cacheManager.deletePattern(pattern);
|
|
32
|
+
}
|
|
33
|
+
async invalidatePattern(pattern) {
|
|
34
|
+
return await this.cacheManager.deletePattern(pattern);
|
|
35
|
+
}
|
|
36
|
+
async invalidateKey(key) {
|
|
37
|
+
await this.cacheManager.delete(key);
|
|
38
|
+
}
|
|
39
|
+
async invalidateMultipleTables(tables, cascade = true) {
|
|
40
|
+
const allTables = new Set();
|
|
41
|
+
for (const table of tables) {
|
|
42
|
+
if (cascade) {
|
|
43
|
+
const targets = this.dependencyGraph.getInvalidationTargets(table);
|
|
44
|
+
targets.forEach((t) => allTables.add(t));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
allTables.add(table);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
for (const table of allTables) {
|
|
51
|
+
await this.invalidateTableCache(table);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async invalidateAll() {
|
|
55
|
+
await this.cacheManager.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.InvalidationManager = InvalidationManager;
|
|
59
|
+
//# sourceMappingURL=invalidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation.js","sourceRoot":"","sources":["../../src/cache/invalidation.ts"],"names":[],"mappings":";;;AAEA,0CAA2E;AAE3E,MAAa,mBAAmB;IAI9B,YAAY,YAA0B,EAAE,eAAgC;QACtE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,KAAa,EACb,UAA+B,EAAE;QAEjC,MAAM,EACJ,OAAO,GAAG,IAAI,EACd,QAAQ,GAAG,4BAAoB,CAAC,SAAS,GAC1C,GAAG,OAAO,CAAC;QAEZ,IAAI,QAAQ,KAAK,4BAAoB,CAAC,QAAQ,EAAE,CAAC;YAC/C,yCAAyC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO;YAChC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACpD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAEZ,IAAI,QAAQ,KAAK,4BAAoB,CAAC,IAAI,EAAE,CAAC;YAC3C,qDAAqD;YACrD,6DAA6D;YAC7D,2CAA2C;QAC7C,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,KAAa;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,MAAgB,EAChB,UAAmB,IAAI;QAEvB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;CACF;AA3ED,kDA2EC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SmartDBConfig } from './types/config';
|
|
2
|
+
import { TableOperations, QueryMetadata } from './types/query';
|
|
3
|
+
import { DependencyGraph } from './discovery/dependency-graph';
|
|
4
|
+
import { CacheManager } from './cache/cache-manager';
|
|
5
|
+
import { InvalidationManager } from './cache/invalidation';
|
|
6
|
+
import { HooksManager } from './hooks/hooks-manager';
|
|
7
|
+
import { InMemoryQueryTracker } from './query/query-tracker';
|
|
8
|
+
export declare class SmartDBClient {
|
|
9
|
+
private config;
|
|
10
|
+
private dbManager;
|
|
11
|
+
private redisManager;
|
|
12
|
+
private cacheManager;
|
|
13
|
+
private invalidationManager;
|
|
14
|
+
private dependencyGraph;
|
|
15
|
+
private queryBuilder;
|
|
16
|
+
private tableProxyFactory;
|
|
17
|
+
hooks: HooksManager;
|
|
18
|
+
queryTracker: InMemoryQueryTracker;
|
|
19
|
+
private initialized;
|
|
20
|
+
private discoveredTables;
|
|
21
|
+
constructor(config: SmartDBConfig);
|
|
22
|
+
initialize(): Promise<void>;
|
|
23
|
+
private discoverSchema;
|
|
24
|
+
refreshSchema(): Promise<void>;
|
|
25
|
+
getTableOperations<T = any>(tableName: string): TableOperations<T>;
|
|
26
|
+
getCacheManager(): CacheManager;
|
|
27
|
+
getInvalidationManager(): InvalidationManager;
|
|
28
|
+
getDependencyGraph(): DependencyGraph;
|
|
29
|
+
getDiscoveredTables(): string[];
|
|
30
|
+
getQueries(correlationId?: string): QueryMetadata[];
|
|
31
|
+
clearQueries(correlationId?: string): void;
|
|
32
|
+
healthCheck(): Promise<{
|
|
33
|
+
mariadb: boolean;
|
|
34
|
+
redis: boolean;
|
|
35
|
+
overall: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
private log;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAId,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,iBAAiB,CAAqB;IACvC,KAAK,EAAG,YAAY,CAAC;IACrB,YAAY,EAAE,oBAAoB,CAAC;IAE1C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,gBAAgB,CAA0B;gBAEtC,MAAM,EAAE,aAAa;IAU3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAsEnB,cAAc;IA4BtB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAiBlE,eAAe,IAAI,YAAY;IAI/B,sBAAsB,IAAI,mBAAmB;IAI7C,kBAAkB,IAAI,eAAe;IAIrC,mBAAmB,IAAI,MAAM,EAAE;IAI/B,UAAU,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAInD,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpC,WAAW,IAAI,OAAO,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAWI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,OAAO,CAAC,GAAG;CAKZ"}
|