UNPKG

@leanstacks/serverless-common

Version:

LeanStacks organization common serverless components.

3 lines (2 loc) 5.72 kB
"use strict";var e=require("http-status"),t=require("winston"),r=require("joi"),s=require("@aws-sdk/lib-dynamodb"),a=require("@aws-sdk/client-dynamodb"),n=require("@aws-sdk/client-sqs"),o=require("@aws-sdk/client-cognito-identity-provider"),d=require("@middy/core"),i=require("@middy/http-event-normalizer"),u=require("@middy/http-json-body-parser"),m=require("crypto");class l extends Error{constructor(e,t){super(),this.name="HttpError",this.statusCode=500,this.statusCode=t,"string"==typeof e&&(this.message=e),e instanceof Error&&(this.message=e.message)}}class c extends Error{constructor(e,t,r){super(),this.name="ServiceError",this.code=500,this.statusCode=500,this.code=t||500,this.statusCode=r||500,"string"==typeof e&&(this.message=e),e instanceof Error&&(this.message=e.message)}}class S extends l{constructor(t){super(t||e[`${e.BAD_REQUEST}_MESSAGE`],e.BAD_REQUEST),this.name="BadRequestError"}}function g(e){const{error:t,value:r}=e.validate(process.env,{abortEarly:!1,allowUnknown:!0});if(t)throw console.warn(`Configuration is invalid. Detail: ${t}`),new c(`Configuration validation failed. ${t.message}`);return r}const p=r.object({AWS_EXECUTION_ENV:r.string().required(),AWS_LAMBDA_FUNCTION_NAME:r.string().required(),AWS_LAMBDA_FUNCTION_MEMORY_SIZE:r.string().required(),AWS_LAMBDA_FUNCTION_VERSION:r.string().required(),AWS_REGION:r.string().required(),LOGGING_ENABLED:r.boolean().default(!0),LOGGING_LEVEL:r.string().allow("debug","info","warn","error").default("info")}),C=g(p),f={validateConfig:g},{combine:E,json:h,timestamp:v}=t.format,w={format:E(v(),h()),level:C.LOGGING_LEVEL,silent:!C.LOGGING_ENABLED,transports:[new t.transports.Console]},y=t.createLogger(w);y.debug("Logger::creating new Logger");const N={defaultMessage:"Unhandled error",defaultStatusCode:500},I=e=>{const t={...N,...e};return{onError:e=>{if(void 0!==e.response)return;if(!e.error)return;const{error:r}=e;(e=>e instanceof l)(r)?(y.error(`middleware::http-error-handler::HttpError::${r}`,r),e.response={statusCode:r.statusCode??t.defaultStatusCode,body:JSON.stringify({name:r.name,message:r.message??t.defaultMessage,code:r.statusCode??t.defaultStatusCode,statusCode:r.statusCode??t.defaultStatusCode})}):(e=>e instanceof c)(r)?(y.error(`middleware::http-error-handler::ServiceError::${r}`,r),e.response={statusCode:r.statusCode??t.defaultStatusCode,body:JSON.stringify({name:r.name,message:r.message||t.defaultMessage,code:r.code||t.defaultStatusCode,statusCode:r.statusCode||t.defaultStatusCode})}):(y.error(`middleware::http-error-handler::Error::${r}`,r),e.response={statusCode:t.defaultStatusCode??500,body:JSON.stringify({name:r.name,message:r.message??t.defaultMessage,code:t.defaultStatusCode,statusCode:t.defaultStatusCode})})}}},D=()=>({before:e=>{y.defaultMeta={requestId:e.context.awsRequestId}}}),_={abortEarly:!1,allowUnknown:!0},b=e=>({before:t=>{if(y.debug("middleware::validator::before"),e.eventSchema){const{error:r,value:s}=((e,t)=>e.validate(t,_))(e.eventSchema,t.event);if(r)throw y.error(`middleware::validator::error::${r}`),new S(r.message);t.event={...t.event,...s}}}}),x={region:C.AWS_REGION},M={convertEmptyValues:!1,removeUndefinedValues:!0,convertClassInstanceToMap:!0},O={wrapNumbers:!1},A={marshallOptions:M,unmarshallOptions:O};y.debug("DynamoService::creating new DynamoDBDocumentClient",{data:{dynamoDbClientConfig:x,marshallOptions:M,unmarshallOptions:O}});const G=s.DynamoDBDocumentClient.from(new a.DynamoDBClient(x),A),L={batchWriteItems:e=>G.send(new s.BatchWriteCommand(e)),deleteItem:e=>G.send(new s.DeleteCommand(e)),getItem:e=>G.send(new s.GetCommand(e)),putItem:e=>G.send(new s.PutCommand(e)),queryItems:e=>G.send(new s.QueryCommand(e)),scanItems:e=>G.send(new s.ScanCommand(e)),updateItem:e=>G.send(new s.UpdateCommand(e))},U={region:C.AWS_REGION};y.debug("SQSService::creating new SQSClient",{data:{clientConfig:U}});const q=new n.SQSClient(U),B={sendMessage:e=>q.send(new n.SendMessageCommand(e))},R={send:async(e,t)=>{await B.sendMessage({QueueUrl:t,MessageBody:JSON.stringify({data:e.templateData,destinations:e.destinations,template:e.templateName})})}},T={region:C.AWS_REGION},F=new o.CognitoIdentityProviderClient(T),W={adminDisableUser:e=>F.send(new o.AdminDisableUserCommand(e)),adminSetUserPassword:e=>F.send(new o.AdminSetUserPasswordCommand(e)),listUsers:e=>F.send(new o.ListUsersCommand(e))},Q={generate:(e=16)=>{let t=e;(e<1||e>128)&&(t=16);const r=Math.ceil(t/2);return m.randomBytes(r).toString("hex").substring(0,t)},ID_LENGTH_DEFAULT:16,ID_LENGTH_MAXIMUM:128,ID_LENGTH_MINIMUM:1};exports.BadRequestError=S,exports.CognitoIdentityProviderService=W,exports.ConfigService=f,exports.DynamoService=L,exports.EmailService=R,exports.ForbiddenError=class extends l{constructor(t){super(t||e[`${e.FORBIDDEN}_MESSAGE`],e.FORBIDDEN),this.name="ForbiddenError"}},exports.HttpError=l,exports.ID=Q,exports.Logger=y,exports.NotFoundError=class extends l{constructor(t){super(t||e[`${e.NOT_FOUND}_MESSAGE`],e.NOT_FOUND),this.name="NotFoundError"}},exports.SQSService=B,exports.ServiceError=c,exports.baseConfigSchema=p,exports.baseConfigValues=C,exports.httpErrorHandler=I,exports.loggerInitializer=D,exports.middyfyAPIGateway=e=>d(e.handler).use(D()).use(i()).use(u()).use(b({eventSchema:e.eventSchema})).use(I({defaultMessage:e.defaultErrorMessage,defaultStatusCode:e.defaultErrorStatusCode})),exports.middyfyLambda=e=>d(e.handler).use(D()).use(b({eventSchema:e.eventSchema})),exports.middyfySNS=e=>d(e.handler).use(D()).use(b({eventSchema:e.eventSchema})),exports.middyfySQS=e=>d(e.handler).use(D()).use(b({eventSchema:e.eventSchema})),exports.middyfyScheduled=e=>d(e.handler).use(D()).use(b({eventSchema:e.eventSchema})),exports.validator=b; //# sourceMappingURL=index.js.map