@h4ad/serverless-adapter 4.3.2 → 4.4.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.
Files changed (176) hide show
  1. package/README.md +1 -1
  2. package/lib/{adapter.contract-y5xSjOjo.d.cts → adapter.contract-Cp2Jsh5V.d.cts} +2 -2
  3. package/lib/{adapter.contract-EQE3rlgO.d.ts → adapter.contract-FnS-TPRj.d.ts} +2 -2
  4. package/lib/adapters/apollo-server/index.cjs +4 -4
  5. package/lib/adapters/apollo-server/index.cjs.map +1 -1
  6. package/lib/adapters/apollo-server/index.d.cts +3 -3
  7. package/lib/adapters/apollo-server/index.d.ts +3 -3
  8. package/lib/adapters/apollo-server/index.mjs +1 -1
  9. package/lib/adapters/aws/index.cjs +3 -3
  10. package/lib/adapters/aws/index.cjs.map +1 -1
  11. package/lib/adapters/aws/index.d.cts +5 -5
  12. package/lib/adapters/aws/index.d.ts +5 -5
  13. package/lib/adapters/aws/index.mjs +1 -1
  14. package/lib/adapters/azure/index.cjs +3 -3
  15. package/lib/adapters/azure/index.cjs.map +1 -1
  16. package/lib/adapters/azure/index.d.cts +3 -3
  17. package/lib/adapters/azure/index.d.ts +3 -3
  18. package/lib/adapters/azure/index.mjs +1 -1
  19. package/lib/adapters/digital-ocean/index.cjs +3 -3
  20. package/lib/adapters/digital-ocean/index.cjs.map +1 -1
  21. package/lib/adapters/digital-ocean/index.d.cts +3 -3
  22. package/lib/adapters/digital-ocean/index.d.ts +3 -3
  23. package/lib/adapters/digital-ocean/index.mjs +1 -1
  24. package/lib/adapters/dummy/index.cjs +4 -4
  25. package/lib/adapters/dummy/index.cjs.map +1 -1
  26. package/lib/adapters/dummy/index.d.cts +4 -4
  27. package/lib/adapters/dummy/index.d.ts +4 -4
  28. package/lib/adapters/dummy/index.mjs +1 -1
  29. package/lib/adapters/huawei/index.cjs +3 -3
  30. package/lib/adapters/huawei/index.cjs.map +1 -1
  31. package/lib/adapters/huawei/index.d.cts +3 -3
  32. package/lib/adapters/huawei/index.d.ts +3 -3
  33. package/lib/adapters/huawei/index.mjs +1 -1
  34. package/lib/{base-handler-peEBoKtZ.d.cts → base-handler-B6soYcRl.d.cts} +5 -5
  35. package/lib/{base-handler-fYEk59Xq.d.ts → base-handler-DTcqjFpI.d.ts} +5 -5
  36. package/lib/chunk-6KNWT653.mjs +2 -0
  37. package/lib/chunk-6KNWT653.mjs.map +1 -0
  38. package/lib/chunk-OIGHP3AJ.mjs +13 -0
  39. package/lib/chunk-OIGHP3AJ.mjs.map +1 -0
  40. package/lib/{chunk-OYOJMOFP.mjs → chunk-QWPVIX2T.mjs} +1 -1
  41. package/lib/{chunk-N5ADYIHA.mjs → chunk-SWP64FOK.mjs} +2 -2
  42. package/lib/frameworks/apollo-server/index.cjs +2 -2
  43. package/lib/frameworks/apollo-server/index.cjs.map +1 -1
  44. package/lib/frameworks/apollo-server/index.d.cts +3 -3
  45. package/lib/frameworks/apollo-server/index.d.ts +3 -3
  46. package/lib/frameworks/apollo-server/index.mjs +1 -1
  47. package/lib/frameworks/apollo-server/index.mjs.map +1 -1
  48. package/lib/frameworks/body-parser/index.cjs +3 -3
  49. package/lib/frameworks/body-parser/index.cjs.map +1 -1
  50. package/lib/frameworks/body-parser/index.d.cts +1 -1
  51. package/lib/frameworks/body-parser/index.d.ts +1 -1
  52. package/lib/frameworks/body-parser/index.mjs +1 -1
  53. package/lib/frameworks/cors/index.cjs +3 -3
  54. package/lib/frameworks/cors/index.cjs.map +1 -1
  55. package/lib/frameworks/cors/index.d.cts +1 -1
  56. package/lib/frameworks/cors/index.d.ts +1 -1
  57. package/lib/frameworks/cors/index.mjs +1 -1
  58. package/lib/frameworks/deepkit/index.cjs +3 -3
  59. package/lib/frameworks/deepkit/index.cjs.map +1 -1
  60. package/lib/frameworks/deepkit/index.d.cts +3 -3
  61. package/lib/frameworks/deepkit/index.d.ts +3 -3
  62. package/lib/frameworks/deepkit/index.mjs +1 -1
  63. package/lib/frameworks/express/index.d.cts +1 -1
  64. package/lib/frameworks/express/index.d.ts +1 -1
  65. package/lib/frameworks/express/index.mjs +1 -1
  66. package/lib/frameworks/fastify/index.d.cts +1 -1
  67. package/lib/frameworks/fastify/index.d.ts +1 -1
  68. package/lib/frameworks/fastify/index.mjs +1 -1
  69. package/lib/frameworks/hapi/index.d.cts +1 -1
  70. package/lib/frameworks/hapi/index.d.ts +1 -1
  71. package/lib/frameworks/hapi/index.mjs +1 -1
  72. package/lib/frameworks/koa/index.d.cts +1 -1
  73. package/lib/frameworks/koa/index.d.ts +1 -1
  74. package/lib/frameworks/koa/index.mjs +1 -1
  75. package/lib/frameworks/lazy/index.cjs +3 -3
  76. package/lib/frameworks/lazy/index.cjs.map +1 -1
  77. package/lib/frameworks/lazy/index.d.cts +2 -2
  78. package/lib/frameworks/lazy/index.d.ts +2 -2
  79. package/lib/frameworks/lazy/index.mjs +1 -1
  80. package/lib/frameworks/polka/index.d.cts +1 -1
  81. package/lib/frameworks/polka/index.d.ts +1 -1
  82. package/lib/frameworks/polka/index.mjs +1 -1
  83. package/lib/frameworks/trpc/index.cjs +3 -3
  84. package/lib/frameworks/trpc/index.cjs.map +1 -1
  85. package/lib/frameworks/trpc/index.d.cts +2 -2
  86. package/lib/frameworks/trpc/index.d.ts +2 -2
  87. package/lib/frameworks/trpc/index.mjs +1 -1
  88. package/lib/frameworks/trpc/index.mjs.map +1 -1
  89. package/lib/{handler.contract-8Cb7qLSi.d.ts → handler.contract-Ckhqvom_.d.ts} +3 -3
  90. package/lib/{handler.contract-TQk8iM8f.d.cts → handler.contract-D9QyTfDX.d.cts} +3 -3
  91. package/lib/handlers/aws/index.cjs +8 -8
  92. package/lib/handlers/aws/index.cjs.map +1 -1
  93. package/lib/handlers/aws/index.d.cts +7 -7
  94. package/lib/handlers/aws/index.d.ts +7 -7
  95. package/lib/handlers/aws/index.mjs +1 -1
  96. package/lib/handlers/aws/index.mjs.map +1 -1
  97. package/lib/handlers/azure/index.cjs +3 -3
  98. package/lib/handlers/azure/index.cjs.map +1 -1
  99. package/lib/handlers/azure/index.d.cts +7 -7
  100. package/lib/handlers/azure/index.d.ts +7 -7
  101. package/lib/handlers/azure/index.mjs +1 -1
  102. package/lib/handlers/default/index.cjs +3 -3
  103. package/lib/handlers/default/index.cjs.map +1 -1
  104. package/lib/handlers/default/index.d.cts +7 -7
  105. package/lib/handlers/default/index.d.ts +7 -7
  106. package/lib/handlers/default/index.mjs +1 -1
  107. package/lib/handlers/digital-ocean/index.cjs +3 -3
  108. package/lib/handlers/digital-ocean/index.cjs.map +1 -1
  109. package/lib/handlers/digital-ocean/index.d.cts +7 -7
  110. package/lib/handlers/digital-ocean/index.d.ts +7 -7
  111. package/lib/handlers/digital-ocean/index.mjs +1 -1
  112. package/lib/handlers/firebase/index.cjs +3 -3
  113. package/lib/handlers/firebase/index.cjs.map +1 -1
  114. package/lib/handlers/firebase/index.d.cts +7 -7
  115. package/lib/handlers/firebase/index.d.ts +7 -7
  116. package/lib/handlers/firebase/index.mjs +1 -1
  117. package/lib/handlers/gcp/index.cjs +3 -3
  118. package/lib/handlers/gcp/index.cjs.map +1 -1
  119. package/lib/handlers/gcp/index.d.cts +7 -7
  120. package/lib/handlers/gcp/index.d.ts +7 -7
  121. package/lib/handlers/gcp/index.mjs +1 -1
  122. package/lib/handlers/huawei/index.cjs +2 -2
  123. package/lib/handlers/huawei/index.cjs.map +1 -1
  124. package/lib/handlers/huawei/index.d.cts +5 -5
  125. package/lib/handlers/huawei/index.d.ts +5 -5
  126. package/lib/handlers/huawei/index.mjs +1 -1
  127. package/lib/index.cjs +8 -8
  128. package/lib/index.cjs.map +1 -1
  129. package/lib/index.d.cts +13 -13
  130. package/lib/index.d.ts +13 -13
  131. package/lib/index.mjs +1 -1
  132. package/lib/{raw-request-B2vPjAfE.d.cts → raw-request-B_VM70E4.d.cts} +2 -2
  133. package/lib/{raw-request-b6AYnkxd.d.ts → raw-request-CoVOqVRW.d.ts} +2 -2
  134. package/lib/{request-sVa4pxmx.d.ts → request-DI51fiy-.d.ts} +1 -1
  135. package/lib/{request-DNNIV9ub.d.cts → request-DsBcr1WD.d.cts} +1 -1
  136. package/lib/resolvers/aws-context/index.cjs +1 -1
  137. package/lib/resolvers/aws-context/index.cjs.map +1 -1
  138. package/lib/resolvers/aws-context/index.d.cts +3 -3
  139. package/lib/resolvers/aws-context/index.d.ts +3 -3
  140. package/lib/resolvers/aws-context/index.mjs +1 -1
  141. package/lib/resolvers/aws-context/index.mjs.map +1 -1
  142. package/lib/resolvers/callback/index.cjs +1 -1
  143. package/lib/resolvers/callback/index.cjs.map +1 -1
  144. package/lib/resolvers/callback/index.d.cts +3 -3
  145. package/lib/resolvers/callback/index.d.ts +3 -3
  146. package/lib/resolvers/callback/index.mjs +1 -1
  147. package/lib/resolvers/callback/index.mjs.map +1 -1
  148. package/lib/resolvers/dummy/index.cjs +1 -1
  149. package/lib/resolvers/dummy/index.cjs.map +1 -1
  150. package/lib/resolvers/dummy/index.d.cts +3 -3
  151. package/lib/resolvers/dummy/index.d.ts +3 -3
  152. package/lib/resolvers/dummy/index.mjs +1 -1
  153. package/lib/resolvers/dummy/index.mjs.map +1 -1
  154. package/lib/resolvers/promise/index.cjs +1 -1
  155. package/lib/resolvers/promise/index.cjs.map +1 -1
  156. package/lib/resolvers/promise/index.d.cts +3 -3
  157. package/lib/resolvers/promise/index.d.ts +3 -3
  158. package/lib/resolvers/promise/index.mjs +1 -1
  159. package/lib/resolvers/promise/index.mjs.map +1 -1
  160. package/package.json +45 -36
  161. package/lib/chunk-L4VRXTKP.mjs +0 -13
  162. package/lib/chunk-L4VRXTKP.mjs.map +0 -1
  163. package/lib/chunk-SQ2M27T2.mjs +0 -2
  164. package/lib/chunk-SQ2M27T2.mjs.map +0 -1
  165. /package/lib/{chunk-OYOJMOFP.mjs.map → chunk-QWPVIX2T.mjs.map} +0 -0
  166. /package/lib/{chunk-N5ADYIHA.mjs.map → chunk-SWP64FOK.mjs.map} +0 -0
  167. /package/lib/{constants-0cgQlFSV.d.cts → constants-DVTIV7Xu.d.cts} +0 -0
  168. /package/lib/{constants-0cgQlFSV.d.ts → constants-DVTIV7Xu.d.ts} +0 -0
  169. /package/lib/{framework.contract-YnJ-fl1w.d.cts → framework.contract-td-lRvq6.d.cts} +0 -0
  170. /package/lib/{framework.contract-YnJ-fl1w.d.ts → framework.contract-td-lRvq6.d.ts} +0 -0
  171. /package/lib/{headers-K2qbcurv.d.cts → headers-DjfGHDmI.d.cts} +0 -0
  172. /package/lib/{headers-K2qbcurv.d.ts → headers-DjfGHDmI.d.ts} +0 -0
  173. /package/lib/{logger-9me5n48P.d.cts → logger-F8qccesk.d.cts} +0 -0
  174. /package/lib/{logger-9me5n48P.d.ts → logger-F8qccesk.d.ts} +0 -0
  175. /package/lib/{path-yBwCb8C1.d.cts → path-BrSXm7S6.d.cts} +0 -0
  176. /package/lib/{path-yBwCb8C1.d.ts → path-BrSXm7S6.d.ts} +0 -0
@@ -1,2 +1,2 @@
1
- import{a as o}from"../../chunk-N5ADYIHA.mjs";import"../../chunk-L4VRXTKP.mjs";import{a as t}from"../../chunk-OYOJMOFP.mjs";import{http as s}from"@google-cloud/functions-framework";var n=class extends o{constructor(e){super();this.name=e}static{t(this,"GCPHandler")}getHandler(e,p){let r=this.onRequestCallback(e,p);return s(this.name,r),r}};export{n as GCPHandler};
1
+ import{a as o}from"../../chunk-SWP64FOK.mjs";import"../../chunk-OIGHP3AJ.mjs";import{a as t}from"../../chunk-QWPVIX2T.mjs";import{http as s}from"@google-cloud/functions-framework";var n=class extends o{constructor(e){super();this.name=e}static{t(this,"GCPHandler")}getHandler(e,p){let r=this.onRequestCallback(e,p);return s(this.name,r),r}};export{n as GCPHandler};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -2,6 +2,6 @@
2
2
  \r
3
3
  `,I=`0\r
4
4
  \r
5
- `,c=Symbol("Response body"),u=Symbol("Response headers");function v(t,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)t[c].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}n(v,"addData");var S=class t extends A.ServerResponse{static{n(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[c]=[],this[u]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let r=1,s={_writableState:{},writable:!0,on:a,removeListener:a,destroy:a,cork:a,uncork:a,write:(o,p,d)=>{if(typeof p=="function"&&(d=p,p=null),this._header===""||this._wroteHeader)this.chunkedEncoding?r>0?r--:o!==I&&(v(this,o),r=3):v(this,o);else{let i=h(o),l=i.indexOf(b);if(l!==-1){let f=i.slice(l+b.length);f&&!this.chunkedEncoding&&v(this,f),this._wroteHeader=!0}}typeof d=="function"&&d()}};this.assignSocket(s)}_header;_headers;_wroteHeader;[c];[u];get headers(){return this[u]}static from(e){let r=new t({method:e.method});return r.statusCode=e.statusCode||0,r[u]=e.headers,r[c]=e.body?[Buffer.from(e.body)]:[],r.end(),r}static body(e){return Buffer.concat(e[c])}static headers(e){let r=e.getHeaders();return Object.assign(r,e[u])}setHeader(e,r){this._wroteHeader?this[u][e]=r:super.setHeader(e,r)}writeHead(e,r,s){let o=typeof r=="string"?s:r,p=Array.isArray(o)?o:[o||{}];for(let d of p)for(let i in d)if(this.setHeader(i,d[i]),!this._wroteHeader)break;return this.callNativeWriteHead(e,r,s)}callNativeWriteHead(e,r,s){return super.writeHead(e,r,s)}};var D=require("http");var G=Buffer.from(`\r
6
- `);var a=n(()=>{},"NO_OP");var Ee=Symbol("InternalLogger");function x(t,e){return t===void 0?e:t}n(x,"getDefaultIfUndefined");var ke=require("stream");var C=8e3,R=class{constructor(e){this.options=e}static{n(this,"HttpHuaweiHandler")}getHandler(e,r,s,o,p,d,i){let l=n((y,m)=>{r.sendRequest(e,y,m)},"requestListener"),f=x(this.options?.httpServerFactory,this.createHttpServer.bind(this))(l),E=x(this.options?.port,C);return f.listen(E,()=>{i.debug("SERVERLESS_ADAPTER:PROXY: Server started."),i.debug(`SERVERLESS_ADAPTER:PROXY: Listening the Huawei Requests in port ${E}`)}),()=>(i.debug("SERVERLESS_ADAPTER:PROXY: Disposing the server"),new Promise((y,m)=>{f.close(T=>T?m(T):y())}))}createHttpServer(e){return(0,w.createServer)(e)}};0&&(module.exports={DEFAULT_HUAWEI_LISTEN_PORT,HttpHuaweiHandler});
5
+ `,l=Symbol("Response body"),u=Symbol("Response headers");function v(t,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)t[l].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}n(v,"addData");var S=class t extends A.ServerResponse{static{n(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[l]=[],this[u]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let r=1,s={_writableState:{},writable:!0,writableLength:0,writableHighWaterMark:16384,on:a,removeListener:a,destroy:a,cork:a,uncork:a,write:n((o,p,d)=>{if(typeof p=="function"&&(d=p,p=null),this._header===""||this._wroteHeader)this.chunkedEncoding?r>0?r--:o!==I&&(v(this,o),r=3):v(this,o);else{let i=h(o),c=i.indexOf(b);if(c!==-1){let f=i.slice(c+b.length);f&&!this.chunkedEncoding&&v(this,f),this._wroteHeader=!0}}typeof d=="function"&&d()},"write")};this.assignSocket(s)}_header;_headers;_wroteHeader;[l];[u];get headers(){return this[u]}static from(e){let r=new t({method:e.method});return r.statusCode=e.statusCode||0,r[u]=e.headers,r[l]=e.body?[Buffer.from(e.body)]:[],r.end(),r}static body(e){return Buffer.concat(e[l])}static headers(e){let r=e.getHeaders();return Object.assign(r,e[u])}setHeader(e,r){this._wroteHeader?this[u][e]=r:super.setHeader(e,r)}writeHead(e,r,s){let o=typeof r=="string"?s:r,p=Array.isArray(o)?o:[o||{}];for(let d of p)for(let i in d)if(this.setHeader(i,d[i]),!this._wroteHeader)break;return this.callNativeWriteHead(e,r,s)}callNativeWriteHead(e,r,s){return super.writeHead(e,r,s)}};var D=require("http");var G=Buffer.from(`\r
6
+ `);var a=n(()=>{},"NO_OP");var Ee=Symbol("InternalLogger");function x(t,e){return t===void 0?e:t}n(x,"getDefaultIfUndefined");var ke=require("stream");var C=8e3,R=class{constructor(e){this.options=e}static{n(this,"HttpHuaweiHandler")}getHandler(e,r,s,o,p,d,i){let c=n((y,m)=>{r.sendRequest(e,y,m)},"requestListener"),f=x(this.options?.httpServerFactory,this.createHttpServer.bind(this))(c),E=x(this.options?.port,C);return f.listen(E,()=>{i.debug("SERVERLESS_ADAPTER:PROXY: Server started."),i.debug(`SERVERLESS_ADAPTER:PROXY: Listening the Huawei Requests in port ${E}`)}),()=>(i.debug("SERVERLESS_ADAPTER:PROXY: Disposing the server"),new Promise((y,m)=>{f.close(T=>T?m(T):y())}))}createHttpServer(e){return(0,w.createServer)(e)}};0&&(module.exports={DEFAULT_HUAWEI_LISTEN_PORT,HttpHuaweiHandler});
7
7
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/handlers/huawei/index.ts","../../../src/handlers/huawei/http-huawei.handler.ts","../../../src/network/request.ts","../../../src/network/response.ts","../../../src/network/utils.ts","../../../src/network/response-stream.ts","../../../src/core/no-op.ts","../../../src/core/logger.ts","../../../src/core/optional.ts","../../../src/core/stream.ts"],"sourcesContent":["export * from './http-huawei.handler';\n","//#region Imports\n\nimport type { RequestListener } from 'http';\nimport { type Server, createServer } from 'node:http';\nimport type { BinarySettings } from '../../@types';\nimport type {\n AdapterContract,\n FrameworkContract,\n HandlerContract,\n ResolverContract,\n ServerlessHandler,\n} from '../../contracts';\nimport { type ILogger, getDefaultIfUndefined } from '../../core';\n\n//#endregion\n\n/**\n * The default port that huawei will proxy the request to your framework\n *\n * {@link https://support.huaweicloud.com/intl/en-us/ae-ad-1-usermanual-functiongraph/functiongraph_01_1442.html#functiongraph_01_1442__li194597302096 | Reference}\n *\n * @breadcrumb Handlers / HttpHuaweiHandler\n * @public\n */\nexport const DEFAULT_HUAWEI_LISTEN_PORT: number = 8000;\n\n/**\n * The options to customize {@link HttpHuaweiHandler}\n *\n * @breadcrumb Handlers / HttpHuaweiHandler\n * @public\n */\nexport type HttpHuaweiHandlerOptions = {\n /**\n * @defaultValue {@link DEFAULT_HUAWEI_LISTEN_PORT}\n */\n port?: number;\n\n /**\n * The factory to create a http server to use to listen huawei requests\n */\n httpServerFactory?: (requestListener: RequestListener) => Server;\n};\n\n/**\n * The class that implements a huawei serverless handler with http function that exposes a http server in specific port.\n *\n * In this Handler, you don't need to specific resolver and adapter, so you can use DummyAdapter and DummyResolver instead.\n *\n * @see https://support.huaweicloud.com/intl/en-us/ae-ad-1-usermanual-functiongraph/functiongraph_01_1442.html#functiongraph_01_1442__li194597302096\n *\n * @breadcrumb Handlers / HttpHuaweiHandler\n * @public\n */\nexport class HttpHuaweiHandler<TApp>\n implements HandlerContract<TApp, void, void, void, void, Promise<void>>\n{\n //#region Constructor\n\n /**\n * Construtor padrão\n */\n constructor(protected readonly options?: HttpHuaweiHandlerOptions) {}\n\n //#endregion\n\n //#region Public Methods\n\n /**\n * {@inheritDoc}\n */\n public getHandler(\n app: TApp,\n framework: FrameworkContract<TApp>,\n _adapters: AdapterContract<void, void, void>[],\n _resolver: ResolverContract<void, void, void, void, void>,\n _binarySettings: BinarySettings,\n _respondWithErrors: boolean,\n log: ILogger,\n ): ServerlessHandler<Promise<void>> {\n const requestListener: RequestListener = (req, res) => {\n framework.sendRequest(app, req, res);\n };\n\n const server = getDefaultIfUndefined(\n this.options?.httpServerFactory,\n this.createHttpServer.bind(this),\n )(requestListener);\n\n const port = getDefaultIfUndefined(\n this.options?.port,\n DEFAULT_HUAWEI_LISTEN_PORT,\n );\n\n server.listen(port, () => {\n log.debug('SERVERLESS_ADAPTER:PROXY: Server started.');\n log.debug(\n `SERVERLESS_ADAPTER:PROXY: Listening the Huawei Requests in port ${port}`,\n );\n });\n\n return () => {\n log.debug('SERVERLESS_ADAPTER:PROXY: Disposing the server');\n\n return new Promise((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()));\n });\n };\n }\n\n //#endregion\n\n //#region Protected Methods\n\n /**\n * The method that creates the instance of http server\n *\n * @param requestListener - O método que lidará com as requisições recebidas\n */\n protected createHttpServer(requestListener: RequestListener): Server {\n return createServer(requestListener);\n }\n\n //#endregion\n}\n","// ATTRIBUTION: https://github.com/dougmoscrop/serverless-http\nimport { IncomingMessage } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport type { SingleValueHeaders } from '../@types';\nimport { NO_OP } from '../core';\n\nconst HTTPS_PORT = 443;\n\n/**\n * The properties to create a {@link ServerlessRequest}\n *\n * @breadcrumb Network / ServerlessRequest\n * @public\n */\nexport interface ServerlessRequestProps {\n /**\n * The HTTP Method of the request\n */\n method: string;\n\n /**\n * The URL requested\n */\n url: string;\n\n /**\n * The headers from the event source\n */\n headers: SingleValueHeaders;\n\n /**\n * The body from the event source\n */\n body?: Buffer | Uint8Array;\n\n /**\n * The IP Address from caller\n */\n remoteAddress?: string;\n}\n\n/**\n * The class that represents an {@link http#IncomingMessage} created by the library to represent an actual request to the framework.\n *\n * @breadcrumb Network / ServerlessRequest\n * @public\n */\nexport class ServerlessRequest extends IncomingMessage {\n constructor({\n method,\n url,\n headers,\n body,\n remoteAddress,\n }: ServerlessRequestProps) {\n super({\n encrypted: true,\n readable: false,\n remoteAddress,\n address: () => ({ port: HTTPS_PORT }) as AddressInfo,\n end: NO_OP,\n destroy: NO_OP,\n } as any);\n\n this.statusCode = 200;\n this.statusMessage = 'OK';\n this.complete = true;\n this.httpVersion = '1.1';\n this.httpVersionMajor = 1;\n this.httpVersionMinor = 1;\n this.method = method;\n this.headers = headers;\n this.body = body;\n this.url = url;\n this.ip = remoteAddress;\n\n this._read = () => {\n this.push(body);\n this.push(null);\n };\n }\n\n ip?: string;\n body?: Buffer | Uint8Array;\n}\n","// ATTRIBUTION: https://github.com/dougmoscrop/serverless-http\nimport { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Socket } from 'node:net';\nimport { NO_OP } from '../core';\nimport { getString } from './utils';\n\nconst headerEnd = '\\r\\n\\r\\n';\nconst endChunked = '0\\r\\n\\r\\n';\n\nconst BODY = Symbol('Response body');\nconst HEADERS = Symbol('Response headers');\n\nfunction addData(stream: ServerlessResponse, data: Uint8Array | string) {\n if (\n Buffer.isBuffer(data) ||\n typeof data === 'string' ||\n data instanceof Uint8Array\n )\n stream[BODY].push(Buffer.from(data));\n else throw new Error(`response.write() of unexpected type: ${typeof data}`);\n}\n\n/**\n * The properties to create a {@link ServerlessResponse}.\n *\n * @breadcrumb Network / ServerlessResponse\n * @public\n */\nexport interface ServerlessResponseProps {\n /**\n * The HTTP Method from request\n */\n method?: string;\n}\n\n/**\n * The class that represents a response instance used to send to the framework and wait until the framework finishes processing the request.\n * Once it's happens, we use the properties from this response to built the response to the cloud.\n *\n * @breadcrumb Network / ServerlessResponse\n * @public\n */\nexport class ServerlessResponse extends ServerResponse {\n constructor({ method }: ServerlessResponseProps) {\n super({ method } as any);\n\n this[BODY] = [];\n this[HEADERS] = {};\n\n this.useChunkedEncodingByDefault = false;\n this.chunkedEncoding = false;\n this._header = '';\n\n // this ignore is used because I need to ignore these write calls:\n // https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js#L934-L935\n // https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js#L937\n let writesToIgnore = 1;\n\n const socket: Partial<Socket> & { _writableState: any } = {\n _writableState: {},\n writable: true,\n on: NO_OP,\n removeListener: NO_OP,\n destroy: NO_OP,\n cork: NO_OP,\n uncork: NO_OP,\n write: (\n data: Uint8Array | string,\n encoding?: string | null | (() => void),\n cb?: () => void,\n ): any => {\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (this._header === '' || this._wroteHeader) {\n if (!this.chunkedEncoding) addData(this, data);\n else {\n if (writesToIgnore > 0) writesToIgnore--;\n else if (data !== endChunked) {\n addData(this, data);\n writesToIgnore = 3;\n }\n }\n } else {\n const string = getString(data);\n const index = string.indexOf(headerEnd);\n\n if (index !== -1) {\n const remainder = string.slice(index + headerEnd.length);\n\n if (remainder && !this.chunkedEncoding) addData(this, remainder);\n\n this._wroteHeader = true;\n }\n }\n\n if (typeof cb === 'function') cb();\n },\n };\n\n this.assignSocket(socket as unknown as Socket);\n }\n\n _header: string;\n _headers?: Record<any, any>;\n _wroteHeader?: boolean;\n\n [BODY]: any[];\n [HEADERS]: Record<any, any>;\n\n get headers(): Record<any, any> {\n return this[HEADERS];\n }\n\n static from(res: IncomingMessage) {\n const response = new ServerlessResponse({ method: res.method });\n\n response.statusCode = res.statusCode || 0;\n response[HEADERS] = res.headers;\n response[BODY] = (res as any).body ? [Buffer.from((res as any).body)] : [];\n response.end();\n\n return response;\n }\n\n static body(res: ServerlessResponse): Buffer {\n return Buffer.concat(res[BODY]);\n }\n\n static headers(res: ServerlessResponse) {\n const headers = res.getHeaders();\n\n return Object.assign(headers, res[HEADERS]);\n }\n\n override setHeader(\n key: string,\n value: number | string | readonly string[],\n ): any {\n if (this._wroteHeader) this[HEADERS][key] = value;\n else super.setHeader(key, value);\n }\n\n override writeHead(\n statusCode: number,\n statusMessage?: string | any | any[],\n obj?: any | any[],\n ): any {\n const headersObjOrArray =\n typeof statusMessage === 'string' ? obj : statusMessage;\n\n const arrayHeaders = Array.isArray(headersObjOrArray)\n ? headersObjOrArray\n : [headersObjOrArray || {}];\n\n for (const headers of arrayHeaders) {\n for (const name in headers) {\n this.setHeader(name, headers[name]!);\n\n if (!this._wroteHeader) {\n // we only need to initiate super.headers once\n // writeHead will add the other headers itself\n break;\n }\n }\n }\n\n return this.callNativeWriteHead(statusCode, statusMessage, obj);\n }\n\n /**\n * I use ignore here because in nodejs 12.x, statusMessage can be string | OutgoingHttpHeaders\n * But in nodejs \\>=14.x, statusMessage can also be OutgoingHttpHeaders[]\n * I take care of these cases above, but here I can't handle it well, so I give up\n * nodejs 12.x ref: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/v12/http.d.ts#L229\n * nodejs 14.x ref: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/v14/http.d.ts#L263\n */\n protected callNativeWriteHead(\n statusCode: number,\n statusMessage?: string | any | any[],\n obj?: any | any[],\n ): this {\n return super.writeHead(statusCode, statusMessage, obj);\n }\n}\n","/**\n * Get the data from a buffer, string, or Uint8Array\n *\n * @breadcrumb Network\n * @param data - The data that was written inside the stream\n */\nexport function getString(data: Buffer | string | unknown) {\n if (Buffer.isBuffer(data)) return data.toString('utf8');\n else if (typeof data === 'string') return data;\n else if (data instanceof Uint8Array) return new TextDecoder().decode(data);\n else throw new Error(`response.write() of unexpected type: ${typeof data}`);\n}\n","import { ServerResponse } from 'node:http';\nimport type { Socket } from 'node:net';\nimport type { Writable } from 'node:stream';\nimport type { BothValueHeaders } from '../@types';\nimport { type ILogger, NO_OP, parseHeaders } from '../core';\nimport { getString } from './utils';\n\n// header or data crlf\nconst crlfBuffer = Buffer.from('\\r\\n');\n\nconst endChunked = '0\\r\\n\\r\\n';\nconst headerEnd = '\\r\\n\\r\\n';\nconst endStatusSeparator = '\\r\\n';\n\n/**\n * The properties to create a {@link ServerlessStreamResponse}.\n *\n * @breadcrumb Network / ServerlessStreamResponse\n * @public\n */\nexport interface ServerlessStreamResponseProps {\n /**\n * The HTTP Method from request\n */\n method?: string;\n\n /**\n * The callback to receive the headers when they are written to the stream\n * You need to return a writable stream be able to continue writing the response\n *\n * @param statusCode - The status code of the response\n * @param headers - The headers of the response\n */\n onReceiveHeaders: (statusCode: number, headers: BothValueHeaders) => Writable;\n\n /**\n * Instance of the logger\n */\n log: ILogger;\n}\n\n/**\n * The class that represents a response instance used to send to the framework and wait until the framework finishes processing the request.\n * This response is specially built to deal with transfer-encoding: chunked\n *\n * @breadcrumb Network / ServerlessStreamResponse\n * @public\n */\nexport class ServerlessStreamResponse extends ServerResponse {\n constructor({\n method,\n onReceiveHeaders,\n log,\n }: ServerlessStreamResponseProps) {\n super({ method } as any);\n\n this.useChunkedEncodingByDefault = true;\n this.chunkedEncoding = true;\n\n let internalWritable: Writable | null = null;\n let firstCrlfBufferEncountered = false;\n let chunkEncountered = false;\n\n const socket: Partial<Socket> & { _writableState: any } = {\n _writableState: {},\n writable: true,\n on: NO_OP,\n removeListener: NO_OP,\n destroy: NO_OP,\n cork: NO_OP,\n uncork: NO_OP,\n write: (\n data: Uint8Array | string,\n encoding?: string | null | (() => void),\n cb?: () => void,\n ): any => {\n // very unlikely, I don't even know how to reproduce this, but exist on types\n // istanbul ignore if\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n log.debug('SERVERLESS_ADAPTER:RESPONSE_STREAM:DATA', () => ({\n data: Buffer.isBuffer(data) ? data.toString('utf8') : data,\n encoding,\n }));\n\n if (!internalWritable) {\n const stringData = getString(data);\n const endStatusIndex = stringData.indexOf(endStatusSeparator);\n const status = +stringData.slice(0, endStatusIndex).split(' ')[1];\n const endHeaderIndex = stringData.indexOf(headerEnd);\n\n const headerData = stringData.slice(\n endStatusIndex + 2,\n endHeaderIndex,\n );\n const headers = parseHeaders(headerData);\n log.debug(\n 'SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS',\n () => ({\n headers,\n }),\n );\n\n internalWritable = onReceiveHeaders(status, headers);\n\n // If we get an endChunked right after header which means the response body is empty, we need to immediately end the writable\n if (stringData.substring(endHeaderIndex + 4) === endChunked)\n internalWritable.end();\n\n return true;\n }\n\n // node sends the last chunk crlf as a string:\n // https://github.com/nodejs/node/blob/v22.8.0/lib/_http_outgoing.js#L1131\n if (data === endChunked) {\n internalWritable.end(cb);\n return true;\n }\n\n // check for header or data crlf\n // node sends the header and data crlf as a buffer\n // below code is aligned to following node implementation of the HTTP/1.1 chunked transfer coding:\n // https://github.com/nodejs/node/blob/v22.8.0/lib/_http_outgoing.js#L1012-L1015\n // for reference: https://datatracker.ietf.org/doc/html/rfc9112#section-7\n if (Buffer.isBuffer(data) && crlfBuffer.equals(data)) {\n const isHeaderCrlf = !firstCrlfBufferEncountered;\n if (isHeaderCrlf) {\n firstCrlfBufferEncountered = true;\n return true;\n }\n\n const isDataCrlf = firstCrlfBufferEncountered && chunkEncountered;\n if (isDataCrlf) {\n // done with chunk\n firstCrlfBufferEncountered = false;\n chunkEncountered = false;\n return true;\n }\n\n // the crlf *is* the chunk\n }\n\n const isContentLength = !firstCrlfBufferEncountered;\n if (isContentLength) {\n // discard content length\n return true;\n }\n\n // write chunk\n chunkEncountered = true;\n internalWritable.write(data, cb);\n return true;\n },\n };\n\n this.assignSocket(socket as unknown as Socket);\n }\n}\n","/**\n * No operation function is used when we need to pass a function, but we don't want to specify any behavior.\n *\n * @breadcrumb Core\n * @public\n */\nexport const NO_OP: (...args: any[]) => any = () => void 0;\n","import { NO_OP } from './no-op';\n\n/**\n * The type representing the possible log levels to choose from.\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type LogLevels =\n | 'debug'\n | 'verbose'\n | 'info'\n | 'warn'\n | 'error'\n | 'none';\n\n/**\n * The options to customize {@link ILogger}\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type LoggerOptions = {\n /**\n * Select the log level, {@link LogLevels | see more}.\n *\n * @defaultValue error\n */\n level: LogLevels;\n};\n\n/**\n * The log function used in any level.\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type LoggerFN = (message: any, ...additional: any[]) => void;\n\n/**\n * The interface representing the logger, you can provide a custom logger by implementing this interface.\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type ILogger = Record<Exclude<LogLevels, 'none'>, LoggerFN>;\n\n/**\n * The symbol used to check against an ILogger instace to verify if that ILogger was created by this library\n *\n * @breadcrumb Core / Logger\n * @public\n */\nconst InternalLoggerSymbol = Symbol('InternalLogger');\n\nconst logLevels: Record<\n LogLevels,\n [level: LogLevels, consoleMethod: keyof Console][]\n> = {\n debug: [\n ['debug', 'debug'],\n ['verbose', 'debug'],\n ['info', 'info'],\n ['error', 'error'],\n ['warn', 'warn'],\n ],\n verbose: [\n ['verbose', 'debug'],\n ['info', 'info'],\n ['error', 'error'],\n ['warn', 'warn'],\n ],\n info: [\n ['info', 'info'],\n ['error', 'error'],\n ['warn', 'warn'],\n ],\n warn: [\n ['warn', 'warn'],\n ['error', 'error'],\n ],\n error: [['error', 'error']],\n none: [],\n};\n\nconst lazyPrint = (value: () => any | unknown) => {\n if (typeof value === 'function') return value();\n\n return value;\n};\n\nconst print =\n (fn: string) =>\n (message: any, ...additional: (() => any)[]) =>\n console[fn](message, ...additional.map(lazyPrint));\n\n/**\n * The method used to create a simple logger instance to use in this library.\n *\n * @remarks Behind the scenes, this simple logger sends the message to the `console` methods.\n *\n * @example\n * ```typescript\n * const logger = createDefaultLogger();\n *\n * logger.error('An error happens.');\n * // An error happens.\n * ```\n *\n * @param level - Select the level of the log\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport function createDefaultLogger(\n { level }: LoggerOptions = { level: 'error' },\n): ILogger {\n const levels = logLevels[level];\n\n if (!levels) throw new Error('Invalid log level');\n\n const logger = {\n [InternalLoggerSymbol]: true,\n error: NO_OP,\n debug: NO_OP,\n info: NO_OP,\n verbose: NO_OP,\n warn: NO_OP,\n } as ILogger;\n\n for (const [level, consoleMethod] of levels)\n logger[level] = print(consoleMethod);\n\n return logger;\n}\n\n/**\n * The method used to chck if logger was created by this library, or it was defined by the user.\n *\n * @param logger - The instance of the logger to check\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport function isInternalLogger(logger: ILogger): boolean {\n return !!logger[InternalLoggerSymbol];\n}\n","/**\n * Return the defaultValue whether the value is undefined, otherwise, return the value.\n *\n * @example\n * ```typescript\n * const value1 = getDefaultIfUndefined(undefined, true);\n * const value2 = getDefaultIfUndefined(false, true);\n *\n * console.log(value1);\n * // true\n * console.log(value2);\n * // false\n * ```\n *\n * @param value - The value to be checked\n * @param defaultValue - The default value when value is undefined\n *\n * @breadcrumb Core\n * @public\n */\nexport function getDefaultIfUndefined<T>(\n value: T | undefined,\n defaultValue: T,\n): T {\n if (value === undefined) return defaultValue;\n\n return value;\n}\n","//#region Imports\n\nimport { Readable, Writable } from 'node:stream';\n\n//#endregion\n\n/**\n * Check if stream already ended\n *\n * @param stream - The stream\n *\n * @breadcrumb Core / Stream\n * @public\n */\nexport function isStreamEnded(stream: Readable | Writable): boolean {\n if ('readableEnded' in stream && stream.readableEnded) return true;\n\n if ('writableEnded' in stream && stream.writableEnded) return true;\n\n return false;\n}\n\n/**\n * Wait asynchronous the stream to complete\n *\n * @param stream - The stream\n *\n * @breadcrumb Core / Stream\n * @public\n */\nexport function waitForStreamComplete<TStream extends Readable | Writable>(\n stream: TStream,\n): Promise<TStream> {\n if (isStreamEnded(stream)) return Promise.resolve(stream);\n\n return new Promise<TStream>((resolve, reject) => {\n // Reading the {@link https://github.com/nodejs/node/blob/v12.22.9/lib/events.js#L262 | emit source code},\n // it's almost impossible to complete being called twice because the emit function runs synchronously and removes the other listeners,\n // but I'll leave it at that because I didn't write that code, so I couldn't figure out what the author thought when he wrote this.\n let isComplete = false;\n\n function complete(err: any) {\n /* istanbul ignore next */\n if (isComplete) return;\n\n isComplete = true;\n\n stream.removeListener('error', complete);\n stream.removeListener('end', complete);\n stream.removeListener('finish', complete);\n\n if (err) reject(err);\n else resolve(stream);\n }\n\n stream.once('error', complete);\n stream.once('end', complete);\n stream.once('finish', complete);\n });\n}\n"],"mappings":"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","names":["huawei_exports","__export","DEFAULT_HUAWEI_LISTEN_PORT","HttpHuaweiHandler","__toCommonJS","import_node_http","import_node_http","import_node_http","getString","data","__name","headerEnd","endChunked","BODY","HEADERS","addData","stream","data","__name","ServerlessResponse","_ServerlessResponse","method","writesToIgnore","socket","NO_OP","encoding","cb","string","getString","index","remainder","res","response","headers","key","value","statusCode","statusMessage","obj","headersObjOrArray","arrayHeaders","name","import_node_http","crlfBuffer","NO_OP","__name","InternalLoggerSymbol","getDefaultIfUndefined","value","defaultValue","__name","import_node_stream","DEFAULT_HUAWEI_LISTEN_PORT","HttpHuaweiHandler","options","__name","app","framework","_adapters","_resolver","_binarySettings","_respondWithErrors","log","requestListener","req","res","server","getDefaultIfUndefined","port","resolve","reject","err"]}
1
+ {"version":3,"sources":["../../../src/handlers/huawei/index.ts","../../../src/handlers/huawei/http-huawei.handler.ts","../../../src/network/request.ts","../../../src/network/response.ts","../../../src/network/utils.ts","../../../src/network/response-stream.ts","../../../src/core/no-op.ts","../../../src/core/logger.ts","../../../src/core/optional.ts","../../../src/core/stream.ts"],"sourcesContent":["export * from './http-huawei.handler';\n","//#region Imports\n\nimport type { RequestListener } from 'http';\nimport { type Server, createServer } from 'node:http';\nimport type { BinarySettings } from '../../@types';\nimport type {\n AdapterContract,\n FrameworkContract,\n HandlerContract,\n ResolverContract,\n ServerlessHandler,\n} from '../../contracts';\nimport { type ILogger, getDefaultIfUndefined } from '../../core';\n\n//#endregion\n\n/**\n * The default port that huawei will proxy the request to your framework\n *\n * {@link https://support.huaweicloud.com/intl/en-us/ae-ad-1-usermanual-functiongraph/functiongraph_01_1442.html#functiongraph_01_1442__li194597302096 | Reference}\n *\n * @breadcrumb Handlers / HttpHuaweiHandler\n * @public\n */\nexport const DEFAULT_HUAWEI_LISTEN_PORT: number = 8000;\n\n/**\n * The options to customize {@link HttpHuaweiHandler}\n *\n * @breadcrumb Handlers / HttpHuaweiHandler\n * @public\n */\nexport type HttpHuaweiHandlerOptions = {\n /**\n * @defaultValue {@link DEFAULT_HUAWEI_LISTEN_PORT}\n */\n port?: number;\n\n /**\n * The factory to create a http server to use to listen huawei requests\n */\n httpServerFactory?: (requestListener: RequestListener) => Server;\n};\n\n/**\n * The class that implements a huawei serverless handler with http function that exposes a http server in specific port.\n *\n * In this Handler, you don't need to specific resolver and adapter, so you can use DummyAdapter and DummyResolver instead.\n *\n * @see https://support.huaweicloud.com/intl/en-us/ae-ad-1-usermanual-functiongraph/functiongraph_01_1442.html#functiongraph_01_1442__li194597302096\n *\n * @breadcrumb Handlers / HttpHuaweiHandler\n * @public\n */\nexport class HttpHuaweiHandler<TApp>\n implements HandlerContract<TApp, void, void, void, void, Promise<void>>\n{\n //#region Constructor\n\n /**\n * Construtor padrão\n */\n constructor(protected readonly options?: HttpHuaweiHandlerOptions) {}\n\n //#endregion\n\n //#region Public Methods\n\n /**\n * {@inheritDoc}\n */\n public getHandler(\n app: TApp,\n framework: FrameworkContract<TApp>,\n _adapters: AdapterContract<void, void, void>[],\n _resolver: ResolverContract<void, void, void, void, void>,\n _binarySettings: BinarySettings,\n _respondWithErrors: boolean,\n log: ILogger,\n ): ServerlessHandler<Promise<void>> {\n const requestListener: RequestListener = (req, res) => {\n framework.sendRequest(app, req, res);\n };\n\n const server = getDefaultIfUndefined(\n this.options?.httpServerFactory,\n this.createHttpServer.bind(this),\n )(requestListener);\n\n const port = getDefaultIfUndefined(\n this.options?.port,\n DEFAULT_HUAWEI_LISTEN_PORT,\n );\n\n server.listen(port, () => {\n log.debug('SERVERLESS_ADAPTER:PROXY: Server started.');\n log.debug(\n `SERVERLESS_ADAPTER:PROXY: Listening the Huawei Requests in port ${port}`,\n );\n });\n\n return () => {\n log.debug('SERVERLESS_ADAPTER:PROXY: Disposing the server');\n\n return new Promise((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()));\n });\n };\n }\n\n //#endregion\n\n //#region Protected Methods\n\n /**\n * The method that creates the instance of http server\n *\n * @param requestListener - O método que lidará com as requisições recebidas\n */\n protected createHttpServer(requestListener: RequestListener): Server {\n return createServer(requestListener);\n }\n\n //#endregion\n}\n","// ATTRIBUTION: https://github.com/dougmoscrop/serverless-http\nimport { IncomingMessage } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport type { SingleValueHeaders } from '../@types';\nimport { NO_OP } from '../core';\n\nconst HTTPS_PORT = 443;\n\n/**\n * The properties to create a {@link ServerlessRequest}\n *\n * @breadcrumb Network / ServerlessRequest\n * @public\n */\nexport interface ServerlessRequestProps {\n /**\n * The HTTP Method of the request\n */\n method: string;\n\n /**\n * The URL requested\n */\n url: string;\n\n /**\n * The headers from the event source\n */\n headers: SingleValueHeaders;\n\n /**\n * The body from the event source\n */\n body?: Buffer | Uint8Array;\n\n /**\n * The IP Address from caller\n */\n remoteAddress?: string;\n}\n\n/**\n * The class that represents an {@link http#IncomingMessage} created by the library to represent an actual request to the framework.\n *\n * @breadcrumb Network / ServerlessRequest\n * @public\n */\nexport class ServerlessRequest extends IncomingMessage {\n constructor({\n method,\n url,\n headers,\n body,\n remoteAddress,\n }: ServerlessRequestProps) {\n super({\n encrypted: true,\n readable: true, // credits to @pnkp at https://github.com/CodeGenieApp/serverless-express/pull/692\n remoteAddress,\n address: () => ({ port: HTTPS_PORT }) as AddressInfo,\n on: NO_OP,\n removeListener: NO_OP,\n removeEventListener: NO_OP,\n end: NO_OP,\n destroy: NO_OP,\n } as any);\n\n this.statusCode = 200;\n this.statusMessage = 'OK';\n this.complete = true;\n this.httpVersion = '1.1';\n this.httpVersionMajor = 1;\n this.httpVersionMinor = 1;\n this.method = method;\n this.headers = headers;\n this.body = body;\n this.url = url;\n this.ip = remoteAddress;\n\n this._read = () => {\n this.push(body);\n this.push(null);\n };\n }\n\n ip?: string;\n body?: Buffer | Uint8Array;\n}\n","// ATTRIBUTION: https://github.com/dougmoscrop/serverless-http\nimport { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Socket } from 'node:net';\nimport { NO_OP } from '../core';\nimport { getString } from './utils';\n\nconst headerEnd = '\\r\\n\\r\\n';\nconst endChunked = '0\\r\\n\\r\\n';\n\nconst BODY = Symbol('Response body');\nconst HEADERS = Symbol('Response headers');\n\nfunction addData(stream: ServerlessResponse, data: Uint8Array | string) {\n if (\n Buffer.isBuffer(data) ||\n typeof data === 'string' ||\n data instanceof Uint8Array\n )\n stream[BODY].push(Buffer.from(data));\n else throw new Error(`response.write() of unexpected type: ${typeof data}`);\n}\n\n/**\n * The properties to create a {@link ServerlessResponse}.\n *\n * @breadcrumb Network / ServerlessResponse\n * @public\n */\nexport interface ServerlessResponseProps {\n /**\n * The HTTP Method from request\n */\n method?: string;\n}\n\n/**\n * The class that represents a response instance used to send to the framework and wait until the framework finishes processing the request.\n * Once it's happens, we use the properties from this response to built the response to the cloud.\n *\n * @breadcrumb Network / ServerlessResponse\n * @public\n */\nexport class ServerlessResponse extends ServerResponse {\n constructor({ method }: ServerlessResponseProps) {\n super({ method } as any);\n\n this[BODY] = [];\n this[HEADERS] = {};\n\n this.useChunkedEncodingByDefault = false;\n this.chunkedEncoding = false;\n this._header = '';\n\n // this ignore is used because I need to ignore these write calls:\n // https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js#L934-L935\n // https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js#L937\n let writesToIgnore = 1;\n\n const socket: Partial<Socket> & { _writableState: any } = {\n _writableState: {},\n writable: true,\n writableLength: 0,\n writableHighWaterMark: 16384,\n on: NO_OP,\n removeListener: NO_OP,\n destroy: NO_OP,\n cork: NO_OP,\n uncork: NO_OP,\n write: (\n data: Uint8Array | string,\n encoding?: string | null | (() => void),\n cb?: () => void,\n ): any => {\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (this._header === '' || this._wroteHeader) {\n if (!this.chunkedEncoding) addData(this, data);\n else {\n if (writesToIgnore > 0) writesToIgnore--;\n else if (data !== endChunked) {\n addData(this, data);\n writesToIgnore = 3;\n }\n }\n } else {\n const string = getString(data);\n const index = string.indexOf(headerEnd);\n\n if (index !== -1) {\n const remainder = string.slice(index + headerEnd.length);\n\n if (remainder && !this.chunkedEncoding) addData(this, remainder);\n\n this._wroteHeader = true;\n }\n }\n\n if (typeof cb === 'function') cb();\n },\n };\n\n this.assignSocket(socket as unknown as Socket);\n }\n\n _header: string;\n _headers?: Record<any, any>;\n _wroteHeader?: boolean;\n\n [BODY]: any[];\n [HEADERS]: Record<any, any>;\n\n get headers(): Record<any, any> {\n return this[HEADERS];\n }\n\n static from(res: IncomingMessage) {\n const response = new ServerlessResponse({ method: res.method });\n\n response.statusCode = res.statusCode || 0;\n response[HEADERS] = res.headers;\n response[BODY] = (res as any).body ? [Buffer.from((res as any).body)] : [];\n response.end();\n\n return response;\n }\n\n static body(res: ServerlessResponse): Buffer {\n return Buffer.concat(res[BODY]);\n }\n\n static headers(res: ServerlessResponse) {\n const headers = res.getHeaders();\n\n return Object.assign(headers, res[HEADERS]);\n }\n\n override setHeader(\n key: string,\n value: number | string | readonly string[],\n ): any {\n if (this._wroteHeader) this[HEADERS][key] = value;\n else super.setHeader(key, value);\n }\n\n override writeHead(\n statusCode: number,\n statusMessage?: string | any | any[],\n obj?: any | any[],\n ): any {\n const headersObjOrArray =\n typeof statusMessage === 'string' ? obj : statusMessage;\n\n const arrayHeaders = Array.isArray(headersObjOrArray)\n ? headersObjOrArray\n : [headersObjOrArray || {}];\n\n for (const headers of arrayHeaders) {\n for (const name in headers) {\n this.setHeader(name, headers[name]!);\n\n if (!this._wroteHeader) {\n // we only need to initiate super.headers once\n // writeHead will add the other headers itself\n break;\n }\n }\n }\n\n return this.callNativeWriteHead(statusCode, statusMessage, obj);\n }\n\n /**\n * I use ignore here because in nodejs 12.x, statusMessage can be string | OutgoingHttpHeaders\n * But in nodejs \\>=14.x, statusMessage can also be OutgoingHttpHeaders[]\n * I take care of these cases above, but here I can't handle it well, so I give up\n * nodejs 12.x ref: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/v12/http.d.ts#L229\n * nodejs 14.x ref: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/v14/http.d.ts#L263\n */\n protected callNativeWriteHead(\n statusCode: number,\n statusMessage?: string | any | any[],\n obj?: any | any[],\n ): this {\n return super.writeHead(statusCode, statusMessage, obj);\n }\n}\n","/**\n * Get the data from a buffer, string, or Uint8Array\n *\n * @breadcrumb Network\n * @param data - The data that was written inside the stream\n */\nexport function getString(data: Buffer | string | unknown) {\n if (Buffer.isBuffer(data)) return data.toString('utf8');\n else if (typeof data === 'string') return data;\n else if (data instanceof Uint8Array) return new TextDecoder().decode(data);\n else throw new Error(`response.write() of unexpected type: ${typeof data}`);\n}\n","import { ServerResponse } from 'node:http';\nimport type { Socket } from 'node:net';\nimport type { Writable } from 'node:stream';\nimport type { BothValueHeaders } from '../@types';\nimport { type ILogger, NO_OP, parseHeaders } from '../core';\nimport { getString } from './utils';\n\n// header or data crlf\nconst crlfBuffer = Buffer.from('\\r\\n');\n\nconst endChunked = '0\\r\\n\\r\\n';\nconst headerEnd = '\\r\\n\\r\\n';\nconst endStatusSeparator = '\\r\\n';\n\n/**\n * The properties to create a {@link ServerlessStreamResponse}.\n *\n * @breadcrumb Network / ServerlessStreamResponse\n * @public\n */\nexport interface ServerlessStreamResponseProps {\n /**\n * The HTTP Method from request\n */\n method?: string;\n\n /**\n * The callback to receive the headers when they are written to the stream\n * You need to return a writable stream be able to continue writing the response\n *\n * @param statusCode - The status code of the response\n * @param headers - The headers of the response\n */\n onReceiveHeaders: (statusCode: number, headers: BothValueHeaders) => Writable;\n\n /**\n * Instance of the logger\n */\n log: ILogger;\n}\n\n/**\n * The class that represents a response instance used to send to the framework and wait until the framework finishes processing the request.\n * This response is specially built to deal with transfer-encoding: chunked\n *\n * @breadcrumb Network / ServerlessStreamResponse\n * @public\n */\nexport class ServerlessStreamResponse extends ServerResponse {\n constructor({\n method,\n onReceiveHeaders,\n log,\n }: ServerlessStreamResponseProps) {\n super({ method } as any);\n\n this.useChunkedEncodingByDefault = true;\n this.chunkedEncoding = true;\n\n let internalWritable: Writable | null = null;\n let firstCrlfBufferEncountered = false;\n let chunkEncountered = false;\n\n const socket: Partial<Socket> & { _writableState: any } = {\n _writableState: {},\n writable: true,\n writableLength: 0,\n writableHighWaterMark: 16384,\n on: NO_OP,\n removeListener: NO_OP,\n destroy: NO_OP,\n cork: NO_OP,\n uncork: NO_OP,\n write: (\n data: Uint8Array | string,\n encoding?: string | null | (() => void),\n cb?: () => void,\n ): any => {\n // very unlikely, I don't even know how to reproduce this, but exist on types\n // istanbul ignore if\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n log.debug('SERVERLESS_ADAPTER:RESPONSE_STREAM:DATA', () => ({\n data: Buffer.isBuffer(data) ? data.toString('utf8') : data,\n encoding,\n }));\n\n if (!internalWritable) {\n const stringData = getString(data);\n const endStatusIndex = stringData.indexOf(endStatusSeparator);\n const status = +stringData.slice(0, endStatusIndex).split(' ')[1];\n const endHeaderIndex = stringData.indexOf(headerEnd);\n\n const headerData = stringData.slice(\n endStatusIndex + 2,\n endHeaderIndex,\n );\n const headers = parseHeaders(headerData);\n log.debug(\n 'SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS',\n () => ({\n headers,\n }),\n );\n\n internalWritable = onReceiveHeaders(status, headers);\n\n const dataAfterHeaders = stringData.substring(endHeaderIndex + 4);\n\n // If we get an endChunked right after header which means the response body is empty, we need to immediately end the writable\n // The callback must be forwarded, otherwise the response never emits `finish`\n if (dataAfterHeaders === endChunked) {\n internalWritable.end(cb);\n return true;\n }\n\n // Responses without a body (eg. 204) write only the headers and never write again,\n // so the callback has to be called here or the response never emits `finish`\n if (dataAfterHeaders === '' && cb) process.nextTick(cb);\n\n return true;\n }\n\n // node sends the last chunk crlf as a string:\n // https://github.com/nodejs/node/blob/v22.8.0/lib/_http_outgoing.js#L1131\n if (data === endChunked) {\n internalWritable.end(cb);\n return true;\n }\n\n // check for header or data crlf\n // node sends the header and data crlf as a buffer\n // below code is aligned to following node implementation of the HTTP/1.1 chunked transfer coding:\n // https://github.com/nodejs/node/blob/v22.8.0/lib/_http_outgoing.js#L1012-L1015\n // for reference: https://datatracker.ietf.org/doc/html/rfc9112#section-7\n if (Buffer.isBuffer(data) && crlfBuffer.equals(data)) {\n const isHeaderCrlf = !firstCrlfBufferEncountered;\n if (isHeaderCrlf) {\n firstCrlfBufferEncountered = true;\n return true;\n }\n\n const isDataCrlf = firstCrlfBufferEncountered && chunkEncountered;\n if (isDataCrlf) {\n // done with chunk\n firstCrlfBufferEncountered = false;\n chunkEncountered = false;\n return true;\n }\n\n // the crlf *is* the chunk\n }\n\n const isContentLength = !firstCrlfBufferEncountered;\n if (isContentLength) {\n // discard content length\n return true;\n }\n\n // write chunk\n chunkEncountered = true;\n internalWritable.write(data, cb);\n return true;\n },\n };\n\n this.assignSocket(socket as unknown as Socket);\n }\n}\n","/**\n * No operation function is used when we need to pass a function, but we don't want to specify any behavior.\n *\n * @breadcrumb Core\n * @public\n */\nexport const NO_OP: (...args: any[]) => any = () => void 0;\n","import { NO_OP } from './no-op';\n\n/**\n * The type representing the possible log levels to choose from.\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type LogLevels =\n | 'debug'\n | 'verbose'\n | 'info'\n | 'warn'\n | 'error'\n | 'none';\n\n/**\n * The options to customize {@link ILogger}\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type LoggerOptions = {\n /**\n * Select the log level, {@link LogLevels | see more}.\n *\n * @defaultValue error\n */\n level: LogLevels;\n};\n\n/**\n * The log function used in any level.\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type LoggerFN = (message: any, ...additional: any[]) => void;\n\n/**\n * The interface representing the logger, you can provide a custom logger by implementing this interface.\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport type ILogger = Record<Exclude<LogLevels, 'none'>, LoggerFN>;\n\n/**\n * The symbol used to check against an ILogger instace to verify if that ILogger was created by this library\n *\n * @breadcrumb Core / Logger\n * @public\n */\nconst InternalLoggerSymbol = Symbol('InternalLogger');\n\nconst logLevels: Record<\n LogLevels,\n [level: LogLevels, consoleMethod: keyof Console][]\n> = {\n debug: [\n ['debug', 'debug'],\n ['verbose', 'debug'],\n ['info', 'info'],\n ['error', 'error'],\n ['warn', 'warn'],\n ],\n verbose: [\n ['verbose', 'debug'],\n ['info', 'info'],\n ['error', 'error'],\n ['warn', 'warn'],\n ],\n info: [\n ['info', 'info'],\n ['error', 'error'],\n ['warn', 'warn'],\n ],\n warn: [\n ['warn', 'warn'],\n ['error', 'error'],\n ],\n error: [['error', 'error']],\n none: [],\n};\n\nconst lazyPrint = (value: () => any | unknown) => {\n if (typeof value === 'function') return value();\n\n return value;\n};\n\nconst print =\n (fn: string) =>\n (message: any, ...additional: (() => any)[]) =>\n console[fn](message, ...additional.map(lazyPrint));\n\n/**\n * The method used to create a simple logger instance to use in this library.\n *\n * @remarks Behind the scenes, this simple logger sends the message to the `console` methods.\n *\n * @example\n * ```typescript\n * const logger = createDefaultLogger();\n *\n * logger.error('An error happens.');\n * // An error happens.\n * ```\n *\n * @param level - Select the level of the log\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport function createDefaultLogger(\n { level }: LoggerOptions = { level: 'error' },\n): ILogger {\n const levels = logLevels[level];\n\n if (!levels) throw new Error('Invalid log level');\n\n const logger = {\n [InternalLoggerSymbol]: true,\n error: NO_OP,\n debug: NO_OP,\n info: NO_OP,\n verbose: NO_OP,\n warn: NO_OP,\n } as ILogger;\n\n for (const [level, consoleMethod] of levels)\n logger[level] = print(consoleMethod);\n\n return logger;\n}\n\n/**\n * The method used to chck if logger was created by this library, or it was defined by the user.\n *\n * @param logger - The instance of the logger to check\n *\n * @breadcrumb Core / Logger\n * @public\n */\nexport function isInternalLogger(logger: ILogger): boolean {\n return !!logger[InternalLoggerSymbol];\n}\n","/**\n * Return the defaultValue whether the value is undefined, otherwise, return the value.\n *\n * @example\n * ```typescript\n * const value1 = getDefaultIfUndefined(undefined, true);\n * const value2 = getDefaultIfUndefined(false, true);\n *\n * console.log(value1);\n * // true\n * console.log(value2);\n * // false\n * ```\n *\n * @param value - The value to be checked\n * @param defaultValue - The default value when value is undefined\n *\n * @breadcrumb Core\n * @public\n */\nexport function getDefaultIfUndefined<T>(\n value: T | undefined,\n defaultValue: T,\n): T {\n if (value === undefined) return defaultValue;\n\n return value;\n}\n","//#region Imports\n\nimport { Readable, Writable } from 'node:stream';\n\n//#endregion\n\n/**\n * Check if stream already ended\n *\n * @param stream - The stream\n *\n * @breadcrumb Core / Stream\n * @public\n */\nexport function isStreamEnded(stream: Readable | Writable): boolean {\n if ('readableEnded' in stream && stream.readableEnded) return true;\n\n if ('writableEnded' in stream && stream.writableEnded) return true;\n\n return false;\n}\n\n/**\n * Wait asynchronous the stream to complete\n *\n * @param stream - The stream\n *\n * @breadcrumb Core / Stream\n * @public\n */\nexport function waitForStreamComplete<TStream extends Readable | Writable>(\n stream: TStream,\n): Promise<TStream> {\n if (isStreamEnded(stream)) return Promise.resolve(stream);\n\n return new Promise<TStream>((resolve, reject) => {\n // Reading the {@link https://github.com/nodejs/node/blob/v12.22.9/lib/events.js#L262 | emit source code},\n // it's almost impossible to complete being called twice because the emit function runs synchronously and removes the other listeners,\n // but I'll leave it at that because I didn't write that code, so I couldn't figure out what the author thought when he wrote this.\n let isComplete = false;\n\n function complete(err: any) {\n /* istanbul ignore next */\n if (isComplete) return;\n\n isComplete = true;\n\n stream.removeListener('error', complete);\n stream.removeListener('end', complete);\n stream.removeListener('finish', complete);\n\n if (err) reject(err);\n else resolve(stream);\n }\n\n stream.once('error', complete);\n stream.once('end', complete);\n stream.once('finish', complete);\n });\n}\n"],"mappings":"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","names":["huawei_exports","__export","DEFAULT_HUAWEI_LISTEN_PORT","HttpHuaweiHandler","__toCommonJS","import_node_http","import_node_http","import_node_http","getString","data","__name","headerEnd","endChunked","BODY","HEADERS","addData","stream","data","__name","ServerlessResponse","_ServerlessResponse","method","writesToIgnore","socket","NO_OP","encoding","cb","string","getString","index","remainder","res","response","headers","key","value","statusCode","statusMessage","obj","headersObjOrArray","arrayHeaders","name","import_node_http","crlfBuffer","NO_OP","__name","InternalLoggerSymbol","getDefaultIfUndefined","value","defaultValue","__name","import_node_stream","DEFAULT_HUAWEI_LISTEN_PORT","HttpHuaweiHandler","options","__name","app","framework","_adapters","_resolver","_binarySettings","_respondWithErrors","log","requestListener","req","res","server","getDefaultIfUndefined","port","resolve","reject","err"]}
@@ -1,10 +1,10 @@
1
1
  import { RequestListener } from 'http';
2
2
  import { Server } from 'node:http';
3
- import { H as HandlerContract, B as BinarySettings, S as ServerlessHandler } from '../../handler.contract-TQk8iM8f.cjs';
4
- import { A as AdapterContract, R as ResolverContract } from '../../adapter.contract-y5xSjOjo.cjs';
5
- import { F as FrameworkContract } from '../../framework.contract-YnJ-fl1w.cjs';
6
- import { I as ILogger } from '../../logger-9me5n48P.cjs';
7
- import '../../headers-K2qbcurv.cjs';
3
+ import { H as HandlerContract, B as BinarySettings, S as ServerlessHandler } from '../../handler.contract-D9QyTfDX.cjs';
4
+ import { A as AdapterContract, R as ResolverContract } from '../../adapter.contract-Cp2Jsh5V.cjs';
5
+ import { F as FrameworkContract } from '../../framework.contract-td-lRvq6.cjs';
6
+ import { I as ILogger } from '../../logger-F8qccesk.cjs';
7
+ import '../../headers-DjfGHDmI.cjs';
8
8
 
9
9
  /**
10
10
  * The default port that huawei will proxy the request to your framework
@@ -1,10 +1,10 @@
1
1
  import { RequestListener } from 'http';
2
2
  import { Server } from 'node:http';
3
- import { H as HandlerContract, B as BinarySettings, S as ServerlessHandler } from '../../handler.contract-8Cb7qLSi.js';
4
- import { A as AdapterContract, R as ResolverContract } from '../../adapter.contract-EQE3rlgO.js';
5
- import { F as FrameworkContract } from '../../framework.contract-YnJ-fl1w.js';
6
- import { I as ILogger } from '../../logger-9me5n48P.js';
7
- import '../../headers-K2qbcurv.js';
3
+ import { H as HandlerContract, B as BinarySettings, S as ServerlessHandler } from '../../handler.contract-Ckhqvom_.js';
4
+ import { A as AdapterContract, R as ResolverContract } from '../../adapter.contract-FnS-TPRj.js';
5
+ import { F as FrameworkContract } from '../../framework.contract-td-lRvq6.js';
6
+ import { I as ILogger } from '../../logger-F8qccesk.js';
7
+ import '../../headers-DjfGHDmI.js';
8
8
 
9
9
  /**
10
10
  * The default port that huawei will proxy the request to your framework
@@ -1,2 +1,2 @@
1
- import{t as i}from"../../chunk-L4VRXTKP.mjs";import{a as s}from"../../chunk-OYOJMOFP.mjs";import{createServer as S}from"node:http";var u=8e3,d=class{constructor(e){this.options=e}static{s(this,"HttpHuaweiHandler")}getHandler(e,v,m,l,E,A,t){let c=s((r,o)=>{v.sendRequest(e,r,o)},"requestListener"),n=i(this.options?.httpServerFactory,this.createHttpServer.bind(this))(c),p=i(this.options?.port,u);return n.listen(p,()=>{t.debug("SERVERLESS_ADAPTER:PROXY: Server started."),t.debug(`SERVERLESS_ADAPTER:PROXY: Listening the Huawei Requests in port ${p}`)}),()=>(t.debug("SERVERLESS_ADAPTER:PROXY: Disposing the server"),new Promise((r,o)=>{n.close(a=>a?o(a):r())}))}createHttpServer(e){return S(e)}};export{u as DEFAULT_HUAWEI_LISTEN_PORT,d as HttpHuaweiHandler};
1
+ import{t as i}from"../../chunk-OIGHP3AJ.mjs";import{a as s}from"../../chunk-QWPVIX2T.mjs";import{createServer as S}from"node:http";var u=8e3,d=class{constructor(e){this.options=e}static{s(this,"HttpHuaweiHandler")}getHandler(e,v,m,l,E,A,t){let c=s((r,o)=>{v.sendRequest(e,r,o)},"requestListener"),n=i(this.options?.httpServerFactory,this.createHttpServer.bind(this))(c),p=i(this.options?.port,u);return n.listen(p,()=>{t.debug("SERVERLESS_ADAPTER:PROXY: Server started."),t.debug(`SERVERLESS_ADAPTER:PROXY: Listening the Huawei Requests in port ${p}`)}),()=>(t.debug("SERVERLESS_ADAPTER:PROXY: Disposing the server"),new Promise((r,o)=>{n.close(a=>a?o(a):r())}))}createHttpServer(e){return S(e)}};export{u as DEFAULT_HUAWEI_LISTEN_PORT,d as HttpHuaweiHandler};
2
2
  //# sourceMappingURL=index.mjs.map
package/lib/index.cjs CHANGED
@@ -1,13 +1,13 @@
1
- "use strict";var T=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var s=(r,e)=>T(r,"name",{value:e,configurable:!0});var K=(r,e)=>{for(var t in e)T(r,t,{get:e[t],enumerable:!0})},z=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of $(e))!G.call(r,o)&&o!==t&&T(r,o,{get:()=>e[o],enumerable:!(n=Y(e,o))||n.enumerable});return r};var Q=r=>z(T({},"__esModule",{value:!0}),r);var Re={};K(Re,{BaseHandler:()=>v,DEFAULT_BINARY_CONTENT_TYPES:()=>S,DEFAULT_BINARY_ENCODINGS:()=>x,EmptyResponse:()=>J,NO_OP:()=>p,ServerlessAdapter:()=>L,ServerlessRequest:()=>g,ServerlessResponse:()=>h,ServerlessStreamResponse:()=>k,buildStripBasePath:()=>ce,createDefaultLogger:()=>w,getContentType:()=>O,getCurrentInvoke:()=>X,getDefaultIfUndefined:()=>le,getEventBodyAsBuffer:()=>ee,getFlattenedHeadersMap:()=>re,getFlattenedHeadersMapAndCookies:()=>ne,getMultiValueHeadersMap:()=>te,getPathWithQueryStringParams:()=>ue,getQueryParamsStringFromRecord:()=>D,getString:()=>m,isBinary:()=>se,isContentEncodingBinary:()=>I,isContentTypeBinary:()=>P,isInternalLogger:()=>de,isStreamEnded:()=>V,keysToLowercase:()=>oe,parseHeaders:()=>A,setCurrentInvoke:()=>Z,waitForStreamComplete:()=>ge});module.exports=Q(Re);var N=require("http");var v=class{static{s(this,"BaseHandler")}getAdapterByEventAndContext(e,t,n,o){let i=n.filter(a=>a.canHandle(e,t,o));if(i.length===0)throw new Error("SERVERLESS_ADAPTER: Couldn't find adapter to handle this event.");if(i.length>1)throw new Error(`SERVERLESS_ADAPTER: Two or more adapters was resolved by the event, the adapters are: ${n.map(a=>a.getAdapterName()).join(", ")}.`);return i[0]}getServerlessRequestResponseFromAdapterRequest(e){let t=new g({method:e.method,headers:e.headers,body:e.body,remoteAddress:e.remoteAddress,url:e.path}),n=new h({method:e.method});return[t,n]}};var x=["gzip","deflate","br"],S=["image/png","image/jpeg","image/jpg","image/avif","image/bmp","image/x-png","image/gif","image/webp","video/mp4","application/pdf"],J={};var b={context:null,event:null};function X(){return b}s(X,"getCurrentInvoke");function Z({event:r,context:e}){b.event=r,b.context=e}s(Z,"setCurrentInvoke");function ee(r,e){let t=e?"base64":"utf8",n=Buffer.from(r,t),o=Buffer.byteLength(n,t);return[n,o]}s(ee,"getEventBodyAsBuffer");function re(r,e=",",t=!1){return Object.keys(r).reduce((n,o)=>{let i=t?o.toLowerCase():o,a=r[o];return Array.isArray(a)?n[i]=a.join(e):n[i]=(a??"")+"",n},{})}s(re,"getFlattenedHeadersMap");function te(r){return Object.keys(r).reduce((e,t)=>{let n=r[t];return e[t.toLowerCase()]=Array.isArray(n)?n.map(String):[String(n)],e},{})}s(te,"getMultiValueHeadersMap");function ne(r){return Object.keys(r).reduce((e,t)=>{let n=r[t],o=t.toLowerCase();return Array.isArray(n)?o!=="set-cookie"?e.headers[t]=n.join(","):e.cookies.push(...n):o==="set-cookie"&&n!==void 0?e.cookies.push(n??""):e.headers[t]=String(n??""),e},{cookies:[],headers:{}})}s(ne,"getFlattenedHeadersMapAndCookies");function A(r){if(!r)return{};let e={},t=r.trim().split(`
2
- `);for(let n=0;n<t.length;n++){let o=t[n],i=o.indexOf(":"),a=o.slice(0,i).trim().toLowerCase(),d=o.slice(i+1).trim();typeof e[a]>"u"?e[a]=d:Array.isArray(e[a])?e[a].push(d):e[a]=[e[a],d]}return e}s(A,"parseHeaders");function oe(r){let e={};for(let[t,n]of Object.entries(r))e[t.toLowerCase()]=n;return e}s(oe,"keysToLowercase");function I(r,e){let t=r["content-encoding"];return t?(Array.isArray(t)||(t=t.split(",")),t.some(n=>e.includes(n.trim()))):!1}s(I,"isContentEncodingBinary");function O(r){let e=r["content-type"],t=Array.isArray(e)?e[0]||"":e||"";if(!e)return"";let n=t.indexOf(";");return n===-1?t:t.slice(0,n)}s(O,"getContentType");function P(r,e){let t=O(r);return t?e.includes(t.trim()):!1}s(P,"isContentTypeBinary");function se(r,e){return"isBinary"in e?e.isBinary===!1?!1:e.isBinary(r):I(r,e.contentEncodings)||P(r,e.contentTypes)}s(se,"isBinary");var p=s(()=>{},"NO_OP");var _=Symbol("InternalLogger"),ie={debug:[["debug","debug"],["verbose","debug"],["info","info"],["error","error"],["warn","warn"]],verbose:[["verbose","debug"],["info","info"],["error","error"],["warn","warn"]],info:[["info","info"],["error","error"],["warn","warn"]],warn:[["warn","warn"],["error","error"]],error:[["error","error"]],none:[]},ae=s(r=>typeof r=="function"?r():r,"lazyPrint"),pe=s(r=>(e,...t)=>console[r](e,...t.map(ae)),"print");function w({level:r}={level:"error"}){let e=ie[r];if(!e)throw new Error("Invalid log level");let t={[_]:!0,error:p,debug:p,info:p,verbose:p,warn:p};for(let[n,o]of e)t[n]=pe(o);return t}s(w,"createDefaultLogger");function de(r){return!!r[_]}s(de,"isInternalLogger");function le(r,e){return r===void 0?e:r}s(le,"getDefaultIfUndefined");function ue(r,e){if(String(e||"").length===0)return r;if(typeof e=="string")return`${r}?${e}`;let t=D(e);return t?`${r}?${t}`:r}s(ue,"getPathWithQueryStringParams");function D(r){let e=new URLSearchParams,t=Object.entries(r||{});if(t.length===0)return"";for(let[n,o]of t){if(!Array.isArray(o)){e.append(n,o||"");continue}for(let i of o)e.append(n,i)}return e.toString()}s(D,"getQueryParamsStringFromRecord");var fe=s(r=>r,"NOOPBasePath");function ce(r){if(!r)return fe;let e=r.length;return t=>t.startsWith(r)?t.slice(t.indexOf(r)+e,t.length)||"/":t}s(ce,"buildStripBasePath");var Ge=require("stream");function V(r){return!!("readableEnded"in r&&r.readableEnded||"writableEnded"in r&&r.writableEnded)}s(V,"isStreamEnded");function ge(r){return V(r)?Promise.resolve(r):new Promise((e,t)=>{let n=!1;function o(i){n||(n=!0,r.removeListener("error",o),r.removeListener("end",o),r.removeListener("finish",o),i?t(i):e(r))}s(o,"complete"),r.once("error",o),r.once("end",o),r.once("finish",o)})}s(ge,"waitForStreamComplete");var he=443,g=class extends N.IncomingMessage{static{s(this,"ServerlessRequest")}constructor({method:e,url:t,headers:n,body:o,remoteAddress:i}){super({encrypted:!0,readable:!1,remoteAddress:i,address:()=>({port:he}),end:p,destroy:p}),this.statusCode=200,this.statusMessage="OK",this.complete=!0,this.httpVersion="1.1",this.httpVersionMajor=1,this.httpVersionMinor=1,this.method=e,this.headers=n,this.body=o,this.url=t,this.ip=i,this._read=()=>{this.push(o),this.push(null)}}ip;body};var W=require("http");function m(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}`)}s(m,"getString");var F=`\r
1
+ "use strict";var E=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var K=Object.prototype.hasOwnProperty;var s=(r,e)=>E(r,"name",{value:e,configurable:!0});var z=(r,e)=>{for(var t in e)E(r,t,{get:e[t],enumerable:!0})},Q=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of G(e))!K.call(r,o)&&o!==t&&E(r,o,{get:()=>e[o],enumerable:!(n=$(e,o))||n.enumerable});return r};var J=r=>Q(E({},"__esModule",{value:!0}),r);var ve={};z(ve,{BaseHandler:()=>v,DEFAULT_BINARY_CONTENT_TYPES:()=>S,DEFAULT_BINARY_ENCODINGS:()=>x,EmptyResponse:()=>X,NO_OP:()=>p,ServerlessAdapter:()=>L,ServerlessRequest:()=>h,ServerlessResponse:()=>m,ServerlessStreamResponse:()=>k,buildStripBasePath:()=>ge,createDefaultLogger:()=>A,getContentType:()=>P,getCurrentInvoke:()=>Z,getDefaultIfUndefined:()=>ue,getEventBodyAsBuffer:()=>re,getFlattenedHeadersMap:()=>te,getFlattenedHeadersMapAndCookies:()=>oe,getMultiValueHeadersMap:()=>ne,getPathWithQueryStringParams:()=>fe,getQueryParamsStringFromRecord:()=>V,getString:()=>y,isBinary:()=>ie,isContentEncodingBinary:()=>O,isContentTypeBinary:()=>_,isInternalLogger:()=>le,isStreamEnded:()=>N,keysToLowercase:()=>se,parseHeaders:()=>w,setCurrentInvoke:()=>ee,waitForStreamComplete:()=>he});module.exports=J(ve);var F=require("http");var v=class{static{s(this,"BaseHandler")}getAdapterByEventAndContext(e,t,n,o){let i=n.filter(a=>a.canHandle(e,t,o));if(i.length===0)throw new Error("SERVERLESS_ADAPTER: Couldn't find adapter to handle this event.");if(i.length>1)throw new Error(`SERVERLESS_ADAPTER: Two or more adapters was resolved by the event, the adapters are: ${n.map(a=>a.getAdapterName()).join(", ")}.`);return i[0]}getServerlessRequestResponseFromAdapterRequest(e){let t=new h({method:e.method,headers:e.headers,body:e.body,remoteAddress:e.remoteAddress,url:e.path}),n=new m({method:e.method});return[t,n]}};var x=["gzip","deflate","br"],S=["image/png","image/jpeg","image/jpg","image/avif","image/bmp","image/x-png","image/gif","image/webp","video/mp4","application/pdf"],X={};var b={context:null,event:null};function Z(){return b}s(Z,"getCurrentInvoke");function ee({event:r,context:e}){b.event=r,b.context=e}s(ee,"setCurrentInvoke");function re(r,e){let t=e?"base64":"utf8",n=Buffer.from(r,t),o=Buffer.byteLength(n,t);return[n,o]}s(re,"getEventBodyAsBuffer");function te(r,e=",",t=!1){return Object.keys(r).reduce((n,o)=>{let i=t?o.toLowerCase():o,a=r[o];return Array.isArray(a)?n[i]=a.join(e):n[i]=(a??"")+"",n},{})}s(te,"getFlattenedHeadersMap");function ne(r){return Object.keys(r).reduce((e,t)=>{let n=r[t];return e[t.toLowerCase()]=Array.isArray(n)?n.map(String):[String(n)],e},{})}s(ne,"getMultiValueHeadersMap");function oe(r){return Object.keys(r).reduce((e,t)=>{let n=r[t],o=t.toLowerCase();return Array.isArray(n)?o!=="set-cookie"?e.headers[t]=n.join(","):e.cookies.push(...n):o==="set-cookie"&&n!==void 0?e.cookies.push(n??""):e.headers[t]=String(n??""),e},{cookies:[],headers:{}})}s(oe,"getFlattenedHeadersMapAndCookies");function w(r){if(!r)return{};let e={},t=r.trim().split(`
2
+ `);for(let n=0;n<t.length;n++){let o=t[n],i=o.indexOf(":"),a=o.slice(0,i).trim().toLowerCase(),d=o.slice(i+1).trim();typeof e[a]>"u"?e[a]=d:Array.isArray(e[a])?e[a].push(d):e[a]=[e[a],d]}return e}s(w,"parseHeaders");function se(r){let e={};for(let[t,n]of Object.entries(r))e[t.toLowerCase()]=n;return e}s(se,"keysToLowercase");function O(r,e){let t=r["content-encoding"];return t?(Array.isArray(t)||(t=t.split(",")),t.some(n=>e.includes(n.trim()))):!1}s(O,"isContentEncodingBinary");function P(r){let e=r["content-type"],t=Array.isArray(e)?e[0]||"":e||"";if(!e)return"";let n=t.indexOf(";");return n===-1?t:t.slice(0,n)}s(P,"getContentType");function _(r,e){let t=P(r);return t?e.includes(t.trim()):!1}s(_,"isContentTypeBinary");function ie(r,e){return"isBinary"in e?e.isBinary===!1?!1:e.isBinary(r):O(r,e.contentEncodings)||_(r,e.contentTypes)}s(ie,"isBinary");var p=s(()=>{},"NO_OP");var D=Symbol("InternalLogger"),ae={debug:[["debug","debug"],["verbose","debug"],["info","info"],["error","error"],["warn","warn"]],verbose:[["verbose","debug"],["info","info"],["error","error"],["warn","warn"]],info:[["info","info"],["error","error"],["warn","warn"]],warn:[["warn","warn"],["error","error"]],error:[["error","error"]],none:[]},pe=s(r=>typeof r=="function"?r():r,"lazyPrint"),de=s(r=>(e,...t)=>console[r](e,...t.map(pe)),"print");function A({level:r}={level:"error"}){let e=ae[r];if(!e)throw new Error("Invalid log level");let t={[D]:!0,error:p,debug:p,info:p,verbose:p,warn:p};for(let[n,o]of e)t[n]=de(o);return t}s(A,"createDefaultLogger");function le(r){return!!r[D]}s(le,"isInternalLogger");function ue(r,e){return r===void 0?e:r}s(ue,"getDefaultIfUndefined");function fe(r,e){if(String(e||"").length===0)return r;if(typeof e=="string")return`${r}?${e}`;let t=V(e);return t?`${r}?${t}`:r}s(fe,"getPathWithQueryStringParams");function V(r){let e=new URLSearchParams,t=Object.entries(r||{});if(t.length===0)return"";for(let[n,o]of t){if(!Array.isArray(o)){e.append(n,o||"");continue}for(let i of o)e.append(n,i)}return e.toString()}s(V,"getQueryParamsStringFromRecord");var ce=s(r=>r,"NOOPBasePath");function ge(r){if(!r)return ce;let e=r.length;return t=>t.startsWith(r)?t.slice(t.indexOf(r)+e,t.length)||"/":t}s(ge,"buildStripBasePath");var Ke=require("stream");function N(r){return!!("readableEnded"in r&&r.readableEnded||"writableEnded"in r&&r.writableEnded)}s(N,"isStreamEnded");function he(r){return N(r)?Promise.resolve(r):new Promise((e,t)=>{let n=!1;function o(i){n||(n=!0,r.removeListener("error",o),r.removeListener("end",o),r.removeListener("finish",o),i?t(i):e(r))}s(o,"complete"),r.once("error",o),r.once("end",o),r.once("finish",o)})}s(he,"waitForStreamComplete");var me=443,h=class extends F.IncomingMessage{static{s(this,"ServerlessRequest")}constructor({method:e,url:t,headers:n,body:o,remoteAddress:i}){super({encrypted:!0,readable:!0,remoteAddress:i,address:s(()=>({port:me}),"address"),on:p,removeListener:p,removeEventListener:p,end:p,destroy:p}),this.statusCode=200,this.statusMessage="OK",this.complete=!0,this.httpVersion="1.1",this.httpVersionMajor=1,this.httpVersionMinor=1,this.method=e,this.headers=n,this.body=o,this.url=t,this.ip=i,this._read=()=>{this.push(o),this.push(null)}}ip;body};var U=require("http");function y(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}`)}s(y,"getString");var W=`\r
3
3
  \r
4
- `,me=`0\r
4
+ `,ye=`0\r
5
5
  \r
6
- `,y=Symbol("Response body"),c=Symbol("Response headers");function C(r,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)r[y].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}s(C,"addData");var h=class r extends W.ServerResponse{static{s(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[y]=[],this[c]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let t=1,n={_writableState:{},writable:!0,on:p,removeListener:p,destroy:p,cork:p,uncork:p,write:(o,i,a)=>{if(typeof i=="function"&&(a=i,i=null),this._header===""||this._wroteHeader)this.chunkedEncoding?t>0?t--:o!==me&&(C(this,o),t=3):C(this,o);else{let d=m(o),l=d.indexOf(F);if(l!==-1){let u=d.slice(l+F.length);u&&!this.chunkedEncoding&&C(this,u),this._wroteHeader=!0}}typeof a=="function"&&a()}};this.assignSocket(n)}_header;_headers;_wroteHeader;[y];[c];get headers(){return this[c]}static from(e){let t=new r({method:e.method});return t.statusCode=e.statusCode||0,t[c]=e.headers,t[y]=e.body?[Buffer.from(e.body)]:[],t.end(),t}static body(e){return Buffer.concat(e[y])}static headers(e){let t=e.getHeaders();return Object.assign(t,e[c])}setHeader(e,t){this._wroteHeader?this[c][e]=t:super.setHeader(e,t)}writeHead(e,t,n){let o=typeof t=="string"?n:t,i=Array.isArray(o)?o:[o||{}];for(let a of i)for(let d in a)if(this.setHeader(d,a[d]),!this._wroteHeader)break;return this.callNativeWriteHead(e,t,n)}callNativeWriteHead(e,t,n){return super.writeHead(e,t,n)}};var j=require("http");var ye=Buffer.from(`\r
7
- `),U=`0\r
8
- \r
9
- `,Te=`\r
6
+ `,T=Symbol("Response body"),g=Symbol("Response headers");function C(r,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)r[T].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}s(C,"addData");var m=class r extends U.ServerResponse{static{s(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[T]=[],this[g]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let t=1,n={_writableState:{},writable:!0,writableLength:0,writableHighWaterMark:16384,on:p,removeListener:p,destroy:p,cork:p,uncork:p,write:s((o,i,a)=>{if(typeof i=="function"&&(a=i,i=null),this._header===""||this._wroteHeader)this.chunkedEncoding?t>0?t--:o!==ye&&(C(this,o),t=3):C(this,o);else{let d=y(o),l=d.indexOf(W);if(l!==-1){let u=d.slice(l+W.length);u&&!this.chunkedEncoding&&C(this,u),this._wroteHeader=!0}}typeof a=="function"&&a()},"write")};this.assignSocket(n)}_header;_headers;_wroteHeader;[T];[g];get headers(){return this[g]}static from(e){let t=new r({method:e.method});return t.statusCode=e.statusCode||0,t[g]=e.headers,t[T]=e.body?[Buffer.from(e.body)]:[],t.end(),t}static body(e){return Buffer.concat(e[T])}static headers(e){let t=e.getHeaders();return Object.assign(t,e[g])}setHeader(e,t){this._wroteHeader?this[g][e]=t:super.setHeader(e,t)}writeHead(e,t,n){let o=typeof t=="string"?n:t,i=Array.isArray(o)?o:[o||{}];for(let a of i)for(let d in a)if(this.setHeader(d,a[d]),!this._wroteHeader)break;return this.callNativeWriteHead(e,t,n)}callNativeWriteHead(e,t,n){return super.writeHead(e,t,n)}};var M=require("http");var Te=Buffer.from(`\r
7
+ `),j=`0\r
10
8
  \r
11
9
  `,Ee=`\r
12
- `,k=class extends j.ServerResponse{static{s(this,"ServerlessStreamResponse")}constructor({method:e,onReceiveHeaders:t,log:n}){super({method:e}),this.useChunkedEncodingByDefault=!0,this.chunkedEncoding=!0;let o=null,i=!1,a=!1,d={_writableState:{},writable:!0,on:p,removeListener:p,destroy:p,cork:p,uncork:p,write:(l,u,E)=>{if(typeof u=="function"&&(E=u,u=null),n.debug("SERVERLESS_ADAPTER:RESPONSE_STREAM:DATA",()=>({data:Buffer.isBuffer(l)?l.toString("utf8"):l,encoding:u})),!o){let f=m(l),R=f.indexOf(Ee),q=+f.slice(0,R).split(" ")[1],B=f.indexOf(Te),M=f.slice(R+2,B),H=A(M);return n.debug("SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS",()=>({headers:H})),o=t(q,H),f.substring(B+4)===U&&o.end(),!0}if(l===U)return o.end(E),!0;if(Buffer.isBuffer(l)&&ye.equals(l)){if(!i)return i=!0,!0;if(i&&a)return i=!1,a=!1,!0}return i&&(a=!0,o.write(l,E)),!0}};this.assignSocket(d)}};var L=class r{static{s(this,"ServerlessAdapter")}constructor(e){this.app=e}app;binarySettings={contentEncodings:x,contentTypes:S};respondWithErrors=process.env.NODE_ENV==="development";log=w();adapters=[];framework;resolver;handler;static new(e){return new r(e)}setHandler(e){if(this.handler)throw new Error("SERVERLESS_ADAPTER: The handler should not set twice.");return this.handler=e,this}setResolver(e){if(this.resolver)throw new Error("SERVERLESS_ADAPTER: The resolver should not set twice.");return this.resolver=e,this}setFramework(e){if(this.framework)throw new Error("SERVERLESS_ADAPTER: The framework should not set twice.");return this.framework=e,this}setLogger(e){return this.log=e,this}setBinarySettings(e){return this.binarySettings={...this.binarySettings,...e},this}setRespondWithErrors(e){return this.respondWithErrors=e,this}addAdapter(e){return this.adapters.push(e),this}build(){if(!this.resolver)throw new Error("SERVERLESS_ADAPTER: Is required to set a resolver before build.");if(!this.framework)throw new Error("SERVERLESS_ADAPTER: Is required to set a framework before build.");if(!this.handler)throw new Error("SERVERLESS_ADAPTER: Is required to set a handler before build.");if(this.adapters.length===0)throw new Error("SERVERLESS_ADAPTER: Is required to set at least one adapter.");return this.handler.getHandler(this.app,this.framework,this.adapters,this.resolver,this.binarySettings,this.respondWithErrors,this.log)}};0&&(module.exports={BaseHandler,DEFAULT_BINARY_CONTENT_TYPES,DEFAULT_BINARY_ENCODINGS,EmptyResponse,NO_OP,ServerlessAdapter,ServerlessRequest,ServerlessResponse,ServerlessStreamResponse,buildStripBasePath,createDefaultLogger,getContentType,getCurrentInvoke,getDefaultIfUndefined,getEventBodyAsBuffer,getFlattenedHeadersMap,getFlattenedHeadersMapAndCookies,getMultiValueHeadersMap,getPathWithQueryStringParams,getQueryParamsStringFromRecord,getString,isBinary,isContentEncodingBinary,isContentTypeBinary,isInternalLogger,isStreamEnded,keysToLowercase,parseHeaders,setCurrentInvoke,waitForStreamComplete});
10
+ \r
11
+ `,Re=`\r
12
+ `,k=class extends M.ServerResponse{static{s(this,"ServerlessStreamResponse")}constructor({method:e,onReceiveHeaders:t,log:n}){super({method:e}),this.useChunkedEncodingByDefault=!0,this.chunkedEncoding=!0;let o=null,i=!1,a=!1,d={_writableState:{},writable:!0,writableLength:0,writableHighWaterMark:16384,on:p,removeListener:p,destroy:p,cork:p,uncork:p,write:s((l,u,f)=>{if(typeof u=="function"&&(f=u,u=null),n.debug("SERVERLESS_ADAPTER:RESPONSE_STREAM:DATA",()=>({data:Buffer.isBuffer(l)?l.toString("utf8"):l,encoding:u})),!o){let c=y(l),R=c.indexOf(Re),q=+c.slice(0,R).split(" ")[1],H=c.indexOf(Ee),Y=c.slice(R+2,H),B=w(Y);n.debug("SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS",()=>({headers:B})),o=t(q,B);let I=c.substring(H+4);return I===j?(o.end(f),!0):(I===""&&f&&process.nextTick(f),!0)}if(l===j)return o.end(f),!0;if(Buffer.isBuffer(l)&&Te.equals(l)){if(!i)return i=!0,!0;if(i&&a)return i=!1,a=!1,!0}return i&&(a=!0,o.write(l,f)),!0},"write")};this.assignSocket(d)}};var L=class r{static{s(this,"ServerlessAdapter")}constructor(e){this.app=e}app;binarySettings={contentEncodings:x,contentTypes:S};respondWithErrors=process.env.NODE_ENV==="development";log=A();adapters=[];framework;resolver;handler;static new(e){return new r(e)}setHandler(e){if(this.handler)throw new Error("SERVERLESS_ADAPTER: The handler should not set twice.");return this.handler=e,this}setResolver(e){if(this.resolver)throw new Error("SERVERLESS_ADAPTER: The resolver should not set twice.");return this.resolver=e,this}setFramework(e){if(this.framework)throw new Error("SERVERLESS_ADAPTER: The framework should not set twice.");return this.framework=e,this}setLogger(e){return this.log=e,this}setBinarySettings(e){return this.binarySettings={...this.binarySettings,...e},this}setRespondWithErrors(e){return this.respondWithErrors=e,this}addAdapter(e){return this.adapters.push(e),this}build(){if(!this.resolver)throw new Error("SERVERLESS_ADAPTER: Is required to set a resolver before build.");if(!this.framework)throw new Error("SERVERLESS_ADAPTER: Is required to set a framework before build.");if(!this.handler)throw new Error("SERVERLESS_ADAPTER: Is required to set a handler before build.");if(this.adapters.length===0)throw new Error("SERVERLESS_ADAPTER: Is required to set at least one adapter.");return this.handler.getHandler(this.app,this.framework,this.adapters,this.resolver,this.binarySettings,this.respondWithErrors,this.log)}};0&&(module.exports={BaseHandler,DEFAULT_BINARY_CONTENT_TYPES,DEFAULT_BINARY_ENCODINGS,EmptyResponse,NO_OP,ServerlessAdapter,ServerlessRequest,ServerlessResponse,ServerlessStreamResponse,buildStripBasePath,createDefaultLogger,getContentType,getCurrentInvoke,getDefaultIfUndefined,getEventBodyAsBuffer,getFlattenedHeadersMap,getFlattenedHeadersMapAndCookies,getMultiValueHeadersMap,getPathWithQueryStringParams,getQueryParamsStringFromRecord,getString,isBinary,isContentEncodingBinary,isContentTypeBinary,isInternalLogger,isStreamEnded,keysToLowercase,parseHeaders,setCurrentInvoke,waitForStreamComplete});
13
13
  //# sourceMappingURL=index.cjs.map