@goatlab/node-backend 0.2.6 → 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/README.md +146 -14
- package/dist/container/Container.d.ts +86 -2
- package/dist/container/Container.js +260 -10
- package/dist/container/Container.js.map +1 -1
- package/dist/container/examples/batch-operations.example.d.ts +1 -0
- package/dist/container/examples/batch-operations.example.js +165 -0
- package/dist/container/examples/batch-operations.example.js.map +1 -0
- package/dist/container/types.d.ts +50 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server/bootstraps/getExpressTrpcApp.js +69 -7
- package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -1
- package/dist/server/middleware/memoryMonitor.example.d.ts +1 -0
- package/dist/server/middleware/memoryMonitor.example.js +109 -0
- package/dist/server/middleware/memoryMonitor.example.js.map +1 -0
- package/dist/server/middleware/memoryMonitor.middleware.d.ts +42 -0
- package/dist/server/middleware/memoryMonitor.middleware.js +134 -0
- package/dist/server/middleware/memoryMonitor.middleware.js.map +1 -0
- package/dist/server/services/secrets/examples/container-preload.example.d.ts +1 -0
- package/dist/server/services/secrets/examples/container-preload.example.js +148 -0
- package/dist/server/services/secrets/examples/container-preload.example.js.map +1 -0
- package/dist/server/services/secrets/index.d.ts +1 -0
- package/dist/server/services/secrets/index.js +6 -0
- package/dist/server/services/secrets/index.js.map +1 -0
- package/dist/server/services/secrets/secret.service.d.ts +46 -6
- package/dist/server/services/secrets/secret.service.js +256 -30
- package/dist/server/services/secrets/secret.service.js.map +1 -1
- package/dist/server/services/translations/translation.model.js +2 -1
- package/dist/server/services/translations/translation.model.js.map +1 -1
- package/dist/server/services/translations/translation.service.d.ts +8 -1
- package/dist/server/services/translations/translation.service.js +123 -13
- package/dist/server/services/translations/translation.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryMonitor.example.js","sourceRoot":"","sources":["../../../src/server/middleware/memoryMonitor.example.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { CommonLogger } from '@goatlab/js-utils';
|
|
3
|
+
interface MemoryMonitorOptions {
|
|
4
|
+
logger?: CommonLogger;
|
|
5
|
+
warningThreshold?: number;
|
|
6
|
+
criticalThreshold?: number;
|
|
7
|
+
monitorInterval?: number;
|
|
8
|
+
enableGarbageCollection?: boolean;
|
|
9
|
+
addHeaders?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface MemoryMetrics {
|
|
12
|
+
heapUsedMB: number;
|
|
13
|
+
heapTotalMB: number;
|
|
14
|
+
heapUsedPercentage: number;
|
|
15
|
+
rssMB: number;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
declare class MemoryMonitor {
|
|
19
|
+
private logger;
|
|
20
|
+
private warningThreshold;
|
|
21
|
+
private criticalThreshold;
|
|
22
|
+
private monitorInterval;
|
|
23
|
+
private enableGarbageCollection;
|
|
24
|
+
private addHeaders;
|
|
25
|
+
private intervalTimer?;
|
|
26
|
+
private lastMetrics?;
|
|
27
|
+
private gcAvailable;
|
|
28
|
+
constructor(options?: MemoryMonitorOptions);
|
|
29
|
+
private getMemoryMetrics;
|
|
30
|
+
private formatMemoryMetrics;
|
|
31
|
+
private checkMemoryUsage;
|
|
32
|
+
startMonitoring(): void;
|
|
33
|
+
stopMonitoring(): void;
|
|
34
|
+
middleware(): (_req: Request, res: Response, next: NextFunction) => void;
|
|
35
|
+
getLastMetrics(): MemoryMetrics | undefined;
|
|
36
|
+
}
|
|
37
|
+
export declare function createMemoryMonitorMiddleware(options?: MemoryMonitorOptions): {
|
|
38
|
+
middleware: (req: Request, res: Response, next: NextFunction) => void;
|
|
39
|
+
monitor: MemoryMonitor;
|
|
40
|
+
};
|
|
41
|
+
export declare function memoryMonitorMiddleware(options?: MemoryMonitorOptions): (req: Request, res: Response, next: NextFunction) => void;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// npx vitest run ./src/server/middleware/memoryMonitor.middleware.test.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.createMemoryMonitorMiddleware = createMemoryMonitorMiddleware;
|
|
5
|
+
exports.memoryMonitorMiddleware = memoryMonitorMiddleware;
|
|
6
|
+
const colors_1 = require("kleur/colors");
|
|
7
|
+
class MemoryMonitor {
|
|
8
|
+
logger;
|
|
9
|
+
warningThreshold;
|
|
10
|
+
criticalThreshold;
|
|
11
|
+
monitorInterval;
|
|
12
|
+
enableGarbageCollection;
|
|
13
|
+
addHeaders;
|
|
14
|
+
intervalTimer;
|
|
15
|
+
lastMetrics;
|
|
16
|
+
gcAvailable;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.logger = options.logger || console;
|
|
19
|
+
this.warningThreshold = options.warningThreshold || 90;
|
|
20
|
+
this.criticalThreshold = options.criticalThreshold || 95;
|
|
21
|
+
this.monitorInterval = options.monitorInterval || 30000; // 30 seconds default
|
|
22
|
+
this.enableGarbageCollection = options.enableGarbageCollection !== false;
|
|
23
|
+
this.addHeaders = options.addHeaders !== false;
|
|
24
|
+
// Check if garbage collection is available
|
|
25
|
+
this.gcAvailable = typeof global.gc === 'function';
|
|
26
|
+
if (this.enableGarbageCollection && !this.gcAvailable) {
|
|
27
|
+
this.logger.warn('Garbage collection is not available. Run node with --expose-gc flag to enable.');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
getMemoryMetrics() {
|
|
31
|
+
const memUsage = process.memoryUsage();
|
|
32
|
+
const heapUsedMB = memUsage.heapUsed / (1024 * 1024);
|
|
33
|
+
const heapTotalMB = memUsage.heapTotal / (1024 * 1024);
|
|
34
|
+
const heapUsedPercentage = (memUsage.heapUsed / memUsage.heapTotal) * 100;
|
|
35
|
+
const rssMB = memUsage.rss / (1024 * 1024);
|
|
36
|
+
return {
|
|
37
|
+
heapUsedMB,
|
|
38
|
+
heapTotalMB,
|
|
39
|
+
heapUsedPercentage,
|
|
40
|
+
rssMB,
|
|
41
|
+
timestamp: Date.now()
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
formatMemoryMetrics(metrics) {
|
|
45
|
+
return `Heap: ${metrics.heapUsedMB.toFixed(2)}/${metrics.heapTotalMB.toFixed(2)}MB (${metrics.heapUsedPercentage.toFixed(1)}%) | RSS: ${metrics.rssMB.toFixed(2)}MB`;
|
|
46
|
+
}
|
|
47
|
+
checkMemoryUsage(metrics) {
|
|
48
|
+
const { heapUsedPercentage } = metrics;
|
|
49
|
+
if (heapUsedPercentage >= this.criticalThreshold) {
|
|
50
|
+
this.logger.error((0, colors_1.red)(`CRITICAL: Memory usage at ${heapUsedPercentage.toFixed(1)}% - ${this.formatMemoryMetrics(metrics)}`));
|
|
51
|
+
// Attempt garbage collection if available and enabled
|
|
52
|
+
if (this.enableGarbageCollection && this.gcAvailable) {
|
|
53
|
+
this.logger.warn('Triggering garbage collection due to critical memory usage');
|
|
54
|
+
global.gc();
|
|
55
|
+
// Log memory after GC
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
const afterGcMetrics = this.getMemoryMetrics();
|
|
58
|
+
this.logger.log(`Memory after GC: ${this.formatMemoryMetrics(afterGcMetrics)}`);
|
|
59
|
+
}, 100);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (heapUsedPercentage >= this.warningThreshold) {
|
|
63
|
+
this.logger.warn((0, colors_1.yellow)(`WARNING: Memory usage at ${heapUsedPercentage.toFixed(1)}% - ${this.formatMemoryMetrics(metrics)}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
startMonitoring() {
|
|
67
|
+
if (this.intervalTimer) {
|
|
68
|
+
return; // Already monitoring
|
|
69
|
+
}
|
|
70
|
+
// Initial check
|
|
71
|
+
const initialMetrics = this.getMemoryMetrics();
|
|
72
|
+
this.logger.log(`Memory monitoring started - ${this.formatMemoryMetrics(initialMetrics)}`);
|
|
73
|
+
this.intervalTimer = setInterval(() => {
|
|
74
|
+
const metrics = this.getMemoryMetrics();
|
|
75
|
+
this.lastMetrics = metrics;
|
|
76
|
+
this.checkMemoryUsage(metrics);
|
|
77
|
+
}, this.monitorInterval);
|
|
78
|
+
// Ensure timer doesn't prevent process from exiting
|
|
79
|
+
this.intervalTimer.unref();
|
|
80
|
+
}
|
|
81
|
+
stopMonitoring() {
|
|
82
|
+
if (this.intervalTimer) {
|
|
83
|
+
clearInterval(this.intervalTimer);
|
|
84
|
+
this.intervalTimer = undefined;
|
|
85
|
+
this.logger.log('Memory monitoring stopped');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
middleware() {
|
|
89
|
+
return (_req, res, next) => {
|
|
90
|
+
const metrics = this.getMemoryMetrics();
|
|
91
|
+
this.lastMetrics = metrics;
|
|
92
|
+
// Add memory metrics to response headers if enabled
|
|
93
|
+
if (this.addHeaders) {
|
|
94
|
+
res.setHeader('X-Memory-Heap-Used-MB', metrics.heapUsedMB.toFixed(2));
|
|
95
|
+
res.setHeader('X-Memory-Heap-Total-MB', metrics.heapTotalMB.toFixed(2));
|
|
96
|
+
res.setHeader('X-Memory-Heap-Used-Percent', metrics.heapUsedPercentage.toFixed(1));
|
|
97
|
+
res.setHeader('X-Memory-RSS-MB', metrics.rssMB.toFixed(2));
|
|
98
|
+
}
|
|
99
|
+
// Check memory usage on each request
|
|
100
|
+
this.checkMemoryUsage(metrics);
|
|
101
|
+
next();
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
getLastMetrics() {
|
|
105
|
+
return this.lastMetrics;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Track if we've already added process listeners
|
|
109
|
+
let processListenersAdded = false;
|
|
110
|
+
// Factory function to create memory monitor middleware
|
|
111
|
+
function createMemoryMonitorMiddleware(options) {
|
|
112
|
+
const monitor = new MemoryMonitor(options);
|
|
113
|
+
// Start background monitoring
|
|
114
|
+
monitor.startMonitoring();
|
|
115
|
+
// Handle graceful shutdown - only add listeners once globally
|
|
116
|
+
if (!processListenersAdded && process.env.NODE_ENV !== 'test') {
|
|
117
|
+
processListenersAdded = true;
|
|
118
|
+
const cleanup = () => {
|
|
119
|
+
monitor.stopMonitoring();
|
|
120
|
+
};
|
|
121
|
+
process.once('SIGTERM', cleanup);
|
|
122
|
+
process.once('SIGINT', cleanup);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
middleware: monitor.middleware(),
|
|
126
|
+
monitor
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Convenience middleware function for simple usage
|
|
130
|
+
function memoryMonitorMiddleware(options) {
|
|
131
|
+
const { middleware } = createMemoryMonitorMiddleware(options);
|
|
132
|
+
return middleware;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=memoryMonitor.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryMonitor.middleware.js","sourceRoot":"","sources":["../../../src/server/middleware/memoryMonitor.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Example: Using SecretService with preloading in Container
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const Container_1 = require("../../../../container/Container");
|
|
5
|
+
const secret_service_1 = require("../secret.service");
|
|
6
|
+
// Define your service factories (mock for example)
|
|
7
|
+
const factories = {
|
|
8
|
+
secrets: (secret_service_1.SecretService),
|
|
9
|
+
database: class MockDatabaseService {
|
|
10
|
+
tenantId;
|
|
11
|
+
config;
|
|
12
|
+
constructor(tenantId, config) {
|
|
13
|
+
this.tenantId = tenantId;
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
async connect() { console.log('Connected to DB'); }
|
|
17
|
+
async query(sql) { return []; }
|
|
18
|
+
},
|
|
19
|
+
api: class MockApiService {
|
|
20
|
+
tenantId;
|
|
21
|
+
config;
|
|
22
|
+
constructor(tenantId, config) {
|
|
23
|
+
this.tenantId = tenantId;
|
|
24
|
+
this.config = config;
|
|
25
|
+
}
|
|
26
|
+
async getUser(userId, apiKey) { return { id: userId }; }
|
|
27
|
+
async processData(apiKey) { return { processed: true }; }
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
// Create container with preloading pattern
|
|
31
|
+
const container = new Container_1.Container(factories, async (preload, meta) => {
|
|
32
|
+
// Create secret service instance
|
|
33
|
+
const secretService = preload.secrets(meta.tenantId, {
|
|
34
|
+
provider: 'FILE', // or 'VAULT', 'ENV'
|
|
35
|
+
location: meta.secretsLocation,
|
|
36
|
+
encryptionKey: meta.encryptionKey,
|
|
37
|
+
vaultConfig: meta.vaultConfig
|
|
38
|
+
});
|
|
39
|
+
// Preload secrets before using them
|
|
40
|
+
await secretService.preload();
|
|
41
|
+
// Now we can use synchronous methods to get secrets
|
|
42
|
+
const dbConnectionString = secretService.getSecretSync('DB_CONNECTION_STRING');
|
|
43
|
+
const jwtSecret = secretService.getSecretSync('JWT_SECRET');
|
|
44
|
+
// Create other services using the preloaded secrets
|
|
45
|
+
const database = preload.database(meta.tenantId, meta.tenantId, {
|
|
46
|
+
connectionString: dbConnectionString
|
|
47
|
+
});
|
|
48
|
+
const api = preload.api(meta.tenantId, meta.tenantId, {
|
|
49
|
+
database,
|
|
50
|
+
jwtSecret
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
secrets: secretService,
|
|
54
|
+
database,
|
|
55
|
+
api
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
// Usage example
|
|
59
|
+
async function processRequest(tenantMeta, userId) {
|
|
60
|
+
await container.bootstrap(tenantMeta, async () => {
|
|
61
|
+
const { api, secrets } = container.context;
|
|
62
|
+
// Secrets are already preloaded, so we can use sync methods
|
|
63
|
+
const apiKey = secrets.getSecretSync('API_KEY');
|
|
64
|
+
// Use services
|
|
65
|
+
const user = await api.getUser(userId, apiKey);
|
|
66
|
+
return user;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Example with multiple providers
|
|
70
|
+
async function multiProviderExample() {
|
|
71
|
+
// FILE provider for development
|
|
72
|
+
const devTenant = {
|
|
73
|
+
tenantId: 'dev-tenant',
|
|
74
|
+
secretsLocation: '/secrets/dev.json',
|
|
75
|
+
encryptionKey: 'dev-encryption-key-32chars'
|
|
76
|
+
};
|
|
77
|
+
// VAULT provider for production
|
|
78
|
+
const prodTenant = {
|
|
79
|
+
tenantId: 'prod-tenant',
|
|
80
|
+
secretsLocation: 'production/secrets',
|
|
81
|
+
encryptionKey: 'prod-encryption-key-32chars',
|
|
82
|
+
vaultConfig: {
|
|
83
|
+
endpoint: 'https://vault.company.com',
|
|
84
|
+
token: process.env.VAULT_TOKEN
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
// ENV provider for CI/CD
|
|
88
|
+
const ciTenant = {
|
|
89
|
+
tenantId: 'ci-tenant',
|
|
90
|
+
secretsLocation: 'CI', // Will look for CI_API_KEY, CI_DB_CONNECTION_STRING, etc.
|
|
91
|
+
encryptionKey: 'ci-encryption-key-32chars'
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Example with automatic invalidation (FILE provider)
|
|
95
|
+
async function fileWatchingExample() {
|
|
96
|
+
const container = new Container_1.Container(factories, async (preload, meta) => {
|
|
97
|
+
const secretService = preload.secrets(meta.tenantId, {
|
|
98
|
+
provider: 'FILE',
|
|
99
|
+
location: meta.secretsLocation,
|
|
100
|
+
encryptionKey: meta.encryptionKey,
|
|
101
|
+
cacheTTL: 60000 // 1 minute cache
|
|
102
|
+
});
|
|
103
|
+
// Enable automatic reload on file changes
|
|
104
|
+
await secretService.preload();
|
|
105
|
+
// Secrets will automatically reload if the file changes
|
|
106
|
+
return { secrets: secretService };
|
|
107
|
+
});
|
|
108
|
+
// The secret service will watch for file changes and reload automatically
|
|
109
|
+
}
|
|
110
|
+
// Example with batch operations
|
|
111
|
+
async function batchTenantProcessing() {
|
|
112
|
+
const tenants = [
|
|
113
|
+
{ tenantId: 'tenant1', secretsLocation: '/secrets/tenant1.json', encryptionKey: 'key1' },
|
|
114
|
+
{ tenantId: 'tenant2', secretsLocation: '/secrets/tenant2.json', encryptionKey: 'key2' },
|
|
115
|
+
{ tenantId: 'tenant3', secretsLocation: '/secrets/tenant3.json', encryptionKey: 'key3' }
|
|
116
|
+
];
|
|
117
|
+
const results = await container.bootstrapBatch(tenants.map(meta => ({
|
|
118
|
+
metadata: meta,
|
|
119
|
+
fn: async () => {
|
|
120
|
+
const { secrets, api } = container.context;
|
|
121
|
+
// Each tenant has its own preloaded secrets
|
|
122
|
+
const apiKey = secrets.getSecretSync('API_KEY');
|
|
123
|
+
// Process tenant data
|
|
124
|
+
return api.processData(apiKey);
|
|
125
|
+
}
|
|
126
|
+
})), {
|
|
127
|
+
concurrency: 5,
|
|
128
|
+
continueOnError: true,
|
|
129
|
+
onProgress: (completed, total) => {
|
|
130
|
+
console.log(`Processed ${completed}/${total} tenants`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
// Check results
|
|
134
|
+
for (const result of results) {
|
|
135
|
+
if (result.status === 'success') {
|
|
136
|
+
console.log(`Tenant ${result.metadata.tenantId} processed successfully`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.error(`Tenant ${result.metadata.tenantId} failed:`, result.error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Cleanup when done
|
|
144
|
+
async function cleanup() {
|
|
145
|
+
// Dispose all services (including secret watchers)
|
|
146
|
+
await container.disposeAll();
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=container-preload.example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-preload.example.js","sourceRoot":"","sources":["../../../../../src/server/services/secrets/examples/container-preload.example.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SecretService, SecretServiceConfig, SecretProvider, VaultConfig } from './secret.service';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecretService = void 0;
|
|
4
|
+
var secret_service_1 = require("./secret.service");
|
|
5
|
+
Object.defineProperty(exports, "SecretService", { enumerable: true, get: function () { return secret_service_1.SecretService; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/services/secrets/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkG;AAAzF,+GAAA,aAAa,OAAA"}
|
|
@@ -5,17 +5,44 @@ export interface VaultConfig {
|
|
|
5
5
|
mount?: string;
|
|
6
6
|
namespace?: string;
|
|
7
7
|
}
|
|
8
|
+
export interface SecretServiceConfig {
|
|
9
|
+
provider: SecretProvider;
|
|
10
|
+
location: string;
|
|
11
|
+
encryptionKey: string;
|
|
12
|
+
vaultConfig?: VaultConfig;
|
|
13
|
+
cacheTTL?: number;
|
|
14
|
+
}
|
|
8
15
|
export declare class SecretService<SecretType> {
|
|
9
16
|
provider: SecretProvider;
|
|
10
17
|
location: string;
|
|
11
18
|
encryptionKey: string;
|
|
12
19
|
vaultConfig?: VaultConfig;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
cacheTTL: number;
|
|
21
|
+
protected preloadedSecrets?: SecretType;
|
|
22
|
+
protected isPreloaded: boolean;
|
|
23
|
+
private fileWatcher?;
|
|
24
|
+
constructor(config: SecretServiceConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Preload secrets asynchronously for synchronous access later
|
|
27
|
+
* This method loads secrets once and stores them in the instance
|
|
28
|
+
*/
|
|
29
|
+
preload(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Invalidate preloaded secrets and stop file watching
|
|
32
|
+
*/
|
|
33
|
+
invalidate(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Set up file watching for automatic invalidation
|
|
36
|
+
*/
|
|
37
|
+
private setupFileWatcher;
|
|
38
|
+
/**
|
|
39
|
+
* Load secrets asynchronously with decryption for all providers
|
|
40
|
+
*/
|
|
41
|
+
private loadSecretsAsync;
|
|
42
|
+
private isCacheValid;
|
|
43
|
+
private setCache;
|
|
44
|
+
private getCache;
|
|
45
|
+
loadSecretsFromFileAsync(): Promise<SecretType>;
|
|
19
46
|
loadSecretsFromFile(): SecretType;
|
|
20
47
|
loadSecretsFromGCP(): SecretType;
|
|
21
48
|
loadEncryptionKeyFromGCP(): string;
|
|
@@ -24,9 +51,22 @@ export declare class SecretService<SecretType> {
|
|
|
24
51
|
storeSecretsToVault(secrets: Partial<SecretType>): Promise<void>;
|
|
25
52
|
loadSecrets(): SecretType | Promise<SecretType>;
|
|
26
53
|
loadEncryptionKey(): string;
|
|
54
|
+
getSecretAsync(secretName: keyof SecretType): Promise<string>;
|
|
55
|
+
getSecretJsonAsync<T = any>(secretName: keyof SecretType): Promise<T>;
|
|
27
56
|
getSecret(secretName: keyof SecretType): Promise<string>;
|
|
28
57
|
getSecretJson<T = any>(secretName: keyof SecretType): Promise<T>;
|
|
58
|
+
/**
|
|
59
|
+
* Get a secret synchronously (requires preload() to be called first)
|
|
60
|
+
*/
|
|
29
61
|
getSecretSync(secretName: keyof SecretType): string;
|
|
62
|
+
/**
|
|
63
|
+
* Get a JSON secret synchronously (requires preload() to be called first)
|
|
64
|
+
*/
|
|
30
65
|
getSecretJsonSync<T = any>(secretName: keyof SecretType): T;
|
|
31
66
|
static clearCache(): void;
|
|
67
|
+
static cleanupExpiredCache(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Clean up resources (file watchers, etc.) when service is no longer needed
|
|
70
|
+
*/
|
|
71
|
+
dispose(): void;
|
|
32
72
|
}
|