@aifabrix/miso-client 1.0.3 → 1.1.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/README.md +40 -0
- package/dist/examples/manual-config-example.js +2 -0
- package/dist/examples/manual-config-example.js.map +1 -1
- package/dist/examples/step-5-logging.js +2 -1
- package/dist/examples/step-5-logging.js.map +1 -1
- package/dist/examples/step-7-encryption-cache.d.ts +8 -0
- package/dist/examples/step-7-encryption-cache.d.ts.map +1 -0
- package/dist/examples/step-7-encryption-cache.js +131 -0
- package/dist/examples/step-7-encryption-cache.js.map +1 -0
- package/dist/examples/usage.js +3 -3
- package/dist/examples/usage.js.map +1 -1
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +37 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/services/cache.service.d.ts +58 -0
- package/dist/src/services/cache.service.d.ts.map +1 -0
- package/dist/src/services/cache.service.js +171 -0
- package/dist/src/services/cache.service.js.map +1 -0
- package/dist/src/services/encryption.service.d.ts +32 -0
- package/dist/src/services/encryption.service.d.ts.map +1 -0
- package/dist/src/services/encryption.service.js +135 -0
- package/dist/src/services/encryption.service.js.map +1 -0
- package/dist/src/services/permission.service.d.ts +5 -5
- package/dist/src/services/permission.service.d.ts.map +1 -1
- package/dist/src/services/permission.service.js +14 -27
- package/dist/src/services/permission.service.js.map +1 -1
- package/dist/src/services/role.service.d.ts +4 -4
- package/dist/src/services/role.service.d.ts.map +1 -1
- package/dist/src/services/role.service.js +11 -22
- package/dist/src/services/role.service.js.map +1 -1
- package/dist/src/types/config.types.d.ts +1 -0
- package/dist/src/types/config.types.d.ts.map +1 -1
- package/dist/src/utils/config-loader.d.ts.map +1 -1
- package/dist/src/utils/config-loader.js +4 -0
- package/dist/src/utils/config-loader.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,6 +26,7 @@ The **AI Fabrix Miso Client SDK** provides authentication, authorization, and lo
|
|
|
26
26
|
- API key authentication
|
|
27
27
|
- Token revocation support
|
|
28
28
|
- Secure token storage
|
|
29
|
+
- Data encryption/decryption (AES-256-GCM)
|
|
29
30
|
|
|
30
31
|
### 📊 Compliance & Audit
|
|
31
32
|
|
|
@@ -51,6 +52,7 @@ The **AI Fabrix Miso Client SDK** provides authentication, authorization, and lo
|
|
|
51
52
|
|
|
52
53
|
**Intelligent Caching**
|
|
53
54
|
- Redis-based role and permission caching
|
|
55
|
+
- Generic cache service with Redis and in-memory fallback
|
|
54
56
|
- Configurable cache TTL (default: 15 minutes)
|
|
55
57
|
- Automatic cache invalidation
|
|
56
58
|
- Fallback to controller when Redis unavailable
|
|
@@ -283,6 +285,43 @@ await client.log.audit('access.denied', 'authorization', {
|
|
|
283
285
|
|
|
284
286
|
---
|
|
285
287
|
|
|
288
|
+
### Encryption and Caching
|
|
289
|
+
|
|
290
|
+
**What happens:** Use encryption for sensitive data and generic caching for improved performance.
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
import { MisoClient, loadConfig } from '@aifabrix/miso-client';
|
|
294
|
+
|
|
295
|
+
const client = new MisoClient(loadConfig());
|
|
296
|
+
await client.initialize();
|
|
297
|
+
|
|
298
|
+
// Encryption (requires ENCRYPTION_KEY in .env or config.encryptionKey)
|
|
299
|
+
if (client.encryption) {
|
|
300
|
+
const encrypted = client.encryption.encrypt('sensitive-data');
|
|
301
|
+
const decrypted = client.encryption.decrypt(encrypted);
|
|
302
|
+
console.log('Decrypted:', decrypted);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Generic caching (automatically uses Redis if available, falls back to memory)
|
|
306
|
+
await client.cache.set('user:123', { name: 'John', age: 30 }, 600); // 10 minutes TTL
|
|
307
|
+
const user = await client.cache.get<{ name: string; age: number }>('user:123');
|
|
308
|
+
if (user) {
|
|
309
|
+
console.log('Cached user:', user);
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Configuration:**
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
# Add to .env
|
|
317
|
+
ENCRYPTION_KEY=your-32-byte-encryption-key
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
→ [API Reference](docs/api-reference.md#encryption-methods)
|
|
321
|
+
→ [Cache Methods](docs/api-reference.md#cache-methods)
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
286
325
|
## 🔧 Configuration
|
|
287
326
|
|
|
288
327
|
```typescript
|
|
@@ -292,6 +331,7 @@ interface MisoClientConfig {
|
|
|
292
331
|
clientSecret: string; // Required: Client secret
|
|
293
332
|
redis?: RedisConfig; // Optional: For caching
|
|
294
333
|
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
334
|
+
encryptionKey?: string; // Optional: Encryption key (or use ENCRYPTION_KEY env var)
|
|
295
335
|
cache?: {
|
|
296
336
|
roleTTL?: number; // Role cache TTL (default: 900s)
|
|
297
337
|
permissionTTL?: number; // Permission cache TTL (default: 900s)
|
|
@@ -15,6 +15,8 @@ async function manualConfigExample() {
|
|
|
15
15
|
port: 6379,
|
|
16
16
|
},
|
|
17
17
|
logLevel: 'info',
|
|
18
|
+
// Optional: Encryption key (or set ENCRYPTION_KEY env var)
|
|
19
|
+
encryptionKey: 'your-encryption-key-here', // 32-byte key in hex/base64/raw string
|
|
18
20
|
});
|
|
19
21
|
try {
|
|
20
22
|
await client.initialize();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-config-example.js","sourceRoot":"","sources":["../../examples/manual-config-example.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,wCAA0C;AAE1C,KAAK,UAAU,mBAAmB;IAChC,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC;QAC5B,aAAa,EAAE,uBAAuB;QACtC,QAAQ,EAAE,iBAAiB;QAC3B,YAAY,EAAE,kBAAkB;QAChC,KAAK,EAAE;YACL,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,IAAI;SACX;QACD,QAAQ,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"manual-config-example.js","sourceRoot":"","sources":["../../examples/manual-config-example.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,wCAA0C;AAE1C,KAAK,UAAU,mBAAmB;IAChC,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC;QAC5B,aAAa,EAAE,uBAAuB;QACtC,QAAQ,EAAE,iBAAiB;QAC3B,YAAY,EAAE,kBAAkB;QAChC,KAAK,EAAE;YACL,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,IAAI;SACX;QACD,QAAQ,EAAE,MAAM;QAChB,2DAA2D;QAC3D,aAAa,EAAE,0BAA0B,EAAE,uCAAuC;KACnF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEpC,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,mBAAmB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -52,6 +52,7 @@ async function loggingExample() {
|
|
|
52
52
|
}
|
|
53
53
|
async function performOperation() {
|
|
54
54
|
// Your application logic
|
|
55
|
+
// This is a placeholder for any operation that might fail
|
|
56
|
+
throw new Error('Operation failed');
|
|
55
57
|
}
|
|
56
|
-
let someCondition = false;
|
|
57
58
|
//# sourceMappingURL=step-5-logging.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-5-logging.js","sourceRoot":"","sources":["../../examples/step-5-logging.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0DM,wCAAc;AAxDvB,wCAAsD;AAEtD,KAAK,UAAU,cAAc;IAC3B,gDAAgD;IAChD,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC,IAAA,kBAAU,GAAE,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,qBAAqB,CAAC;QAEpC,0CAA0C;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEzC,kCAAkC;QAClC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE;YAC/C,MAAM,EAAE,IAAI,EAAE,EAAE;YAChB,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,kBAAkB;QAClB,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE;gBACzC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACvD,MAAM,EAAE,IAAI,EAAE,EAAE;aACjB,CAAC,CAAC;QACL,CAAC;QAED,qDAAqD;QACrD,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE;YAChD,MAAM,EAAE,IAAI,EAAE,EAAE;YAChB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,yBAAyB;
|
|
1
|
+
{"version":3,"file":"step-5-logging.js","sourceRoot":"","sources":["../../examples/step-5-logging.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0DM,wCAAc;AAxDvB,wCAAsD;AAEtD,KAAK,UAAU,cAAc;IAC3B,gDAAgD;IAChD,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC,IAAA,kBAAU,GAAE,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,qBAAqB,CAAC;QAEpC,0CAA0C;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEzC,kCAAkC;QAClC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE;YAC/C,MAAM,EAAE,IAAI,EAAE,EAAE;YAChB,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,kBAAkB;QAClB,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE;gBACzC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACvD,MAAM,EAAE,IAAI,EAAE,EAAE;aACjB,CAAC,CAAC;QACL,CAAC;QAED,qDAAqD;QACrD,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE;YAChD,MAAM,EAAE,IAAI,EAAE,EAAE;YAChB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,yBAAyB;IACzB,0DAA0D;IAC1D,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step 7: Encryption & Caching
|
|
3
|
+
*
|
|
4
|
+
* Examples of encrypting sensitive data and using generic caching.
|
|
5
|
+
*/
|
|
6
|
+
declare function encryptionCacheExample(): Promise<void>;
|
|
7
|
+
export { encryptionCacheExample };
|
|
8
|
+
//# sourceMappingURL=step-7-encryption-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-7-encryption-cache.d.ts","sourceRoot":"","sources":["../../examples/step-7-encryption-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,iBAAe,sBAAsB,kBA6JpC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Step 7: Encryption & Caching
|
|
4
|
+
*
|
|
5
|
+
* Examples of encrypting sensitive data and using generic caching.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.encryptionCacheExample = encryptionCacheExample;
|
|
9
|
+
const index_1 = require("../src/index");
|
|
10
|
+
async function encryptionCacheExample() {
|
|
11
|
+
// Create client - loads from .env automatically
|
|
12
|
+
// Make sure ENCRYPTION_KEY is set in .env for encryption to work
|
|
13
|
+
const client = new index_1.MisoClient((0, index_1.loadConfig)());
|
|
14
|
+
try {
|
|
15
|
+
await client.initialize();
|
|
16
|
+
console.log('✅ Client initialized');
|
|
17
|
+
const token = 'your-jwt-token-here';
|
|
18
|
+
// ==================== ENCRYPTION ====================
|
|
19
|
+
// Check if encryption is available (requires ENCRYPTION_KEY in .env)
|
|
20
|
+
if (client.encryption) {
|
|
21
|
+
console.log('🔒 Encryption service is available');
|
|
22
|
+
// Encrypt sensitive data
|
|
23
|
+
const sensitiveData = JSON.stringify({
|
|
24
|
+
creditCard: '4532-1234-5678-9010',
|
|
25
|
+
ssn: '123-45-6789',
|
|
26
|
+
apiKey: 'secret-api-key-123'
|
|
27
|
+
});
|
|
28
|
+
const encrypted = client.encryption.encrypt(sensitiveData);
|
|
29
|
+
console.log('🔐 Encrypted data:', encrypted);
|
|
30
|
+
// Decrypt when needed
|
|
31
|
+
const decrypted = client.encryption.decrypt(encrypted);
|
|
32
|
+
console.log('🔓 Decrypted data:', JSON.parse(decrypted));
|
|
33
|
+
// Example: Storing encrypted user preferences
|
|
34
|
+
const userPreferences = {
|
|
35
|
+
theme: 'dark',
|
|
36
|
+
notifications: true,
|
|
37
|
+
language: 'en'
|
|
38
|
+
};
|
|
39
|
+
const encryptedPreferences = client.encryption.encrypt(JSON.stringify(userPreferences));
|
|
40
|
+
console.log('💾 Encrypted preferences ready for storage');
|
|
41
|
+
// Later, decrypt when retrieving
|
|
42
|
+
const decryptedPreferences = JSON.parse(client.encryption.decrypt(encryptedPreferences));
|
|
43
|
+
console.log('📖 Retrieved preferences:', decryptedPreferences);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log('⚠️ Encryption not available - set ENCRYPTION_KEY in .env');
|
|
47
|
+
}
|
|
48
|
+
// ==================== GENERIC CACHING ====================
|
|
49
|
+
console.log('\n📦 Generic caching examples:');
|
|
50
|
+
// Example 1: Cache expensive computation results
|
|
51
|
+
const userId = 'user-123';
|
|
52
|
+
const cacheKey = `user:${userId}:computed-data`;
|
|
53
|
+
// Check cache first
|
|
54
|
+
const cachedData = await client.cache.get(cacheKey);
|
|
55
|
+
if (cachedData) {
|
|
56
|
+
console.log('⚡ Got data from cache:', cachedData);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log('💭 Computing expensive data...');
|
|
60
|
+
// Simulate expensive computation
|
|
61
|
+
const computedData = {
|
|
62
|
+
result: Math.random() * 1000,
|
|
63
|
+
computedAt: new Date().toISOString()
|
|
64
|
+
};
|
|
65
|
+
// Cache for 10 minutes (600 seconds)
|
|
66
|
+
await client.cache.set(cacheKey, computedData, 600);
|
|
67
|
+
console.log('💾 Cached computed data');
|
|
68
|
+
}
|
|
69
|
+
async function getProduct(id) {
|
|
70
|
+
const productCacheKey = `product:${id}`;
|
|
71
|
+
// Check cache
|
|
72
|
+
const cachedProduct = await client.cache.get(productCacheKey);
|
|
73
|
+
if (cachedProduct) {
|
|
74
|
+
console.log('⚡ Product from cache:', cachedProduct);
|
|
75
|
+
return cachedProduct;
|
|
76
|
+
}
|
|
77
|
+
// Simulate database fetch
|
|
78
|
+
console.log('💭 Fetching product from database...');
|
|
79
|
+
const product = {
|
|
80
|
+
id,
|
|
81
|
+
name: `Product ${id}`,
|
|
82
|
+
price: 99.99
|
|
83
|
+
};
|
|
84
|
+
// Cache for 5 minutes (300 seconds)
|
|
85
|
+
await client.cache.set(productCacheKey, product, 300);
|
|
86
|
+
console.log('💾 Product cached');
|
|
87
|
+
return product;
|
|
88
|
+
}
|
|
89
|
+
// Use the cached product function
|
|
90
|
+
await getProduct('prod-123');
|
|
91
|
+
await getProduct('prod-123'); // Second call uses cache
|
|
92
|
+
// Example 3: Cache user session data
|
|
93
|
+
if (await client.validateToken(token)) {
|
|
94
|
+
const user = await client.getUser(token);
|
|
95
|
+
if (user) {
|
|
96
|
+
const sessionCacheKey = `session:${user.id}`;
|
|
97
|
+
const sessionData = {
|
|
98
|
+
userId: user.id,
|
|
99
|
+
username: user.username,
|
|
100
|
+
lastAccess: new Date().toISOString(),
|
|
101
|
+
preferences: {
|
|
102
|
+
theme: 'dark',
|
|
103
|
+
language: 'en'
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
// Cache session for 30 minutes (1800 seconds)
|
|
107
|
+
await client.cache.set(sessionCacheKey, sessionData, 1800);
|
|
108
|
+
console.log('💾 User session cached');
|
|
109
|
+
// Retrieve later
|
|
110
|
+
const cachedSession = await client.cache.get(sessionCacheKey);
|
|
111
|
+
if (cachedSession) {
|
|
112
|
+
console.log('📖 Retrieved session:', cachedSession);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Example 4: Delete from cache
|
|
117
|
+
await client.cache.delete(cacheKey);
|
|
118
|
+
console.log('🗑️ Deleted from cache');
|
|
119
|
+
// Example 5: Clear all cache (use with caution)
|
|
120
|
+
// await client.cache.clear();
|
|
121
|
+
// console.log('🧹 All cache cleared');
|
|
122
|
+
console.log('\n✅ Encryption & caching examples completed');
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error('❌ Error:', error);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await client.disconnect();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=step-7-encryption-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-7-encryption-cache.js","sourceRoot":"","sources":["../../examples/step-7-encryption-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/examples/usage.js
CHANGED
|
@@ -29,11 +29,11 @@ async function example() {
|
|
|
29
29
|
const isAdmin = await client.hasRole(token, 'admin');
|
|
30
30
|
console.log('Is admin:', isAdmin);
|
|
31
31
|
// Log some events
|
|
32
|
-
client.log.info('User accessed application', {
|
|
32
|
+
await client.log.info('User accessed application', {
|
|
33
33
|
userId: user?.id,
|
|
34
34
|
username: user?.username
|
|
35
35
|
});
|
|
36
|
-
client.log.audit('user.login', 'authentication', {
|
|
36
|
+
await client.log.audit('user.login', 'authentication', {
|
|
37
37
|
userId: user?.id,
|
|
38
38
|
ip: '192.168.1.1'
|
|
39
39
|
});
|
|
@@ -43,7 +43,7 @@ async function example() {
|
|
|
43
43
|
throw new Error('Something went wrong');
|
|
44
44
|
}
|
|
45
45
|
catch (error) {
|
|
46
|
-
client.log.error('Application error', {
|
|
46
|
+
await client.log.error('Application error', {
|
|
47
47
|
error: error instanceof Error ? error.message : 'Unknown error',
|
|
48
48
|
stack: error instanceof Error ? error.stack : undefined
|
|
49
49
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../examples/usage.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqEM,0BAAO;AAnEhB,wCAAsD;AAEtD,KAAK,UAAU,OAAO;IACpB,uDAAuD;IACvD,wEAAwE;IACxE,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC,IAAA,kBAAU,GAAE,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,sEAAsE;QACtE,MAAM,KAAK,GAAG,qBAAqB,CAAC;QAEpC,iBAAiB;QACjB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAErC,IAAI,OAAO,EAAE,CAAC;YACZ,gBAAgB;YAChB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAE3B,iBAAiB;YACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAElC,sBAAsB;YACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAElC,kBAAkB;YAClB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE;
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../examples/usage.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqEM,0BAAO;AAnEhB,wCAAsD;AAEtD,KAAK,UAAU,OAAO;IACpB,uDAAuD;IACvD,wEAAwE;IACxE,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC,IAAA,kBAAU,GAAE,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,sEAAsE;QACtE,MAAM,KAAK,GAAG,qBAAqB,CAAC;QAEpC,iBAAiB;QACjB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAErC,IAAI,OAAO,EAAE,CAAC;YACZ,gBAAgB;YAChB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAE3B,iBAAiB;YACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAElC,sBAAsB;YACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAElC,kBAAkB;YAClB,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACjD,MAAM,EAAE,IAAI,EAAE,EAAE;gBAChB,QAAQ,EAAE,IAAI,EAAE,QAAQ;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,EAAE;gBACrD,MAAM,EAAE,IAAI,EAAE,EAAE;gBAChB,EAAE,EAAE,aAAa;aAClB,CAAC,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;YAAS,CAAC;QACT,UAAU;QACV,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Main MisoClient SDK class
|
|
3
3
|
*/
|
|
4
4
|
import { LoggerService } from './services/logger.service';
|
|
5
|
+
import { EncryptionService } from './services/encryption.service';
|
|
6
|
+
import { CacheService } from './services/cache.service';
|
|
5
7
|
import { MisoClientConfig, UserInfo } from './types/config.types';
|
|
6
8
|
export declare class MisoClient {
|
|
7
9
|
private config;
|
|
@@ -11,6 +13,8 @@ export declare class MisoClient {
|
|
|
11
13
|
private roles;
|
|
12
14
|
private permissions;
|
|
13
15
|
private logger;
|
|
16
|
+
private encryptionService?;
|
|
17
|
+
private cacheService;
|
|
14
18
|
private initialized;
|
|
15
19
|
constructor(config: MisoClientConfig);
|
|
16
20
|
/**
|
|
@@ -112,6 +116,15 @@ export declare class MisoClient {
|
|
|
112
116
|
* Get logger service for application logging
|
|
113
117
|
*/
|
|
114
118
|
get log(): LoggerService;
|
|
119
|
+
/**
|
|
120
|
+
* Get encryption service for data encryption/decryption
|
|
121
|
+
* Returns undefined if encryption key is not configured
|
|
122
|
+
*/
|
|
123
|
+
get encryption(): EncryptionService | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Get cache service for generic caching
|
|
126
|
+
*/
|
|
127
|
+
get cache(): CacheService;
|
|
115
128
|
/**
|
|
116
129
|
* Get current configuration
|
|
117
130
|
*/
|
|
@@ -126,6 +139,8 @@ export { AuthService } from './services/auth.service';
|
|
|
126
139
|
export { RoleService } from './services/role.service';
|
|
127
140
|
export { LoggerService } from './services/logger.service';
|
|
128
141
|
export { RedisService } from './services/redis.service';
|
|
142
|
+
export { EncryptionService } from './services/encryption.service';
|
|
143
|
+
export { CacheService } from './services/cache.service';
|
|
129
144
|
export { HttpClient } from './utils/http-client';
|
|
130
145
|
export { loadConfig } from './utils/config-loader';
|
|
131
146
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -17,12 +17,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.loadConfig = exports.HttpClient = exports.RedisService = exports.LoggerService = exports.RoleService = exports.AuthService = exports.MisoClient = void 0;
|
|
20
|
+
exports.loadConfig = exports.HttpClient = exports.CacheService = exports.EncryptionService = exports.RedisService = exports.LoggerService = exports.RoleService = exports.AuthService = exports.MisoClient = void 0;
|
|
21
21
|
const auth_service_1 = require("./services/auth.service");
|
|
22
22
|
const role_service_1 = require("./services/role.service");
|
|
23
23
|
const permission_service_1 = require("./services/permission.service");
|
|
24
24
|
const logger_service_1 = require("./services/logger.service");
|
|
25
25
|
const redis_service_1 = require("./services/redis.service");
|
|
26
|
+
const encryption_service_1 = require("./services/encryption.service");
|
|
27
|
+
const cache_service_1 = require("./services/cache.service");
|
|
26
28
|
const http_client_1 = require("./utils/http-client");
|
|
27
29
|
class MisoClient {
|
|
28
30
|
constructor(config) {
|
|
@@ -31,9 +33,22 @@ class MisoClient {
|
|
|
31
33
|
this.httpClient = new http_client_1.HttpClient(config);
|
|
32
34
|
this.redis = new redis_service_1.RedisService(config.redis);
|
|
33
35
|
this.auth = new auth_service_1.AuthService(this.httpClient, this.redis);
|
|
34
|
-
this.roles = new role_service_1.RoleService(this.httpClient, this.redis);
|
|
35
|
-
this.permissions = new permission_service_1.PermissionService(this.httpClient, this.redis);
|
|
36
36
|
this.logger = new logger_service_1.LoggerService(this.httpClient, this.redis);
|
|
37
|
+
// Initialize cache service with Redis support (used by roles and permissions)
|
|
38
|
+
this.cacheService = new cache_service_1.CacheService(this.redis);
|
|
39
|
+
// Initialize services that use cache
|
|
40
|
+
this.roles = new role_service_1.RoleService(this.httpClient, this.cacheService);
|
|
41
|
+
this.permissions = new permission_service_1.PermissionService(this.httpClient, this.cacheService);
|
|
42
|
+
// Initialize encryption service if key is provided (optional)
|
|
43
|
+
if (config.encryptionKey || process.env.ENCRYPTION_KEY) {
|
|
44
|
+
try {
|
|
45
|
+
this.encryptionService = new encryption_service_1.EncryptionService(config.encryptionKey);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// Encryption service not initialized if key is missing
|
|
49
|
+
// This is okay - encryption is optional
|
|
50
|
+
}
|
|
51
|
+
}
|
|
37
52
|
}
|
|
38
53
|
/**
|
|
39
54
|
* Initialize the client (connect to Redis if configured)
|
|
@@ -199,6 +214,21 @@ class MisoClient {
|
|
|
199
214
|
get log() {
|
|
200
215
|
return this.logger;
|
|
201
216
|
}
|
|
217
|
+
// ==================== ENCRYPTION METHODS ====================
|
|
218
|
+
/**
|
|
219
|
+
* Get encryption service for data encryption/decryption
|
|
220
|
+
* Returns undefined if encryption key is not configured
|
|
221
|
+
*/
|
|
222
|
+
get encryption() {
|
|
223
|
+
return this.encryptionService;
|
|
224
|
+
}
|
|
225
|
+
// ==================== CACHE METHODS ====================
|
|
226
|
+
/**
|
|
227
|
+
* Get cache service for generic caching
|
|
228
|
+
*/
|
|
229
|
+
get cache() {
|
|
230
|
+
return this.cacheService;
|
|
231
|
+
}
|
|
202
232
|
// ==================== UTILITY METHODS ====================
|
|
203
233
|
/**
|
|
204
234
|
* Get current configuration
|
|
@@ -225,6 +255,10 @@ var logger_service_2 = require("./services/logger.service");
|
|
|
225
255
|
Object.defineProperty(exports, "LoggerService", { enumerable: true, get: function () { return logger_service_2.LoggerService; } });
|
|
226
256
|
var redis_service_2 = require("./services/redis.service");
|
|
227
257
|
Object.defineProperty(exports, "RedisService", { enumerable: true, get: function () { return redis_service_2.RedisService; } });
|
|
258
|
+
var encryption_service_2 = require("./services/encryption.service");
|
|
259
|
+
Object.defineProperty(exports, "EncryptionService", { enumerable: true, get: function () { return encryption_service_2.EncryptionService; } });
|
|
260
|
+
var cache_service_2 = require("./services/cache.service");
|
|
261
|
+
Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return cache_service_2.CacheService; } });
|
|
228
262
|
var http_client_2 = require("./utils/http-client");
|
|
229
263
|
Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return http_client_2.HttpClient; } });
|
|
230
264
|
// Export utilities
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,0DAAsD;AACtD,0DAAsD;AACtD,sEAAkE;AAClE,8DAA0D;AAC1D,4DAAwD;AACxD,qDAAiD;AAGjD,MAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache service for generic caching with Redis support and in-memory TTL fallback
|
|
3
|
+
*/
|
|
4
|
+
import { RedisService } from './redis.service';
|
|
5
|
+
export declare class CacheService {
|
|
6
|
+
private redis?;
|
|
7
|
+
private memoryCache;
|
|
8
|
+
private cleanupInterval?;
|
|
9
|
+
/**
|
|
10
|
+
* Create a CacheService instance
|
|
11
|
+
* @param redis - Optional RedisService for Redis-backed caching. If not provided, uses in-memory cache only.
|
|
12
|
+
*/
|
|
13
|
+
constructor(redis?: RedisService);
|
|
14
|
+
/**
|
|
15
|
+
* Clean up expired entries from memory cache
|
|
16
|
+
*/
|
|
17
|
+
private cleanupExpired;
|
|
18
|
+
/**
|
|
19
|
+
* Get cached value
|
|
20
|
+
* Checks Redis first, then falls back to memory cache
|
|
21
|
+
* @param key - Cache key
|
|
22
|
+
* @returns Cached value or null if not found or expired
|
|
23
|
+
*/
|
|
24
|
+
get<T>(key: string): Promise<T | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Set value in cache with TTL
|
|
27
|
+
* Sets in both Redis and memory cache
|
|
28
|
+
* @param key - Cache key
|
|
29
|
+
* @param value - Value to cache (will be JSON serialized)
|
|
30
|
+
* @param ttl - Time to live in seconds
|
|
31
|
+
* @returns true if successful, false otherwise
|
|
32
|
+
*/
|
|
33
|
+
set<T>(key: string, value: T, ttl: number): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Set value in memory cache
|
|
36
|
+
*/
|
|
37
|
+
private setInMemory;
|
|
38
|
+
/**
|
|
39
|
+
* Delete value from cache
|
|
40
|
+
* Deletes from both Redis and memory cache
|
|
41
|
+
* @param key - Cache key
|
|
42
|
+
* @returns true if deleted from at least one cache, false otherwise
|
|
43
|
+
*/
|
|
44
|
+
delete(key: string): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Clear all cache entries
|
|
47
|
+
* Clears both Redis and memory cache
|
|
48
|
+
* Note: This only clears keys that are accessible via this service instance
|
|
49
|
+
* Redis may have other keys set by other services
|
|
50
|
+
*/
|
|
51
|
+
clear(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Cleanup resources (stops cleanup interval)
|
|
54
|
+
* Call this when the service is no longer needed
|
|
55
|
+
*/
|
|
56
|
+
destroy(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=cache.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../../src/services/cache.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,eAAe,CAAC,CAAiB;IAEzC;;;OAGG;gBACS,KAAK,CAAC,EAAE,YAAY;IAShC;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IA4C5C;;;;;;;OAOG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BlE;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc3C;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;;OAGG;IACH,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cache service for generic caching with Redis support and in-memory TTL fallback
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CacheService = void 0;
|
|
7
|
+
class CacheService {
|
|
8
|
+
/**
|
|
9
|
+
* Create a CacheService instance
|
|
10
|
+
* @param redis - Optional RedisService for Redis-backed caching. If not provided, uses in-memory cache only.
|
|
11
|
+
*/
|
|
12
|
+
constructor(redis) {
|
|
13
|
+
this.memoryCache = new Map();
|
|
14
|
+
this.redis = redis;
|
|
15
|
+
// Start periodic cleanup of expired entries (every 5 minutes)
|
|
16
|
+
this.cleanupInterval = setInterval(() => {
|
|
17
|
+
this.cleanupExpired();
|
|
18
|
+
}, 5 * 60 * 1000);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Clean up expired entries from memory cache
|
|
22
|
+
*/
|
|
23
|
+
cleanupExpired() {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
const keysToDelete = [];
|
|
26
|
+
for (const [key, entry] of this.memoryCache.entries()) {
|
|
27
|
+
if (entry.expiresAt < now) {
|
|
28
|
+
keysToDelete.push(key);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
for (const key of keysToDelete) {
|
|
32
|
+
this.memoryCache.delete(key);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get cached value
|
|
37
|
+
* Checks Redis first, then falls back to memory cache
|
|
38
|
+
* @param key - Cache key
|
|
39
|
+
* @returns Cached value or null if not found or expired
|
|
40
|
+
*/
|
|
41
|
+
async get(key) {
|
|
42
|
+
try {
|
|
43
|
+
// Try Redis first if available
|
|
44
|
+
if (this.redis && this.redis.isConnected()) {
|
|
45
|
+
const cached = await this.redis.get(key);
|
|
46
|
+
if (cached) {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(cached);
|
|
49
|
+
// Also cache in memory for faster subsequent access
|
|
50
|
+
// We don't know the TTL from Redis, so we'll use a default 5 minutes
|
|
51
|
+
// This is just for optimization, Redis is still the source of truth
|
|
52
|
+
this.setInMemory(key, parsed, 300);
|
|
53
|
+
return parsed;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// Invalid JSON, remove from cache
|
|
57
|
+
console.warn(`Failed to parse cached data for key ${key}:`, error);
|
|
58
|
+
await this.delete(key);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Fallback to memory cache
|
|
64
|
+
const entry = this.memoryCache.get(key);
|
|
65
|
+
if (entry) {
|
|
66
|
+
// Check if expired
|
|
67
|
+
if (entry.expiresAt < Date.now()) {
|
|
68
|
+
this.memoryCache.delete(key);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return entry.value;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// On error, try memory cache
|
|
77
|
+
const entry = this.memoryCache.get(key);
|
|
78
|
+
if (entry && entry.expiresAt >= Date.now()) {
|
|
79
|
+
return entry.value;
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set value in cache with TTL
|
|
86
|
+
* Sets in both Redis and memory cache
|
|
87
|
+
* @param key - Cache key
|
|
88
|
+
* @param value - Value to cache (will be JSON serialized)
|
|
89
|
+
* @param ttl - Time to live in seconds
|
|
90
|
+
* @returns true if successful, false otherwise
|
|
91
|
+
*/
|
|
92
|
+
async set(key, value, ttl) {
|
|
93
|
+
try {
|
|
94
|
+
const serialized = JSON.stringify(value);
|
|
95
|
+
let success = true;
|
|
96
|
+
// Try to set in Redis first
|
|
97
|
+
if (this.redis && this.redis.isConnected()) {
|
|
98
|
+
success = await this.redis.set(key, serialized, ttl);
|
|
99
|
+
// Continue even if Redis fails, fallback to memory
|
|
100
|
+
}
|
|
101
|
+
// Always set in memory cache as fallback
|
|
102
|
+
this.setInMemory(key, value, ttl);
|
|
103
|
+
return success;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// If serialization fails, try to set in memory with the raw value
|
|
107
|
+
// This handles cases where value might not be JSON serializable
|
|
108
|
+
try {
|
|
109
|
+
this.setInMemory(key, value, ttl);
|
|
110
|
+
return false; // Indicate Redis failed, but memory cache set
|
|
111
|
+
}
|
|
112
|
+
catch (memoryError) {
|
|
113
|
+
console.error(`Failed to cache value for key ${key}:`, error);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Set value in memory cache
|
|
120
|
+
*/
|
|
121
|
+
setInMemory(key, value, ttl) {
|
|
122
|
+
const expiresAt = Date.now() + ttl * 1000;
|
|
123
|
+
this.memoryCache.set(key, {
|
|
124
|
+
value,
|
|
125
|
+
expiresAt
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Delete value from cache
|
|
130
|
+
* Deletes from both Redis and memory cache
|
|
131
|
+
* @param key - Cache key
|
|
132
|
+
* @returns true if deleted from at least one cache, false otherwise
|
|
133
|
+
*/
|
|
134
|
+
async delete(key) {
|
|
135
|
+
let redisDeleted = false;
|
|
136
|
+
// Delete from Redis if available
|
|
137
|
+
if (this.redis && this.redis.isConnected()) {
|
|
138
|
+
redisDeleted = await this.redis.delete(key);
|
|
139
|
+
}
|
|
140
|
+
// Delete from memory cache
|
|
141
|
+
const memoryDeleted = this.memoryCache.delete(key);
|
|
142
|
+
return redisDeleted || memoryDeleted;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Clear all cache entries
|
|
146
|
+
* Clears both Redis and memory cache
|
|
147
|
+
* Note: This only clears keys that are accessible via this service instance
|
|
148
|
+
* Redis may have other keys set by other services
|
|
149
|
+
*/
|
|
150
|
+
async clear() {
|
|
151
|
+
// Clear memory cache
|
|
152
|
+
this.memoryCache.clear();
|
|
153
|
+
// Note: We cannot efficiently clear all Redis keys without knowing all keys
|
|
154
|
+
// So we only clear what we know about from memory cache
|
|
155
|
+
// For a true Redis clear, users should use RedisService directly
|
|
156
|
+
// or provide a pattern to delete
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Cleanup resources (stops cleanup interval)
|
|
160
|
+
* Call this when the service is no longer needed
|
|
161
|
+
*/
|
|
162
|
+
destroy() {
|
|
163
|
+
if (this.cleanupInterval) {
|
|
164
|
+
clearInterval(this.cleanupInterval);
|
|
165
|
+
this.cleanupInterval = undefined;
|
|
166
|
+
}
|
|
167
|
+
this.memoryCache.clear();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.CacheService = CacheService;
|
|
171
|
+
//# sourceMappingURL=cache.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.js","sourceRoot":"","sources":["../../../src/services/cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encryption service for symmetric encryption using AES-256-GCM
|
|
3
|
+
*/
|
|
4
|
+
export declare class EncryptionService {
|
|
5
|
+
private key;
|
|
6
|
+
private algorithm;
|
|
7
|
+
/**
|
|
8
|
+
* Create an EncryptionService instance
|
|
9
|
+
* @param encryptionKey - Optional encryption key. If not provided, reads from ENCRYPTION_KEY env var.
|
|
10
|
+
* Supports hex, base64, or raw string format.
|
|
11
|
+
* If string length is not 32 bytes, derives a 32-byte key using SHA-256.
|
|
12
|
+
*/
|
|
13
|
+
constructor(encryptionKey?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Derive a 32-byte key from the provided key string
|
|
16
|
+
* Supports hex, base64, or raw string format
|
|
17
|
+
*/
|
|
18
|
+
private deriveKey;
|
|
19
|
+
/**
|
|
20
|
+
* Encrypt plaintext and return base64-encoded string
|
|
21
|
+
* @param plaintext - The plaintext string to encrypt
|
|
22
|
+
* @returns Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
23
|
+
*/
|
|
24
|
+
encrypt(plaintext: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Decrypt base64-encoded encrypted string
|
|
27
|
+
* @param encryptedText - Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
28
|
+
* @returns Decrypted plaintext string
|
|
29
|
+
*/
|
|
30
|
+
decrypt(encryptedText: string): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=encryption.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.service.d.ts","sourceRoot":"","sources":["../../../src/services/encryption.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAiB;IAElC;;;;;OAKG;gBACS,aAAa,CAAC,EAAE,MAAM;IAalC;;;OAGG;IACH,OAAO,CAAC,SAAS;IAoBjB;;;;OAIG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA0BlC;;;;OAIG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CA+BvC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Encryption service for symmetric encryption using AES-256-GCM
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.EncryptionService = void 0;
|
|
40
|
+
const crypto = __importStar(require("crypto"));
|
|
41
|
+
class EncryptionService {
|
|
42
|
+
/**
|
|
43
|
+
* Create an EncryptionService instance
|
|
44
|
+
* @param encryptionKey - Optional encryption key. If not provided, reads from ENCRYPTION_KEY env var.
|
|
45
|
+
* Supports hex, base64, or raw string format.
|
|
46
|
+
* If string length is not 32 bytes, derives a 32-byte key using SHA-256.
|
|
47
|
+
*/
|
|
48
|
+
constructor(encryptionKey) {
|
|
49
|
+
this.algorithm = 'aes-256-gcm';
|
|
50
|
+
const keyString = encryptionKey || process.env.ENCRYPTION_KEY;
|
|
51
|
+
if (!keyString) {
|
|
52
|
+
throw new Error('Encryption key is required. Provide via constructor parameter or set ENCRYPTION_KEY environment variable.');
|
|
53
|
+
}
|
|
54
|
+
// Derive a 32-byte key from the provided key
|
|
55
|
+
this.key = this.deriveKey(keyString);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Derive a 32-byte key from the provided key string
|
|
59
|
+
* Supports hex, base64, or raw string format
|
|
60
|
+
*/
|
|
61
|
+
deriveKey(keyString) {
|
|
62
|
+
// Try to parse as hex (64 hex chars = 32 bytes)
|
|
63
|
+
if (/^[0-9a-fA-F]{64}$/.test(keyString)) {
|
|
64
|
+
return Buffer.from(keyString, 'hex');
|
|
65
|
+
}
|
|
66
|
+
// Try to parse as base64
|
|
67
|
+
try {
|
|
68
|
+
const base64Decoded = Buffer.from(keyString, 'base64');
|
|
69
|
+
if (base64Decoded.length === 32) {
|
|
70
|
+
return base64Decoded;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Not valid base64, continue
|
|
75
|
+
}
|
|
76
|
+
// Use SHA-256 to derive a 32-byte key from the string
|
|
77
|
+
return crypto.createHash('sha256').update(keyString, 'utf8').digest();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Encrypt plaintext and return base64-encoded string
|
|
81
|
+
* @param plaintext - The plaintext string to encrypt
|
|
82
|
+
* @returns Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
83
|
+
*/
|
|
84
|
+
encrypt(plaintext) {
|
|
85
|
+
if (plaintext === '') {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
// Generate random IV (12 bytes for GCM)
|
|
90
|
+
const iv = crypto.randomBytes(12);
|
|
91
|
+
const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);
|
|
92
|
+
let encrypted = cipher.update(plaintext, 'utf8');
|
|
93
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
94
|
+
// Get authentication tag
|
|
95
|
+
const authTag = cipher.getAuthTag();
|
|
96
|
+
// Combine IV, authTag, and ciphertext, then base64 encode
|
|
97
|
+
const combined = Buffer.concat([iv, authTag, encrypted]);
|
|
98
|
+
return combined.toString('base64');
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new Error(`Encryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Decrypt base64-encoded encrypted string
|
|
106
|
+
* @param encryptedText - Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
107
|
+
* @returns Decrypted plaintext string
|
|
108
|
+
*/
|
|
109
|
+
decrypt(encryptedText) {
|
|
110
|
+
if (encryptedText === '') {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
// Decode from base64
|
|
115
|
+
const combined = Buffer.from(encryptedText, 'base64');
|
|
116
|
+
// Extract IV (12 bytes), authTag (16 bytes), and ciphertext
|
|
117
|
+
if (combined.length < 28) {
|
|
118
|
+
throw new Error('Invalid encrypted data: too short');
|
|
119
|
+
}
|
|
120
|
+
const iv = combined.subarray(0, 12);
|
|
121
|
+
const authTag = combined.subarray(12, 28);
|
|
122
|
+
const ciphertext = combined.subarray(28);
|
|
123
|
+
const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv);
|
|
124
|
+
decipher.setAuthTag(authTag);
|
|
125
|
+
let decrypted = decipher.update(ciphertext, undefined, 'utf8');
|
|
126
|
+
decrypted += decipher.final('utf8');
|
|
127
|
+
return decrypted;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
throw new Error(`Decryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.EncryptionService = EncryptionService;
|
|
135
|
+
//# sourceMappingURL=encryption.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.service.js","sourceRoot":"","sources":["../../../src/services/encryption.service.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,+CAAiC;AAEjC,MAAa,iBAAiB;IAI5B;;;;;OAKG;IACH,YAAY,aAAsB;QAR1B,cAAS,GAAG,aAAa,CAAC;QAShC,MAAM,SAAS,GAAG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAE9D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,SAAiB;QACjC,gDAAgD;QAChD,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,aAAa,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBAChC,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;QAED,sDAAsD;QACtD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,SAAiB;QACvB,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAqB,CAAC;YAEvF,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACjD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAEvD,yBAAyB;YACzB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAEpC,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACjF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,aAAqB;QAC3B,IAAI,aAAa,KAAK,EAAE,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAEtD,4DAA4D;YAC5D,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAEzC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAuB,CAAC;YAC7F,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAE7B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEpC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACjF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAlHD,8CAkHC"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Permission service for user authorization with
|
|
2
|
+
* Permission service for user authorization with caching
|
|
3
3
|
*/
|
|
4
4
|
import { HttpClient } from '../utils/http-client';
|
|
5
|
-
import {
|
|
5
|
+
import { CacheService } from './cache.service';
|
|
6
6
|
export declare class PermissionService {
|
|
7
7
|
private httpClient;
|
|
8
|
-
private
|
|
8
|
+
private cache;
|
|
9
9
|
private config;
|
|
10
10
|
private permissionTTL;
|
|
11
|
-
constructor(httpClient: HttpClient,
|
|
11
|
+
constructor(httpClient: HttpClient, cache: CacheService);
|
|
12
12
|
/**
|
|
13
13
|
* Extract userId from JWT token without making API call
|
|
14
14
|
*/
|
|
15
15
|
private extractUserIdFromToken;
|
|
16
16
|
/**
|
|
17
|
-
* Get user permissions with
|
|
17
|
+
* Get user permissions with caching
|
|
18
18
|
* Optimized to extract userId from token first to check cache before API call
|
|
19
19
|
*/
|
|
20
20
|
getPermissions(token: string): Promise<string[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../../src/services/permission.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../../src/services/permission.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAS;gBAElB,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY;IAOvD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqDtD;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxE;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9E;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/E;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwC1D;;OAEG;IACG,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB1D"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Permission service for user authorization with
|
|
3
|
+
* Permission service for user authorization with caching
|
|
4
4
|
*/
|
|
5
5
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -9,9 +9,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.PermissionService = void 0;
|
|
10
10
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
11
11
|
class PermissionService {
|
|
12
|
-
constructor(httpClient,
|
|
12
|
+
constructor(httpClient, cache) {
|
|
13
13
|
this.config = httpClient.config;
|
|
14
|
-
this.
|
|
14
|
+
this.cache = cache;
|
|
15
15
|
this.httpClient = httpClient;
|
|
16
16
|
this.permissionTTL = this.config.cache?.permissionTTL || 900; // 15 minutes default
|
|
17
17
|
}
|
|
@@ -31,7 +31,7 @@ class PermissionService {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Get user permissions with
|
|
34
|
+
* Get user permissions with caching
|
|
35
35
|
* Optimized to extract userId from token first to check cache before API call
|
|
36
36
|
*/
|
|
37
37
|
async getPermissions(token) {
|
|
@@ -39,18 +39,11 @@ class PermissionService {
|
|
|
39
39
|
// Extract userId from token to check cache first (avoids API call on cache hit)
|
|
40
40
|
let userId = this.extractUserIdFromToken(token);
|
|
41
41
|
const cacheKey = userId ? `permissions:${userId}` : null;
|
|
42
|
-
// Check
|
|
43
|
-
if (cacheKey
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
const parsed = JSON.parse(cachedPermissions);
|
|
48
|
-
return parsed.permissions || [];
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
// eslint-disable-next-line no-console
|
|
52
|
-
console.warn('Failed to parse cached permissions:', error);
|
|
53
|
-
}
|
|
42
|
+
// Check cache first if we have userId
|
|
43
|
+
if (cacheKey) {
|
|
44
|
+
const cached = await this.cache.get(cacheKey);
|
|
45
|
+
if (cached) {
|
|
46
|
+
return cached.permissions || [];
|
|
54
47
|
}
|
|
55
48
|
}
|
|
56
49
|
// Cache miss or no userId in token - fetch from controller
|
|
@@ -66,11 +59,9 @@ class PermissionService {
|
|
|
66
59
|
const permissionResult = await this.httpClient.authenticatedRequest('GET', '/api/auth/permissions', // Backend knows app/env from client token
|
|
67
60
|
token);
|
|
68
61
|
const permissions = permissionResult.permissions || [];
|
|
69
|
-
// Cache the result
|
|
62
|
+
// Cache the result (use userId-based key)
|
|
70
63
|
const finalCacheKey = `permissions:${userId}`;
|
|
71
|
-
|
|
72
|
-
await this.redis.set(finalCacheKey, JSON.stringify({ permissions, timestamp: Date.now() }), this.permissionTTL);
|
|
73
|
-
}
|
|
64
|
+
await this.cache.set(finalCacheKey, { permissions, timestamp: Date.now() }, this.permissionTTL);
|
|
74
65
|
return permissions;
|
|
75
66
|
}
|
|
76
67
|
catch (error) {
|
|
@@ -116,9 +107,7 @@ class PermissionService {
|
|
|
116
107
|
const permissionResult = await this.httpClient.authenticatedRequest('GET', '/api/auth/permissions/refresh', token);
|
|
117
108
|
const permissions = permissionResult.permissions || [];
|
|
118
109
|
// Update cache with fresh data
|
|
119
|
-
|
|
120
|
-
await this.redis.set(cacheKey, JSON.stringify({ permissions, timestamp: Date.now() }), this.permissionTTL);
|
|
121
|
-
}
|
|
110
|
+
await this.cache.set(cacheKey, { permissions, timestamp: Date.now() }, this.permissionTTL);
|
|
122
111
|
return permissions;
|
|
123
112
|
}
|
|
124
113
|
catch (error) {
|
|
@@ -139,10 +128,8 @@ class PermissionService {
|
|
|
139
128
|
}
|
|
140
129
|
const userId = userInfo.user.id;
|
|
141
130
|
const cacheKey = `permissions:${userId}`;
|
|
142
|
-
// Clear from
|
|
143
|
-
|
|
144
|
-
await this.redis.delete(cacheKey);
|
|
145
|
-
}
|
|
131
|
+
// Clear from cache
|
|
132
|
+
await this.cache.delete(cacheKey);
|
|
146
133
|
}
|
|
147
134
|
catch (error) {
|
|
148
135
|
// eslint-disable-next-line no-console
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.service.js","sourceRoot":"","sources":["../../../src/services/permission.service.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAKH,gEAA+B;
|
|
1
|
+
{"version":3,"file":"permission.service.js","sourceRoot":"","sources":["../../../src/services/permission.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Role service for
|
|
2
|
+
* Role service for completely authorization with caching
|
|
3
3
|
*/
|
|
4
4
|
import { HttpClient } from '../utils/http-client';
|
|
5
|
-
import {
|
|
5
|
+
import { CacheService } from './cache.service';
|
|
6
6
|
export declare class RoleService {
|
|
7
7
|
private httpClient;
|
|
8
|
-
private
|
|
8
|
+
private cache;
|
|
9
9
|
private config;
|
|
10
10
|
private roleTTL;
|
|
11
|
-
constructor(httpClient: HttpClient,
|
|
11
|
+
constructor(httpClient: HttpClient, cache: CacheService);
|
|
12
12
|
/**
|
|
13
13
|
* Extract userId from JWT token without making API call
|
|
14
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.service.d.ts","sourceRoot":"","sources":["../../../src/services/role.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"role.service.d.ts","sourceRoot":"","sources":["../../../src/services/role.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAS;gBAEZ,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY;IAOvD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqDhD;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnE;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAuCrD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Role service for
|
|
3
|
+
* Role service for completely authorization with caching
|
|
4
4
|
*/
|
|
5
5
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -9,9 +9,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.RoleService = void 0;
|
|
10
10
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
11
11
|
class RoleService {
|
|
12
|
-
constructor(httpClient,
|
|
12
|
+
constructor(httpClient, cache) {
|
|
13
13
|
this.config = httpClient.config;
|
|
14
|
-
this.
|
|
14
|
+
this.cache = cache;
|
|
15
15
|
this.httpClient = httpClient;
|
|
16
16
|
this.roleTTL = this.config.cache?.roleTTL || 900; // 15 minutes default
|
|
17
17
|
}
|
|
@@ -39,18 +39,11 @@ class RoleService {
|
|
|
39
39
|
// Extract userId from token to check cache first (avoids API call on cache hit)
|
|
40
40
|
let userId = this.extractUserIdFromToken(token);
|
|
41
41
|
const cacheKey = userId ? `roles:${userId}` : null;
|
|
42
|
-
// Check
|
|
43
|
-
if (cacheKey
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
const parsed = JSON.parse(cachedRoles);
|
|
48
|
-
return parsed.roles || [];
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
// eslint-disable-next-line no-console
|
|
52
|
-
console.warn('Failed to parse cached roles:', error);
|
|
53
|
-
}
|
|
42
|
+
// Check cache first if we have userId
|
|
43
|
+
if (cacheKey) {
|
|
44
|
+
const cached = await this.cache.get(cacheKey);
|
|
45
|
+
if (cached) {
|
|
46
|
+
return cached.roles || [];
|
|
54
47
|
}
|
|
55
48
|
}
|
|
56
49
|
// Cache miss or no userId in token - fetch from controller
|
|
@@ -66,11 +59,9 @@ class RoleService {
|
|
|
66
59
|
const roleResult = await this.httpClient.authenticatedRequest('GET', '/api/auth/roles', // Backend knows app/env from client token
|
|
67
60
|
token);
|
|
68
61
|
const roles = roleResult.roles || [];
|
|
69
|
-
// Cache the result
|
|
62
|
+
// Cache the result (use userId-based key)
|
|
70
63
|
const finalCacheKey = `roles:${userId}`;
|
|
71
|
-
|
|
72
|
-
await this.redis.set(finalCacheKey, JSON.stringify({ roles, timestamp: Date.now() }), this.roleTTL);
|
|
73
|
-
}
|
|
64
|
+
await this.cache.set(finalCacheKey, { roles, timestamp: Date.now() }, this.roleTTL);
|
|
74
65
|
return roles;
|
|
75
66
|
}
|
|
76
67
|
catch (error) {
|
|
@@ -116,9 +107,7 @@ class RoleService {
|
|
|
116
107
|
const roleResult = await this.httpClient.authenticatedRequest('GET', '/api/auth/roles/refresh', token);
|
|
117
108
|
const roles = roleResult.roles || [];
|
|
118
109
|
// Update cache with fresh data
|
|
119
|
-
|
|
120
|
-
await this.redis.set(cacheKey, JSON.stringify({ roles, timestamp: Date.now() }), this.roleTTL);
|
|
121
|
-
}
|
|
110
|
+
await this.cache.set(cacheKey, { roles, timestamp: Date.now() }, this.roleTTL);
|
|
122
111
|
return roles;
|
|
123
112
|
}
|
|
124
113
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.service.js","sourceRoot":"","sources":["../../../src/services/role.service.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAKH,gEAA+B;
|
|
1
|
+
{"version":3,"file":"role.service.js","sourceRoot":"","sources":["../../../src/services/role.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CA0C7C"}
|
|
@@ -39,6 +39,10 @@ function loadConfig() {
|
|
|
39
39
|
}
|
|
40
40
|
config.redis = redisConfig;
|
|
41
41
|
}
|
|
42
|
+
// Optional encryption key
|
|
43
|
+
if (process.env.ENCRYPTION_KEY) {
|
|
44
|
+
config.encryptionKey = process.env.ENCRYPTION_KEY;
|
|
45
|
+
}
|
|
42
46
|
return config;
|
|
43
47
|
}
|
|
44
48
|
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,gCA0CC;AAhDD,yBAAuB;AAGvB;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAqB;QAC/B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gCAAgC;QAClF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACvE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE;QACnF,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,cAAsD,IAAI,OAAO;KACzF,CAAC;IAEF,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;YAChD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACrC,CAAC;QAEF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,WAAW,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjC,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACvD,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|