@h4ad/serverless-adapter
Version:
Run REST APIs and other web applications using your existing Node.js application framework (NestJS, Express, Koa, Hapi, Fastify and many others), on top of AWS, Azure, Digital Ocean and many other clouds.
13 lines • 7.45 kB
JavaScript
;var v=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var a=(r,e)=>v(r,"name",{value:e,configurable:!0});var j=(r,e)=>{for(var t in e)v(r,t,{get:e[t],enumerable:!0})},G=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of U(e))!q.call(r,n)&&n!==t&&v(r,n,{get:()=>e[n],enumerable:!(o=N(e,n))||o.enumerable});return r};var K=r=>G(v({},"__esModule",{value:!0}),r);var Z={};j(Z,{AwsStreamHandler:()=>L});module.exports=K(Z);var st=require("stream"),M=require("util");var P=require("http");var $=443,R=class extends P.IncomingMessage{static{a(this,"ServerlessRequest")}constructor({method:e,url:t,headers:o,body:n,remoteAddress:s}){super({encrypted:!0,readable:!0,remoteAddress:s,address:a(()=>({port:$}),"address"),on:u,removeListener:u,removeEventListener:u,end:u,destroy:u}),this.statusCode=200,this.statusMessage="OK",this.complete=!0,this.httpVersion="1.1",this.httpVersionMajor=1,this.httpVersionMinor=1,this.method=e,this.headers=o,this.body=n,this.url=t,this.ip=s,this._read=()=>{this.push(n),this.push(null)}}ip;body};var H=require("http");function T(r){if(Buffer.isBuffer(r))return r.toString("utf8");if(typeof r=="string")return r;if(r instanceof Uint8Array)return new TextDecoder().decode(r);throw new Error(`response.write() of unexpected type: ${typeof r}`)}a(T,"getString");var B=`\r
\r
`,Q=`0\r
\r
`,h=Symbol("Response body"),A=Symbol("Response headers");function k(r,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)r[h].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}a(k,"addData");var w=class r extends H.ServerResponse{static{a(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[h]=[],this[A]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let t=1,o={_writableState:{},writable:!0,on:u,removeListener:u,destroy:u,cork:u,uncork:u,write:a((n,s,i)=>{if(typeof s=="function"&&(i=s,s=null),this._header===""||this._wroteHeader)this.chunkedEncoding?t>0?t--:n!==Q&&(k(this,n),t=3):k(this,n);else{let f=T(n),d=f.indexOf(B);if(d!==-1){let p=f.slice(d+B.length);p&&!this.chunkedEncoding&&k(this,p),this._wroteHeader=!0}}typeof i=="function"&&i()},"write")};this.assignSocket(o)}_header;_headers;_wroteHeader;[h];[A];get headers(){return this[A]}static from(e){let t=new r({method:e.method});return t.statusCode=e.statusCode||0,t[A]=e.headers,t[h]=e.body?[Buffer.from(e.body)]:[],t.end(),t}static body(e){return Buffer.concat(e[h])}static headers(e){let t=e.getHeaders();return Object.assign(t,e[A])}setHeader(e,t){this._wroteHeader?this[A][e]=t:super.setHeader(e,t)}writeHead(e,t,o){let n=typeof t=="string"?o:t,s=Array.isArray(n)?n:[n||{}];for(let i of s)for(let f in i)if(this.setHeader(f,i[f]),!this._wroteHeader)break;return this.callNativeWriteHead(e,t,o)}callNativeWriteHead(e,t,o){return super.writeHead(e,t,o)}};var O=require("http");var Y=Buffer.from(`\r
`),_=`0\r
\r
`,z=`\r
\r
`,X=`\r
`,b=class extends O.ServerResponse{static{a(this,"ServerlessStreamResponse")}constructor({method:e,onReceiveHeaders:t,log:o}){super({method:e}),this.useChunkedEncodingByDefault=!0,this.chunkedEncoding=!0;let n=null,s=!1,i=!1,f={_writableState:{},writable:!0,on:u,removeListener:u,destroy:u,cork:u,uncork:u,write:a((d,p,g)=>{if(typeof p=="function"&&(g=p,p=null),o.debug("SERVERLESS_ADAPTER:RESPONSE_STREAM:DATA",()=>({data:Buffer.isBuffer(d)?d.toString("utf8"):d,encoding:p})),!n){let c=T(d),l=c.indexOf(X),x=+c.slice(0,l).split(" ")[1],y=c.indexOf(z),S=c.slice(l+2,y),E=I(S);return o.debug("SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS",()=>({headers:E})),n=t(x,E),c.substring(y+4)===_&&n.end(),!0}if(d===_)return n.end(g),!0;if(Buffer.isBuffer(d)&&Y.equals(d)){if(!s)return s=!0,!0;if(s&&i)return s=!1,i=!1,!0}return s&&(i=!0,n.write(d,g)),!0},"write")};this.assignSocket(f)}};var C=class{static{a(this,"BaseHandler")}getAdapterByEventAndContext(e,t,o,n){let s=o.filter(i=>i.canHandle(e,t,n));if(s.length===0)throw new Error("SERVERLESS_ADAPTER: Couldn't find adapter to handle this event.");if(s.length>1)throw new Error(`SERVERLESS_ADAPTER: Two or more adapters was resolved by the event, the adapters are: ${o.map(i=>i.getAdapterName()).join(", ")}.`);return s[0]}getServerlessRequestResponseFromAdapterRequest(e){let t=new R({method:e.method,headers:e.headers,body:e.body,remoteAddress:e.remoteAddress,url:e.path}),o=new w({method:e.method});return[t,o]}};var W={context:null,event:null};function V({event:r,context:e}){W.event=r,W.context=e}a(V,"setCurrentInvoke");function F(r,e=",",t=!1){return Object.keys(r).reduce((o,n)=>{let s=t?n.toLowerCase():n,i=r[n];return Array.isArray(i)?o[s]=i.join(e):o[s]=(i??"")+"",o},{})}a(F,"getFlattenedHeadersMap");function I(r){if(!r)return{};let e={},t=r.trim().split(`
`);for(let o=0;o<t.length;o++){let n=t[o],s=n.indexOf(":"),i=n.slice(0,s).trim().toLowerCase(),f=n.slice(s+1).trim();typeof e[i]>"u"?e[i]=f:Array.isArray(e[i])?e[i].push(f):e[i]=[e[i],f]}return e}a(I,"parseHeaders");var u=a(()=>{},"NO_OP");var Ie=Symbol("InternalLogger");var Ue=require("stream");function J(r){return!!("readableEnded"in r&&r.readableEnded||"writableEnded"in r&&r.writableEnded)}a(J,"isStreamEnded");function D(r){return J(r)?Promise.resolve(r):new Promise((e,t)=>{let o=!1;function n(s){o||(o=!0,r.removeListener("error",n),r.removeListener("end",n),r.removeListener("finish",n),s?t(s):e(r))}a(n,"complete"),r.once("error",n),r.once("end",n),r.once("finish",n)})}a(D,"waitForStreamComplete");var L=class extends C{constructor(t){super();this.options=t}static{a(this,"AwsStreamHandler")}getHandler(t,o,n,s,i,f,d){return awslambda.streamifyResponse(async(p,g,m)=>{this.options?.callbackWaitsForEmptyEventLoop!==void 0&&(m.callbackWaitsForEmptyEventLoop=this.options.callbackWaitsForEmptyEventLoop);let c={response:g,context:m};this.onReceiveRequest(d,p,c,i,f);let l=this.getAdapterByEventAndContext(p,c,n,d);this.onResolveAdapter(d,l),V({event:p,context:m}),await this.forwardRequestToFramework(t,o,p,c,l,i,d)})}onReceiveRequest(t,o,n,s,i){t.debug("SERVERLESS_ADAPTER:PROXY",()=>({event:o,context:(0,M.inspect)(n,{depth:null}),binarySettings:s,respondWithErrors:i}))}onResolveAdapter(t,o){t.debug("SERVERLESS_ADAPTER:RESOLVED_ADAPTER_NAME: ",o.getAdapterName())}onResolveRequestValues(t,o){t.debug("SERVERLESS_ADAPTER:FORWARD_REQUEST_TO_FRAMEWORK:REQUEST_VALUES",()=>({requestValues:{...o,body:o.body?.toString()}}))}onForwardResponseAdapterResponse(t,o){t.debug("SERVERLESS_ADAPTER:FORWARD_RESPONSE:EVENT_SOURCE_RESPONSE",{successResponse:o})}async forwardRequestToFramework(t,o,n,s,i,f,d){let p=i.getRequest(n,s,d);this.onResolveRequestValues(d,p);let g=new R({method:p.method,headers:p.headers,body:p.body,remoteAddress:p.remoteAddress,url:p.path}),m=new b({method:p.method,onReceiveHeaders:a((c,l)=>{let x=F(l),y={statusCode:c,headers:x},S=l["set-cookie"];S&&(y.cookies=Array.isArray(S)?S:[S],delete l["set-cookie"],delete x["set-cookie"]),this.onForwardResponseAdapterResponse(d,y);let E=awslambda.HttpResponseStream.from(s.response,y);return E.write(""),E},"onReceiveHeaders"),log:d});o.sendRequest(t,g,m),d.debug("SERVERLESS_ADAPTER:FORWARD_REQUEST_TO_FRAMEWORK:WAITING_STREAM_COMPLETE"),await D(m),d.debug("SERVERLESS_ADAPTER:FORWARD_REQUEST_TO_FRAMEWORK:STREAM_COMPLETE"),s.response.end()}};0&&(module.exports={AwsStreamHandler});
//# sourceMappingURL=index.cjs.map