import { 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(params: ISecretServiceParams) { this.secretProvider = this.getSecretProvider(params); } private getSecretProvider(params: ISecretServiceParams): ProviderBase { const { awsConfig, azureConfig } = params; if (azureConfig) { return new AzureKeyVaultProvider(azureConfig.keyVaultName); } if (awsConfig) { const awsProvider = new AwsSecretsManagerProvider( awsConfig.secretsManagerSecretId, awsConfig.region, ); return awsProvider; } return new EnvironmentProvider(); } 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); } } }