UNPKG

aws-secret-manager-client

Version:

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

2 lines 6.01 kB
"use strict";var l=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(g,e)=>{for(var n in e)l(g,n,{get:e[n],enumerable:!0})},w=(g,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of h(e))!p.call(g,t)&&t!==n&&l(g,t,{get:()=>e[t],enumerable:!(r=S(e,t))||r.enumerable});return g};var I=g=>w(l({},"__esModule",{value:!0}),g);var y={};C(y,{SecretsManagerClient:()=>m,SecretsManagerError:()=>i,default:()=>m});module.exports=I(y);var o=require("@aws-sdk/client-secrets-manager"),i=class extends Error{constructor(n,r,t,a){super(n);this.code=r;this.statusCode=t;this.originalError=a;this.name="SecretsManagerError"}},m=class{constructor(e={}){var n,r,t,a,c,d,s;this.options={region:process.env.AWS_REGION||"us-east-1",...e},this.logger={trace:((n=e.logger)==null?void 0:n.trace)||(()=>{}),debug:((r=e.logger)==null?void 0:r.debug)||(()=>{}),info:((t=e.logger)==null?void 0:t.info)||(()=>{}),warn:((a=e.logger)==null?void 0:a.warn)||(()=>{}),error:((c=e.logger)==null?void 0:c.error)||(()=>{})},this.awsClient=new o.SecretsManagerClient({...this.options,region:this.options.region??"us-east-1",maxAttempts:((d=this.options.retryPolicy)==null?void 0:d.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,n){var r,t;throw(((r=this.logger)==null?void 0:r.error)??(()=>{}))(`Error in ${n}:`,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 ${n} failed: ${e.message||"Unknown error"}`,e.name||"UNKNOWN_ERROR",((t=e.$metadata)==null?void 0:t.httpStatusCode)||500,e)}async getSecret(e,n,r){var a,c;this.validateSecretId(e);let t={SecretId:e,...n&&{VersionId:n},...r&&{VersionStage:r}};(a=this.logger)==null||a.debug("Getting secret",{secretId:e,versionId:n,versionStage:r});try{let d=new o.GetSecretValueCommand(t),s=await this.awsClient.send(d),u={arn:s.ARN,name:s.Name,value:s.SecretString,versionId:s.VersionId,versionStages:s.VersionStages,createdDate:s.CreatedDate};return(c=this.logger)==null||c.info("Secret retrieved successfully",{secretId:e}),u}catch(d){this.handleError(d,"getSecret")}}async getSecretJson(e,n,r){let t=await this.getSecret(e,n,r);if(!t.value)throw new i("Secret value is empty","EMPTY_SECRET_VALUE");try{return JSON.parse(t.value)}catch(a){throw new i("Failed to parse secret value as JSON","INVALID_JSON",400,a)}}async createSecret(e){var n,r;if(!e.Name||typeof e.Name!="string")throw new i("Name is required and must be a string");(n=this.logger)==null||n.debug("Creating secret",{name:e.Name});try{let t=new o.CreateSecretCommand(e),a=await this.awsClient.send(t);return(r=this.logger)==null||r.info("Secret created successfully",{name:e.Name,arn:a.ARN}),{arn:a.ARN??"",name:a.Name??"",versionId:a.VersionId??""}}catch(t){this.handleError(t,"createSecret")}}async updateSecret(e){var n,r;if(!e.SecretId||typeof e.SecretId!="string")throw new i("SecretId is required and must be a string");(n=this.logger)==null||n.debug("Updating secret",{secretId:e.SecretId});try{let t=new o.UpdateSecretCommand(e),a=await this.awsClient.send(t);return(r=this.logger)==null||r.info("Secret updated successfully",{secretId:e.SecretId,arn:a.ARN}),{arn:a.ARN??"",name:a.Name??"",versionId:a.VersionId??""}}catch(t){this.handleError(t,"updateSecret")}}async deleteSecret(e,n=!1,r){var a,c;this.validateSecretId(e);let t={SecretId:e,ForceDeleteWithoutRecovery:n,...r&&{RecoveryWindowInDays:r}};(a=this.logger)==null||a.debug("Deleting secret",{secretId:e,forceDeleteWithoutRecovery:n});try{let d=new o.DeleteSecretCommand(t),s=await this.awsClient.send(d);return(c=this.logger)==null||c.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(d){this.handleError(d,"deleteSecret")}}async rotateSecret(e){var n,r;if(!e.SecretId||typeof e.SecretId!="string")throw new i("SecretId is required and must be a string");(n=this.logger)==null||n.debug("Rotating secret",{secretId:e.SecretId});try{let t=new o.RotateSecretCommand(e),a=await this.awsClient.send(t);return(r=this.logger)==null||r.info("Secret rotation initiated",{secretId:e.SecretId}),{arn:a.ARN??"",name:a.Name??"",versionId:a.VersionId??""}}catch(t){this.handleError(t,"rotateSecret")}}async cancelRotateSecret(e){var r,t;this.validateSecretId(e);let n={SecretId:e};(r=this.logger)==null||r.debug("Canceling secret rotation",{secretId:e});try{let a=new o.CancelRotateSecretCommand(n),c=await this.awsClient.send(a);return(t=this.logger)==null||t.info("Secret rotation canceled",{secretId:e}),{arn:c.ARN??"",name:c.Name??"",versionId:c.VersionId??""}}catch(a){this.handleError(a,"cancelRotateSecret")}}async healthCheck(){try{let e=new o.GetSecretValueCommand({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()}};0&&(module.exports={SecretsManagerClient,SecretsManagerError}); //# sourceMappingURL=index.js.map