@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.
Files changed (34) hide show
  1. package/README.md +146 -14
  2. package/dist/container/Container.d.ts +86 -2
  3. package/dist/container/Container.js +260 -10
  4. package/dist/container/Container.js.map +1 -1
  5. package/dist/container/examples/batch-operations.example.d.ts +1 -0
  6. package/dist/container/examples/batch-operations.example.js +165 -0
  7. package/dist/container/examples/batch-operations.example.js.map +1 -0
  8. package/dist/container/types.d.ts +50 -0
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/bootstraps/getExpressTrpcApp.js +69 -7
  12. package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -1
  13. package/dist/server/middleware/memoryMonitor.example.d.ts +1 -0
  14. package/dist/server/middleware/memoryMonitor.example.js +109 -0
  15. package/dist/server/middleware/memoryMonitor.example.js.map +1 -0
  16. package/dist/server/middleware/memoryMonitor.middleware.d.ts +42 -0
  17. package/dist/server/middleware/memoryMonitor.middleware.js +134 -0
  18. package/dist/server/middleware/memoryMonitor.middleware.js.map +1 -0
  19. package/dist/server/services/secrets/examples/container-preload.example.d.ts +1 -0
  20. package/dist/server/services/secrets/examples/container-preload.example.js +148 -0
  21. package/dist/server/services/secrets/examples/container-preload.example.js.map +1 -0
  22. package/dist/server/services/secrets/index.d.ts +1 -0
  23. package/dist/server/services/secrets/index.js +6 -0
  24. package/dist/server/services/secrets/index.js.map +1 -0
  25. package/dist/server/services/secrets/secret.service.d.ts +46 -6
  26. package/dist/server/services/secrets/secret.service.js +256 -30
  27. package/dist/server/services/secrets/secret.service.js.map +1 -1
  28. package/dist/server/services/translations/translation.model.js +2 -1
  29. package/dist/server/services/translations/translation.model.js.map +1 -1
  30. package/dist/server/services/translations/translation.service.d.ts +8 -1
  31. package/dist/server/services/translations/translation.service.js +123 -13
  32. package/dist/server/services/translations/translation.service.js.map +1 -1
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. 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":";AAAA,0EAA0E;;AA0J1E,sEAyBC;AAGD,0DAGC;AArLD,yCAA0C;AAmB1C,MAAM,aAAa;IACT,MAAM,CAAc;IACpB,gBAAgB,CAAQ;IACxB,iBAAiB,CAAQ;IACzB,eAAe,CAAQ;IACvB,uBAAuB,CAAS;IAChC,UAAU,CAAS;IACnB,aAAa,CAAiB;IAC9B,WAAW,CAAgB;IAC3B,WAAW,CAAS;IAE5B,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAA;QACvC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAA;QACtD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAA;QACxD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAA,CAAC,qBAAqB;QAC7E,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,KAAK,KAAK,CAAA;QACxE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,KAAK,CAAA;QAE9C,2CAA2C;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,MAAM,CAAC,EAAE,KAAK,UAAU,CAAA;QAElD,IAAI,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAA;QACpG,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QACtD,MAAM,kBAAkB,GAAG,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,CAAA;QACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QAE1C,OAAO;YACL,UAAU;YACV,WAAW;YACX,kBAAkB;YAClB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAA;IACH,CAAC;IAEO,mBAAmB,CAAC,OAAsB;QAChD,OAAO,SAAS,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IACtK,CAAC;IAEO,gBAAgB,CAAC,OAAsB;QAC7C,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAA;QAEtC,IAAI,kBAAkB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,IAAA,YAAG,EAAC,6BAA6B,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,CAC1G,CAAA;YAED,sDAAsD;YACtD,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;gBAC9E,MAAM,CAAC,EAAG,EAAE,CAAA;gBAEZ,sBAAsB;gBACtB,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;oBAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,CAC/D,CAAA;gBACH,CAAC,EAAE,GAAG,CAAC,CAAA;YACT,CAAC;QACH,CAAC;aAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAA,eAAM,EAAC,4BAA4B,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,CAC5G,CAAA;QACH,CAAC;IACH,CAAC;IAEM,eAAe;QACpB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAM,CAAC,qBAAqB;QAC9B,CAAC;QAED,gBAAgB;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;QAE1F,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACvC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAA;YAC1B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;QAExB,oDAAoD;QACpD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACjC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAA;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAEM,UAAU;QACf,OAAO,CAAC,IAAa,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACvC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAA;YAE1B,oDAAoD;YACpD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrE,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvE,GAAG,CAAC,SAAS,CAAC,4BAA4B,EAAE,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAClF,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5D,CAAC;YAED,qCAAqC;YACrC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;YAE9B,IAAI,EAAE,CAAA;QACR,CAAC,CAAA;IACH,CAAC;IAEM,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;CACF;AAED,iDAAiD;AACjD,IAAI,qBAAqB,GAAG,KAAK,CAAA;AAEjC,uDAAuD;AACvD,SAAgB,6BAA6B,CAAC,OAA8B;IAI1E,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAA;IAE1C,8BAA8B;IAC9B,OAAO,CAAC,eAAe,EAAE,CAAA;IAEzB,8DAA8D;IAC9D,IAAI,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC9D,qBAAqB,GAAG,IAAI,CAAA;QAE5B,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,cAAc,EAAE,CAAA;QAC1B,CAAC,CAAA;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;QAChC,OAAO;KACR,CAAA;AACH,CAAC;AAED,mDAAmD;AACnD,SAAgB,uBAAuB,CAAC,OAA8B;IACpE,MAAM,EAAE,UAAU,EAAE,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAA;IAC7D,OAAO,UAAU,CAAA;AACnB,CAAC"}
@@ -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
- constructor({ provider, location, encryptionKey, vaultConfig }: {
14
- provider: SecretProvider;
15
- location: string;
16
- encryptionKey: string;
17
- vaultConfig?: VaultConfig;
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
  }