@spytecgps/lambda-utils 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports["lambda-utils"]=r():e["lambda-utils"]=r()}(global,(()=>(()=>{"use strict";var e={n:r=>{var t=r&&r.__esModule?()=>r.default:()=>r;return e.d(t,{a:t}),t},d:(r,t)=>{for(var a in t)e.o(t,a)&&!e.o(r,a)&&Object.defineProperty(r,a,{enumerable:!0,get:t[a]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};e.r(r),e.d(r,{BadRequestError:()=>E,BaseError:()=>O,ConflictError:()=>N,ForbiddenError:()=>_,HttpError:()=>b,LambdaCache:()=>oe,NotFoundError:()=>M,SpytecJoi:()=>y,UnauthorizedError:()=>v,apiGatewayEventWrapper:()=>R,apiGatewayMiddlewares:()=>Y,apiGatewayMiddy:()=>re,baseMiddlewares:()=>Q,buildProxyResult:()=>x,buildResponseBody:()=>j,defaultApiSchema:()=>
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports["lambda-utils"]=r():e["lambda-utils"]=r()}(global,(()=>(()=>{"use strict";var e={n:r=>{var t=r&&r.__esModule?()=>r.default:()=>r;return e.d(t,{a:t}),t},d:(r,t)=>{for(var a in t)e.o(t,a)&&!e.o(r,a)&&Object.defineProperty(r,a,{enumerable:!0,get:t[a]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};e.r(r),e.d(r,{BadRequestError:()=>E,BaseError:()=>O,ConflictError:()=>N,ForbiddenError:()=>_,HttpError:()=>b,LambdaCache:()=>oe,NotFoundError:()=>M,SpytecJoi:()=>y,UnauthorizedError:()=>v,apiGatewayEventWrapper:()=>R,apiGatewayMiddlewares:()=>Y,apiGatewayMiddy:()=>re,baseMiddlewares:()=>Q,buildProxyResult:()=>x,buildResponseBody:()=>j,defaultApiSchema:()=>A,getAuthorizerValidator:()=>h,getRequestContextValidator:()=>f,httpErrorHandler:()=>H(),httpResponseSerializer:()=>W(),iccidSchema:()=>m,imeiSchema:()=>g,json:()=>u,logger:()=>t.logger,merge:()=>ae(),middy:()=>ee,promiseWithCache:()=>se,promiseWithTimeout:()=>ne,requestContextValidator:()=>w,sqsEventWrapper:()=>S,sqsEventWrapperWithReturn:()=>I,sqsJsonBodyParser:()=>U(),urlEncoded:()=>p,validateEvent:()=>C,validatorMiddleware:()=>Z,warmupMiddleware:()=>K,withRequest:()=>t.withRequest});const t=require("@spytecgps/sdk-logger"),a=require("dayjs");var o=e.n(a);const s=require("dayjs/plugin/timezone");var n=e.n(s);const i=require("dayjs/plugin/utc");var l=e.n(i);const d=require("joi"),c=require("qs");o().extend(l()),o().extend(n());const u=d.extend((e=>({type:"object",base:e.object(),messages:{"json.valid":"must be valid JSON"},coerce(e){try{return{value:JSON.parse(e)}}catch(e){return null}},validate:(e,r)=>e?{value:e}:{value:e,errors:r.error("json.valid")}}))),p=d.extend((e=>({type:"object",base:e.object(),coerce:e=>({value:c.parse(e)})}))),g=d.string().regex(/^\d{15,16}$/).message("Invalid IMEI"),m=d.string().regex(/^[0-9A-Za-z]{18,22}$/).message("Invalid ICCID"),y=d.extend((e=>({type:"imei",messages:"Invalid IMEI",base:e.string().regex(/^\d{15,16}$/)})),(e=>({type:"iccid",messages:"Invalid ICCID",base:e.string().regex(/^[0-9A-Za-z]{18,22}$/)})),(e=>({type:"urlEncodedObject",base:e.object(),coerce:e=>({value:c.parse(e)})})),(e=>({type:"jsonObject",base:e.object(),coerce(e){try{return{value:JSON.parse(e)}}catch(e){return null}},validate:(e,r)=>e?{value:e}:{value:e,errors:r.error("json.valid")}})),(e=>({type:"delimitedArray",base:e.array().default([]),coerce:e=>({value:e.split?e.split(","):e})})),(e=>({type:"queryStringParameters",messages:"Missing query parameters",base:e.object().required()})),(e=>({type:"date",base:e.date(),prepare(e,r){try{const r=o().tz(e,"UTC");if(r.isValid())return{value:r.toDate()}}catch(e){return r.error("any.invalid")}}})),(e=>({type:"jsonArray",base:e.array(),coerce(e){try{return{value:JSON.parse(e)}}catch(e){return{value:null}}},validate:(e,r)=>Array.isArray(e)?{value:e}:{value:e,errors:r.error("jsonArray.schema")}})),(e=>({type:"base64ThenUriEncodedObject",base:e.object(),coerce(e){try{const r=decodeURIComponent(Buffer.from(e,"base64").toString());return{value:JSON.parse(r)}}catch(e){return null}},validate:(e,r)=>e?{value:e}:{value:e,errors:r.error("json.valid")}})));class b extends Error{}class v extends b{code=401;statusCode=401;name="UnauthorizedError"}const h=({scope:e,type:r}={})=>d.object({clientId:d.number(),resources:u.object({}),scope:e?d.string().pattern(new RegExp(`${e}`)).error((()=>new v(`missing scope ${e}`))):d.optional(),type:r?d.any().valid(r).error((()=>new v(`missing user type ${r}`))):d.optional(),enterprise:d.boolean().default(!1),maintenanceModule:d.boolean().default(!1),billingMethod:d.string().optional(),customerSegment:d.string().optional(),securityGroupTagId:d.number().optional().allow(null)}),w=d.object({authorizer:h()}),f=(e={})=>d.object({authorizer:h(e)});class E extends b{code=400;statusCode=400;name="BadRequestError"}const C=(e,r,a)=>{if(!r)return t.logger.warn("skipping validation"),e;const{error:o,value:s}=r.validate(e,{allowUnknown:a?.allowUnknown||!0,errors:{label:"key",wrap:{label:!1}}});if(o)throw t.logger.error({error:o},"Validation error"),o.isJoi?new E(o.message):o;return s},A=y.object({requestContext:f()}),q={"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Access-Control-Allow-Credentials":!0},j=(e,r,t)=>({success:e<400,message:r,result:t||void 0}),x=({statusCode:e=200,message:r="ok",data:t,headers:a={},rawResult:o=!1,stringifyBody:s=!0})=>{const n=o?t:j(e,r,t),i=s?n&&JSON.stringify(n):t;return{headers:{...q,...a},statusCode:e,body:i}},R=async({event:e,context:r,schema:a,handler:o})=>{e&&r&&(0,t.withRequest)(e,r);try{const r=C(e,a),t=await o(r);return x(t)}catch(r){return t.logger.error({err:r,event:(s=e,{resource:s.resource,httpMethod:s.httpMethod,queryStringParameters:s.queryStringParameters,pathParameters:s.pathParameters,body:s.body})},"apiGatewayWrapper - caught error"),x({statusCode:r.code||500,message:r.message||"Error"})}var s},S=async({event:e,context:r,schema:a,handler:o,singleHandler:s,mode:n="serial"})=>{e&&r&&(0,t.withRequest)(e,r);try{const r=C(e,a);await async function(e,r,t,a){if(!r&&!t)throw new Error("handler or singleHandler not defined");if(r)await r(e);else if(t){const r=e.Records;if("serial"===a)for(const e of r)await t(e);else"parallel"===a&&await Promise.all(r.map((e=>t(e))))}}(r,o,s,n)}catch(r){throw t.logger.error({err:r,event:(i=e,(i.Records||[]).map((e=>({messageId:e.messageId,body:e.body,messageAttributes:e.messageAttributes}))))},"sqsEventWrapper - caught error"),r}var i},I=async({event:e,context:r,schema:a,handler:o,singleHandler:s,mode:n="serial"})=>{e&&r&&(0,t.withRequest)(e,r);try{const r=C(e,a);return await(async(e,r,t,a)=>{if(!r&&!t)throw new Error("handler or singleHandler not defined");if(r)return await r(e);if(t){const r=e.Records;if("serial"===a){const e=[];for(const a of r){const r=await t(a);e.push(r)}return e}if("parallel"===a)return await Promise.all(r.map((e=>t(e))))}})(r,o,s,n)}catch(r){throw t.logger.error({err:r,event:(i=e,(i.Records||[]).map((e=>({messageId:e.messageId,body:e.body,messageAttributes:e.messageAttributes}))))},"sqsEventWrapper - caught error"),r}var i};class O extends Error{code;statusCode}class N extends b{code=409;statusCode=409;name="ConflictError"}class _ extends b{code=403;statusCode=403;name="ForbiddenError"}class M extends b{code=404;statusCode=404;name="NotFoundError"}const T=require("@middy/core");var P=e.n(T);const z=require("@middy/http-error-handler");var H=e.n(z);const $=require("@middy/http-response-serializer");var W=e.n($);const G=require("@middy/sqs-json-body-parser");var U=e.n(G);const k="_X_AMZN_TRACE_ID",J="x-correlation-",B=`${J}id`,D=`${J}trace-id`,V={before:async({event:e,context:r})=>{const a={awsRequestId:r.awsRequestId},o=e.requestContext?.requestId;o&&(a.apiRequestId=o),e.headers&&Object.keys(e.headers).forEach((r=>{r.toLowerCase().startsWith(J)&&(a[r]=e.headers[r])})),process.env[k]&&(a[D]=process.env[k]),a[B]||(a[B]=r.awsRequestId),t.logger.setHapnContext(a)}},F=require("@middy/input-output-logger"),L=e.n(F)()({logger:e=>{const r=e?.event?"event":"response";t.logger.info(e.event??e.response,r)}}),Z=({schema:e,allowUnknown:r=!0})=>({before:a=>{const{error:o,value:s}=e.validate(a.event,{allowUnknown:r,errors:{label:"key",wrap:{label:!1}}});if(o)throw t.logger.error("Validation error",{error:o}),o.isJoi?new E(o.message):o;a.event=s}}),X={isWarmingUp:e=>"serverless-plugin-warmup"===e.source},K=(e={})=>{const r={...X,...e};return{before:e=>{if(r.isWarmingUp(e.event))return"warmup"}}},Q=[V,L],Y=[W()({serializers:[{regex:/^application\/xml$/,serializer:({body:e})=>`<message>${e}</message>`},{regex:/^application\/json$/,serializer:({body:e})=>JSON.stringify(e)},{regex:/^text\/plain$/,serializer:({body:e})=>e}],default:"application/json"}),{after:e=>{e.response=x(e.response)},onError:e=>{e.response=x({statusCode:e.error.code||500,message:e.error.message||"Error"})}}],ee=e=>P()(e).use([...Q]),re=e=>P()(e).use([...Q,...Y]),te=require("deepmerge");var ae=e.n(te);class oe{collectionName;constructor(e){this.collectionName=e??`${process.env.AWS_LAMBDA_FUNCTION_NAME}-${process.env.AWS_LAMBDA_FUNCTION_VERSION}`,global.CACHE_STORAGE||(global.CACHE_STORAGE={}),global.CACHE_STORAGE[this.collectionName]||(global.CACHE_STORAGE[this.collectionName]=new Map)}set(e,r,t){const a=1e3*t+Date.now();global.CACHE_STORAGE[this.collectionName].set(e,{value:r,expire:a})}get(e){if(!e)throw new Error("key is required!");const r=global.CACHE_STORAGE[this.collectionName].get(e);return r?!r.expire||r.expire>Date.now()?r.value:this.remove(e):null}remove(e){global.CACHE_STORAGE[this.collectionName].get(e)&&global.CACHE_STORAGE[this.collectionName].delete(e)}}const se=async(e,r,t,a)=>{let o=r.get(t);return o||(o=await e(),r.set(t,o,a)),o},ne=(e,r,t=new Error("Promise timed out"))=>{const a=new Promise(((e,a)=>{setTimeout((()=>{a(t)}),r)}));return Promise.race([e,a])};return r})()));
|
|
@@ -5,16 +5,17 @@ import sqsJsonBodyParser from '@middy/sqs-json-body-parser';
|
|
|
5
5
|
import { Context as LambdaContext } from 'aws-lambda/handler';
|
|
6
6
|
import { MiddyInputHandler } from './types';
|
|
7
7
|
import { validatorMiddleware } from './validation';
|
|
8
|
-
|
|
8
|
+
import { warmupMiddleware } from './warmup';
|
|
9
|
+
declare const baseMiddlewares: ({
|
|
9
10
|
before: ({ event, context }: {
|
|
10
11
|
event: any;
|
|
11
12
|
context: any;
|
|
12
13
|
}) => Promise<void>;
|
|
13
|
-
})[];
|
|
14
|
+
} | rawMiddy.MiddlewareObj<any, any, Error, LambdaContext>)[];
|
|
14
15
|
declare const apiGatewayMiddlewares: (rawMiddy.MiddlewareObj<any, any, Error, LambdaContext> | {
|
|
15
16
|
after: (req: any) => void;
|
|
16
17
|
onError: (req: any) => void;
|
|
17
18
|
})[];
|
|
18
19
|
declare const middy: <TEvent, TResult, TContext extends LambdaContext>(handler: MiddyInputHandler<TEvent, TResult, TContext>) => rawMiddy.MiddyfiedHandler<TEvent, TResult, Error, TContext>;
|
|
19
20
|
declare const apiGatewayMiddy: <TEvent, TResult, TContext extends LambdaContext>(handler: MiddyInputHandler<TEvent, TResult, TContext>) => rawMiddy.MiddyfiedHandler<TEvent, TResult, Error, TContext>;
|
|
20
|
-
export { apiGatewayMiddlewares, apiGatewayMiddy, baseMiddlewares, httpErrorHandler, httpResponseSerializer, middy, sqsJsonBodyParser, validatorMiddleware, };
|
|
21
|
+
export { apiGatewayMiddlewares, apiGatewayMiddy, baseMiddlewares, httpErrorHandler, httpResponseSerializer, middy, sqsJsonBodyParser, validatorMiddleware, warmupMiddleware, };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spytecgps/lambda-utils",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Lambda Utils",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -34,7 +34,6 @@
|
|
|
34
34
|
"@middy/http-response-serializer": "^2.5.7",
|
|
35
35
|
"@middy/input-output-logger": "^2.5.7",
|
|
36
36
|
"@middy/sqs-json-body-parser": "^2.5.7",
|
|
37
|
-
"@middy/warmup": "^5.5.1",
|
|
38
37
|
"@spytecgps/sdk-logger": "^2.0.2",
|
|
39
38
|
"dayjs": "^1.11.11",
|
|
40
39
|
"deepmerge": "^4.3.1",
|