@kibibit/configit 1.0.0-beta.26 → 1.0.0-beta.27
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 +419 -0
- package/lib/scripts/test-vault-comprehensive.d.ts +2 -0
- package/lib/scripts/test-vault-comprehensive.d.ts.map +1 -0
- package/lib/scripts/test-vault-comprehensive.js +422 -0
- package/lib/scripts/test-vault-comprehensive.js.map +1 -0
- package/lib/scripts/test-vault-dynamic.d.ts +2 -0
- package/lib/scripts/test-vault-dynamic.d.ts.map +1 -0
- package/lib/scripts/test-vault-dynamic.js +193 -0
- package/lib/scripts/test-vault-dynamic.js.map +1 -0
- package/lib/scripts/test-vault-gcp-ttl.d.ts +3 -0
- package/lib/scripts/test-vault-gcp-ttl.d.ts.map +1 -0
- package/lib/scripts/test-vault-gcp-ttl.js +218 -0
- package/lib/scripts/test-vault-gcp-ttl.js.map +1 -0
- package/lib/scripts/test-vault.d.ts +2 -0
- package/lib/scripts/test-vault.d.ts.map +1 -0
- package/lib/scripts/test-vault.js +167 -0
- package/lib/scripts/test-vault.js.map +1 -0
- package/lib/src/config.errors.d.ts.map +1 -0
- package/lib/src/config.errors.js.map +1 -0
- package/lib/src/config.model.d.ts.map +1 -0
- package/lib/src/config.model.js.map +1 -0
- package/lib/{config.service.d.ts → src/config.service.d.ts} +10 -1
- package/lib/src/config.service.d.ts.map +1 -0
- package/lib/{config.service.js → src/config.service.js} +75 -9
- package/lib/src/config.service.js.map +1 -0
- package/lib/src/environment.service.d.ts.map +1 -0
- package/lib/src/environment.service.js.map +1 -0
- package/lib/{index.d.ts → src/index.d.ts} +1 -0
- package/lib/src/index.d.ts.map +1 -0
- package/lib/{index.js → src/index.js} +1 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/json-schema.validator.d.ts.map +1 -0
- package/lib/src/json-schema.validator.js.map +1 -0
- package/lib/src/vault/__tests__/vault-integration.test.d.ts +2 -0
- package/lib/src/vault/__tests__/vault-integration.test.d.ts.map +1 -0
- package/lib/src/vault/__tests__/vault-integration.test.js +190 -0
- package/lib/src/vault/__tests__/vault-integration.test.js.map +1 -0
- package/lib/src/vault/decorators.d.ts +17 -0
- package/lib/src/vault/decorators.d.ts.map +1 -0
- package/lib/src/vault/decorators.js +149 -0
- package/lib/src/vault/decorators.js.map +1 -0
- package/lib/src/vault/index.d.ts +7 -0
- package/lib/src/vault/index.d.ts.map +1 -0
- package/lib/src/vault/index.js +42 -0
- package/lib/src/vault/index.js.map +1 -0
- package/lib/src/vault/secret-refresh-manager.d.ts +23 -0
- package/lib/src/vault/secret-refresh-manager.d.ts.map +1 -0
- package/lib/src/vault/secret-refresh-manager.js +149 -0
- package/lib/src/vault/secret-refresh-manager.js.map +1 -0
- package/lib/src/vault/types.d.ts +149 -0
- package/lib/src/vault/types.d.ts.map +1 -0
- package/lib/src/vault/types.js +4 -0
- package/lib/src/vault/types.js.map +1 -0
- package/lib/src/vault/vault-cache.d.ts +20 -0
- package/lib/src/vault/vault-cache.d.ts.map +1 -0
- package/lib/src/vault/vault-cache.js +139 -0
- package/lib/src/vault/vault-cache.js.map +1 -0
- package/lib/src/vault/vault-integration.d.ts +27 -0
- package/lib/src/vault/vault-integration.d.ts.map +1 -0
- package/lib/src/vault/vault-integration.js +211 -0
- package/lib/src/vault/vault-integration.js.map +1 -0
- package/lib/src/vault/vault-provider.d.ts +37 -0
- package/lib/src/vault/vault-provider.d.ts.map +1 -0
- package/lib/src/vault/vault-provider.js +354 -0
- package/lib/src/vault/vault-provider.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -65
- package/src/config.service.ts +155 -10
- package/src/config.service.vault.spec.ts +859 -0
- package/src/index.ts +1 -0
- package/src/vault/__tests__/vault-integration.test.ts +226 -0
- package/src/vault/decorators.ts +228 -0
- package/src/vault/index.ts +31 -0
- package/src/vault/secret-refresh-manager.ts +241 -0
- package/src/vault/types.ts +487 -0
- package/src/vault/vault-cache.ts +240 -0
- package/src/vault/vault-integration.ts +332 -0
- package/src/vault/vault-provider.ts +576 -0
- package/lib/config.errors.d.ts.map +0 -1
- package/lib/config.errors.js.map +0 -1
- package/lib/config.model.d.ts.map +0 -1
- package/lib/config.model.js.map +0 -1
- package/lib/config.service.d.ts.map +0 -1
- package/lib/config.service.js.map +0 -1
- package/lib/environment.service.d.ts.map +0 -1
- package/lib/environment.service.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/json-schema.validator.d.ts.map +0 -1
- package/lib/json-schema.validator.js.map +0 -1
- /package/lib/{config.errors.d.ts → src/config.errors.d.ts} +0 -0
- /package/lib/{config.errors.js → src/config.errors.js} +0 -0
- /package/lib/{config.model.d.ts → src/config.model.d.ts} +0 -0
- /package/lib/{config.model.js → src/config.model.js} +0 -0
- /package/lib/{environment.service.d.ts → src/environment.service.d.ts} +0 -0
- /package/lib/{environment.service.js → src/environment.service.js} +0 -0
- /package/lib/{json-schema.validator.d.ts → src/json-schema.validator.d.ts} +0 -0
- /package/lib/{json-schema.validator.js → src/json-schema.validator.js} +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecretRefreshManager = void 0;
|
|
4
|
+
class SecretRefreshManager {
|
|
5
|
+
constructor(provider, cache, refreshBuffer) {
|
|
6
|
+
this.refreshTimers = new Map();
|
|
7
|
+
this.refreshLocks = new Map();
|
|
8
|
+
this.refreshCounts = new Map();
|
|
9
|
+
this.lastRefreshTimes = new Map();
|
|
10
|
+
this.refreshContexts = new Map();
|
|
11
|
+
this.vaultProvider = provider;
|
|
12
|
+
this.cache = cache;
|
|
13
|
+
this.refreshBuffer = refreshBuffer || 300;
|
|
14
|
+
}
|
|
15
|
+
scheduleRefresh(propertyName, metadata, targetInstance) {
|
|
16
|
+
const entry = this.cache.getEntry(propertyName);
|
|
17
|
+
if (!entry) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.refreshContexts.set(propertyName, {
|
|
21
|
+
metadata,
|
|
22
|
+
targetInstance,
|
|
23
|
+
fullPath: entry.vaultPath
|
|
24
|
+
});
|
|
25
|
+
this.cancelRefresh(propertyName);
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const timeUntilRefresh = Math.max(0, entry.refreshAt - now);
|
|
28
|
+
if (timeUntilRefresh <= 0) {
|
|
29
|
+
this.executeRefresh(propertyName);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const timer = setTimeout(() => {
|
|
33
|
+
this.executeRefresh(propertyName);
|
|
34
|
+
}, timeUntilRefresh);
|
|
35
|
+
this.refreshTimers.set(propertyName, timer);
|
|
36
|
+
}
|
|
37
|
+
cancelRefresh(propertyName) {
|
|
38
|
+
const timer = this.refreshTimers.get(propertyName);
|
|
39
|
+
if (timer) {
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
this.refreshTimers.delete(propertyName);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async executeRefresh(propertyName) {
|
|
45
|
+
const existingLock = this.refreshLocks.get(propertyName);
|
|
46
|
+
if (existingLock) {
|
|
47
|
+
await existingLock;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const refreshPromise = this.performRefresh(propertyName)
|
|
51
|
+
.finally(() => {
|
|
52
|
+
this.refreshLocks.delete(propertyName);
|
|
53
|
+
this.refreshTimers.delete(propertyName);
|
|
54
|
+
});
|
|
55
|
+
this.refreshLocks.set(propertyName, refreshPromise);
|
|
56
|
+
await refreshPromise;
|
|
57
|
+
}
|
|
58
|
+
async performRefresh(propertyName) {
|
|
59
|
+
const context = this.refreshContexts.get(propertyName);
|
|
60
|
+
if (!context) {
|
|
61
|
+
console.error(`No refresh context for ${propertyName}`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { metadata, targetInstance, fullPath } = context;
|
|
65
|
+
const refreshCount = (this.refreshCounts.get(propertyName) || 0) + 1;
|
|
66
|
+
this.refreshCounts.set(propertyName, refreshCount);
|
|
67
|
+
try {
|
|
68
|
+
const secret = await this.vaultProvider.read(fullPath);
|
|
69
|
+
this.cache.set(propertyName, fullPath, secret, metadata);
|
|
70
|
+
if (targetInstance) {
|
|
71
|
+
const key = metadata.key || metadata.propertyName;
|
|
72
|
+
const value = secret.data[key];
|
|
73
|
+
targetInstance[propertyName] = value;
|
|
74
|
+
}
|
|
75
|
+
this.lastRefreshTimes.set(propertyName, Date.now());
|
|
76
|
+
this.scheduleRefresh(propertyName, metadata, targetInstance);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const errorMessage = (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error';
|
|
80
|
+
console.error(`Failed to refresh secret for ${propertyName}: ${this.sanitizeError(errorMessage)}`);
|
|
81
|
+
const retryDelay = Math.min(1000 * Math.pow(2, refreshCount - 1), 30000);
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
this.scheduleRefresh(propertyName, metadata, targetInstance);
|
|
84
|
+
}, retryDelay);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
getRefreshStatus() {
|
|
88
|
+
const statuses = [];
|
|
89
|
+
const cachedProperties = this.cache.getCachedProperties();
|
|
90
|
+
for (const propertyName of cachedProperties) {
|
|
91
|
+
const entry = this.cache.getEntry(propertyName);
|
|
92
|
+
if (!entry) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const timer = this.refreshTimers.get(propertyName);
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const refreshAt = entry.refreshAt;
|
|
98
|
+
const timeUntilRefresh = Math.max(0, refreshAt - now);
|
|
99
|
+
statuses.push({
|
|
100
|
+
propertyName,
|
|
101
|
+
vaultPath: entry.vaultPath,
|
|
102
|
+
scheduled: timer !== undefined,
|
|
103
|
+
refreshAt,
|
|
104
|
+
timeUntilRefresh,
|
|
105
|
+
lastRefresh: this.lastRefreshTimes.get(propertyName) || entry.cachedAt,
|
|
106
|
+
refreshCount: this.refreshCounts.get(propertyName) || 0
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return statuses;
|
|
110
|
+
}
|
|
111
|
+
getRefreshStatusForProperty(propertyName) {
|
|
112
|
+
const entry = this.cache.getEntry(propertyName);
|
|
113
|
+
if (!entry) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const timer = this.refreshTimers.get(propertyName);
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
const refreshAt = entry.refreshAt;
|
|
119
|
+
const timeUntilRefresh = Math.max(0, refreshAt - now);
|
|
120
|
+
return {
|
|
121
|
+
propertyName,
|
|
122
|
+
vaultPath: entry.vaultPath,
|
|
123
|
+
scheduled: timer !== undefined,
|
|
124
|
+
refreshAt,
|
|
125
|
+
timeUntilRefresh,
|
|
126
|
+
lastRefresh: this.lastRefreshTimes.get(propertyName) || entry.cachedAt,
|
|
127
|
+
refreshCount: this.refreshCounts.get(propertyName) || 0
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
shutdown() {
|
|
131
|
+
for (const [propertyName, timer] of this.refreshTimers.entries()) {
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
}
|
|
134
|
+
this.refreshTimers.clear();
|
|
135
|
+
this.refreshLocks.clear();
|
|
136
|
+
this.refreshCounts.clear();
|
|
137
|
+
this.lastRefreshTimes.clear();
|
|
138
|
+
}
|
|
139
|
+
sanitizeError(message) {
|
|
140
|
+
const sensitivePatterns = [/password/i, /secret/i, /key/i, /token/i, /credential/i];
|
|
141
|
+
let sanitized = message;
|
|
142
|
+
sensitivePatterns.forEach((pattern) => {
|
|
143
|
+
sanitized = sanitized.replace(new RegExp(`${pattern.source}[:=]\\s*[^\\s,}]+`, 'gi'), `${pattern.source}: ***`);
|
|
144
|
+
});
|
|
145
|
+
return sanitized;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.SecretRefreshManager = SecretRefreshManager;
|
|
149
|
+
//# sourceMappingURL=secret-refresh-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-refresh-manager.js","sourceRoot":"","sources":["../../../src/vault/secret-refresh-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import 'reflect-metadata';
|
|
3
|
+
export type VaultEngineType = 'kv1' | 'kv-v1' | 'kv2' | 'kv-v2' | 'database' | 'aws' | 'azure' | 'gcp' | 'transit' | 'pki' | 'custom';
|
|
4
|
+
export interface IVaultConfigOptions {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
auth: IVaultAuthConfig;
|
|
7
|
+
tls?: IVaultTLSConfig;
|
|
8
|
+
refreshBuffer?: number;
|
|
9
|
+
fallback?: IVaultFallbackConfig;
|
|
10
|
+
retry?: IRetryPolicy;
|
|
11
|
+
circuitBreaker?: ICircuitBreakerConfig;
|
|
12
|
+
}
|
|
13
|
+
export type IVaultAuthConfig = IVaultAuthConfigSimple | IVaultAuthConfigMethods;
|
|
14
|
+
export type IVaultAuthConfigSimple = ({
|
|
15
|
+
method: 'gcp';
|
|
16
|
+
} & IGCPAuthConfig) | ({
|
|
17
|
+
method: 'aws';
|
|
18
|
+
} & IAWSAuthConfig) | ({
|
|
19
|
+
method: 'approle';
|
|
20
|
+
} & IAppRoleAuthConfig) | ({
|
|
21
|
+
method: 'token';
|
|
22
|
+
} & ITokenAuthConfig);
|
|
23
|
+
export interface IVaultAuthConfigMethods {
|
|
24
|
+
methods: IVaultAuthMethod[];
|
|
25
|
+
}
|
|
26
|
+
export interface IVaultAuthMethod {
|
|
27
|
+
type: 'gcp' | 'aws' | 'approle' | 'token';
|
|
28
|
+
config: IGCPAuthConfig | IAWSAuthConfig | IAppRoleAuthConfig | ITokenAuthConfig;
|
|
29
|
+
}
|
|
30
|
+
export interface IGCPAuthConfig {
|
|
31
|
+
type?: 'gcp';
|
|
32
|
+
role: string;
|
|
33
|
+
serviceAccountKeyFile?: string;
|
|
34
|
+
serviceAccountEmail?: string;
|
|
35
|
+
jwtExpiration?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface IAWSAuthConfig {
|
|
38
|
+
type?: 'aws';
|
|
39
|
+
role: string;
|
|
40
|
+
}
|
|
41
|
+
export interface IAppRoleAuthConfig {
|
|
42
|
+
type?: 'approle';
|
|
43
|
+
roleId: string;
|
|
44
|
+
secretId: string;
|
|
45
|
+
mountPath?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ITokenAuthConfig {
|
|
48
|
+
type?: 'token';
|
|
49
|
+
token: string;
|
|
50
|
+
}
|
|
51
|
+
export interface IVaultTLSConfig {
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
verifyCertificate: boolean;
|
|
54
|
+
certificateFingerprint?: string;
|
|
55
|
+
caCert?: string | Buffer;
|
|
56
|
+
minVersion?: 'TLSv1.2' | 'TLSv1.3';
|
|
57
|
+
}
|
|
58
|
+
export interface IVaultFallbackConfig {
|
|
59
|
+
required: boolean;
|
|
60
|
+
useCacheOnFailure: boolean;
|
|
61
|
+
maxCacheAge: number;
|
|
62
|
+
failFast: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface IRetryPolicy {
|
|
65
|
+
maxAttempts: number;
|
|
66
|
+
backoff: {
|
|
67
|
+
strategy: 'exponential' | 'linear' | 'fixed';
|
|
68
|
+
initial: number;
|
|
69
|
+
max: number;
|
|
70
|
+
multiplier: number;
|
|
71
|
+
};
|
|
72
|
+
retryableErrors: string[];
|
|
73
|
+
}
|
|
74
|
+
export interface ICircuitBreakerConfig {
|
|
75
|
+
enabled: boolean;
|
|
76
|
+
failureThreshold: number;
|
|
77
|
+
resetTimeout: number;
|
|
78
|
+
halfOpenMaxRequests: number;
|
|
79
|
+
}
|
|
80
|
+
export interface IVaultSecretResponse {
|
|
81
|
+
data: Record<string, any>;
|
|
82
|
+
lease_id?: string;
|
|
83
|
+
lease_duration?: number;
|
|
84
|
+
renewable?: boolean;
|
|
85
|
+
request_id?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface IVaultSecret {
|
|
88
|
+
data: Record<string, any>;
|
|
89
|
+
leaseId?: string;
|
|
90
|
+
leaseDuration: number;
|
|
91
|
+
renewable: boolean;
|
|
92
|
+
metadata?: {
|
|
93
|
+
createdTime: string;
|
|
94
|
+
deletionTime: string;
|
|
95
|
+
destroyed: boolean;
|
|
96
|
+
version: number;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export interface VaultPropertyMetadata {
|
|
100
|
+
path: string;
|
|
101
|
+
engine: VaultEngineType;
|
|
102
|
+
key?: string;
|
|
103
|
+
refreshBuffer?: number;
|
|
104
|
+
required: boolean;
|
|
105
|
+
propertyName: string;
|
|
106
|
+
propertyType: string;
|
|
107
|
+
}
|
|
108
|
+
export interface VaultCacheEntry {
|
|
109
|
+
value: any;
|
|
110
|
+
secret: IVaultSecret;
|
|
111
|
+
cachedAt: number;
|
|
112
|
+
expiresAt: number;
|
|
113
|
+
refreshAt: number;
|
|
114
|
+
propertyName: string;
|
|
115
|
+
vaultPath: string;
|
|
116
|
+
}
|
|
117
|
+
export interface VaultHealth {
|
|
118
|
+
connected: boolean;
|
|
119
|
+
authenticated: boolean;
|
|
120
|
+
cacheSize: number;
|
|
121
|
+
refreshQueueSize: number;
|
|
122
|
+
lastRefreshTime: number;
|
|
123
|
+
errors: VaultError[];
|
|
124
|
+
}
|
|
125
|
+
export interface VaultError {
|
|
126
|
+
timestamp: number;
|
|
127
|
+
path: string;
|
|
128
|
+
error: string;
|
|
129
|
+
retryable: boolean;
|
|
130
|
+
}
|
|
131
|
+
export interface IRefreshStatus {
|
|
132
|
+
propertyName: string;
|
|
133
|
+
vaultPath: string;
|
|
134
|
+
scheduled: boolean;
|
|
135
|
+
refreshAt: number;
|
|
136
|
+
timeUntilRefresh: number;
|
|
137
|
+
lastRefresh: number;
|
|
138
|
+
refreshCount: number;
|
|
139
|
+
}
|
|
140
|
+
export interface IVaultHealthDetails {
|
|
141
|
+
connected: boolean;
|
|
142
|
+
authenticated: boolean;
|
|
143
|
+
cacheSize: number;
|
|
144
|
+
refreshQueueSize: number;
|
|
145
|
+
lastRefreshTime: number;
|
|
146
|
+
errors: VaultError[];
|
|
147
|
+
refreshStatus: IRefreshStatus[];
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/vault/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/vault/types.ts"],"names":[],"mappings":";;AAKA,4BAA0B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IVaultSecret, VaultCacheEntry, VaultPropertyMetadata } from './types';
|
|
2
|
+
export declare class VaultCache {
|
|
3
|
+
private cache;
|
|
4
|
+
private propertyToPath;
|
|
5
|
+
private pathToProperties;
|
|
6
|
+
get(propertyName: string): any | null;
|
|
7
|
+
set(propertyName: string, vaultPath: string, secret: IVaultSecret, metadata: VaultPropertyMetadata): void;
|
|
8
|
+
private extractValue;
|
|
9
|
+
invalidate(vaultPath: string): void;
|
|
10
|
+
invalidateProperty(propertyName: string): void;
|
|
11
|
+
getEntry(propertyName: string): VaultCacheEntry | undefined;
|
|
12
|
+
getPropertiesForPath(vaultPath: string): string[];
|
|
13
|
+
getPathForProperty(propertyName: string): string | undefined;
|
|
14
|
+
has(propertyName: string): boolean;
|
|
15
|
+
getEntriesNeedingRefresh(): VaultCacheEntry[];
|
|
16
|
+
clear(): void;
|
|
17
|
+
size(): number;
|
|
18
|
+
getCachedProperties(): string[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=vault-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-cache.d.ts","sourceRoot":"","sources":["../../../src/vault/vault-cache.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAK/E,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,gBAAgB,CAAuC;IAO/D,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAkBrC,GAAG,CACD,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,qBAAqB,GAC9B,IAAI;IAoDP,OAAO,CAAC,YAAY;IA6BpB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAmBnC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAc9C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAO3D,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAQjD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO5D,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAkBlC,wBAAwB,IAAI,eAAe,EAAE;IAgB7C,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,MAAM;IAOd,mBAAmB,IAAI,MAAM,EAAE;CAGhC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VaultCache = void 0;
|
|
7
|
+
const nconf_1 = __importDefault(require("nconf"));
|
|
8
|
+
class VaultCache {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.cache = new Map();
|
|
11
|
+
this.propertyToPath = new Map();
|
|
12
|
+
this.pathToProperties = new Map();
|
|
13
|
+
}
|
|
14
|
+
get(propertyName) {
|
|
15
|
+
const entry = this.cache.get(propertyName);
|
|
16
|
+
if (!entry) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (Date.now() > entry.expiresAt) {
|
|
20
|
+
this.cache.delete(propertyName);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return entry.value;
|
|
24
|
+
}
|
|
25
|
+
set(propertyName, vaultPath, secret, metadata) {
|
|
26
|
+
var _a;
|
|
27
|
+
const value = this.extractValue(secret, metadata);
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const leaseDurationMs = secret.leaseDuration * 1000;
|
|
30
|
+
const expiresAt = secret.leaseDuration > 0 ? now + leaseDurationMs : now + 3600000;
|
|
31
|
+
const defaultBufferMs = Math.min(leaseDurationMs * 0.1, 300000);
|
|
32
|
+
const refreshBufferMs = metadata.refreshBuffer ? metadata.refreshBuffer * 1000 : defaultBufferMs;
|
|
33
|
+
const refreshAt = secret.leaseDuration > 0 ? expiresAt - refreshBufferMs : expiresAt;
|
|
34
|
+
const entry = {
|
|
35
|
+
value,
|
|
36
|
+
secret,
|
|
37
|
+
cachedAt: now,
|
|
38
|
+
expiresAt,
|
|
39
|
+
refreshAt,
|
|
40
|
+
propertyName,
|
|
41
|
+
vaultPath
|
|
42
|
+
};
|
|
43
|
+
this.cache.set(propertyName, entry);
|
|
44
|
+
this.propertyToPath.set(propertyName, vaultPath);
|
|
45
|
+
const properties = this.pathToProperties.get(vaultPath) || new Set();
|
|
46
|
+
properties.add(propertyName);
|
|
47
|
+
this.pathToProperties.set(vaultPath, properties);
|
|
48
|
+
const overridesStore = (_a = nconf_1.default.stores) === null || _a === void 0 ? void 0 : _a.overrides;
|
|
49
|
+
const existingOverrides = (overridesStore === null || overridesStore === void 0 ? void 0 : overridesStore.store) || {};
|
|
50
|
+
nconf_1.default.overrides(Object.assign(Object.assign({}, existingOverrides), { [propertyName]: value }));
|
|
51
|
+
}
|
|
52
|
+
extractValue(secret, metadata) {
|
|
53
|
+
var _a;
|
|
54
|
+
const { engine, key } = metadata;
|
|
55
|
+
switch (engine) {
|
|
56
|
+
case 'kv-v1':
|
|
57
|
+
return key ? secret.data[key] : secret.data;
|
|
58
|
+
case 'kv-v2':
|
|
59
|
+
const kv2Data = ((_a = secret.data) === null || _a === void 0 ? void 0 : _a.data) || secret.data;
|
|
60
|
+
return key ? kv2Data[key] : kv2Data;
|
|
61
|
+
case 'database':
|
|
62
|
+
case 'aws':
|
|
63
|
+
case 'azure':
|
|
64
|
+
case 'gcp':
|
|
65
|
+
return key ? secret.data[key] : secret.data;
|
|
66
|
+
default:
|
|
67
|
+
return key ? secret.data[key] : secret.data;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
invalidate(vaultPath) {
|
|
71
|
+
const properties = this.pathToProperties.get(vaultPath);
|
|
72
|
+
if (!properties) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
for (const propertyName of properties) {
|
|
76
|
+
this.cache.delete(propertyName);
|
|
77
|
+
this.propertyToPath.delete(propertyName);
|
|
78
|
+
nconf_1.default.remove(propertyName);
|
|
79
|
+
}
|
|
80
|
+
this.pathToProperties.delete(vaultPath);
|
|
81
|
+
}
|
|
82
|
+
invalidateProperty(propertyName) {
|
|
83
|
+
const vaultPath = this.propertyToPath.get(propertyName);
|
|
84
|
+
if (vaultPath) {
|
|
85
|
+
this.invalidate(vaultPath);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.cache.delete(propertyName);
|
|
89
|
+
nconf_1.default.remove(propertyName);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
getEntry(propertyName) {
|
|
93
|
+
return this.cache.get(propertyName);
|
|
94
|
+
}
|
|
95
|
+
getPropertiesForPath(vaultPath) {
|
|
96
|
+
const properties = this.pathToProperties.get(vaultPath);
|
|
97
|
+
return properties ? Array.from(properties) : [];
|
|
98
|
+
}
|
|
99
|
+
getPathForProperty(propertyName) {
|
|
100
|
+
return this.propertyToPath.get(propertyName);
|
|
101
|
+
}
|
|
102
|
+
has(propertyName) {
|
|
103
|
+
const entry = this.cache.get(propertyName);
|
|
104
|
+
if (!entry) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
if (Date.now() > entry.expiresAt) {
|
|
108
|
+
this.cache.delete(propertyName);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
getEntriesNeedingRefresh() {
|
|
114
|
+
const now = Date.now();
|
|
115
|
+
const entries = [];
|
|
116
|
+
for (const entry of this.cache.values()) {
|
|
117
|
+
if (entry.refreshAt <= now && entry.expiresAt > now) {
|
|
118
|
+
entries.push(entry);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return entries;
|
|
122
|
+
}
|
|
123
|
+
clear() {
|
|
124
|
+
for (const propertyName of this.cache.keys()) {
|
|
125
|
+
nconf_1.default.remove(propertyName);
|
|
126
|
+
}
|
|
127
|
+
this.cache.clear();
|
|
128
|
+
this.propertyToPath.clear();
|
|
129
|
+
this.pathToProperties.clear();
|
|
130
|
+
}
|
|
131
|
+
size() {
|
|
132
|
+
return this.cache.size;
|
|
133
|
+
}
|
|
134
|
+
getCachedProperties() {
|
|
135
|
+
return Array.from(this.cache.keys());
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.VaultCache = VaultCache;
|
|
139
|
+
//# sourceMappingURL=vault-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-cache.js","sourceRoot":"","sources":["../../../src/vault/vault-cache.ts"],"names":[],"mappings":";;;;;;AAKA,kDAA0B;AAO1B,MAAa,UAAU;IAAvB;QACU,UAAK,GAAiC,IAAI,GAAG,EAAE,CAAC;QAChD,mBAAc,GAAwB,IAAI,GAAG,EAAE,CAAC;QAChD,qBAAgB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAgOjE,CAAC;IAzNC,GAAG,CAAC,YAAoB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QAGD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAKD,GAAG,CACD,YAAoB,EACpB,SAAiB,EACjB,MAAoB,EACpB,QAA+B;;QAG/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAGlD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QAEpD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC;QAKnF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;QACjG,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QAErF,MAAM,KAAK,GAAoB;YAC7B,KAAK;YACL,MAAM;YACN,QAAQ,EAAE,GAAG;YACb,SAAS;YACT,SAAS;YACT,YAAY;YACZ,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAGpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACrE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAKjD,MAAM,cAAc,GAAG,MAAC,eAAa,CAAC,MAAM,0CAAE,SAAS,CAAC;QACxD,MAAM,iBAAiB,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,KAAI,EAAE,CAAC;QAGtD,eAAK,CAAC,SAAS,iCACV,iBAAiB,KACpB,CAAC,YAAY,CAAC,EAAE,KAAK,IACrB,CAAC;IACL,CAAC;IAKO,YAAY,CAAC,MAAoB,EAAE,QAA+B;;QACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;QAEjC,QAAQ,MAAM,EAAE;YACd,KAAK,OAAO;gBAEV,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAE9C,KAAK,OAAO;gBAEV,MAAM,OAAO,GAAG,CAAA,MAAA,MAAM,CAAC,IAAI,0CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAC;gBACjD,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAEtC,KAAK,UAAU,CAAC;YAChB,KAAK,KAAK,CAAC;YACX,KAAK,OAAO,CAAC;YACb,KAAK,KAAK;gBAER,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAE9C;gBAEE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;SAC/C;IACH,CAAC;IAKD,UAAU,CAAC,SAAiB;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE;YACf,OAAO;SACR;QAED,KAAK,MAAM,YAAY,IAAI,UAAU,EAAE;YACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAEzC,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SAC5B;QAED,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAKD,kBAAkB,CAAC,YAAoB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC5B;aAAM;YAEL,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAChC,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SAC5B;IACH,CAAC;IAKD,QAAQ,CAAC,YAAoB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAKD,oBAAoB,CAAC,SAAiB;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAKD,kBAAkB,CAAC,YAAoB;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAKD,GAAG,CAAC,YAAoB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,KAAK,CAAC;SACd;QAGD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,wBAAwB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACvC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE;gBACnD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACrB;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAKD,KAAK;QAEH,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;YAC5C,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SAC5B;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAKD,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAKD,mBAAmB;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AAnOD,gCAmOC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IVaultConfigOptions, IVaultHealthDetails, VaultHealth } from './types';
|
|
2
|
+
export declare class VaultIntegration {
|
|
3
|
+
private provider;
|
|
4
|
+
private cache;
|
|
5
|
+
private refreshManager;
|
|
6
|
+
private initialized;
|
|
7
|
+
private config;
|
|
8
|
+
private errors;
|
|
9
|
+
constructor(config: IVaultConfigOptions);
|
|
10
|
+
initialize(): Promise<void>;
|
|
11
|
+
loadSecrets<T extends object>(configOrClass: T | (new () => T)): Promise<void>;
|
|
12
|
+
getSecret(propertyName: string): any | null;
|
|
13
|
+
isInitialized(): boolean;
|
|
14
|
+
getHealth(): VaultHealth;
|
|
15
|
+
getHealthDetails(): IVaultHealthDetails;
|
|
16
|
+
invalidateCache(vaultPath: string): void;
|
|
17
|
+
invalidateProperty(propertyName: string): void;
|
|
18
|
+
shutdown(): void;
|
|
19
|
+
private groupByPath;
|
|
20
|
+
private groupByFullPath;
|
|
21
|
+
private constructFullPath;
|
|
22
|
+
private recordError;
|
|
23
|
+
private isRetryableError;
|
|
24
|
+
private sanitizeError;
|
|
25
|
+
private sanitizePath;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=vault-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-integration.d.ts","sourceRoot":"","sources":["../../../src/vault/vault-integration.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EAEZ,MAAM,SAAS,CAAC;AAOjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAqF;gBAEvF,MAAM,EAAE,mBAAmB;IAYjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsEpF,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAO3C,aAAa,IAAI,OAAO;IAOxB,SAAS,IAAI,WAAW;IAmBxB,gBAAgB,IAAI,mBAAmB;IAmBvC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAYxC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQ9C,QAAQ,IAAI,IAAI;IAShB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,YAAY;CAWrB"}
|