import { ProviderInitializationError, SecretNotFoundError } from '../errors'; import AwsSecretsManagerProvider from '../providers/AwsSecretsManager'; import AzureKeyVaultProvider from '../providers/AzureKeyVault'; import CloudProviderBase from '../providers/CloudProviderBase'; import EnvironmentProvider from '../providers/Environment'; import ProviderBase from '../providers/ProviderBase'; interface IAwsConfig { secretsManagerSecretId: string; region: string; } interface IAzureConfig { keyVaultName: string; } interface ISecretServiceParams { awsConfig?: IAwsConfig; azureConfig?: IAzureConfig; } export default class SecretService { private secretProvider: ProviderBase | CloudProviderBase; constructor() { this.secretProvider = this.getSecretProvider(); } private getSecretProvider(): ProviderBase { try { const { AzureKeyVaultName, AwsSecretsManagerSecretId, AwsRegion } = process.env; if (AzureKeyVaultName) { return new AzureKeyVaultProvider(AzureKeyVaultName); } if (AwsSecretsManagerSecretId && AwsRegion) { const awsProvider = new AwsSecretsManagerProvider( AwsSecretsManagerSecretId, AwsRegion ); return awsProvider; } return new EnvironmentProvider(); } catch (error) { throw new ProviderInitializationError(); } } public async getSecret(key: string) { const secretValue = await this.secretProvider.getSecret(key); if (!secretValue) { throw new SecretNotFoundError(key); } return secretValue; } public async getOptionalSecret(key: string) { try { return await this.secretProvider.getSecret(key); } catch (error) { return new EnvironmentProvider().getSecret(key); } } }