@enspirit/emb
Version:
A replacement for our Makefile-for-monorepos
76 lines (75 loc) • 2.3 kB
JavaScript
/**
* Manages secret providers and creates template sources for them.
*/
export class SecretManager {
providers = new Map();
/**
* Register a secret provider.
* @param name Provider name (e.g., 'vault', 'op')
* @param provider The provider instance
*/
register(name, provider) {
if (this.providers.has(name)) {
throw new Error(`Secret provider '${name}' is already registered`);
}
this.providers.set(name, provider);
}
/**
* Get a registered provider by name.
* @param name Provider name
* @returns The provider instance or undefined if not found
*/
get(name) {
return this.providers.get(name);
}
/**
* Check if a provider is registered.
* @param name Provider name
*/
has(name) {
return this.providers.has(name);
}
/**
* Get all registered provider names.
*/
getProviderNames() {
return [...this.providers.keys()];
}
/**
* Connect all registered providers.
*/
async connectAll() {
await Promise.all([...this.providers.values()].map((p) => p.connect()));
}
/**
* Disconnect all registered providers.
*/
async disconnectAll() {
await Promise.all([...this.providers.values()].map((p) => p.disconnect()));
}
/**
* Parse a secret reference string into a SecretReference object.
* Format: "path/to/secret#key" or "path/to/secret"
* @param refString The reference string to parse
*/
parseReference(refString) {
const [path, key] = refString.split('#');
return { path, key };
}
/**
* Create an async source function for use with TemplateExpander.
* @param providerName The name of the provider to use
* @returns An async function that resolves secrets
*/
createSource(providerName) {
return async (key) => {
const provider = this.get(providerName);
if (!provider) {
throw new Error(`Secret provider '${providerName}' not found. ` +
`Available providers: ${this.getProviderNames().join(', ') || 'none'}`);
}
const ref = this.parseReference(key);
return provider.get(ref);
};
}
}