UNPKG

aws-secret-manager-client

Version:

Modern AWS Secrets Manager client for Node.js with TypeScript support, built on AWS SDK v3

2 lines 5.5 kB
import{SecretsManagerClient as u,GetSecretValueCommand as g,CreateSecretCommand as S,UpdateSecretCommand as h,DeleteSecretCommand as p,RotateSecretCommand as C,CancelRotateSecretCommand as w}from"@aws-sdk/client-secrets-manager";var i=class extends Error{constructor(r,a,n,t){super(r);this.code=a;this.statusCode=n;this.originalError=t;this.name="SecretsManagerError"}},d=class{constructor(e={}){var r,a,n,t,o,c,s;this.options={region:process.env.AWS_REGION||"us-east-1",...e},this.logger={trace:((r=e.logger)==null?void 0:r.trace)||(()=>{}),debug:((a=e.logger)==null?void 0:a.debug)||(()=>{}),info:((n=e.logger)==null?void 0:n.info)||(()=>{}),warn:((t=e.logger)==null?void 0:t.warn)||(()=>{}),error:((o=e.logger)==null?void 0:o.error)||(()=>{})},this.awsClient=new u({...this.options,region:this.options.region??"us-east-1",maxAttempts:((c=this.options.retryPolicy)==null?void 0:c.maxRetries)||3}),this.logger.info("SecretsManager client initialized",{region:this.options.region,maxRetries:((s=this.options.retryPolicy)==null?void 0:s.maxRetries)||3})}validateSecretId(e){if(!e||typeof e!="string"||e.trim()==="")throw new i("SecretId is required and must be a non-empty string")}handleError(e,r){var a,n;throw(((a=this.logger)==null?void 0:a.error)??(()=>{}))(`Error in ${r}:`,e??{}),e.name==="ResourceNotFoundException"?new i(`Secret not found: ${e.message}`,"RESOURCE_NOT_FOUND",404,e):e.name==="AccessDeniedError"?new i(`Access denied: ${e.message}`,"ACCESS_DENIED",403,e):e.name==="InvalidParameterException"?new i(`Invalid parameter: ${e.message}`,"INVALID_PARAMETER",400,e):e.name==="InvalidRequestException"?new i(`Invalid request: ${e.message}`,"INVALID_REQUEST",400,e):e.name==="ResourceExistsException"?new i(`Resource already exists: ${e.message}`,"RESOURCE_EXISTS",409,e):new i(`Operation ${r} failed: ${e.message||"Unknown error"}`,e.name||"UNKNOWN_ERROR",((n=e.$metadata)==null?void 0:n.httpStatusCode)||500,e)}async getSecret(e,r,a){var t,o;this.validateSecretId(e);let n={SecretId:e,...r&&{VersionId:r},...a&&{VersionStage:a}};(t=this.logger)==null||t.debug("Getting secret",{secretId:e,versionId:r,versionStage:a});try{let c=new g(n),s=await this.awsClient.send(c),l={arn:s.ARN,name:s.Name,value:s.SecretString,versionId:s.VersionId,versionStages:s.VersionStages,createdDate:s.CreatedDate};return(o=this.logger)==null||o.info("Secret retrieved successfully",{secretId:e}),l}catch(c){this.handleError(c,"getSecret")}}async getSecretJson(e,r,a){let n=await this.getSecret(e,r,a);if(!n.value)throw new i("Secret value is empty","EMPTY_SECRET_VALUE");try{return JSON.parse(n.value)}catch(t){throw new i("Failed to parse secret value as JSON","INVALID_JSON",400,t)}}async createSecret(e){var r,a;if(!e.Name||typeof e.Name!="string")throw new i("Name is required and must be a string");(r=this.logger)==null||r.debug("Creating secret",{name:e.Name});try{let n=new S(e),t=await this.awsClient.send(n);return(a=this.logger)==null||a.info("Secret created successfully",{name:e.Name,arn:t.ARN}),{arn:t.ARN??"",name:t.Name??"",versionId:t.VersionId??""}}catch(n){this.handleError(n,"createSecret")}}async updateSecret(e){var r,a;if(!e.SecretId||typeof e.SecretId!="string")throw new i("SecretId is required and must be a string");(r=this.logger)==null||r.debug("Updating secret",{secretId:e.SecretId});try{let n=new h(e),t=await this.awsClient.send(n);return(a=this.logger)==null||a.info("Secret updated successfully",{secretId:e.SecretId,arn:t.ARN}),{arn:t.ARN??"",name:t.Name??"",versionId:t.VersionId??""}}catch(n){this.handleError(n,"updateSecret")}}async deleteSecret(e,r=!1,a){var t,o;this.validateSecretId(e);let n={SecretId:e,ForceDeleteWithoutRecovery:r,...a&&{RecoveryWindowInDays:a}};(t=this.logger)==null||t.debug("Deleting secret",{secretId:e,forceDeleteWithoutRecovery:r});try{let c=new p(n),s=await this.awsClient.send(c);return(o=this.logger)==null||o.info("Secret deleted successfully",{secretId:e}),{arn:s.ARN??"",name:s.Name??"",deletionDate:s.DeletionDate?typeof s.DeletionDate=="string"?new Date(s.DeletionDate):s.DeletionDate:new Date(0)}}catch(c){this.handleError(c,"deleteSecret")}}async rotateSecret(e){var r,a;if(!e.SecretId||typeof e.SecretId!="string")throw new i("SecretId is required and must be a string");(r=this.logger)==null||r.debug("Rotating secret",{secretId:e.SecretId});try{let n=new C(e),t=await this.awsClient.send(n);return(a=this.logger)==null||a.info("Secret rotation initiated",{secretId:e.SecretId}),{arn:t.ARN??"",name:t.Name??"",versionId:t.VersionId??""}}catch(n){this.handleError(n,"rotateSecret")}}async cancelRotateSecret(e){var a,n;this.validateSecretId(e);let r={SecretId:e};(a=this.logger)==null||a.debug("Canceling secret rotation",{secretId:e});try{let t=new w(r),o=await this.awsClient.send(t);return(n=this.logger)==null||n.info("Secret rotation canceled",{secretId:e}),{arn:o.ARN??"",name:o.Name??"",versionId:o.VersionId??""}}catch(t){this.handleError(t,"cancelRotateSecret")}}async healthCheck(){try{let e=new g({SecretId:"health-check-non-existent-secret"});return await this.awsClient.send(e),{status:"healthy",message:"Client is healthy"}}catch(e){return e.name==="ResourceNotFoundException"?{status:"healthy",message:"Client is healthy"}:{status:"unhealthy",message:`Health check failed: ${e.message}`}}}async close(){var e;(e=this.logger)==null||e.info("Closing SecretsManager client"),await this.awsClient.destroy()}};export{d as SecretsManagerClient,i as SecretsManagerError,d as default}; //# sourceMappingURL=index.mjs.map