@spytecgps/lambda-utils 2.3.9 → 2.3.10

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
- "use strict";var e=require("@spytecgps/sdk-logger"),r=require("dayjs"),t=require("dayjs/plugin/timezone"),s=require("dayjs/plugin/utc"),o=require("joi"),a=require("qs"),n=require("@middy/core"),i=require("@middy/http-error-handler"),l=require("@middy/http-response-serializer"),c=require("@middy/sqs-json-body-parser"),d=require("deepmerge"),u=require("@middy/input-output-logger"),p=require("@aws-sdk/client-lambda");function g(e){var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,s.get?s:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var m=g(o),v=g(a);r.extend(s),r.extend(t);const h=m.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")}}))),y=m.extend((e=>({type:"object",base:e.object(),coerce:e=>({value:v.parse(e)})}))),x=m.string().regex(/^\d{15,16}$/).message("Invalid IMEI"),b=m.string().regex(/^[0-9A-Za-z]{18,22}$/).message("Invalid ICCID"),w=m.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:v.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,t){try{const t=r.tz(e,"UTC");if(t.isValid())return{value:t.toDate()}}catch(e){return t.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 E extends Error{}class f extends E{code=400;statusCode=400;name="BadRequestError"}class C extends Error{code;statusCode}class q extends E{code=401;statusCode=401;name="UnauthorizedError"}const A=({scope:e,type:r}={})=>m.object({clientId:m.number(),resources:h.object({}),scope:e?m.string().pattern(new RegExp(`${e}`)).error((()=>new q(`missing scope ${e}`))):m.optional(),type:r?m.any().valid(r).error((()=>new q(`missing user type ${r}`))):m.optional(),enterprise:m.boolean().default(!1),maintenanceModule:m.boolean().default(!1),billingMethod:m.string().optional(),customerSegment:m.string().optional(),securityGroupTagId:m.number().optional().allow(null)}),j=m.object({authorizer:A()}),I=(e={})=>m.object({authorizer:A(e)}),S=(r,t,s)=>{if(!t)return e.logger.warn("skipping validation"),r;const{error:o,value:a}=t.validate(r,{allowUnknown:s?.allowUnknown||!0,errors:{label:"key",wrap:{label:!1}}});if(o)throw e.logger.error({error:o},"Validation error"),o.isJoi?new f(o.message):o;return a},N=w.object({requestContext:I()}),O={"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Access-Control-Allow-Credentials":!0},R=(e,r,t)=>({success:e<400,message:r,result:t||void 0}),z=({statusCode:e=200,message:r="ok",data:t,headers:s={},rawResult:o=!1,stringifyBody:a=!0})=>{const n=o?t:R(e,r,t),i=a?n&&JSON.stringify(n):t;return{headers:{...O,...s},statusCode:e,body:i}};const T=()=>"test"===process.env.NODE_ENV?"test":process.env.IS_OFFLINE&&"dev"===process.env.STAGE?"local":process.env.STAGE??process.env.NODE_ENV??"dev",_=()=>"local"===T(),M=()=>"test"===T(),P="_X_AMZN_TRACE_ID",k="x-correlation-",G=`${k}id`,H=`${k}trace-id`,W={before:async({event:r,context:t})=>{const s={awsRequestId:t?.awsRequestId},o=r?.requestContext?.requestId;o&&(s.apiRequestId=o),r.headers&&Object.keys(r.headers).forEach((e=>{e.toLowerCase().startsWith(k)&&(s[e]=r.headers[e])})),process.env[P]&&(s[H]=process.env[P]),s[G]||(s[G]=t.awsRequestId),e.logger.setHapnContext(s)}},$=u({omitPaths:["event.multiValueHeaders","event.multiValueQueryStringParameters","event.resource","event.httpMethod","event.headers","event.stageVariables","event.requestContext.resourceId","event.requestContext.resourcePath","event.requestContext.httpMethod","event.requestContext.extendedRequestId","event.requestContext.requestTime","event.requestContext.path","event.requestContext.accountId","event.requestContext.protocol","event.requestContext.stage","event.requestContext.domainPrefix","event.requestContext.requestTimeEpoch","event.requestContext.apiId","event.requestContext.domainName","event.requestContext.identity","event.isBase64Encoded","event.body","response.body","response.headers"],logger:r=>{const t=r?.event?"event":"response";e.logger.info(r.event??r.response,t)}}),B={isWarmingUp:e=>"serverless-plugin-warmup"===e.source},F=(e={})=>{const r={...B,...e};return{before:e=>{if(r.isWarmingUp(e.event))return"warmup"}}},J=[F(),W,_()||M()?void 0:$].filter(Boolean),U=[l({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=z(e.response)},onError:r=>{e.logger.error(r.error,"Request failed"),r.response=z({statusCode:r.error.code||500,message:r.error.message||"Error"})}},(({authFunctionName:r="spytec-web-api-auth-prod-AuthorizerFunction",enabled:t=!!process.env.IS_OFFLINE}={})=>{const s=new p.LambdaClient({region:process.env.AWS_REGION});return{before:async o=>{if(!t)return;const{event:a}=o,n=a.headers?.Authorization||a.headers?.authorization;if(!n||!n.startsWith("Bearer "))throw new Error("Authorization header is missing or invalid");const i={authorizationToken:n.slice(7)},l=new p.InvokeCommand({FunctionName:r,Payload:Buffer.from(JSON.stringify(i))});try{const e=await s.send(l),r=JSON.parse(Buffer.from(e.Payload).toString());if(r.errorMessage)throw new Error(r.errorMessage);a.requestContext.authorizer=r.context}catch(r){throw e.logger.error("Error invoking auth function:",r),new Error("Authorization failed")}}}})()];exports.httpErrorHandler=i,exports.httpResponseSerializer=l,exports.sqsJsonBodyParser=c,exports.merge=d,exports.BadRequestError=f,exports.BaseError=C,exports.ConflictError=class extends E{code=409;statusCode=409;name="ConflictError"},exports.ForbiddenError=class extends E{code=403;statusCode=403;name="ForbiddenError"},exports.HttpError=E,exports.LambdaCache=class{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 s=1e3*t+Date.now();global.CACHE_STORAGE[this.collectionName].set(e,{value:r,expire:s})}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)}},exports.NotFoundError=class extends E{code=404;statusCode=404;name="NotFoundError"},exports.SpytecJoi=w,exports.UnauthorizedError=q,exports.apiGatewayEventWrapper=async({event:r,context:t,schema:s,handler:o})=>{r&&t&&e.withRequest(r,t);try{const e=S(r,s),t=await o(e);return z(t)}catch(t){return e.logger.error({err:t,event:(a=r,{resource:a.resource,httpMethod:a.httpMethod,queryStringParameters:a.queryStringParameters,pathParameters:a.pathParameters,body:a.body})},"apiGatewayWrapper - caught error"),z({statusCode:t.code||500,message:t.message||"Error"})}var a},exports.apiGatewayMiddlewares=U,exports.apiGatewayMiddy=e=>n(e).use([...J,...U]),exports.baseMiddlewares=J,exports.buildProxyResult=z,exports.buildResponseBody=R,exports.defaultApiSchema=N,exports.getAuthorizerValidator=A,exports.getEnvKey=T,exports.getRequestContextValidator=I,exports.iccidSchema=b,exports.imeiSchema=x,exports.isDev=()=>"dev"===T(),exports.isLocal=_,exports.isProduction=()=>"prod"===T(),exports.isTest=M,exports.json=h,exports.middy=e=>n(e).use([...J]),exports.promiseWithCache=async(e,r,t,s)=>{let o=r.get(t);return o||(o=await e(),r.set(t,o,s)),o},exports.promiseWithTimeout=(e,r,t=new Error("Promise timed out"))=>{const s=new Promise(((e,s)=>{setTimeout((()=>{s(t)}),r)}));return Promise.race([e,s])},exports.requestContextValidator=j,exports.setupEnvConfig=e=>{const r=e.base,t=e[T()]??{};return d(r,t)},exports.sqsEventWrapper=async({event:r,context:t,schema:s,handler:o,singleHandler:a,mode:n="serial"})=>{r&&t&&e.withRequest(r,t);try{const e=S(r,s);await async function(e,r,t,s){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"===s)for(const e of r)await t(e);else"parallel"===s&&await Promise.all(r.map((e=>t(e))))}}(e,o,a,n)}catch(t){throw e.logger.error({err:t,event:(i=r,(i.Records||[]).map((e=>({messageId:e.messageId,body:e.body,messageAttributes:e.messageAttributes}))))},"sqsEventWrapper - caught error"),t}var i},exports.sqsEventWrapperWithReturn=async({event:r,context:t,schema:s,handler:o,singleHandler:a,mode:n="serial"})=>{r&&t&&e.withRequest(r,t);try{const e=S(r,s);return await(async(e,r,t,s)=>{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"===s){const e=[];for(const s of r){const r=await t(s);e.push(r)}return e}if("parallel"===s)return await Promise.all(r.map((e=>t(e))))}})(e,o,a,n)}catch(t){throw e.logger.error({err:t,event:(i=r,(i.Records||[]).map((e=>({messageId:e.messageId,body:e.body,messageAttributes:e.messageAttributes}))))},"sqsEventWrapper - caught error"),t}var i},exports.urlEncoded=y,exports.validateEvent=S,exports.validatorMiddleware=({schema:r,allowUnknown:t=!0})=>({before:s=>{const{error:o,value:a}=r.validate(s.event,{allowUnknown:t,errors:{label:"key",wrap:{label:!1}}});if(o)throw e.logger.error("Validation error",{error:o}),o.isJoi?new f(o.message):o;s.event=a}}),exports.warmupMiddleware=F;
1
+ "use strict";var e=require("@spytecgps/sdk-logger"),r=require("dayjs"),t=require("dayjs/plugin/timezone"),o=require("dayjs/plugin/utc"),s=require("joi"),a=require("@middy/core"),n=require("@middy/http-error-handler"),i=require("@middy/http-response-serializer"),l=require("@middy/sqs-json-body-parser"),d=require("deepmerge"),c=require("@middy/input-output-logger"),u=require("@aws-sdk/client-lambda");function p(e){var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,o.get?o:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var g=p(s),m=require("./stringify"),v=require("./parse"),h=require("./formats");module.exports={formats:h,parse:v,stringify:m},r.extend(o),r.extend(t);const y=g.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")}}))),x=g.extend((e=>({type:"object",base:e.object(),coerce:e=>({value:(void 0)(e)})}))),b=g.string().regex(/^\d{15,16}$/).message("Invalid IMEI"),w=g.string().regex(/^[0-9A-Za-z]{18,22}$/).message("Invalid ICCID"),E=g.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:(void 0)(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,t){try{const t=r.tz(e,"UTC");if(t.isValid())return{value:t.toDate()}}catch(e){return t.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 f extends Error{}class C extends f{code=400;statusCode=400;name="BadRequestError"}class q extends Error{code;statusCode}class A extends f{code=401;statusCode=401;name="UnauthorizedError"}const j=({scope:e,type:r}={})=>g.object({clientId:g.number(),resources:y.object({}),scope:e?g.string().pattern(new RegExp(`${e}`)).error((()=>new A(`missing scope ${e}`))):g.optional(),type:r?g.any().valid(r).error((()=>new A(`missing user type ${r}`))):g.optional(),enterprise:g.boolean().default(!1),maintenanceModule:g.boolean().default(!1),billingMethod:g.string().optional(),customerSegment:g.string().optional(),securityGroupTagId:g.number().optional().allow(null),securityRole:g.string().optional().allow(null)}),I=g.object({authorizer:j()}),S=(e={})=>g.object({authorizer:j(e)}),N=(r,t,o)=>{if(!t)return e.logger.warn("skipping validation"),r;const{error:s,value:a}=t.validate(r,{allowUnknown:o?.allowUnknown||!0,errors:{label:"key",wrap:{label:!1}}});if(s)throw e.logger.error({error:s},"Validation error"),s.isJoi?new C(s.message):s;return a},O=E.object({requestContext:S()}),R={"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Access-Control-Allow-Credentials":!0},z=(e,r,t)=>({success:e<400,message:r,result:t||void 0}),T=({statusCode:e=200,message:r="ok",data:t,headers:o={},rawResult:s=!1,stringifyBody:a=!0})=>{const n=s?t:z(e,r,t),i=a?n&&JSON.stringify(n):t;return{headers:{...R,...o},statusCode:e,body:i}};const _=()=>"test"===process.env.NODE_ENV?"test":process.env.IS_OFFLINE&&"dev"===process.env.STAGE?"local":process.env.STAGE??process.env.NODE_ENV??"dev",M=()=>"local"===_(),P=()=>"test"===_(),k="_X_AMZN_TRACE_ID",G="x-correlation-",H=`${G}id`,W=`${G}trace-id`,$={before:async({event:r,context:t})=>{const o={awsRequestId:t?.awsRequestId},s=r?.requestContext?.requestId;s&&(o.apiRequestId=s),r.headers&&Object.keys(r.headers).forEach((e=>{e.toLowerCase().startsWith(G)&&(o[e]=r.headers[e])})),process.env[k]&&(o[W]=process.env[k]),o[H]||(o[H]=t.awsRequestId),e.logger.setHapnContext(o)}},B=c({omitPaths:["event.multiValueHeaders","event.multiValueQueryStringParameters","event.resource","event.httpMethod","event.headers","event.stageVariables","event.requestContext.resourceId","event.requestContext.resourcePath","event.requestContext.httpMethod","event.requestContext.extendedRequestId","event.requestContext.requestTime","event.requestContext.path","event.requestContext.accountId","event.requestContext.protocol","event.requestContext.stage","event.requestContext.domainPrefix","event.requestContext.requestTimeEpoch","event.requestContext.apiId","event.requestContext.domainName","event.requestContext.identity","event.isBase64Encoded","event.body","response.body","response.headers"],logger:r=>{const t=r?.event?"event":"response";e.logger.info(r.event??r.response,t)}}),F={isWarmingUp:e=>"serverless-plugin-warmup"===e.source},J=(e={})=>{const r={...F,...e};return{before:e=>{if(r.isWarmingUp(e.event))return"warmup"}}},U=[J(),$,M()||P()?void 0:B].filter(Boolean),D=[i({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=T(e.response)},onError:r=>{e.logger.error(r.error,"Request failed"),r.response=T({statusCode:r.error.code||500,message:r.error.message||"Error"})}},(({authFunctionName:r="spytec-web-api-auth-prod-AuthorizerFunction",enabled:t=!!process.env.IS_OFFLINE}={})=>{const o=new u.LambdaClient({region:process.env.AWS_REGION});return{before:async s=>{if(!t)return;const{event:a}=s,n=a.headers?.Authorization||a.headers?.authorization;if(!n||!n.startsWith("Bearer "))throw new Error("Authorization header is missing or invalid");const i={authorizationToken:n.slice(7)},l=new u.InvokeCommand({FunctionName:r,Payload:Buffer.from(JSON.stringify(i))});try{const e=await o.send(l),r=JSON.parse(Buffer.from(e.Payload).toString());if(r.errorMessage)throw new Error(r.errorMessage);a.requestContext.authorizer=r.context}catch(r){throw e.logger.error("Error invoking auth function:",r),new Error("Authorization failed")}}}})()];exports.httpErrorHandler=n,exports.httpResponseSerializer=i,exports.sqsJsonBodyParser=l,exports.merge=d,exports.BadRequestError=C,exports.BaseError=q,exports.ConflictError=class extends f{code=409;statusCode=409;name="ConflictError"},exports.ForbiddenError=class extends f{code=403;statusCode=403;name="ForbiddenError"},exports.HttpError=f,exports.LambdaCache=class{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 o=1e3*t+Date.now();global.CACHE_STORAGE[this.collectionName].set(e,{value:r,expire:o})}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)}},exports.NotFoundError=class extends f{code=404;statusCode=404;name="NotFoundError"},exports.SpytecJoi=E,exports.UnauthorizedError=A,exports.apiGatewayEventWrapper=async({event:r,context:t,schema:o,handler:s})=>{r&&t&&e.withRequest(r,t);try{const e=N(r,o),t=await s(e);return T(t)}catch(t){return e.logger.error({err:t,event:(a=r,{resource:a.resource,httpMethod:a.httpMethod,queryStringParameters:a.queryStringParameters,pathParameters:a.pathParameters,body:a.body})},"apiGatewayWrapper - caught error"),T({statusCode:t.code||500,message:t.message||"Error"})}var a},exports.apiGatewayMiddlewares=D,exports.apiGatewayMiddy=e=>a(e).use([...U,...D]),exports.baseMiddlewares=U,exports.buildProxyResult=T,exports.buildResponseBody=z,exports.defaultApiSchema=O,exports.getAuthorizerValidator=j,exports.getEnvKey=_,exports.getRequestContextValidator=S,exports.iccidSchema=w,exports.imeiSchema=b,exports.isDev=()=>"dev"===_(),exports.isLocal=M,exports.isProduction=()=>"prod"===_(),exports.isTest=P,exports.json=y,exports.middy=e=>a(e).use([...U]),exports.promiseWithCache=async(e,r,t,o)=>{let s=r.get(t);return s||(s=await e(),r.set(t,s,o)),s},exports.promiseWithTimeout=(e,r,t=new Error("Promise timed out"))=>{const o=new Promise(((e,o)=>{setTimeout((()=>{o(t)}),r)}));return Promise.race([e,o])},exports.requestContextValidator=I,exports.setupEnvConfig=e=>{const r=e.base,t=e[_()]??{};return d(r,t)},exports.sqsEventWrapper=async({event:r,context:t,schema:o,handler:s,singleHandler:a,mode:n="serial"})=>{r&&t&&e.withRequest(r,t);try{const e=N(r,o);await async function(e,r,t,o){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"===o)for(const e of r)await t(e);else"parallel"===o&&await Promise.all(r.map((e=>t(e))))}}(e,s,a,n)}catch(t){throw e.logger.error({err:t,event:(i=r,(i.Records||[]).map((e=>({messageId:e.messageId,body:e.body,messageAttributes:e.messageAttributes}))))},"sqsEventWrapper - caught error"),t}var i},exports.sqsEventWrapperWithReturn=async({event:r,context:t,schema:o,handler:s,singleHandler:a,mode:n="serial"})=>{r&&t&&e.withRequest(r,t);try{const e=N(r,o);return await(async(e,r,t,o)=>{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"===o){const e=[];for(const o of r){const r=await t(o);e.push(r)}return e}if("parallel"===o)return await Promise.all(r.map((e=>t(e))))}})(e,s,a,n)}catch(t){throw e.logger.error({err:t,event:(i=r,(i.Records||[]).map((e=>({messageId:e.messageId,body:e.body,messageAttributes:e.messageAttributes}))))},"sqsEventWrapper - caught error"),t}var i},exports.urlEncoded=x,exports.validateEvent=N,exports.validatorMiddleware=({schema:r,allowUnknown:t=!0})=>({before:o=>{const{error:s,value:a}=r.validate(o.event,{allowUnknown:t,errors:{label:"key",wrap:{label:!1}}});if(s)throw e.logger.error("Validation error",{error:s}),s.isJoi?new C(s.message):s;o.event=a}}),exports.warmupMiddleware=J;
package/dist/types.d.ts CHANGED
@@ -29,6 +29,7 @@ export interface SpytecAuthContext {
29
29
  billingMethod?: BillingMethod;
30
30
  customerSegment?: CustomerSegment;
31
31
  securityGroupTagId?: number;
32
+ securityRole?: string;
32
33
  }
33
34
  export type BaseAPIGatewayEvent = Omit<APIGatewayProxyEventBase<SpytecAuthContext>, 'pathParameters' | 'queryStringParameters' | 'body'>;
34
35
  export interface WrapperArgs<E, R> {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spytecgps/lambda-utils",
3
- "version": "2.3.9",
3
+ "version": "2.3.10",
4
4
  "description": "Lambda Utils",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -72,4 +72,4 @@
72
72
  "files": [
73
73
  "dist/**/*"
74
74
  ]
75
- }
75
+ }
@@ -1,2 +0,0 @@
1
- import { logger, withRequest } from '@spytecgps/sdk-logger';
2
- export { logger, withRequest };