@goatlab/node-backend 0.1.0 → 0.2.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 +67 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server/bootstraps/getExpressTrpcApp.d.ts +1 -1
- package/dist/server/bootstraps/getExpressTrpcApp.js +9 -9
- package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -1
- package/dist/server/context/request.context.d.ts +1 -1
- package/dist/server/context/request.context.js +33 -7
- package/dist/server/context/request.context.js.map +1 -1
- package/dist/server/services/secrets/secret.service.d.ts +5 -4
- package/dist/server/services/secrets/secret.service.js +56 -8
- package/dist/server/services/secrets/secret.service.js.map +1 -1
- package/dist/server/trpc.d.ts +9 -9
- package/dist/test/const.d.ts +4 -0
- package/dist/test/const.js +11 -1
- package/dist/test/const.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -15
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @goatlab/node-backend
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Common tools for Node.js backend applications, including caching, secret management, Express/tRPC integration, and testing utilities.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -58,4 +58,69 @@ const result = await cache.remember('expensive-op', 300000, async () => {
|
|
|
58
58
|
- **Cache Helpers**: Laravel-inspired helper methods like `remember()`, `rememberForever()`, and `pull()`
|
|
59
59
|
- **Namespace Operations**: Delete or retrieve values by key prefix with `deleteWhereStartsWith()` and `getValueWhereKeyStartsWith()`
|
|
60
60
|
- **Type Safety**: Full TypeScript support with generic types
|
|
61
|
-
- **Automatic Validation**: Skips caching of null, undefined, empty strings, empty arrays, and empty objects
|
|
61
|
+
- **Automatic Validation**: Skips caching of null, undefined, empty strings, empty arrays, and empty objects
|
|
62
|
+
|
|
63
|
+
## Secret Management
|
|
64
|
+
|
|
65
|
+
The `SecretService` provides secure secret management with support for multiple backends:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { SecretService } from '@goatlab/node-backend'
|
|
69
|
+
|
|
70
|
+
// File-based encrypted secrets
|
|
71
|
+
const fileSecrets = new SecretService('FILE', '/path/to/secrets.json')
|
|
72
|
+
|
|
73
|
+
// HashiCorp Vault integration
|
|
74
|
+
const vaultSecrets = new SecretService('VAULT', 'my-app/secrets')
|
|
75
|
+
|
|
76
|
+
// Environment variables (new!)
|
|
77
|
+
const envSecrets = new SecretService('ENV', 'APP') // Loads APP_* env vars
|
|
78
|
+
const allEnvSecrets = new SecretService('ENV', '') // Loads all env vars
|
|
79
|
+
|
|
80
|
+
// Usage
|
|
81
|
+
await fileSecrets.loadSecrets()
|
|
82
|
+
const apiKey = await fileSecrets.getSecret('API_KEY')
|
|
83
|
+
const config = await fileSecrets.getSecretJson('CONFIG')
|
|
84
|
+
|
|
85
|
+
// Store secrets (FILE and VAULT providers)
|
|
86
|
+
await fileSecrets.storeSecrets({ API_KEY: 'secret-value' })
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Secret Provider Features
|
|
90
|
+
|
|
91
|
+
- **FILE**: Encrypted local file storage using AES encryption
|
|
92
|
+
- **VAULT**: HashiCorp Vault integration with automatic token management
|
|
93
|
+
- **ENV**: Runtime environment variable access with optional prefix filtering
|
|
94
|
+
- **Caching**: Automatic in-memory caching for improved performance
|
|
95
|
+
- **Type Safety**: Generic type support for JSON secrets
|
|
96
|
+
|
|
97
|
+
## Express + tRPC Integration
|
|
98
|
+
|
|
99
|
+
Helper for creating Express applications with tRPC integration:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { getExpressTrpcApp } from '@goatlab/node-backend'
|
|
103
|
+
import { initTRPC } from '@trpc/server'
|
|
104
|
+
|
|
105
|
+
const t = initTRPC.create()
|
|
106
|
+
const appRouter = t.router({
|
|
107
|
+
hello: t.procedure.query(() => 'Hello World!')
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
const app = getExpressTrpcApp({
|
|
111
|
+
trpcRouter: appRouter,
|
|
112
|
+
port: 3000,
|
|
113
|
+
sentryService,
|
|
114
|
+
expressResources: [customRouter], // Optional Express routers
|
|
115
|
+
customHandlers: [middleware1, middleware2], // Optional middleware
|
|
116
|
+
shouldInitOpenApiDocs: true, // Optional OpenAPI documentation
|
|
117
|
+
})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Testing Utilities
|
|
121
|
+
|
|
122
|
+
Comprehensive testing setup with testcontainers support:
|
|
123
|
+
|
|
124
|
+
- **Vitest Configuration**: Pre-configured vitest setup without globals
|
|
125
|
+
- **Testcontainers**: Redis and Vault containers for integration testing
|
|
126
|
+
- **Real Service Testing**: Test utilities that avoid mocking in favor of real services
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export { Layout, Content, EmailCategory } from './server/services/email/email.mo
|
|
|
21
21
|
export type { EmailTemplates, Theme, EmailAttachment } from './server/services/email/email.model';
|
|
22
22
|
export { SendgridService } from './server/services/sendgrid/sendgridApi.service';
|
|
23
23
|
export { getGcpServiceAccountFromBase64 } from './server/services/gcp/getGcpServiceAccountFromBase64';
|
|
24
|
-
export type { SecretProvider } from './server/services/secrets/secret.service';
|
|
24
|
+
export type { SecretProvider, VaultConfig } from './server/services/secrets/secret.service';
|
|
25
25
|
export { SecretService } from './server/services/secrets/secret.service';
|
|
26
26
|
export { UrlService } from './server/services/util/url.service';
|
|
27
27
|
export { paginationUtility } from './server/services/util/pagination';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAGtB,sFAHA,aAAK,OAGA;AAGd,sBAAsB;AACtB,2EAAyE;AAAhE,sHAAA,iBAAiB,OAAA;AAC1B,iEAA8D;AAArD,+GAAA,aAAa,OAAA;AACtB,uDAAqD;AAA5C,sGAAA,SAAS,OAAA;AAClB,4EAAqE;AAA5D,2GAAA,SAAS,OAAA;AAClB,yFAA4E;AAAnE,yHAAA,aAAa,OAAA;AACtB,+FAA+F;AAAtF,4IAAA,6BAA6B,OAAA;AACtC,sCAAuC;AAA9B,+FAAA,OAAO,OAAA;AAChB,oEAAiE;AAAxD,iHAAA,cAAc,OAAA;AAEvB,qDAAuE;AAA9D,0HAAA,6BAA6B,OAAA;AAMtC,0CAAwC;AAA/B,gGAAA,MAAM,OAAA;AACf,uEAAoE;AAA3D,6GAAA,YAAY,OAAA;AACrB,mEAI4C;AAH1C,qGAAA,MAAM,OAAA;AACN,sGAAA,OAAO,OAAA;AACP,4GAAA,aAAa,OAAA;AAOf,sFAAgF;AAAvE,sHAAA,eAAe,OAAA;AACxB,uGAAqG;AAA5F,gJAAA,8BAA8B,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAGtB,sFAHA,aAAK,OAGA;AAGd,sBAAsB;AACtB,2EAAyE;AAAhE,sHAAA,iBAAiB,OAAA;AAC1B,iEAA8D;AAArD,+GAAA,aAAa,OAAA;AACtB,uDAAqD;AAA5C,sGAAA,SAAS,OAAA;AAClB,4EAAqE;AAA5D,2GAAA,SAAS,OAAA;AAClB,yFAA4E;AAAnE,yHAAA,aAAa,OAAA;AACtB,+FAA+F;AAAtF,4IAAA,6BAA6B,OAAA;AACtC,sCAAuC;AAA9B,+FAAA,OAAO,OAAA;AAChB,oEAAiE;AAAxD,iHAAA,cAAc,OAAA;AAEvB,qDAAuE;AAA9D,0HAAA,6BAA6B,OAAA;AAMtC,0CAAwC;AAA/B,gGAAA,MAAM,OAAA;AACf,uEAAoE;AAA3D,6GAAA,YAAY,OAAA;AACrB,mEAI4C;AAH1C,qGAAA,MAAM,OAAA;AACN,sGAAA,OAAO,OAAA;AACP,4GAAA,aAAa,OAAA;AAOf,sFAAgF;AAAvE,sHAAA,eAAe,OAAA;AACxB,uGAAqG;AAA5F,gJAAA,8BAA8B,OAAA;AAMvC,2EAAwE;AAA/D,+GAAA,aAAa,OAAA;AACtB,kEAA+D;AAAtD,yGAAA,UAAU,OAAA;AACnB,gEAAqE;AAA5D,+GAAA,iBAAiB,OAAA;AAE1B,uCAAwC;AAA/B,mGAAA,SAAS,OAAA;AAClB,0FAG2D;AAFzD,yHAAA,kBAAkB,OAAA;AAClB,yGAAA,EAAE,OAAA;AAKJ,wBAAwB;AACxB,mBAAmB;AACnB,wBAAwB;AACxB,mDAAiD;AAAxC,sGAAA,SAAS,OAAA;AAYlB,iDAAyD;AAAhD,8GAAA,kBAAkB,OAAA;AAC3B,uFAGgD;AAF9C,0IAAA,2BAA2B,OAAA;AAC3B,6IAAA,8BAA8B,OAAA"}
|
|
@@ -2,7 +2,7 @@ import type { BuiltRouter } from '@trpc/server/unstable-core-do-not-import';
|
|
|
2
2
|
import type { Express, RequestHandler, Router } from 'express';
|
|
3
3
|
import { CommonLogger } from '@goatlab/js-utils';
|
|
4
4
|
import { SentryService } from '../sentry/sentry.service';
|
|
5
|
-
export declare function getExpressTrpcApp({ trpcRouter, port, expressResources, shouldInitOpenApiDocs, baseUrl, shouldEnableSentry, sentryService, logger, customHandlers
|
|
5
|
+
export declare function getExpressTrpcApp({ trpcRouter, port, expressResources, shouldInitOpenApiDocs, baseUrl, shouldEnableSentry, sentryService, logger, customHandlers }: {
|
|
6
6
|
appName?: string;
|
|
7
7
|
appVersion?: string;
|
|
8
8
|
port: number;
|
|
@@ -24,7 +24,7 @@ const trpcError_middleware_1 = require("../middleware/trpcError.middleware");
|
|
|
24
24
|
// return this.toString()
|
|
25
25
|
// }
|
|
26
26
|
/* eslint-enable */
|
|
27
|
-
function getExpressTrpcApp({ trpcRouter, port, expressResources, shouldInitOpenApiDocs, baseUrl = `http://localhost:${port}`, shouldEnableSentry, sentryService, logger = console, customHandlers
|
|
27
|
+
function getExpressTrpcApp({ trpcRouter, port, expressResources, shouldInitOpenApiDocs, baseUrl = `http://localhost:${port}`, shouldEnableSentry, sentryService, logger = console, customHandlers }) {
|
|
28
28
|
logger.log(`Starting ${consts_1.pkg.name}`);
|
|
29
29
|
const app = (0, express_1.default)();
|
|
30
30
|
app.use((0, cors_1.default)());
|
|
@@ -38,22 +38,22 @@ function getExpressTrpcApp({ trpcRouter, port, expressResources, shouldInitOpenA
|
|
|
38
38
|
app.use(express_1.default.urlencoded({ limit: '1mb', extended: true }));
|
|
39
39
|
app.use(express_1.default.raw({
|
|
40
40
|
inflate: true,
|
|
41
|
-
limit: '100kb'
|
|
41
|
+
limit: '100kb'
|
|
42
42
|
}));
|
|
43
43
|
app.use((req, resp, next) => (0, logs_middleware_1.expressRequestLogger)(req, resp, next, logger));
|
|
44
44
|
app.use((0, error_middleware_1.genericErrorMiddleware)({
|
|
45
|
-
sentryService: shouldEnableSentry ? sentryService : undefined
|
|
45
|
+
sentryService: shouldEnableSentry ? sentryService : undefined
|
|
46
46
|
}));
|
|
47
|
-
customHandlers?.forEach(
|
|
47
|
+
customHandlers?.forEach(customHandler => {
|
|
48
48
|
app.use(customHandler);
|
|
49
49
|
});
|
|
50
50
|
// TRPC endpoint
|
|
51
51
|
app.use('/trpc', trpcExpress.createExpressMiddleware({
|
|
52
52
|
router: trpcRouter,
|
|
53
53
|
createContext: trpc_context_1.createContext,
|
|
54
|
-
onError:
|
|
54
|
+
onError: e => (0, trpcError_middleware_1.trpcErrorMiddleware)({ sentryService, ...e })
|
|
55
55
|
}));
|
|
56
|
-
expressResources?.forEach(
|
|
56
|
+
expressResources?.forEach(expressResource => {
|
|
57
57
|
app.use(expressResource);
|
|
58
58
|
});
|
|
59
59
|
if (shouldInitOpenApiDocs) {
|
|
@@ -62,18 +62,18 @@ function getExpressTrpcApp({ trpcRouter, port, expressResources, shouldInitOpenA
|
|
|
62
62
|
appName: 'somename',
|
|
63
63
|
appVersion: 'someversion',
|
|
64
64
|
trpcRouter,
|
|
65
|
-
baseUrl
|
|
65
|
+
baseUrl
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
68
|
// Apply the OpenAPI Express middleware
|
|
69
69
|
app.use('/', (0, trpc_to_openapi_1.createOpenApiExpressMiddleware)({
|
|
70
70
|
router: trpcRouter,
|
|
71
71
|
createContext: trpc_context_1.createContext,
|
|
72
|
-
onError: trpcError_middleware_1.trpcErrorMiddleware
|
|
72
|
+
onError: trpcError_middleware_1.trpcErrorMiddleware
|
|
73
73
|
}));
|
|
74
74
|
app.use(async (req, res, next) => {
|
|
75
75
|
req.context = await (0, trpc_context_1.createContext)({
|
|
76
|
-
req
|
|
76
|
+
req
|
|
77
77
|
});
|
|
78
78
|
next();
|
|
79
79
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getExpressTrpcApp.js","sourceRoot":"","sources":["../../../src/server/bootstraps/getExpressTrpcApp.ts"],"names":[],"mappings":";;AA4BA,8CA2HC;AAvJD,+BAA2B;AAG3B,gDAA6D;AAC7D,uCAAsC;AACtC,6DAA4D;AAC5D,+BAAuB;AACvB,qCAA6B;AAC7B,mCAA2B;AAC3B,yCAAqC;AACrC,qDAAgE;AAChE,sCAA+B;AAC/B,0DAAuD;AACvD,wDAAoD;AACpD,qEAAuE;AACvE,mEAAoE;AACpE,6EAAwE;AAGxE,kCAAkC;AAClC,0CAA0C;AAC1C,kBAAkB;AAClB,oBAAoB;AACpB,0CAA0C;AAC1C,2BAA2B;AAC3B,IAAI;AACJ,mBAAmB;AAEnB,SAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,IAAI,EACJ,gBAAgB,EAChB,qBAAqB,EACrB,OAAO,GAAG,oBAAoB,IAAI,EAAE,EACpC,kBAAkB,EAClB,aAAa,EACb,MAAM,GAAG,OAAO,EAChB,cAAc,
|
|
1
|
+
{"version":3,"file":"getExpressTrpcApp.js","sourceRoot":"","sources":["../../../src/server/bootstraps/getExpressTrpcApp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.requestContext = void 0;
|
|
4
|
-
|
|
4
|
+
// Handle both CommonJS and ESM compatibility for ua-parser-js
|
|
5
|
+
let UAParser;
|
|
6
|
+
try {
|
|
7
|
+
// Try to import as ESM default
|
|
8
|
+
UAParser = require('ua-parser-js').default || require('ua-parser-js');
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
try {
|
|
12
|
+
// Try direct import
|
|
13
|
+
UAParser = require('ua-parser-js');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fallback - create a minimal parser
|
|
17
|
+
UAParser = class {
|
|
18
|
+
constructor(ua) { }
|
|
19
|
+
getResult() {
|
|
20
|
+
return {
|
|
21
|
+
browser: { name: 'Unknown', version: '' },
|
|
22
|
+
engine: { name: 'Unknown', version: '' },
|
|
23
|
+
os: { name: 'Unknown', version: '' },
|
|
24
|
+
device: { type: 'desktop' },
|
|
25
|
+
cpu: { architecture: 'unknown' }
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
5
31
|
const requestContext = (request, token) => {
|
|
6
32
|
const userAgent = request.headers['user-agent'] || '';
|
|
7
|
-
const parser = new
|
|
33
|
+
const parser = new UAParser(userAgent);
|
|
8
34
|
const result = parser.getResult();
|
|
9
35
|
const ip = request.ip ??
|
|
10
36
|
request.socket.remoteAddress ??
|
|
@@ -16,7 +42,7 @@ const requestContext = (request, token) => {
|
|
|
16
42
|
? {
|
|
17
43
|
decodedToken: token,
|
|
18
44
|
email: 'email' in token ? token.email : undefined,
|
|
19
|
-
firebaseId: 'uid' in token ? token.uid : undefined
|
|
45
|
+
firebaseId: 'uid' in token ? token.uid : undefined
|
|
20
46
|
}
|
|
21
47
|
: undefined,
|
|
22
48
|
url: request.url,
|
|
@@ -44,11 +70,11 @@ const requestContext = (request, token) => {
|
|
|
44
70
|
return {
|
|
45
71
|
ip,
|
|
46
72
|
publicIp: publicIp || '',
|
|
47
|
-
...location
|
|
73
|
+
...location
|
|
48
74
|
};
|
|
49
75
|
},
|
|
50
76
|
endpoint: [request.method, request.path || request.url]
|
|
51
|
-
.map(
|
|
77
|
+
.map(s => s.toLowerCase())
|
|
52
78
|
.join(' '),
|
|
53
79
|
device: {
|
|
54
80
|
isMobile: result?.device?.type === 'mobile',
|
|
@@ -57,8 +83,8 @@ const requestContext = (request, token) => {
|
|
|
57
83
|
isMacPC: result.os.name === 'Mac OS' || result?.device?.model === 'Macintosh',
|
|
58
84
|
os: result.os.name,
|
|
59
85
|
isIOS: result.os.name === 'iOS',
|
|
60
|
-
isAndroid: result.os.name === 'Android'
|
|
61
|
-
}
|
|
86
|
+
isAndroid: result.os.name === 'Android'
|
|
87
|
+
}
|
|
62
88
|
};
|
|
63
89
|
};
|
|
64
90
|
exports.requestContext = requestContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.context.js","sourceRoot":"","sources":["../../../src/server/context/request.context.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"request.context.js","sourceRoot":"","sources":["../../../src/server/context/request.context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type SecretProvider = 'GCP' | 'FILE' | 'VAULT';
|
|
2
|
-
interface VaultConfig {
|
|
1
|
+
export type SecretProvider = 'GCP' | 'FILE' | 'VAULT' | 'ENV';
|
|
2
|
+
export interface VaultConfig {
|
|
3
3
|
endpoint: string;
|
|
4
4
|
token?: string;
|
|
5
5
|
mount?: string;
|
|
@@ -10,7 +10,7 @@ export declare class SecretService<SecretType> {
|
|
|
10
10
|
location: string;
|
|
11
11
|
encryptionKey: string;
|
|
12
12
|
vaultConfig?: VaultConfig;
|
|
13
|
-
constructor({ provider, location, encryptionKey, vaultConfig
|
|
13
|
+
constructor({ provider, location, encryptionKey, vaultConfig }: {
|
|
14
14
|
provider: SecretProvider;
|
|
15
15
|
location: string;
|
|
16
16
|
encryptionKey: string;
|
|
@@ -19,6 +19,7 @@ export declare class SecretService<SecretType> {
|
|
|
19
19
|
loadSecretsFromFile(): SecretType;
|
|
20
20
|
loadSecretsFromGCP(): SecretType;
|
|
21
21
|
loadEncryptionKeyFromGCP(): string;
|
|
22
|
+
loadSecretsFromEnv(): SecretType;
|
|
22
23
|
loadSecretsFromVault(): Promise<SecretType>;
|
|
23
24
|
storeSecretsToVault(secrets: Partial<SecretType>): Promise<void>;
|
|
24
25
|
loadSecrets(): SecretType | Promise<SecretType>;
|
|
@@ -27,5 +28,5 @@ export declare class SecretService<SecretType> {
|
|
|
27
28
|
getSecretJson<T = any>(secretName: keyof SecretType): Promise<T>;
|
|
28
29
|
getSecretSync(secretName: keyof SecretType): string;
|
|
29
30
|
getSecretJsonSync<T = any>(secretName: keyof SecretType): T;
|
|
31
|
+
static clearCache(): void;
|
|
30
32
|
}
|
|
31
|
-
export {};
|
|
@@ -11,7 +11,7 @@ class SecretService {
|
|
|
11
11
|
location;
|
|
12
12
|
encryptionKey;
|
|
13
13
|
vaultConfig;
|
|
14
|
-
constructor({ provider, location, encryptionKey, vaultConfig
|
|
14
|
+
constructor({ provider, location, encryptionKey, vaultConfig }) {
|
|
15
15
|
this.provider = provider;
|
|
16
16
|
this.location = location;
|
|
17
17
|
this.encryptionKey = encryptionKey;
|
|
@@ -47,6 +47,45 @@ class SecretService {
|
|
|
47
47
|
loadEncryptionKeyFromGCP() {
|
|
48
48
|
return '';
|
|
49
49
|
}
|
|
50
|
+
loadSecretsFromEnv() {
|
|
51
|
+
const cacheKey = `env_${this.location}`;
|
|
52
|
+
if (memoryCache[cacheKey]) {
|
|
53
|
+
return memoryCache[cacheKey];
|
|
54
|
+
}
|
|
55
|
+
const start = process.hrtime.bigint();
|
|
56
|
+
try {
|
|
57
|
+
// For ENV provider, location is used as a prefix for environment variables
|
|
58
|
+
// For example, if location is "APP", it will look for APP_API_KEY, APP_DB_PASSWORD, etc.
|
|
59
|
+
const prefix = this.location ? `${this.location.toUpperCase()}_` : '';
|
|
60
|
+
const secrets = {};
|
|
61
|
+
// Get all environment variables that start with the prefix
|
|
62
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
63
|
+
if (value !== undefined) {
|
|
64
|
+
if (prefix && key.startsWith(prefix)) {
|
|
65
|
+
// Remove the prefix from the key
|
|
66
|
+
const secretKey = key.slice(prefix.length);
|
|
67
|
+
secrets[secretKey] = value;
|
|
68
|
+
}
|
|
69
|
+
else if (!prefix) {
|
|
70
|
+
// No prefix, include all environment variables
|
|
71
|
+
secrets[key] = value;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Log warning if no prefix is specified
|
|
76
|
+
if (!this.location) {
|
|
77
|
+
console.warn('ENV provider without location prefix - this will expose all environment variables');
|
|
78
|
+
}
|
|
79
|
+
memoryCache[cacheKey] = secrets;
|
|
80
|
+
const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;
|
|
81
|
+
console.log(`🔐 Secrets loaded from ENV: ${(0, colors_1.magenta)(this.location || 'all')} (${durationMs.toFixed(3)}ms)`);
|
|
82
|
+
return secrets;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('Failed to load secrets from ENV:', error.message);
|
|
86
|
+
throw new Error(`loadSecretsFromEnv failed: ${error.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
50
89
|
async loadSecretsFromVault() {
|
|
51
90
|
if (!this.vaultConfig) {
|
|
52
91
|
throw new Error('Vault configuration is required for VAULT provider');
|
|
@@ -59,7 +98,7 @@ class SecretService {
|
|
|
59
98
|
try {
|
|
60
99
|
const vaultUrl = `${this.vaultConfig.endpoint}/v1/${this.vaultConfig.mount || 'secret'}/data/${this.location}`;
|
|
61
100
|
const headers = {
|
|
62
|
-
'Content-Type': 'application/json'
|
|
101
|
+
'Content-Type': 'application/json'
|
|
63
102
|
};
|
|
64
103
|
// Add token authentication
|
|
65
104
|
if (this.vaultConfig.token) {
|
|
@@ -71,12 +110,12 @@ class SecretService {
|
|
|
71
110
|
}
|
|
72
111
|
const response = await (0, undici_1.fetch)(vaultUrl, {
|
|
73
112
|
method: 'GET',
|
|
74
|
-
headers
|
|
113
|
+
headers
|
|
75
114
|
});
|
|
76
115
|
if (!response.ok) {
|
|
77
116
|
throw new Error(`Vault request failed: ${response.status} ${response.statusText}`);
|
|
78
117
|
}
|
|
79
|
-
const data = await response.json();
|
|
118
|
+
const data = (await response.json());
|
|
80
119
|
// Vault KV v2 stores data in data.data
|
|
81
120
|
const secrets = data.data?.data || data.data || {};
|
|
82
121
|
memoryCache[cacheKey] = secrets;
|
|
@@ -96,7 +135,7 @@ class SecretService {
|
|
|
96
135
|
try {
|
|
97
136
|
const vaultUrl = `${this.vaultConfig.endpoint}/v1/${this.vaultConfig.mount || 'secret'}/data/${this.location}`;
|
|
98
137
|
const headers = {
|
|
99
|
-
'Content-Type': 'application/json'
|
|
138
|
+
'Content-Type': 'application/json'
|
|
100
139
|
};
|
|
101
140
|
// Add token authentication
|
|
102
141
|
if (this.vaultConfig.token) {
|
|
@@ -108,12 +147,12 @@ class SecretService {
|
|
|
108
147
|
}
|
|
109
148
|
// For Vault KV v2, data needs to be wrapped in a data object
|
|
110
149
|
const payload = {
|
|
111
|
-
data: secrets
|
|
150
|
+
data: secrets
|
|
112
151
|
};
|
|
113
152
|
const response = await (0, undici_1.fetch)(vaultUrl, {
|
|
114
153
|
method: 'POST',
|
|
115
154
|
headers,
|
|
116
|
-
body: JSON.stringify(payload)
|
|
155
|
+
body: JSON.stringify(payload)
|
|
117
156
|
});
|
|
118
157
|
if (!response.ok) {
|
|
119
158
|
throw new Error(`Vault store request failed: ${response.status} ${response.statusText}`);
|
|
@@ -135,6 +174,9 @@ class SecretService {
|
|
|
135
174
|
if (this.provider === 'VAULT') {
|
|
136
175
|
return this.loadSecretsFromVault();
|
|
137
176
|
}
|
|
177
|
+
if (this.provider === 'ENV') {
|
|
178
|
+
return this.loadSecretsFromEnv();
|
|
179
|
+
}
|
|
138
180
|
return this.loadSecretsFromFile();
|
|
139
181
|
}
|
|
140
182
|
loadEncryptionKey() {
|
|
@@ -152,7 +194,7 @@ class SecretService {
|
|
|
152
194
|
const secretValue = await this.getSecret(secretName);
|
|
153
195
|
return JSON.parse(secretValue);
|
|
154
196
|
}
|
|
155
|
-
// Synchronous versions for backward compatibility (FILE
|
|
197
|
+
// Synchronous versions for backward compatibility (FILE and ENV providers only)
|
|
156
198
|
getSecretSync(secretName) {
|
|
157
199
|
if (this.provider === 'VAULT') {
|
|
158
200
|
throw new Error('Use async getSecret() method for Vault provider');
|
|
@@ -167,6 +209,12 @@ class SecretService {
|
|
|
167
209
|
getSecretJsonSync(secretName) {
|
|
168
210
|
return JSON.parse(this.getSecretSync(secretName));
|
|
169
211
|
}
|
|
212
|
+
// Utility method to clear cache for testing
|
|
213
|
+
static clearCache() {
|
|
214
|
+
Object.keys(memoryCache).forEach(key => {
|
|
215
|
+
delete memoryCache[key];
|
|
216
|
+
});
|
|
217
|
+
}
|
|
170
218
|
}
|
|
171
219
|
exports.SecretService = SecretService;
|
|
172
220
|
//# sourceMappingURL=secret.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret.service.js","sourceRoot":"","sources":["../../../../src/server/services/secrets/secret.service.ts"],"names":[],"mappings":";;;AAAA,yBAAwB;AACxB,mCAA8B;AAE9B,oDAA8C;AAC9C,yCAAsC;AAEtC,MAAM,WAAW,GAA0C,EAAE,CAAA;AAY7D,MAAa,aAAa;IACxB,QAAQ,CAAgB;IACxB,QAAQ,CAAQ;IAChB,aAAa,CAAQ;IACrB,WAAW,CAAc;IAEzB,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"secret.service.js","sourceRoot":"","sources":["../../../../src/server/services/secrets/secret.service.ts"],"names":[],"mappings":"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"}
|
package/dist/server/trpc.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
37
37
|
isMobile: boolean;
|
|
38
38
|
isWebApp: boolean;
|
|
39
39
|
isMacPC: boolean;
|
|
40
|
-
os:
|
|
40
|
+
os: any;
|
|
41
41
|
isIOS: boolean;
|
|
42
42
|
isAndroid: boolean;
|
|
43
43
|
};
|
|
@@ -73,7 +73,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
73
73
|
isMobile: boolean;
|
|
74
74
|
isWebApp: boolean;
|
|
75
75
|
isMacPC: boolean;
|
|
76
|
-
os:
|
|
76
|
+
os: any;
|
|
77
77
|
isIOS: boolean;
|
|
78
78
|
isAndroid: boolean;
|
|
79
79
|
};
|
|
@@ -112,7 +112,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
112
112
|
isMobile: boolean;
|
|
113
113
|
isWebApp: boolean;
|
|
114
114
|
isMacPC: boolean;
|
|
115
|
-
os:
|
|
115
|
+
os: any;
|
|
116
116
|
isIOS: boolean;
|
|
117
117
|
isAndroid: boolean;
|
|
118
118
|
};
|
|
@@ -148,7 +148,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
148
148
|
isMobile: boolean;
|
|
149
149
|
isWebApp: boolean;
|
|
150
150
|
isMacPC: boolean;
|
|
151
|
-
os:
|
|
151
|
+
os: any;
|
|
152
152
|
isIOS: boolean;
|
|
153
153
|
isAndroid: boolean;
|
|
154
154
|
};
|
|
@@ -188,7 +188,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
188
188
|
isMobile: boolean;
|
|
189
189
|
isWebApp: boolean;
|
|
190
190
|
isMacPC: boolean;
|
|
191
|
-
os:
|
|
191
|
+
os: any;
|
|
192
192
|
isIOS: boolean;
|
|
193
193
|
isAndroid: boolean;
|
|
194
194
|
};
|
|
@@ -224,7 +224,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
224
224
|
isMobile: boolean;
|
|
225
225
|
isWebApp: boolean;
|
|
226
226
|
isMacPC: boolean;
|
|
227
|
-
os:
|
|
227
|
+
os: any;
|
|
228
228
|
isIOS: boolean;
|
|
229
229
|
isAndroid: boolean;
|
|
230
230
|
};
|
|
@@ -263,7 +263,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
263
263
|
isMobile: boolean;
|
|
264
264
|
isWebApp: boolean;
|
|
265
265
|
isMacPC: boolean;
|
|
266
|
-
os:
|
|
266
|
+
os: any;
|
|
267
267
|
isIOS: boolean;
|
|
268
268
|
isAndroid: boolean;
|
|
269
269
|
};
|
|
@@ -304,7 +304,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
304
304
|
isMobile: boolean;
|
|
305
305
|
isWebApp: boolean;
|
|
306
306
|
isMacPC: boolean;
|
|
307
|
-
os:
|
|
307
|
+
os: any;
|
|
308
308
|
isIOS: boolean;
|
|
309
309
|
isAndroid: boolean;
|
|
310
310
|
};
|
|
@@ -352,7 +352,7 @@ export declare function getTrpc<ExtendedAuthenticatedContext = {}, ExtendedConte
|
|
|
352
352
|
isMobile: boolean;
|
|
353
353
|
isWebApp: boolean;
|
|
354
354
|
isMacPC: boolean;
|
|
355
|
-
os:
|
|
355
|
+
os: any;
|
|
356
356
|
isIOS: boolean;
|
|
357
357
|
isAndroid: boolean;
|
|
358
358
|
};
|
package/dist/test/const.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export type GlobalTempData = {
|
|
2
2
|
redisUrl?: string;
|
|
3
|
+
vaultUrl?: string;
|
|
4
|
+
vaultToken?: string;
|
|
3
5
|
};
|
|
4
6
|
export declare const getGlobalData: () => GlobalTempData;
|
|
7
|
+
export declare const writeGlobalData: (data: GlobalTempData) => void;
|
|
8
|
+
export declare const cleanGlobalData: () => void;
|
package/dist/test/const.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getGlobalData = void 0;
|
|
3
|
+
exports.cleanGlobalData = exports.writeGlobalData = exports.getGlobalData = void 0;
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const tempDataFilePath = (0, path_1.resolve)((0, path_1.join)(__dirname, '../../'), 'tempData.json');
|
|
@@ -9,4 +9,14 @@ const getGlobalData = () => {
|
|
|
9
9
|
return data;
|
|
10
10
|
};
|
|
11
11
|
exports.getGlobalData = getGlobalData;
|
|
12
|
+
const writeGlobalData = (data) => {
|
|
13
|
+
(0, fs_1.writeFileSync)(tempDataFilePath, JSON.stringify(data), 'utf-8');
|
|
14
|
+
};
|
|
15
|
+
exports.writeGlobalData = writeGlobalData;
|
|
16
|
+
const cleanGlobalData = () => {
|
|
17
|
+
if ((0, fs_1.existsSync)(tempDataFilePath)) {
|
|
18
|
+
(0, fs_1.unlinkSync)(tempDataFilePath);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.cleanGlobalData = cleanGlobalData;
|
|
12
22
|
//# sourceMappingURL=const.js.map
|
package/dist/test/const.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/test/const.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/test/const.ts"],"names":[],"mappings":";;;AAAA,2BAAwE;AACxE,+BAAoC;AAQpC,MAAM,gBAAgB,GAAG,IAAA,cAAO,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAA;AAErE,MAAM,aAAa,GAAG,GAAmB,EAAE;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;IAEhE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAJY,QAAA,aAAa,iBAIzB;AAEM,MAAM,eAAe,GAAG,CAAC,IAAoB,EAAE,EAAE;IACtD,IAAA,kBAAa,EAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;AAChE,CAAC,CAAA;AAFY,QAAA,eAAe,mBAE3B;AAEM,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,IAAI,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAA,eAAU,EAAC,gBAAgB,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC,CAAA;AAJY,QAAA,eAAe,mBAI3B"}
|