UNPKG

serverless-aws-lambda

Version:

AWS Application Load Balancer and API Gateway - Lambda dev tool for Serverless. Allows Express synthax in handlers. Supports packaging, local invoking and offline ALB, APG, S3, SNS, SQS, DynamoDB Stream server mocking.

20 lines (19 loc) 11.6 kB
"use strict";var me=Object.create;var D=Object.defineProperty,ue=Object.defineProperties,pe=Object.getOwnPropertyDescriptor,fe=Object.getOwnPropertyDescriptors,be=Object.getOwnPropertyNames,J=Object.getOwnPropertySymbols,ye=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var z=t=>{throw TypeError(t)};var B=(t,o,e)=>o in t?D(t,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[o]=e,A=(t,o)=>{for(var e in o||(o={}))K.call(o,e)&&B(t,e,o[e]);if(J)for(var e of J(o))ge.call(o,e)&&B(t,e,o[e]);return t},Y=(t,o)=>ue(t,fe(o));var he=(t,o,e,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of be(o))!K.call(t,s)&&s!==e&&D(t,s,{get:()=>o[s],enumerable:!(n=pe(o,s))||n.enumerable});return t};var we=(t,o,e)=>(e=t!=null?me(ye(t)):{},he(o||!t||!t.__esModule?D(e,"default",{value:t,enumerable:!0}):e,t));var m=(t,o,e)=>B(t,typeof o!="symbol"?o+"":o,e),X=(t,o,e)=>o.has(t)||z("Cannot "+e);var k=(t,o,e)=>(X(t,o,"read from private field"),e?e.call(t):o.get(t)),C=(t,o,e)=>o.has(t)?z("Cannot add the same private member more than once"):o instanceof WeakSet?o.add(t):o.set(t,e),_=(t,o,e,n)=>(X(t,o,"write to private field"),n?n.call(t,e):o.set(t,e),e);var Z=(t,o,e)=>new Promise((n,s)=>{var r=a=>{try{d(e.next(a))}catch(l){s(l)}},c=a=>{try{d(e.throw(a))}catch(l){s(l)}},d=a=>a.done?n(a.value):Promise.resolve(a.value).then(r,c);d((e=e.apply(t,o)).next())});var u=require("worker_threads");var Q=require("stream");var T,L,N,$,R=class extends Q.Writable{constructor(e){super({highWaterMark:e.highWaterMark,write:e.write});C(this,T,!1);C(this,L);C(this,N,new TypeError('Invalid value "undefined" for header "Content-Type"'));m(this,"_onBeforeFirstWrite");C(this,$,e=>(typeof e!="string"&&!Buffer.isBuffer(e)&&(e==null?void 0:e.constructor)!==Uint8Array&&(e=JSON.stringify(e)),e));m(this,"setContentType",e=>{if(!e)throw k(this,N);this.emit("ct",e)});_(this,L,this.write.bind(this)),this.write=(s,r,c)=>{s=k(this,$).call(this,s),!k(this,T)&&typeof this._onBeforeFirstWrite=="function"&&this._onBeforeFirstWrite(a=>k(this,L).call(this,a));let d=k(this,L).call(this,s,r,c);return k(this,T)||_(this,T,!0),d};let n=this.end.bind(this);this.end=(...s)=>{if(s.length){let[r]=s;r&&typeof r!="function"?(this.write(r),n()):n(...s)}else n(...s)}}};T=new WeakMap,L=new WeakMap,N=new WeakMap,$=new WeakMap;var te=require("async_hooks"),U=require("util"),oe=we(require("path"));var ne=process.cwd(),Ee=`${ne}/`,re="/dist/lambda/router.",ee=ne.split(oe.default.sep).filter(Boolean)[0],H=new RegExp(`\\((/${ee}|${ee}).*(\\d+):(\\d+)`),xe=clearTimeout.bind(clearTimeout),{AWS_LAMBDA_FUNCTION_NAME:se}=process.env,ke=t=>{let o=t.match(/{[\w\W]*}/);if(o)return`${t.slice(0,o.index+1)} \x1B[33m try {\x1B[0m ${t.slice(o.index+1,-1).trim()} \x1B[33m } catch (error) {\x1B[0m \x1B[35m // handle the error\x1B[0m \x1B[33m }\x1B[0m }`},q=t=>{let o={errorType:"string",errorMessage:"",trace:[]};if(t instanceof Error)o.errorType=t.name,o.errorMessage=t.message,typeof t.stack=="string"&&(o.trace=t.stack.split(` `));else{o.errorType=typeof t;try{o.errorMessage=t.toString()}catch(e){}}return o},We=t=>{var e;let o="";try{let n=(e=H.exec(t.stack.split("at")[2]))==null?void 0:e[0];typeof n=="string"&&(o=n.slice(1))}catch(n){}return o},ie=()=>{let t={assert:console.assert.bind(console.assert),clear:console.clear.bind(console.clear),count:console.count.bind(console.count),countReset:console.countReset.bind(console.countReset),debug:console.debug.bind(console.debug),dir:console.dir.bind(console.dir),dirxml:console.dirxml.bind(console.dirxml),error:console.error.bind(console.error),group:console.group.bind(console.group),groupCollapsed:console.groupCollapsed.bind(console.groupCollapsed),groupEnd:console.groupEnd.bind(console.groupEnd),info:console.info.bind(console.info),log:console.log.bind(console.log),table:console.table.bind(console.table),time:console.time.bind(console.time),timeEnd:console.timeEnd.bind(console.timeEnd),timeLog:console.timeLog.bind(console.timeLog),timeStamp:console.timeStamp.bind(console.timeStamp),trace:console.trace.bind(console.trace),warn:console.warn.bind(console.warn)};console=new Proxy(console,{get(o,e){return typeof o[e]=="function"?(...n)=>{let s={};Error.captureStackTrace(s);let r=We(s);process.stdout.write(`\x1B[90m${new Date().toISOString()} ${e.toUpperCase()} ${se} ${r==null?void 0:r.replace(Ee,"")}\x1B[0m `),e=="log"?t.log(...n.map(c=>(0,U.inspect)(c,{colors:!0}))):t[e](...n)}:t[e]}})},ae=t=>{let o="",e=0;return t.slice().reverse().filter(n=>n&&!n.includes(__dirname)&&!n.includes(re)).forEach(n=>{var r;let s=(r=H.exec(n))==null?void 0:r[0];s&&(o+=`${s} `.slice(1),e++,o+=" ".repeat(e))}),o},f=class f extends Map{constructor(e){super();m(this,"onEmpty");m(this,"requestId");m(this,"callbackWaitsForEmptyEventLoop",!0);m(this,"async",!1);m(this,"hook");m(this,"storeContextTimers",()=>{[...this.entries()].forEach(([e,n])=>{if(n.type!="Timeout")return;let{_idleTimeout:s,_idleStart:r,_onTimeout:c,_repeat:d,_destroyed:a}=n.resource,l=s-r;!a&&(l>-1||d)&&f.context[this.requestId].timers.set(e,{timerValue:l,_onTimeout:c,interval:d}),clearTimeout(n.resource)})});m(this,"isEmpty",()=>!([...this.values()].filter(n=>!(typeof n.resource.hasRef=="function"&&!n.resource.hasRef())).length>0));m(this,"add",(e,n,s,r)=>{let c={};Error.captureStackTrace(c);let d=c.stack.split(` `).slice(7);if(n=="PROMISE"&&f.context[this.requestId].promises.set(e,{stack:d,start:Date.now()}),f.IGNORE.includes(n))return this;if(n=="Timeout"){let a=r._repeat?"setInterval":"setTimeout",l=r._onTimeout.toString(),F=r._onTimeout.bind(r._onTimeout);r._onTimeout=()=>{try{F()}catch(h){let O=q(h),E=ke(l);f.parentPort.postMessage({channel:"uncaught",type:a,data:{error:O,solution:E}})}}}return this.set(e,{resource:r,triggerAsyncId:s,type:n,stack:d})});m(this,"destroy",e=>{this.delete(e)&&this.isEmpty()&&this.onEmpty&&this.onEmpty()});m(this,"resolve",e=>{let n=f.context[this.requestId];if(n){let s=n.promises.get(e);s!=null&&s.start&&(s.took=(Date.now()-s.start)/1e3)}});m(this,"enable",()=>{f.restoreContext();let e=this,n=function(r){xe(r),e.destroy(Number(r))};global.clearTimeout=n,global.clearInterval=n,this.hook=(0,te.createHook)({init:this.add,destroy:this.destroy,promiseResolve:this.resolve}).enable()});m(this,"disable",()=>{var e;(e=this.hook)==null||e.disable(),delete this.hook});this.requestId=e,f.context[e]={timers:new Map,promises:new Map}}};m(f,"IGNORE",["PROMISE","RANDOMBYTESREQUEST","PerformanceObserver","TIMERWRAP"]),m(f,"context",{}),m(f,"parentPort"),m(f,"logTimeoutPossibleCause",e=>{let n=f.context[e];if(!n.timeout)return;let s=[...n.promises.values()].reduce((r,c)=>(c.took&&(c.stack=c.stack.reverse().map(d=>{var l;let a=(l=H.exec(d))==null?void 0:l[0];if(a)return a.slice(1)}).filter(d=>d&&!d.includes(__dirname)&&!d.includes(re)),c.stack.length&&(delete c.start,r.push(c))),r),[]);if(s=s.filter((r,c)=>{if(r.took>.01)return!r.stack.every(d=>s.find((a,l)=>c!=l&&(a.took>r.took||r.stack.length<a.stack.length)&&a.stack.includes(d)))}),s.length){let r=(0,U.inspect)(s,{colors:!0});process.stdout.write(`'${se}' Timeout possible cause: ${r} `)}}),m(f,"restoreContext",()=>{Object.values(f.context).forEach(({timers:e})=>{let n=[...e.entries()];n.length&&process.stdout.write(`\x1B[31mWarning! Restoring context from previous invokation... This may lead to data leak.\x1B[0m `),n.forEach(([s,r])=>{r.interval?setInterval(r._onTimeout,r.interval):setTimeout(r._onTimeout,r.timerValue),e.delete(s)})})});var W=f;var V=require("util");var w={RED:t=>{},BLUE:t=>{},PINK:t=>{}},v,ve=new Error("Invalid response payload");u.workerData.debug&&(w.RED=t=>{process.stdout.write(`\x1B[31m${t}\x1B[0m `)},w.BLUE=t=>{process.stdout.write(`\x1B[34m${t}\x1B[0m `)},w.PINK=t=>{process.stdout.write(`\x1B[95m${t}\x1B[0m `)},ie());W.parentPort=u.parentPort;var x=(t,o)=>{let e=q(o);u.parentPort.postMessage({channel:"fail",data:e,awsRequestId:t})},P=(t,o,e)=>{try{JSON.stringify(e),u.parentPort.postMessage({channel:t,data:e,awsRequestId:o})}catch(n){x(o,ve)}};process.exit=t=>{process.stdout.write(`\x1B[31musage of process.exit() will throw Runtime error in AWS Lambda\x1B[0m `)};process.on("unhandledRejection",t=>{process.stdout.write((0,V.inspect)(t))});process.on("uncaughtException",t=>{process.stdout.write((0,V.inspect)(t))});var Te=t=>Z(exports,null,function*(){var s,r,c,d,a;let{channel:o,data:e,awsRequestId:n}=t;if(o=="import"){let l=yield import(`file://${u.workerData.esOutputPath}?version=${Date.now()}`);if(u.workerData.handlerName=="default"&&typeof l.default=="object"&&typeof l.default.default=="function"?v=l.default.default:v=l[u.workerData.handlerName],typeof v!="function")throw new Error(`${u.workerData.name} > ${u.workerData.handlerName} is not a function`);u.parentPort.postMessage({channel:"import"})}else if(o=="complete"){let l=W.context[n];typeof t.timeout=="boolean"&&(l.timeout=!0)}else if(o=="exec"){let{event:l,clientContext:F}=e,h=!1,O=u.workerData.timeout*1e3,E,y=()=>{h=!0},le=Date.now(),ce=()=>Math.max(O-(Date.now()-le),0),p=new W(n),j={functionVersion:"$LATEST",functionName:u.workerData.name,memoryLimitInMB:u.workerData.memorySize,logGroupName:`/aws/lambda/${u.workerData.name}`,logStreamName:`${new Date().toLocaleDateString()}[$LATEST]${n.replace(/-/g,"")}`,clientContext:F,identity:void 0,invokedFunctionArn:`arn:aws:lambda:eu-west-1:00000000000:function:${u.workerData.name}`,awsRequestId:n,getRemainingTimeInMillis:ce};if(typeof v.stream=="boolean"){let M=(i,b,I)=>{u.parentPort.postMessage({channel:"stream",data:i,awsRequestId:n,type:"write",encoding:b}),I()};E=new R({highWaterMark:(s=v.streamOpt)==null?void 0:s.highWaterMark,write:M}),E.on("close",()=>{h||(y(),u.parentPort.postMessage({channel:"stream",awsRequestId:n,type:"end"}))}),E.on("error",i=>{h||(y(),w.RED(i),x(n,i))}),E.on("ct",i=>u.parentPort.postMessage({channel:"stream",data:i,awsRequestId:n,type:"ct"}));let g=A({get callbackWaitsForEmptyEventLoop(){return p.callbackWaitsForEmptyEventLoop},set callbackWaitsForEmptyEventLoop(i){p.callbackWaitsForEmptyEventLoop=i}},j),S=(c=(r=v(l,E,g))==null?void 0:r.catch)==null?void 0:c.call(r,i=>{E.destroy(),y(),w.RED(i),x(n,i)});typeof(S==null?void 0:S.then)!="function"&&(y(),E.destroy(),x(n,new Error("Streaming does not support non-async handlers.")))}else{let M=Y(A({get callbackWaitsForEmptyEventLoop(){return p.callbackWaitsForEmptyEventLoop},set callbackWaitsForEmptyEventLoop(i){p.callbackWaitsForEmptyEventLoop=i}},j),{succeed:i=>{h||(y(),P("succeed",n,i))},fail:i=>{h||(y(),x(n,i))},done:function(i,b){h||(y(),i?x(n,i):P("done",n,b))}}),g,S=(i,b)=>{g?w.RED("Invocation has already been reported as done. Cannot call complete more than once per invocation."):g={error:i,res:b}};try{p.enable();let i=v(l,M,S);if((a=(d=i==null?void 0:i.then)==null?void 0:d.call(i,b=>{p.storeContextTimers(),W.logTimeoutPossibleCause(n),!(g||h)&&(y(),P("return",n,b),p.disable())}))==null||a.catch(b=>{y(),x(n,b),p.disable()}),p.async=typeof(i==null?void 0:i.then)=="function",!p.async&&i&&w.RED("Synchronous handler 'return' value is ignored. Consider marking your handler as 'async' or use callback(error, returnValue)"),!h&&(!p.async||g)){let b=()=>{p.storeContextTimers(),p.disable(),g?M.done(g.error,g.res):(y(),P("return",n,null))};if(p.isEmpty())b();else if(!g||p.callbackWaitsForEmptyEventLoop){if(g&&p.callbackWaitsForEmptyEventLoop){w.BLUE("callbackWaitsForEmptyEventLoop...");let I=[...p.values()],de=I[I.length-1],G=ae(de.stack);G&&(w.RED("Blocked by:"),w.PINK(G))}p.onEmpty=()=>{b()}}else b()}}catch(i){y(),x(n,i),p.disable()}}}});u.parentPort.on("message",Te);