import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; import { err, ok, Result, ResultAsync } from 'neverthrow'; import { ErrorWithCode, newError } from 'web-shared/src/types/errors'; const ssm = new SSMClient( !process.env.LAMBDA_TASK_ROOT ? { region: 'ap-southeast-2', profile: 'dev' } : { region: 'ap-southeast-2' }, ); const ssmSafeSend = ResultAsync.fromThrowable( (parameterName: string, decrypt?: boolean) => ssm.send( new GetParameterCommand({ Name: parameterName, WithDecryption: decrypt, }), ), () => newError( 'SecretFetchError', 'An error occurred while fetching secret values', ), ); const parameterCache: Record = {}; export const getParameter = async ( parameterName: string, decrypt?: boolean, ): Promise< Result> > => { try { if (parameterCache[parameterName]) { return ok(parameterCache[parameterName]); } const result = await ssmSafeSend(parameterName, decrypt); if (result.isErr()) { return err(result.error); } parameterCache[parameterName] = result.value.Parameter?.Value || ''; return ok(parameterCache[parameterName]); } catch (error) { return err( newError( 'ServerError', 'An unexpected error occurred while fetching secret values', { error }, ), ); } };