@h4ad/serverless-adapter 4.0.0 → 4.0.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 (199) hide show
  1. package/lib/adapter.contract-EQE3rlgO.d.ts +278 -0
  2. package/lib/adapter.contract-y5xSjOjo.d.cts +278 -0
  3. package/lib/adapters/apollo-server/index.cjs +4 -0
  4. package/lib/adapters/apollo-server/index.cjs.map +1 -0
  5. package/lib/adapters/apollo-server/index.d.cts +61 -0
  6. package/lib/adapters/apollo-server/index.d.ts +61 -0
  7. package/lib/adapters/apollo-server/index.mjs +2 -0
  8. package/lib/adapters/apollo-server/index.mjs.map +1 -0
  9. package/lib/adapters/aws/index.cjs +4 -0
  10. package/lib/adapters/aws/index.cjs.map +1 -0
  11. package/lib/adapters/aws/index.d.cts +910 -0
  12. package/lib/adapters/aws/index.d.ts +910 -0
  13. package/lib/adapters/aws/index.mjs +2 -0
  14. package/lib/adapters/aws/index.mjs.map +1 -0
  15. package/lib/adapters/azure/index.cjs +4 -0
  16. package/lib/adapters/azure/index.cjs.map +1 -0
  17. package/lib/adapters/azure/index.d.cts +86 -0
  18. package/lib/adapters/azure/index.d.ts +86 -0
  19. package/lib/adapters/azure/index.mjs +2 -0
  20. package/lib/adapters/azure/index.mjs.map +1 -0
  21. package/lib/adapters/digital-ocean/index.cjs +4 -0
  22. package/lib/adapters/digital-ocean/index.cjs.map +1 -0
  23. package/lib/adapters/digital-ocean/index.d.cts +126 -0
  24. package/lib/adapters/digital-ocean/index.d.ts +126 -0
  25. package/lib/adapters/digital-ocean/index.mjs +2 -0
  26. package/lib/adapters/digital-ocean/index.mjs.map +1 -0
  27. package/lib/adapters/dummy/index.cjs +4 -0
  28. package/lib/adapters/dummy/index.cjs.map +1 -0
  29. package/lib/adapters/dummy/index.d.cts +37 -0
  30. package/lib/adapters/dummy/index.d.ts +37 -0
  31. package/lib/adapters/dummy/index.mjs +2 -0
  32. package/lib/adapters/dummy/index.mjs.map +1 -0
  33. package/lib/adapters/huawei/index.cjs +4 -0
  34. package/lib/adapters/huawei/index.cjs.map +1 -0
  35. package/lib/adapters/huawei/index.d.cts +365 -0
  36. package/lib/adapters/huawei/index.d.ts +365 -0
  37. package/lib/adapters/huawei/index.mjs +2 -0
  38. package/lib/adapters/huawei/index.mjs.map +1 -0
  39. package/lib/base-handler-fYEk59Xq.d.ts +35 -0
  40. package/lib/base-handler-peEBoKtZ.d.cts +35 -0
  41. package/lib/chunk-22SSVZU5.mjs +1 -0
  42. package/lib/chunk-22SSVZU5.mjs.map +1 -0
  43. package/lib/chunk-HU5XBQCP.mjs +10 -0
  44. package/lib/chunk-HU5XBQCP.mjs.map +1 -0
  45. package/lib/chunk-NSO4L3EI.mjs +2 -0
  46. package/lib/chunk-NSO4L3EI.mjs.map +1 -0
  47. package/lib/chunk-OYOJMOFP.mjs +2 -0
  48. package/lib/chunk-OYOJMOFP.mjs.map +1 -0
  49. package/lib/chunk-Y6H576RS.mjs +2 -0
  50. package/lib/chunk-Y6H576RS.mjs.map +1 -0
  51. package/lib/constants-0cgQlFSV.d.cts +32 -0
  52. package/lib/constants-0cgQlFSV.d.ts +32 -0
  53. package/lib/framework.contract-YnJ-fl1w.d.cts +20 -0
  54. package/lib/framework.contract-YnJ-fl1w.d.ts +20 -0
  55. package/lib/frameworks/apollo-server/index.cjs +4 -0
  56. package/lib/frameworks/apollo-server/index.cjs.map +1 -0
  57. package/lib/frameworks/apollo-server/index.d.cts +72 -0
  58. package/lib/frameworks/apollo-server/index.d.ts +72 -0
  59. package/lib/frameworks/apollo-server/index.mjs +2 -0
  60. package/lib/frameworks/apollo-server/index.mjs.map +1 -0
  61. package/lib/frameworks/body-parser/index.cjs +4 -0
  62. package/lib/frameworks/body-parser/index.cjs.map +1 -0
  63. package/lib/frameworks/body-parser/index.d.cts +159 -0
  64. package/lib/frameworks/body-parser/index.d.ts +159 -0
  65. package/lib/frameworks/body-parser/index.mjs +2 -0
  66. package/lib/frameworks/body-parser/index.mjs.map +1 -0
  67. package/lib/frameworks/cors/index.cjs +5 -0
  68. package/lib/frameworks/cors/index.cjs.map +1 -0
  69. package/lib/frameworks/cors/index.d.cts +79 -0
  70. package/lib/frameworks/cors/index.d.ts +79 -0
  71. package/lib/frameworks/cors/index.mjs +3 -0
  72. package/lib/frameworks/cors/index.mjs.map +1 -0
  73. package/lib/frameworks/deepkit/index.cjs +4 -0
  74. package/lib/frameworks/deepkit/index.cjs.map +1 -0
  75. package/lib/frameworks/deepkit/index.d.cts +21 -0
  76. package/lib/frameworks/deepkit/index.d.ts +21 -0
  77. package/lib/frameworks/deepkit/index.mjs +2 -0
  78. package/lib/frameworks/deepkit/index.mjs.map +1 -0
  79. package/lib/frameworks/express/index.cjs +2 -0
  80. package/lib/frameworks/express/index.cjs.map +1 -0
  81. package/lib/frameworks/express/index.d.cts +18 -0
  82. package/lib/frameworks/express/index.d.ts +18 -0
  83. package/lib/frameworks/express/index.mjs +2 -0
  84. package/lib/frameworks/express/index.mjs.map +1 -0
  85. package/lib/frameworks/fastify/index.cjs +2 -0
  86. package/lib/frameworks/fastify/index.cjs.map +1 -0
  87. package/lib/frameworks/fastify/index.d.cts +18 -0
  88. package/lib/frameworks/fastify/index.d.ts +18 -0
  89. package/lib/frameworks/fastify/index.mjs +2 -0
  90. package/lib/frameworks/fastify/index.mjs.map +1 -0
  91. package/lib/frameworks/hapi/index.cjs +2 -0
  92. package/lib/frameworks/hapi/index.cjs.map +1 -0
  93. package/lib/frameworks/hapi/index.d.cts +18 -0
  94. package/lib/frameworks/hapi/index.d.ts +18 -0
  95. package/lib/frameworks/hapi/index.mjs +2 -0
  96. package/lib/frameworks/hapi/index.mjs.map +1 -0
  97. package/lib/frameworks/koa/index.cjs +2 -0
  98. package/lib/frameworks/koa/index.cjs.map +1 -0
  99. package/lib/frameworks/koa/index.d.cts +18 -0
  100. package/lib/frameworks/koa/index.d.ts +18 -0
  101. package/lib/frameworks/koa/index.mjs +2 -0
  102. package/lib/frameworks/koa/index.mjs.map +1 -0
  103. package/lib/frameworks/lazy/index.cjs +4 -0
  104. package/lib/frameworks/lazy/index.cjs.map +1 -0
  105. package/lib/frameworks/lazy/index.d.cts +57 -0
  106. package/lib/frameworks/lazy/index.d.ts +57 -0
  107. package/lib/frameworks/lazy/index.mjs +2 -0
  108. package/lib/frameworks/lazy/index.mjs.map +1 -0
  109. package/lib/frameworks/trpc/index.cjs +4 -0
  110. package/lib/frameworks/trpc/index.cjs.map +1 -0
  111. package/lib/frameworks/trpc/index.d.cts +154 -0
  112. package/lib/frameworks/trpc/index.d.ts +154 -0
  113. package/lib/frameworks/trpc/index.mjs +2 -0
  114. package/lib/frameworks/trpc/index.mjs.map +1 -0
  115. package/lib/handler.contract-8Cb7qLSi.d.ts +66 -0
  116. package/lib/handler.contract-TQk8iM8f.d.cts +66 -0
  117. package/lib/handlers/aws/index.cjs +10 -0
  118. package/lib/handlers/aws/index.cjs.map +1 -0
  119. package/lib/handlers/aws/index.d.cts +96 -0
  120. package/lib/handlers/aws/index.d.ts +96 -0
  121. package/lib/handlers/aws/index.mjs +2 -0
  122. package/lib/handlers/aws/index.mjs.map +1 -0
  123. package/lib/handlers/azure/index.cjs +4 -0
  124. package/lib/handlers/azure/index.cjs.map +1 -0
  125. package/lib/handlers/azure/index.d.cts +53 -0
  126. package/lib/handlers/azure/index.d.ts +53 -0
  127. package/lib/handlers/azure/index.mjs +2 -0
  128. package/lib/handlers/azure/index.mjs.map +1 -0
  129. package/lib/handlers/default/index.cjs +4 -0
  130. package/lib/handlers/default/index.cjs.map +1 -0
  131. package/lib/handlers/default/index.d.cts +95 -0
  132. package/lib/handlers/default/index.d.ts +95 -0
  133. package/lib/handlers/default/index.mjs +2 -0
  134. package/lib/handlers/default/index.mjs.map +1 -0
  135. package/lib/handlers/digital-ocean/index.cjs +4 -0
  136. package/lib/handlers/digital-ocean/index.cjs.map +1 -0
  137. package/lib/handlers/digital-ocean/index.d.cts +25 -0
  138. package/lib/handlers/digital-ocean/index.d.ts +25 -0
  139. package/lib/handlers/digital-ocean/index.mjs +2 -0
  140. package/lib/handlers/digital-ocean/index.mjs.map +1 -0
  141. package/lib/handlers/firebase/index.cjs +4 -0
  142. package/lib/handlers/firebase/index.cjs.map +1 -0
  143. package/lib/handlers/firebase/index.d.cts +59 -0
  144. package/lib/handlers/firebase/index.d.ts +59 -0
  145. package/lib/handlers/firebase/index.mjs +2 -0
  146. package/lib/handlers/firebase/index.mjs.map +1 -0
  147. package/lib/handlers/gcp/index.cjs +4 -0
  148. package/lib/handlers/gcp/index.cjs.map +1 -0
  149. package/lib/handlers/gcp/index.d.cts +33 -0
  150. package/lib/handlers/gcp/index.d.ts +33 -0
  151. package/lib/handlers/gcp/index.mjs +2 -0
  152. package/lib/handlers/gcp/index.mjs.map +1 -0
  153. package/lib/handlers/huawei/index.cjs +4 -0
  154. package/lib/handlers/huawei/index.cjs.map +1 -0
  155. package/lib/handlers/huawei/index.d.cts +62 -0
  156. package/lib/handlers/huawei/index.d.ts +62 -0
  157. package/lib/handlers/huawei/index.mjs +2 -0
  158. package/lib/handlers/huawei/index.mjs.map +1 -0
  159. package/lib/headers-K2qbcurv.d.cts +38 -0
  160. package/lib/headers-K2qbcurv.d.ts +38 -0
  161. package/lib/index.cjs +10 -0
  162. package/lib/index.cjs.map +1 -0
  163. package/lib/index.d.cts +439 -0
  164. package/lib/index.d.ts +439 -0
  165. package/lib/index.mjs +2 -0
  166. package/lib/index.mjs.map +1 -0
  167. package/lib/logger-9me5n48P.d.cts +65 -0
  168. package/lib/logger-9me5n48P.d.ts +65 -0
  169. package/lib/path-yBwCb8C1.d.cts +64 -0
  170. package/lib/path-yBwCb8C1.d.ts +64 -0
  171. package/lib/raw-request-B2vPjAfE.d.cts +32 -0
  172. package/lib/raw-request-b6AYnkxd.d.ts +32 -0
  173. package/lib/request-DNNIV9ub.d.cts +44 -0
  174. package/lib/request-sVa4pxmx.d.ts +44 -0
  175. package/lib/resolvers/aws-context/index.cjs +2 -0
  176. package/lib/resolvers/aws-context/index.cjs.map +1 -0
  177. package/lib/resolvers/aws-context/index.d.cts +25 -0
  178. package/lib/resolvers/aws-context/index.d.ts +25 -0
  179. package/lib/resolvers/aws-context/index.mjs +2 -0
  180. package/lib/resolvers/aws-context/index.mjs.map +1 -0
  181. package/lib/resolvers/callback/index.cjs +2 -0
  182. package/lib/resolvers/callback/index.cjs.map +1 -0
  183. package/lib/resolvers/callback/index.d.cts +29 -0
  184. package/lib/resolvers/callback/index.d.ts +29 -0
  185. package/lib/resolvers/callback/index.mjs +2 -0
  186. package/lib/resolvers/callback/index.mjs.map +1 -0
  187. package/lib/resolvers/dummy/index.cjs +2 -0
  188. package/lib/resolvers/dummy/index.cjs.map +1 -0
  189. package/lib/resolvers/dummy/index.d.cts +20 -0
  190. package/lib/resolvers/dummy/index.d.ts +20 -0
  191. package/lib/resolvers/dummy/index.mjs +2 -0
  192. package/lib/resolvers/dummy/index.mjs.map +1 -0
  193. package/lib/resolvers/promise/index.cjs +2 -0
  194. package/lib/resolvers/promise/index.cjs.map +1 -0
  195. package/lib/resolvers/promise/index.d.cts +20 -0
  196. package/lib/resolvers/promise/index.d.ts +20 -0
  197. package/lib/resolvers/promise/index.mjs +2 -0
  198. package/lib/resolvers/promise/index.mjs.map +1 -0
  199. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/digital-ocean/index.ts","../../../src/network/request.ts","../../../src/network/response.ts","../../../src/network/utils.ts","../../../src/network/response-stream.ts","../../../src/core/event-body.ts","../../../src/core/headers.ts","../../../src/core/no-op.ts","../../../src/core/logger.ts","../../../src/core/optional.ts","../../../src/core/path.ts","../../../src/core/stream.ts","../../../src/adapters/digital-ocean/http-function.adapter.ts"],"sourcesContent":["export * from './http-function.adapter';\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';\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 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) addData(this, data);\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) 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\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 isFirstCall = true;\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 = 0;\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 (!isFirstCall && internalWritable) {\n if (data === endChunked) {\n internalWritable.end(cb);\n\n return true;\n }\n\n if (writesToIgnore > 0) {\n writesToIgnore--;\n return true;\n }\n\n internalWritable.write(data, cb);\n writesToIgnore = 3;\n } else if (isFirstCall) {\n isFirstCall = false;\n\n const stringData = getString(data);\n const endStatusIndex = stringData.indexOf(endStatusSeparator);\n const status = +stringData.slice(0, endStatusIndex).split(' ')[1];\n\n const headerData = stringData.slice(\n endStatusIndex + 2,\n stringData.indexOf(headerEnd),\n );\n const headers = parseHeaders(headerData);\n log.debug('SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS', {\n headers,\n });\n\n writesToIgnore = 1;\n internalWritable = onReceiveHeaders(status, headers);\n }\n\n return true;\n },\n };\n\n this.assignSocket(socket as unknown as Socket);\n }\n}\n","/**\n * Get the event body as buffer from body string with content length\n *\n * @example\n * ```typescript\n * const body = '{}';\n * const [buffer, contentLength] = getEventBodyAsBuffer(body, false);\n * console.log(buffer);\n * // <Buffer 7b 7d>\n * console.log(contentLength);\n * // 2\n * ```\n *\n * @param body - The body string that can be encoded or not\n * @param isBase64Encoded - Tells if body string is encoded in base64\n *\n * @breadcrumb Core\n * @public\n */\nexport function getEventBodyAsBuffer(\n body: string,\n isBase64Encoded: boolean,\n): [body: Buffer, contentLength: number] {\n const encoding: BufferEncoding = isBase64Encoded ? 'base64' : 'utf8';\n\n const buffer = Buffer.from(body, encoding);\n const contentLength = Buffer.byteLength(buffer, encoding);\n\n return [buffer, contentLength];\n}\n","//#region Imports\n\nimport type { BothValueHeaders } from '../@types';\n\n//#endregion\n\n/**\n * Transform a header map and make sure the value is not an array\n *\n * @example\n * ```typescript\n * const headers = { 'accept-encoding': 'gzip', 'accept-language': ['en-US', 'en;q=0.9'] };\n * const flattenedHeaders = getFlattenedHeadersMap(headers, ',', true);\n * console.log(flattenedHeaders);\n * // { 'accept-encoding': 'gzip', 'accept-language': 'en-US,en;q=0.9' }\n * ```\n *\n * @param headersMap - The initial headers\n * @param separator - The separator used when we join the array of header's value\n * @param lowerCaseKey - Should put all keys in lowercase\n *\n * @breadcrumb Core / Headers\n * @public\n */\nexport function getFlattenedHeadersMap(\n headersMap: BothValueHeaders,\n separator: string = ',',\n lowerCaseKey: boolean = false,\n): Record<string, string> {\n return Object.keys(headersMap).reduce((acc, headerKey) => {\n const newKey = lowerCaseKey ? headerKey.toLowerCase() : headerKey;\n const headerValue = headersMap[headerKey];\n\n if (Array.isArray(headerValue)) acc[newKey] = headerValue.join(separator);\n else acc[newKey] = (headerValue ?? '') + '';\n\n return acc;\n }, {});\n}\n\n/**\n * Transforms a header map into a multi-value map header.\n *\n * @example\n * ```typescript\n * const headers = { 'accept-encoding': 'gzip', 'connection': ['keep-alive'] };\n * const multiValueHeaders = getMultiValueHeadersMap(headers);\n * console.log(multiValueHeaders);\n * // { 'accept-encoding': ['gzip'], 'connection': ['keep-alive'] }\n * ```\n *\n * @param headersMap - The initial headers\n *\n * @breadcrumb Core / Headers\n * @public\n */\nexport function getMultiValueHeadersMap(\n headersMap: BothValueHeaders,\n): Record<string, string[]> {\n return Object.keys(headersMap).reduce((acc, headerKey) => {\n const headerValue = headersMap[headerKey];\n\n acc[headerKey.toLowerCase()] = Array.isArray(headerValue)\n ? headerValue.map(String)\n : [String(headerValue)];\n\n return acc;\n }, {});\n}\n\n/**\n * The wrapper that holds the information about single value headers and cookies\n *\n * @breadcrumb Core / Headers\n * @public\n */\nexport type FlattenedHeadersAndCookies = {\n /**\n * Just the single value headers\n */\n headers: Record<string, string>;\n\n /**\n * The list of cookies\n */\n cookies: string[];\n};\n\n/**\n * Transforms a header map into a single value headers and cookies\n *\n * @param headersMap - The initial headers\n *\n * @breadcrumb Core / Headers\n * @public\n */\nexport function getFlattenedHeadersMapAndCookies(\n headersMap: BothValueHeaders,\n): FlattenedHeadersAndCookies {\n return Object.keys(headersMap).reduce(\n (acc, headerKey) => {\n const headerValue = headersMap[headerKey];\n const lowerHeaderKey = headerKey.toLowerCase();\n\n if (Array.isArray(headerValue)) {\n if (lowerHeaderKey !== 'set-cookie')\n acc.headers[headerKey] = headerValue.join(',');\n else acc.cookies.push(...headerValue);\n } else {\n if (lowerHeaderKey === 'set-cookie' && headerValue !== undefined)\n acc.cookies.push(headerValue ?? '');\n else acc.headers[headerKey] = String(headerValue ?? '');\n }\n\n return acc;\n },\n {\n cookies: [],\n headers: {},\n } as FlattenedHeadersAndCookies,\n );\n}\n\n/**\n * Parse HTTP Raw Headers\n * Attribution to {@link https://github.com/kesla/parse-headers/blob/master/parse-headers.js}\n *\n * @param headers - The raw headers\n *\n * @breadcrumb Core / Headers\n * @public\n */\nexport function parseHeaders(\n headers: string,\n): Record<string, string | string[]> {\n if (!headers) return {};\n\n const result = {};\n const headersArr = headers.trim().split('\\n');\n\n for (let i = 0; i < headersArr.length; i++) {\n const row = headersArr[i];\n const index = row.indexOf(':');\n const key = row.slice(0, index).trim().toLowerCase();\n const value = row.slice(index + 1).trim();\n\n if (typeof result[key] === 'undefined') result[key] = value;\n else if (Array.isArray(result[key])) result[key].push(value);\n else result[key] = [result[key], value];\n }\n\n return result;\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","/**\n * Transform the path and a map of query params to a string with formatted query params\n *\n * @example\n * ```typescript\n * const path = '/pets/search';\n * const queryParams = { batata: undefined, petType: [ 'dog', 'fish' ] };\n * const result = getPathWithQueryStringParams(path, queryParams);\n * console.log(result);\n * // /pets/search?batata=&petType=dog&petType=fish\n * ```\n *\n * @param path - The path\n * @param queryParams - The query params\n *\n * @breadcrumb Core / Path\n * @public\n */\nexport function getPathWithQueryStringParams(\n path: string,\n queryParams:\n | string\n | Record<string, string | string[] | undefined>\n | undefined\n | null,\n): string {\n if (String(queryParams || '').length === 0) return path;\n\n if (typeof queryParams === 'string') return `${path}?${queryParams}`;\n\n const queryParamsString = getQueryParamsStringFromRecord(queryParams);\n\n if (!queryParamsString) return path;\n\n return `${path}?${queryParamsString}`;\n}\n\n/**\n * Map query params to a string with formatted query params\n *\n * @example\n * ```typescript\n * const queryParams = { batata: undefined, petType: [ 'dog', 'fish' ] };\n * const result = getQueryParamsStringFromRecord(queryParams);\n * console.log(result);\n * // batata=&petType=dog&petType=fish\n * ```\n *\n * @param queryParamsRecord - The query params record\n *\n * @breadcrumb Core / Path\n * @public\n */\nexport function getQueryParamsStringFromRecord(\n queryParamsRecord:\n | Record<string, string | string[] | undefined>\n | undefined\n | null,\n): string {\n const searchParams = new URLSearchParams();\n\n const multiValueHeadersEntries: [string, string | string[] | undefined][] =\n Object.entries(queryParamsRecord || {});\n\n if (multiValueHeadersEntries.length === 0) return '';\n\n for (const [key, value] of multiValueHeadersEntries) {\n if (!Array.isArray(value)) {\n searchParams.append(key, value || '');\n continue;\n }\n\n for (const arrayValue of value) searchParams.append(key, arrayValue);\n }\n\n return searchParams.toString();\n}\n\n/**\n * Type of the function to strip base path\n *\n * @breadcrumb Core / Path\n * @public\n */\nexport type StripBasePathFn = (path: string) => string;\n\nconst NOOPBasePath: StripBasePathFn = (path: string) => path;\n\n/**\n * Get the strip base path function\n *\n * @param basePath - The base path\n *\n * @breadcrumb Core / Path\n * @public\n */\nexport function buildStripBasePath(\n basePath: string | undefined,\n): StripBasePathFn {\n if (!basePath) return NOOPBasePath;\n\n const length = basePath.length;\n\n return (path: string) => {\n if (path.startsWith(basePath))\n return path.slice(path.indexOf(basePath) + length, path.length) || '/';\n\n return path;\n };\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","//#region Imports\n\n//#region Imports\n\nimport type {\n DigitalOceanHttpEvent,\n DigitalOceanHttpResponse,\n} from '../../@types/digital-ocean';\nimport type {\n AdapterContract,\n AdapterRequest,\n GetResponseAdapterProps,\n OnErrorProps,\n} from '../../contracts';\nimport {\n getDefaultIfUndefined,\n getEventBodyAsBuffer,\n getFlattenedHeadersMap,\n getPathWithQueryStringParams,\n} from '../../core';\n\n//#endregion\n\n/**\n * The options to customize the {@link HttpFunctionAdapter}\n *\n * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter\n * @public\n */\nexport interface HttpFunctionAdapterOptions {\n /**\n * Strip base path for custom domains\n *\n * @defaultValue ''\n */\n stripBasePath?: string;\n}\n\n/**\n * The adapter to handle requests from Digital Ocean Functions when called from HTTP Endpoint.\n *\n * @example\n * ```typescript\n * const stripBasePath = '/any/custom/base/path'; // default ''\n * const adapter = new HttpFunctionAdapter({ stripBasePath });\n * ```\n *\n * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter\n * @public\n */\nexport class HttpFunctionAdapter\n implements\n AdapterContract<DigitalOceanHttpEvent, void, DigitalOceanHttpResponse>\n{\n //#region Constructor\n\n /**\n * Default constructor\n *\n * @param options - The options to customize the {@link HttpFunctionAdapter}\n */\n constructor(protected readonly options?: HttpFunctionAdapterOptions) {}\n\n //#endregion\n\n //#region Public Methods\n\n /**\n * {@inheritDoc}\n */\n public getAdapterName(): string {\n return HttpFunctionAdapter.name;\n }\n\n /**\n * {@inheritDoc}\n */\n public canHandle(event: unknown): event is DigitalOceanHttpEvent {\n const digitalOceanHttpEvent = event as DigitalOceanHttpEvent;\n\n return (\n !!digitalOceanHttpEvent &&\n digitalOceanHttpEvent.__ow_path !== undefined &&\n digitalOceanHttpEvent.__ow_method !== undefined &&\n digitalOceanHttpEvent.__ow_headers !== undefined\n );\n }\n\n /**\n * {@inheritDoc}\n */\n public getRequest(event: DigitalOceanHttpEvent): AdapterRequest {\n const headers = event.__ow_headers;\n const method = event.__ow_method.toUpperCase();\n const path = this.getPathFromEvent(event);\n\n let body: Buffer | undefined;\n\n if (event.__ow_body) {\n const [bufferBody, contentLength] = getEventBodyAsBuffer(\n event.__ow_body,\n !!event.__ow_isBase64Encoded,\n );\n\n body = bufferBody;\n headers['content-length'] = String(contentLength);\n }\n\n const remoteAddress = headers['x-forwarded-for'];\n\n return {\n method,\n headers,\n body,\n remoteAddress,\n path,\n };\n }\n\n /**\n * {@inheritDoc}\n */\n public getResponse({\n headers: responseHeaders,\n body,\n statusCode,\n }: GetResponseAdapterProps<DigitalOceanHttpEvent>): DigitalOceanHttpResponse {\n const headers = getFlattenedHeadersMap(responseHeaders);\n\n return {\n statusCode,\n body,\n headers,\n };\n }\n\n /**\n * {@inheritDoc}\n */\n public onErrorWhileForwarding({\n error,\n delegatedResolver,\n respondWithErrors,\n event,\n log,\n }: OnErrorProps<DigitalOceanHttpEvent, DigitalOceanHttpResponse>): void {\n const body = respondWithErrors ? error.stack : '';\n const errorResponse = this.getResponse({\n event,\n statusCode: 500,\n body: body || '',\n headers: {},\n isBase64Encoded: false,\n log,\n });\n\n delegatedResolver.succeed(errorResponse);\n }\n\n //#endregion\n\n //#region Protected Methods\n\n /**\n * Get path from event with query strings\n *\n * @param event - The event sent by digital ocean\n */\n protected getPathFromEvent(event: DigitalOceanHttpEvent): string {\n const stripBasePath = getDefaultIfUndefined(\n this.options?.stripBasePath,\n '',\n );\n const replaceRegex = new RegExp(`^${stripBasePath}`);\n\n const path = event.__ow_path.replace(replaceRegex, '');\n const queryParams = event.__ow_query;\n\n return getPathWithQueryStringParams(path, queryParams || {});\n }\n\n //#endregion\n}\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GCCA,IAAAI,EAAgC,gBCAhC,IAAAC,EAAgD,gBCKzC,SAASC,EAAUC,EAAiC,CACzD,GAAI,OAAO,SAASA,CAAI,EAAG,OAAOA,EAAK,SAAS,MAAM,EACjD,GAAI,OAAOA,GAAS,SAAU,OAAOA,EACrC,GAAIA,aAAgB,WAAY,OAAO,IAAI,YAAY,EAAE,OAAOA,CAAI,EACpE,MAAM,IAAI,MAAM,wCAAwC,OAAOA,CAAI,EAAE,CAC5E,CALgBC,EAAAF,EAAA,aDAhB,IAAMG,EAAY;AAAA;AAAA,EAEZC,EAAO,OAAO,eAAe,EAC7BC,EAAU,OAAO,kBAAkB,EAEzC,SAASC,EAAQC,EAA4BC,EAA2B,CACtE,GACE,OAAO,SAASA,CAAI,GACpB,OAAOA,GAAS,UAChBA,aAAgB,WAEhBD,EAAOH,CAAI,EAAE,KAAK,OAAO,KAAKI,CAAI,CAAC,MAChC,OAAM,IAAI,MAAM,wCAAwC,OAAOA,CAAI,EAAE,CAC5E,CARSC,EAAAH,EAAA,WA8BF,IAAMI,EAAN,MAAMC,UAA2B,gBAAe,CAzCvD,MAyCuD,CAAAF,EAAA,2BACrD,YAAY,CAAE,OAAAG,CAAO,EAA4B,CAC/C,MAAM,CAAE,OAAAA,CAAO,CAAQ,EAEvB,KAAKR,CAAI,EAAI,CAAC,EACd,KAAKC,CAAO,EAAI,CAAC,EAEjB,KAAK,4BAA8B,GACnC,KAAK,gBAAkB,GACvB,KAAK,QAAU,GAEf,IAAMQ,EAAoD,CACxD,eAAgB,CAAC,EACjB,SAAU,GACV,GAAIC,EACJ,eAAgBA,EAChB,QAASA,EACT,KAAMA,EACN,OAAQA,EACR,MAAO,CACLN,EACAO,EACAC,IACQ,CAMR,GALI,OAAOD,GAAa,aACtBC,EAAKD,EACLA,EAAW,MAGT,KAAK,UAAY,IAAM,KAAK,aAAcT,EAAQ,KAAME,CAAI,MAC3D,CACH,IAAMS,EAASC,EAAUV,CAAI,EACvBW,EAAQF,EAAO,QAAQd,CAAS,EAEtC,GAAIgB,IAAU,GAAI,CAChB,IAAMC,EAAYH,EAAO,MAAME,EAAQhB,EAAU,MAAM,EAEnDiB,GAAWd,EAAQ,KAAMc,CAAS,EAEtC,KAAK,aAAe,EACtB,CACF,CAEI,OAAOJ,GAAO,YAAYA,EAAG,CACnC,CACF,EAEA,KAAK,aAAaH,CAA2B,CAC/C,CAEA,QACA,SACA,aAEA,CAACT,CAAI,EACL,CAACC,CAAO,EAER,IAAI,SAA4B,CAC9B,OAAO,KAAKA,CAAO,CACrB,CAEA,OAAO,KAAKgB,EAAsB,CAChC,IAAMC,EAAW,IAAIX,EAAmB,CAAE,OAAQU,EAAI,MAAO,CAAC,EAE9D,OAAAC,EAAS,WAAaD,EAAI,YAAc,EACxCC,EAASjB,CAAO,EAAIgB,EAAI,QACxBC,EAASlB,CAAI,EAAKiB,EAAY,KAAO,CAAC,OAAO,KAAMA,EAAY,IAAI,CAAC,EAAI,CAAC,EACzEC,EAAS,IAAI,EAENA,CACT,CAEA,OAAO,KAAKD,EAAiC,CAC3C,OAAO,OAAO,OAAOA,EAAIjB,CAAI,CAAC,CAChC,CAEA,OAAO,QAAQiB,EAAyB,CACtC,IAAME,EAAUF,EAAI,WAAW,EAE/B,OAAO,OAAO,OAAOE,EAASF,EAAIhB,CAAO,CAAC,CAC5C,CAES,UACPmB,EACAC,EACK,CACD,KAAK,aAAc,KAAKpB,CAAO,EAAEmB,CAAG,EAAIC,EACvC,MAAM,UAAUD,EAAKC,CAAK,CACjC,CAES,UACPC,EACAC,EACAC,EACK,CACL,IAAMC,EACJ,OAAOF,GAAkB,SAAWC,EAAMD,EAEtCG,EAAe,MAAM,QAAQD,CAAiB,EAChDA,EACA,CAACA,GAAqB,CAAC,CAAC,EAE5B,QAAWN,KAAWO,EACpB,QAAWC,KAAQR,EAGjB,GAFA,KAAK,UAAUQ,EAAMR,EAAQQ,CAAI,CAAE,EAE/B,CAAC,KAAK,aAGR,MAKN,OAAO,KAAK,oBAAoBL,EAAYC,EAAeC,CAAG,CAChE,CASU,oBACRF,EACAC,EACAC,EACM,CACN,OAAO,MAAM,UAAUF,EAAYC,EAAeC,CAAG,CACvD,CACF,EE5KA,IAAAI,EAA+B,gBCmBxB,SAASC,EACdC,EACAC,EACuC,CACvC,IAAMC,EAA2BD,EAAkB,SAAW,OAExDE,EAAS,OAAO,KAAKH,EAAME,CAAQ,EACnCE,EAAgB,OAAO,WAAWD,EAAQD,CAAQ,EAExD,MAAO,CAACC,EAAQC,CAAa,CAC/B,CAVgBC,EAAAN,EAAA,wBCKT,SAASO,EACdC,EACAC,EAAoB,IACpBC,EAAwB,GACA,CACxB,OAAO,OAAO,KAAKF,CAAU,EAAE,OAAO,CAACG,EAAKC,IAAc,CACxD,IAAMC,EAASH,EAAeE,EAAU,YAAY,EAAIA,EAClDE,EAAcN,EAAWI,CAAS,EAExC,OAAI,MAAM,QAAQE,CAAW,EAAGH,EAAIE,CAAM,EAAIC,EAAY,KAAKL,CAAS,EACnEE,EAAIE,CAAM,GAAKC,GAAe,IAAM,GAElCH,CACT,EAAG,CAAC,CAAC,CACP,CAdgBI,EAAAR,EAAA,0BClBT,IAAMS,EAAiCC,EAAA,IAAG,GAAH,SC+C9C,IAAMC,GAAuB,OAAO,gBAAgB,ECjC7C,SAASC,EACdC,EACAC,EACG,CACH,OAAID,IAAU,OAAkBC,EAEzBD,CACT,CAPgBE,EAAAH,EAAA,yBCFT,SAASI,EACdC,EACAC,EAKQ,CACR,GAAI,OAAOA,GAAe,EAAE,EAAE,SAAW,EAAG,OAAOD,EAEnD,GAAI,OAAOC,GAAgB,SAAU,MAAO,GAAGD,CAAI,IAAIC,CAAW,GAElE,IAAMC,EAAoBC,EAA+BF,CAAW,EAEpE,OAAKC,EAEE,GAAGF,CAAI,IAAIE,CAAiB,GAFJF,CAGjC,CAjBgBI,EAAAL,EAAA,gCAmCT,SAASI,EACdE,EAIQ,CACR,IAAMC,EAAe,IAAI,gBAEnBC,EACJ,OAAO,QAAQF,GAAqB,CAAC,CAAC,EAExC,GAAIE,EAAyB,SAAW,EAAG,MAAO,GAElD,OAAW,CAACC,EAAKC,CAAK,IAAKF,EAA0B,CACnD,GAAI,CAAC,MAAM,QAAQE,CAAK,EAAG,CACzBH,EAAa,OAAOE,EAAKC,GAAS,EAAE,EACpC,QACF,CAEA,QAAWC,KAAcD,EAAOH,EAAa,OAAOE,EAAKE,CAAU,CACrE,CAEA,OAAOJ,EAAa,SAAS,CAC/B,CAvBgBF,EAAAD,EAAA,kCCnDhB,IAAAQ,GAAmC,kBCgD5B,IAAMC,EAAN,MAAMC,CAGb,CAQE,YAA+BC,EAAsC,CAAtC,aAAAA,CAAuC,CA7DxE,MAqDA,CAAAC,EAAA,4BAiBS,gBAAyB,CAC9B,OAAOF,EAAoB,IAC7B,CAKO,UAAUG,EAAgD,CAC/D,IAAMC,EAAwBD,EAE9B,MACE,CAAC,CAACC,GACFA,EAAsB,YAAc,QACpCA,EAAsB,cAAgB,QACtCA,EAAsB,eAAiB,MAE3C,CAKO,WAAWD,EAA8C,CAC9D,IAAME,EAAUF,EAAM,aAChBG,EAASH,EAAM,YAAY,YAAY,EACvCI,EAAO,KAAK,iBAAiBJ,CAAK,EAEpCK,EAEJ,GAAIL,EAAM,UAAW,CACnB,GAAM,CAACM,EAAYC,CAAa,EAAIC,EAClCR,EAAM,UACN,CAAC,CAACA,EAAM,oBACV,EAEAK,EAAOC,EACPJ,EAAQ,gBAAgB,EAAI,OAAOK,CAAa,CAClD,CAEA,IAAME,EAAgBP,EAAQ,iBAAiB,EAE/C,MAAO,CACL,OAAAC,EACA,QAAAD,EACA,KAAAG,EACA,cAAAI,EACA,KAAAL,CACF,CACF,CAKO,YAAY,CACjB,QAASM,EACT,KAAAL,EACA,WAAAM,CACF,EAA6E,CAC3E,IAAMT,EAAUU,EAAuBF,CAAe,EAEtD,MAAO,CACL,WAAAC,EACA,KAAAN,EACA,QAAAH,CACF,CACF,CAKO,uBAAuB,CAC5B,MAAAW,EACA,kBAAAC,EACA,kBAAAC,EACA,MAAAf,EACA,IAAAgB,CACF,EAAwE,CACtE,IAAMX,EAAOU,EAAoBF,EAAM,MAAQ,GACzCI,EAAgB,KAAK,YAAY,CACrC,MAAAjB,EACA,WAAY,IACZ,KAAMK,GAAQ,GACd,QAAS,CAAC,EACV,gBAAiB,GACjB,IAAAW,CACF,CAAC,EAEDF,EAAkB,QAAQG,CAAa,CACzC,CAWU,iBAAiBjB,EAAsC,CAC/D,IAAMkB,EAAgBC,EACpB,KAAK,SAAS,cACd,EACF,EACMC,EAAe,IAAI,OAAO,IAAIF,CAAa,EAAE,EAE7Cd,EAAOJ,EAAM,UAAU,QAAQoB,EAAc,EAAE,EAC/CC,EAAcrB,EAAM,WAE1B,OAAOsB,EAA6BlB,EAAMiB,GAAe,CAAC,CAAC,CAC7D,CAGF","names":["digital_ocean_exports","__export","HttpFunctionAdapter","__toCommonJS","import_node_http","import_node_http","getString","data","__name","headerEnd","BODY","HEADERS","addData","stream","data","__name","ServerlessResponse","_ServerlessResponse","method","socket","NO_OP","encoding","cb","string","getString","index","remainder","res","response","headers","key","value","statusCode","statusMessage","obj","headersObjOrArray","arrayHeaders","name","import_node_http","getEventBodyAsBuffer","body","isBase64Encoded","encoding","buffer","contentLength","__name","getFlattenedHeadersMap","headersMap","separator","lowerCaseKey","acc","headerKey","newKey","headerValue","__name","NO_OP","__name","InternalLoggerSymbol","getDefaultIfUndefined","value","defaultValue","__name","getPathWithQueryStringParams","path","queryParams","queryParamsString","getQueryParamsStringFromRecord","__name","queryParamsRecord","searchParams","multiValueHeadersEntries","key","value","arrayValue","import_node_stream","HttpFunctionAdapter","_HttpFunctionAdapter","options","__name","event","digitalOceanHttpEvent","headers","method","path","body","bufferBody","contentLength","getEventBodyAsBuffer","remoteAddress","responseHeaders","statusCode","getFlattenedHeadersMap","error","delegatedResolver","respondWithErrors","log","errorResponse","stripBasePath","getDefaultIfUndefined","replaceRegex","queryParams","getPathWithQueryStringParams"]}
@@ -0,0 +1,126 @@
1
+ import { S as SingleValueHeaders } from '../../headers-K2qbcurv.cjs';
2
+ import { A as AdapterContract, a as AdapterRequest, G as GetResponseAdapterProps, O as OnErrorProps } from '../../adapter.contract-y5xSjOjo.cjs';
3
+ import 'http';
4
+ import 'node:http';
5
+ import '../../logger-9me5n48P.cjs';
6
+
7
+ /**
8
+ * The interface to represents the values of args send when someone calls a function using HTTP Endpoint.
9
+ * To be able to receive this event, inside your `project.yml`, instead of `web: true` change to `web: 'raw'`.
10
+ *
11
+ * {@link https://www.digitalocean.com/community/questions/digitalocean-functions-how-to-differentiate-query-params-from-body-params | Reference}
12
+ *
13
+ * @public
14
+ * @breadcrumb Types / Digital Ocean / DigitalOceanHttpEvent
15
+ */
16
+ interface DigitalOceanHttpEvent {
17
+ /**
18
+ * The HTTP Method of the request
19
+ */
20
+ __ow_method: string;
21
+ /**
22
+ * The query porams of the request
23
+ */
24
+ __ow_query: string;
25
+ /**
26
+ * The body of the request.
27
+ */
28
+ __ow_body?: string;
29
+ /**
30
+ * Indicates if body is base64 string
31
+ */
32
+ __ow_isBase64Encoded?: boolean;
33
+ /**
34
+ * The HTTP Headers of the request
35
+ */
36
+ __ow_headers: SingleValueHeaders;
37
+ /**
38
+ * The path in the request
39
+ */
40
+ __ow_path: string;
41
+ }
42
+
43
+ /**
44
+ * The interface to represents the response of Digital Ocean Function.
45
+ *
46
+ * @public
47
+ * @breadcrumb Types / Digital Ocean / DigitalOceanHttpResponse
48
+ */
49
+ interface DigitalOceanHttpResponse {
50
+ /**
51
+ * The HTTP Headers of the response
52
+ */
53
+ headers?: SingleValueHeaders;
54
+ /**
55
+ * The body of the response
56
+ */
57
+ body: unknown;
58
+ /**
59
+ * The HTTP Status code of the response
60
+ */
61
+ statusCode: number;
62
+ }
63
+
64
+ /**
65
+ * The options to customize the {@link HttpFunctionAdapter}
66
+ *
67
+ * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter
68
+ * @public
69
+ */
70
+ interface HttpFunctionAdapterOptions {
71
+ /**
72
+ * Strip base path for custom domains
73
+ *
74
+ * @defaultValue ''
75
+ */
76
+ stripBasePath?: string;
77
+ }
78
+ /**
79
+ * The adapter to handle requests from Digital Ocean Functions when called from HTTP Endpoint.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const stripBasePath = '/any/custom/base/path'; // default ''
84
+ * const adapter = new HttpFunctionAdapter({ stripBasePath });
85
+ * ```
86
+ *
87
+ * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter
88
+ * @public
89
+ */
90
+ declare class HttpFunctionAdapter implements AdapterContract<DigitalOceanHttpEvent, void, DigitalOceanHttpResponse> {
91
+ protected readonly options?: HttpFunctionAdapterOptions | undefined;
92
+ /**
93
+ * Default constructor
94
+ *
95
+ * @param options - The options to customize the {@link HttpFunctionAdapter}
96
+ */
97
+ constructor(options?: HttpFunctionAdapterOptions | undefined);
98
+ /**
99
+ * {@inheritDoc}
100
+ */
101
+ getAdapterName(): string;
102
+ /**
103
+ * {@inheritDoc}
104
+ */
105
+ canHandle(event: unknown): event is DigitalOceanHttpEvent;
106
+ /**
107
+ * {@inheritDoc}
108
+ */
109
+ getRequest(event: DigitalOceanHttpEvent): AdapterRequest;
110
+ /**
111
+ * {@inheritDoc}
112
+ */
113
+ getResponse({ headers: responseHeaders, body, statusCode, }: GetResponseAdapterProps<DigitalOceanHttpEvent>): DigitalOceanHttpResponse;
114
+ /**
115
+ * {@inheritDoc}
116
+ */
117
+ onErrorWhileForwarding({ error, delegatedResolver, respondWithErrors, event, log, }: OnErrorProps<DigitalOceanHttpEvent, DigitalOceanHttpResponse>): void;
118
+ /**
119
+ * Get path from event with query strings
120
+ *
121
+ * @param event - The event sent by digital ocean
122
+ */
123
+ protected getPathFromEvent(event: DigitalOceanHttpEvent): string;
124
+ }
125
+
126
+ export { HttpFunctionAdapter, type HttpFunctionAdapterOptions };
@@ -0,0 +1,126 @@
1
+ import { S as SingleValueHeaders } from '../../headers-K2qbcurv.js';
2
+ import { A as AdapterContract, a as AdapterRequest, G as GetResponseAdapterProps, O as OnErrorProps } from '../../adapter.contract-EQE3rlgO.js';
3
+ import 'http';
4
+ import 'node:http';
5
+ import '../../logger-9me5n48P.js';
6
+
7
+ /**
8
+ * The interface to represents the values of args send when someone calls a function using HTTP Endpoint.
9
+ * To be able to receive this event, inside your `project.yml`, instead of `web: true` change to `web: 'raw'`.
10
+ *
11
+ * {@link https://www.digitalocean.com/community/questions/digitalocean-functions-how-to-differentiate-query-params-from-body-params | Reference}
12
+ *
13
+ * @public
14
+ * @breadcrumb Types / Digital Ocean / DigitalOceanHttpEvent
15
+ */
16
+ interface DigitalOceanHttpEvent {
17
+ /**
18
+ * The HTTP Method of the request
19
+ */
20
+ __ow_method: string;
21
+ /**
22
+ * The query porams of the request
23
+ */
24
+ __ow_query: string;
25
+ /**
26
+ * The body of the request.
27
+ */
28
+ __ow_body?: string;
29
+ /**
30
+ * Indicates if body is base64 string
31
+ */
32
+ __ow_isBase64Encoded?: boolean;
33
+ /**
34
+ * The HTTP Headers of the request
35
+ */
36
+ __ow_headers: SingleValueHeaders;
37
+ /**
38
+ * The path in the request
39
+ */
40
+ __ow_path: string;
41
+ }
42
+
43
+ /**
44
+ * The interface to represents the response of Digital Ocean Function.
45
+ *
46
+ * @public
47
+ * @breadcrumb Types / Digital Ocean / DigitalOceanHttpResponse
48
+ */
49
+ interface DigitalOceanHttpResponse {
50
+ /**
51
+ * The HTTP Headers of the response
52
+ */
53
+ headers?: SingleValueHeaders;
54
+ /**
55
+ * The body of the response
56
+ */
57
+ body: unknown;
58
+ /**
59
+ * The HTTP Status code of the response
60
+ */
61
+ statusCode: number;
62
+ }
63
+
64
+ /**
65
+ * The options to customize the {@link HttpFunctionAdapter}
66
+ *
67
+ * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter
68
+ * @public
69
+ */
70
+ interface HttpFunctionAdapterOptions {
71
+ /**
72
+ * Strip base path for custom domains
73
+ *
74
+ * @defaultValue ''
75
+ */
76
+ stripBasePath?: string;
77
+ }
78
+ /**
79
+ * The adapter to handle requests from Digital Ocean Functions when called from HTTP Endpoint.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const stripBasePath = '/any/custom/base/path'; // default ''
84
+ * const adapter = new HttpFunctionAdapter({ stripBasePath });
85
+ * ```
86
+ *
87
+ * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter
88
+ * @public
89
+ */
90
+ declare class HttpFunctionAdapter implements AdapterContract<DigitalOceanHttpEvent, void, DigitalOceanHttpResponse> {
91
+ protected readonly options?: HttpFunctionAdapterOptions | undefined;
92
+ /**
93
+ * Default constructor
94
+ *
95
+ * @param options - The options to customize the {@link HttpFunctionAdapter}
96
+ */
97
+ constructor(options?: HttpFunctionAdapterOptions | undefined);
98
+ /**
99
+ * {@inheritDoc}
100
+ */
101
+ getAdapterName(): string;
102
+ /**
103
+ * {@inheritDoc}
104
+ */
105
+ canHandle(event: unknown): event is DigitalOceanHttpEvent;
106
+ /**
107
+ * {@inheritDoc}
108
+ */
109
+ getRequest(event: DigitalOceanHttpEvent): AdapterRequest;
110
+ /**
111
+ * {@inheritDoc}
112
+ */
113
+ getResponse({ headers: responseHeaders, body, statusCode, }: GetResponseAdapterProps<DigitalOceanHttpEvent>): DigitalOceanHttpResponse;
114
+ /**
115
+ * {@inheritDoc}
116
+ */
117
+ onErrorWhileForwarding({ error, delegatedResolver, respondWithErrors, event, log, }: OnErrorProps<DigitalOceanHttpEvent, DigitalOceanHttpResponse>): void;
118
+ /**
119
+ * Get path from event with query strings
120
+ *
121
+ * @param event - The event sent by digital ocean
122
+ */
123
+ protected getPathFromEvent(event: DigitalOceanHttpEvent): string;
124
+ }
125
+
126
+ export { HttpFunctionAdapter, type HttpFunctionAdapterOptions };
@@ -0,0 +1,2 @@
1
+ import{g as i,h as d,s as c,t as g}from"../../chunk-HU5XBQCP.mjs";import{a as p}from"../../chunk-OYOJMOFP.mjs";var l=class u{constructor(t){this.options=t}static{p(this,"HttpFunctionAdapter")}getAdapterName(){return u.name}canHandle(t){let e=t;return!!e&&e.__ow_path!==void 0&&e.__ow_method!==void 0&&e.__ow_headers!==void 0}getRequest(t){let e=t.__ow_headers,n=t.__ow_method.toUpperCase(),o=this.getPathFromEvent(t),r;if(t.__ow_body){let[s,_]=i(t.__ow_body,!!t.__ow_isBase64Encoded);r=s,e["content-length"]=String(_)}let a=e["x-forwarded-for"];return{method:n,headers:e,body:r,remoteAddress:a,path:o}}getResponse({headers:t,body:e,statusCode:n}){let o=d(t);return{statusCode:n,body:e,headers:o}}onErrorWhileForwarding({error:t,delegatedResolver:e,respondWithErrors:n,event:o,log:r}){let a=n?t.stack:"",s=this.getResponse({event:o,statusCode:500,body:a||"",headers:{},isBase64Encoded:!1,log:r});e.succeed(s)}getPathFromEvent(t){let e=c(this.options?.stripBasePath,""),n=new RegExp(`^${e}`),o=t.__ow_path.replace(n,""),r=t.__ow_query;return g(o,r||{})}};export{l as HttpFunctionAdapter};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/digital-ocean/http-function.adapter.ts"],"sourcesContent":["//#region Imports\n\n//#region Imports\n\nimport type {\n DigitalOceanHttpEvent,\n DigitalOceanHttpResponse,\n} from '../../@types/digital-ocean';\nimport type {\n AdapterContract,\n AdapterRequest,\n GetResponseAdapterProps,\n OnErrorProps,\n} from '../../contracts';\nimport {\n getDefaultIfUndefined,\n getEventBodyAsBuffer,\n getFlattenedHeadersMap,\n getPathWithQueryStringParams,\n} from '../../core';\n\n//#endregion\n\n/**\n * The options to customize the {@link HttpFunctionAdapter}\n *\n * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter\n * @public\n */\nexport interface HttpFunctionAdapterOptions {\n /**\n * Strip base path for custom domains\n *\n * @defaultValue ''\n */\n stripBasePath?: string;\n}\n\n/**\n * The adapter to handle requests from Digital Ocean Functions when called from HTTP Endpoint.\n *\n * @example\n * ```typescript\n * const stripBasePath = '/any/custom/base/path'; // default ''\n * const adapter = new HttpFunctionAdapter({ stripBasePath });\n * ```\n *\n * @breadcrumb Adapters / Digital Ocean / HttpFunctionAdapter\n * @public\n */\nexport class HttpFunctionAdapter\n implements\n AdapterContract<DigitalOceanHttpEvent, void, DigitalOceanHttpResponse>\n{\n //#region Constructor\n\n /**\n * Default constructor\n *\n * @param options - The options to customize the {@link HttpFunctionAdapter}\n */\n constructor(protected readonly options?: HttpFunctionAdapterOptions) {}\n\n //#endregion\n\n //#region Public Methods\n\n /**\n * {@inheritDoc}\n */\n public getAdapterName(): string {\n return HttpFunctionAdapter.name;\n }\n\n /**\n * {@inheritDoc}\n */\n public canHandle(event: unknown): event is DigitalOceanHttpEvent {\n const digitalOceanHttpEvent = event as DigitalOceanHttpEvent;\n\n return (\n !!digitalOceanHttpEvent &&\n digitalOceanHttpEvent.__ow_path !== undefined &&\n digitalOceanHttpEvent.__ow_method !== undefined &&\n digitalOceanHttpEvent.__ow_headers !== undefined\n );\n }\n\n /**\n * {@inheritDoc}\n */\n public getRequest(event: DigitalOceanHttpEvent): AdapterRequest {\n const headers = event.__ow_headers;\n const method = event.__ow_method.toUpperCase();\n const path = this.getPathFromEvent(event);\n\n let body: Buffer | undefined;\n\n if (event.__ow_body) {\n const [bufferBody, contentLength] = getEventBodyAsBuffer(\n event.__ow_body,\n !!event.__ow_isBase64Encoded,\n );\n\n body = bufferBody;\n headers['content-length'] = String(contentLength);\n }\n\n const remoteAddress = headers['x-forwarded-for'];\n\n return {\n method,\n headers,\n body,\n remoteAddress,\n path,\n };\n }\n\n /**\n * {@inheritDoc}\n */\n public getResponse({\n headers: responseHeaders,\n body,\n statusCode,\n }: GetResponseAdapterProps<DigitalOceanHttpEvent>): DigitalOceanHttpResponse {\n const headers = getFlattenedHeadersMap(responseHeaders);\n\n return {\n statusCode,\n body,\n headers,\n };\n }\n\n /**\n * {@inheritDoc}\n */\n public onErrorWhileForwarding({\n error,\n delegatedResolver,\n respondWithErrors,\n event,\n log,\n }: OnErrorProps<DigitalOceanHttpEvent, DigitalOceanHttpResponse>): void {\n const body = respondWithErrors ? error.stack : '';\n const errorResponse = this.getResponse({\n event,\n statusCode: 500,\n body: body || '',\n headers: {},\n isBase64Encoded: false,\n log,\n });\n\n delegatedResolver.succeed(errorResponse);\n }\n\n //#endregion\n\n //#region Protected Methods\n\n /**\n * Get path from event with query strings\n *\n * @param event - The event sent by digital ocean\n */\n protected getPathFromEvent(event: DigitalOceanHttpEvent): string {\n const stripBasePath = getDefaultIfUndefined(\n this.options?.stripBasePath,\n '',\n );\n const replaceRegex = new RegExp(`^${stripBasePath}`);\n\n const path = event.__ow_path.replace(replaceRegex, '');\n const queryParams = event.__ow_query;\n\n return getPathWithQueryStringParams(path, queryParams || {});\n }\n\n //#endregion\n}\n"],"mappings":"+GAkDO,IAAMA,EAAN,MAAMC,CAGb,CAQE,YAA+BC,EAAsC,CAAtC,aAAAA,CAAuC,CA7DxE,MAqDA,CAAAC,EAAA,4BAiBS,gBAAyB,CAC9B,OAAOF,EAAoB,IAC7B,CAKO,UAAUG,EAAgD,CAC/D,IAAMC,EAAwBD,EAE9B,MACE,CAAC,CAACC,GACFA,EAAsB,YAAc,QACpCA,EAAsB,cAAgB,QACtCA,EAAsB,eAAiB,MAE3C,CAKO,WAAWD,EAA8C,CAC9D,IAAME,EAAUF,EAAM,aAChBG,EAASH,EAAM,YAAY,YAAY,EACvCI,EAAO,KAAK,iBAAiBJ,CAAK,EAEpCK,EAEJ,GAAIL,EAAM,UAAW,CACnB,GAAM,CAACM,EAAYC,CAAa,EAAIC,EAClCR,EAAM,UACN,CAAC,CAACA,EAAM,oBACV,EAEAK,EAAOC,EACPJ,EAAQ,gBAAgB,EAAI,OAAOK,CAAa,CAClD,CAEA,IAAME,EAAgBP,EAAQ,iBAAiB,EAE/C,MAAO,CACL,OAAAC,EACA,QAAAD,EACA,KAAAG,EACA,cAAAI,EACA,KAAAL,CACF,CACF,CAKO,YAAY,CACjB,QAASM,EACT,KAAAL,EACA,WAAAM,CACF,EAA6E,CAC3E,IAAMT,EAAUU,EAAuBF,CAAe,EAEtD,MAAO,CACL,WAAAC,EACA,KAAAN,EACA,QAAAH,CACF,CACF,CAKO,uBAAuB,CAC5B,MAAAW,EACA,kBAAAC,EACA,kBAAAC,EACA,MAAAf,EACA,IAAAgB,CACF,EAAwE,CACtE,IAAMX,EAAOU,EAAoBF,EAAM,MAAQ,GACzCI,EAAgB,KAAK,YAAY,CACrC,MAAAjB,EACA,WAAY,IACZ,KAAMK,GAAQ,GACd,QAAS,CAAC,EACV,gBAAiB,GACjB,IAAAW,CACF,CAAC,EAEDF,EAAkB,QAAQG,CAAa,CACzC,CAWU,iBAAiBjB,EAAsC,CAC/D,IAAMkB,EAAgBC,EACpB,KAAK,SAAS,cACd,EACF,EACMC,EAAe,IAAI,OAAO,IAAIF,CAAa,EAAE,EAE7Cd,EAAOJ,EAAM,UAAU,QAAQoB,EAAc,EAAE,EAC/CC,EAAcrB,EAAM,WAE1B,OAAOsB,EAA6BlB,EAAMiB,GAAe,CAAC,CAAC,CAC7D,CAGF","names":["HttpFunctionAdapter","_HttpFunctionAdapter","options","__name","event","digitalOceanHttpEvent","headers","method","path","body","bufferBody","contentLength","getEventBodyAsBuffer","remoteAddress","responseHeaders","statusCode","getFlattenedHeadersMap","error","delegatedResolver","respondWithErrors","log","errorResponse","stripBasePath","getDefaultIfUndefined","replaceRegex","queryParams","getPathWithQueryStringParams"]}
@@ -0,0 +1,4 @@
1
+ "use strict";var f=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var n=(r,e)=>f(r,"name",{value:e,configurable:!0});var T=(r,e)=>{for(var t in e)f(r,t,{get:e[t],enumerable:!0})},A=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of E(e))!b.call(r,o)&&o!==t&&f(r,o,{get:()=>e[o],enumerable:!(s=R(e,o))||s.enumerable});return r};var w=r=>A(f({},"__esModule",{value:!0}),r);var B={};T(B,{DummyAdapter:()=>y});module.exports=w(B);var C=require("http");var v=require("http");function c(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}`)}n(c,"getString");var h=`\r
2
+ \r
3
+ `,l=Symbol("Response body"),a=Symbol("Response headers");function x(r,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)r[l].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}n(x,"addData");var g=class r extends v.ServerResponse{static{n(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[l]=[],this[a]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let t={_writableState:{},writable:!0,on:i,removeListener:i,destroy:i,cork:i,uncork:i,write:(s,o,d)=>{if(typeof o=="function"&&(d=o,o=null),this._header===""||this._wroteHeader)x(this,s);else{let p=c(s),u=p.indexOf(h);if(u!==-1){let m=p.slice(u+h.length);m&&x(this,m),this._wroteHeader=!0}}typeof d=="function"&&d()}};this.assignSocket(t)}_header;_headers;_wroteHeader;[l];[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[l]=e.body?[Buffer.from(e.body)]:[],t.end(),t}static body(e){return Buffer.concat(e[l])}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,s){let o=typeof t=="string"?s:t,d=Array.isArray(o)?o:[o||{}];for(let p of d)for(let u in p)if(this.setHeader(u,p[u]),!this._wroteHeader)break;return this.callNativeWriteHead(e,t,s)}callNativeWriteHead(e,t,s){return super.writeHead(e,t,s)}};var k=require("http");var S={};var i=n(()=>{},"NO_OP");var ce=Symbol("InternalLogger");var Se=require("stream");var y=class r{static{n(this,"DummyAdapter")}canHandle(){return!0}getAdapterName(){return r.name}getRequest(){return{method:"POST",body:void 0,path:"/dummy",headers:{}}}getResponse(){return S}onErrorWhileForwarding(e){e.delegatedResolver.succeed()}};0&&(module.exports={DummyAdapter});
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/dummy/index.ts","../../../src/network/request.ts","../../../src/network/response.ts","../../../src/network/utils.ts","../../../src/network/response-stream.ts","../../../src/core/constants.ts","../../../src/core/no-op.ts","../../../src/core/logger.ts","../../../src/core/stream.ts","../../../src/adapters/dummy/dummy.adapter.ts"],"sourcesContent":["export * from './dummy.adapter';\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';\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 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) addData(this, data);\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) 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\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 isFirstCall = true;\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 = 0;\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 (!isFirstCall && internalWritable) {\n if (data === endChunked) {\n internalWritable.end(cb);\n\n return true;\n }\n\n if (writesToIgnore > 0) {\n writesToIgnore--;\n return true;\n }\n\n internalWritable.write(data, cb);\n writesToIgnore = 3;\n } else if (isFirstCall) {\n isFirstCall = false;\n\n const stringData = getString(data);\n const endStatusIndex = stringData.indexOf(endStatusSeparator);\n const status = +stringData.slice(0, endStatusIndex).split(' ')[1];\n\n const headerData = stringData.slice(\n endStatusIndex + 2,\n stringData.indexOf(headerEnd),\n );\n const headers = parseHeaders(headerData);\n log.debug('SERVERLESS_ADAPTER:RESPONSE_STREAM:FRAMEWORK_HEADERS', {\n headers,\n });\n\n writesToIgnore = 1;\n internalWritable = onReceiveHeaders(status, headers);\n }\n\n return true;\n },\n };\n\n this.assignSocket(socket as unknown as Socket);\n }\n}\n","/**\n * Default encodings that are treated as binary, they are compared with the `Content-Encoding` header.\n *\n * @breadcrumb Core / Constants\n * @defaultValue ['gzip', 'deflate', 'br']\n * @public\n */\nexport const DEFAULT_BINARY_ENCODINGS: string[] = ['gzip', 'deflate', 'br'];\n\n/**\n * Default content types that are treated as binary, they are compared with the `Content-Type` header.\n *\n * @breadcrumb Core / Constants\n * @defaultValue ['image/png', 'image/jpeg', 'image/jpg', 'image/avif', 'image/bmp', 'image/x-png', 'image/gif', 'image/webp', 'video/mp4', 'application/pdf']\n * @public\n */\nexport const DEFAULT_BINARY_CONTENT_TYPES: string[] = [\n 'image/png',\n 'image/jpeg',\n 'image/jpg',\n 'image/avif',\n 'image/bmp',\n 'image/x-png',\n 'image/gif',\n 'image/webp',\n 'video/mp4',\n 'application/pdf',\n];\n\n/**\n * Type alias for empty response and can be used on some adapters when the adapter does not need to return a response.\n *\n * @breadcrumb Core / Constants\n * @public\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type IEmptyResponse = {};\n\n/**\n * Constant for empty response and can be used on some adapters when the adapter does not need to return a response.\n *\n * @breadcrumb Core / Constants\n * @public\n */\nexport const EmptyResponse: IEmptyResponse = {};\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","//#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","//#region Imports\n\nimport type {\n AdapterContract,\n AdapterRequest,\n OnErrorProps,\n} from '../../contracts';\nimport { EmptyResponse, type IEmptyResponse } from '../../core';\n\n//#endregion\n\n/**\n * The class that represents a dummy adapter that does nothing and can be used by the cloud that doesn't use adapters.\n *\n * @breadcrumb Adapters / DummyAdapter\n * @public\n */\nexport class DummyAdapter implements AdapterContract<any, any, void> {\n /**\n * {@inheritDoc}\n */\n public canHandle(): boolean {\n return true;\n }\n\n /**\n * {@inheritDoc}\n */\n public getAdapterName(): string {\n return DummyAdapter.name;\n }\n\n /**\n * {@inheritDoc}\n */\n public getRequest(): AdapterRequest {\n return {\n method: 'POST',\n body: void 0,\n path: '/dummy',\n headers: {},\n };\n }\n\n /**\n * {@inheritDoc}\n */\n public getResponse(): IEmptyResponse {\n return EmptyResponse;\n }\n\n /**\n * {@inheritDoc}\n */\n public onErrorWhileForwarding(props: OnErrorProps<any, void>): void {\n props.delegatedResolver.succeed();\n }\n}\n"],"mappings":"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","names":["dummy_exports","__export","DummyAdapter","__toCommonJS","import_node_http","import_node_http","getString","data","__name","headerEnd","BODY","HEADERS","addData","stream","data","__name","ServerlessResponse","_ServerlessResponse","method","socket","NO_OP","encoding","cb","string","getString","index","remainder","res","response","headers","key","value","statusCode","statusMessage","obj","headersObjOrArray","arrayHeaders","name","import_node_http","EmptyResponse","NO_OP","__name","InternalLoggerSymbol","import_node_stream","DummyAdapter","_DummyAdapter","__name","EmptyResponse","props"]}
@@ -0,0 +1,37 @@
1
+ import { A as AdapterContract, a as AdapterRequest, O as OnErrorProps } from '../../adapter.contract-y5xSjOjo.cjs';
2
+ import { I as IEmptyResponse } from '../../constants-0cgQlFSV.cjs';
3
+ import '../../headers-K2qbcurv.cjs';
4
+ import 'http';
5
+ import 'node:http';
6
+ import '../../logger-9me5n48P.cjs';
7
+
8
+ /**
9
+ * The class that represents a dummy adapter that does nothing and can be used by the cloud that doesn't use adapters.
10
+ *
11
+ * @breadcrumb Adapters / DummyAdapter
12
+ * @public
13
+ */
14
+ declare class DummyAdapter implements AdapterContract<any, any, void> {
15
+ /**
16
+ * {@inheritDoc}
17
+ */
18
+ canHandle(): boolean;
19
+ /**
20
+ * {@inheritDoc}
21
+ */
22
+ getAdapterName(): string;
23
+ /**
24
+ * {@inheritDoc}
25
+ */
26
+ getRequest(): AdapterRequest;
27
+ /**
28
+ * {@inheritDoc}
29
+ */
30
+ getResponse(): IEmptyResponse;
31
+ /**
32
+ * {@inheritDoc}
33
+ */
34
+ onErrorWhileForwarding(props: OnErrorProps<any, void>): void;
35
+ }
36
+
37
+ export { DummyAdapter };
@@ -0,0 +1,37 @@
1
+ import { A as AdapterContract, a as AdapterRequest, O as OnErrorProps } from '../../adapter.contract-EQE3rlgO.js';
2
+ import { I as IEmptyResponse } from '../../constants-0cgQlFSV.js';
3
+ import '../../headers-K2qbcurv.js';
4
+ import 'http';
5
+ import 'node:http';
6
+ import '../../logger-9me5n48P.js';
7
+
8
+ /**
9
+ * The class that represents a dummy adapter that does nothing and can be used by the cloud that doesn't use adapters.
10
+ *
11
+ * @breadcrumb Adapters / DummyAdapter
12
+ * @public
13
+ */
14
+ declare class DummyAdapter implements AdapterContract<any, any, void> {
15
+ /**
16
+ * {@inheritDoc}
17
+ */
18
+ canHandle(): boolean;
19
+ /**
20
+ * {@inheritDoc}
21
+ */
22
+ getAdapterName(): string;
23
+ /**
24
+ * {@inheritDoc}
25
+ */
26
+ getRequest(): AdapterRequest;
27
+ /**
28
+ * {@inheritDoc}
29
+ */
30
+ getResponse(): IEmptyResponse;
31
+ /**
32
+ * {@inheritDoc}
33
+ */
34
+ onErrorWhileForwarding(props: OnErrorProps<any, void>): void;
35
+ }
36
+
37
+ export { DummyAdapter };
@@ -0,0 +1,2 @@
1
+ import{d as r}from"../../chunk-HU5XBQCP.mjs";import{a as e}from"../../chunk-OYOJMOFP.mjs";var t=class o{static{e(this,"DummyAdapter")}canHandle(){return!0}getAdapterName(){return o.name}getRequest(){return{method:"POST",body:void 0,path:"/dummy",headers:{}}}getResponse(){return r}onErrorWhileForwarding(p){p.delegatedResolver.succeed()}};export{t as DummyAdapter};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/dummy/dummy.adapter.ts"],"sourcesContent":["//#region Imports\n\nimport type {\n AdapterContract,\n AdapterRequest,\n OnErrorProps,\n} from '../../contracts';\nimport { EmptyResponse, type IEmptyResponse } from '../../core';\n\n//#endregion\n\n/**\n * The class that represents a dummy adapter that does nothing and can be used by the cloud that doesn't use adapters.\n *\n * @breadcrumb Adapters / DummyAdapter\n * @public\n */\nexport class DummyAdapter implements AdapterContract<any, any, void> {\n /**\n * {@inheritDoc}\n */\n public canHandle(): boolean {\n return true;\n }\n\n /**\n * {@inheritDoc}\n */\n public getAdapterName(): string {\n return DummyAdapter.name;\n }\n\n /**\n * {@inheritDoc}\n */\n public getRequest(): AdapterRequest {\n return {\n method: 'POST',\n body: void 0,\n path: '/dummy',\n headers: {},\n };\n }\n\n /**\n * {@inheritDoc}\n */\n public getResponse(): IEmptyResponse {\n return EmptyResponse;\n }\n\n /**\n * {@inheritDoc}\n */\n public onErrorWhileForwarding(props: OnErrorProps<any, void>): void {\n props.delegatedResolver.succeed();\n }\n}\n"],"mappings":"0FAiBO,IAAMA,EAAN,MAAMC,CAAwD,CAjBrE,MAiBqE,CAAAC,EAAA,qBAI5D,WAAqB,CAC1B,MAAO,EACT,CAKO,gBAAyB,CAC9B,OAAOD,EAAa,IACtB,CAKO,YAA6B,CAClC,MAAO,CACL,OAAQ,OACR,KAAM,OACN,KAAM,SACN,QAAS,CAAC,CACZ,CACF,CAKO,aAA8B,CACnC,OAAOE,CACT,CAKO,uBAAuBC,EAAsC,CAClEA,EAAM,kBAAkB,QAAQ,CAClC,CACF","names":["DummyAdapter","_DummyAdapter","__name","EmptyResponse","props"]}
@@ -0,0 +1,4 @@
1
+ "use strict";var c=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var s=(r,e)=>c(r,"name",{value:e,configurable:!0});var H=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},B=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of T(e))!C.call(r,n)&&n!==t&&c(r,n,{get:()=>e[n],enumerable:!(o=b(e,n))||o.enumerable});return r};var k=r=>B(c({},"__esModule",{value:!0}),r);var I={};H(I,{HuaweiApiGatewayAdapter:()=>m});module.exports=k(I);var L=require("http");var w=require("http");function g(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(g,"getString");var h=`\r
2
+ \r
3
+ `,f=Symbol("Response body"),u=Symbol("Response headers");function x(r,e){if(Buffer.isBuffer(e)||typeof e=="string"||e instanceof Uint8Array)r[f].push(Buffer.from(e));else throw new Error(`response.write() of unexpected type: ${typeof e}`)}s(x,"addData");var y=class r extends w.ServerResponse{static{s(this,"ServerlessResponse")}constructor({method:e}){super({method:e}),this[f]=[],this[u]={},this.useChunkedEncodingByDefault=!1,this.chunkedEncoding=!1,this._header="";let t={_writableState:{},writable:!0,on:d,removeListener:d,destroy:d,cork:d,uncork:d,write:(o,n,i)=>{if(typeof n=="function"&&(i=n,n=null),this._header===""||this._wroteHeader)x(this,o);else{let a=g(o),p=a.indexOf(h);if(p!==-1){let l=a.slice(p+h.length);l&&x(this,l),this._wroteHeader=!0}}typeof i=="function"&&i()}};this.assignSocket(t)}_header;_headers;_wroteHeader;[f];[u];get headers(){return this[u]}static from(e){let t=new r({method:e.method});return t.statusCode=e.statusCode||0,t[u]=e.headers,t[f]=e.body?[Buffer.from(e.body)]:[],t.end(),t}static body(e){return Buffer.concat(e[f])}static headers(e){let t=e.getHeaders();return Object.assign(t,e[u])}setHeader(e,t){this._wroteHeader?this[u][e]=t:super.setHeader(e,t)}writeHead(e,t,o){let n=typeof t=="string"?o:t,i=Array.isArray(n)?n:[n||{}];for(let a of i)for(let p in a)if(this.setHeader(p,a[p]),!this._wroteHeader)break;return this.callNativeWriteHead(e,t,o)}callNativeWriteHead(e,t,o){return super.writeHead(e,t,o)}};var P=require("http");function E(r,e){let t=e?"base64":"utf8",o=Buffer.from(r,t),n=Buffer.byteLength(o,t);return[o,n]}s(E,"getEventBodyAsBuffer");function v(r,e=",",t=!1){return Object.keys(r).reduce((o,n)=>{let i=t?n.toLowerCase():n,a=r[n];return Array.isArray(a)?o[i]=a.join(e):o[i]=(a??"")+"",o},{})}s(v,"getFlattenedHeadersMap");function S(r){return Object.keys(r).reduce((e,t)=>{let o=r[t];return e[t.toLowerCase()]=Array.isArray(o)?o.map(String):[String(o)],e},{})}s(S,"getMultiValueHeadersMap");var d=s(()=>{},"NO_OP");var xe=Symbol("InternalLogger");function A(r,e){return r===void 0?e:r}s(A,"getDefaultIfUndefined");function R(r,e){if(String(e||"").length===0)return r;if(typeof e=="string")return`${r}?${e}`;let t=O(e);return t?`${r}?${t}`:r}s(R,"getPathWithQueryStringParams");function O(r){let e=new URLSearchParams,t=Object.entries(r||{});if(t.length===0)return"";for(let[o,n]of t){if(!Array.isArray(n)){e.append(o,n||"");continue}for(let i of n)e.append(o,i)}return e.toString()}s(O,"getQueryParamsStringFromRecord");var be=require("stream");var m=class r{constructor(e){this.options=e}static{s(this,"HuaweiApiGatewayAdapter")}getAdapterName(){return r.name}canHandle(e){let t=e;return!!(t&&t.httpMethod&&t.requestContext&&t.requestContext.apiId&&t.requestContext.stage&&t.requestContext.requestId&&!("multiValueQueryStringParameters"in t))}getRequest(e){let t=e.httpMethod,o=this.getPathFromEvent(e),n=v(e.headers,",",!0),i;if(e.body){let[p,l]=E(e.body,e.isBase64Encoded);i=p,n["content-length"]=String(l)}let a=n["x-real-ip"];return{method:t,headers:n,body:i,remoteAddress:a,path:o}}getResponse({headers:e,body:t,isBase64Encoded:o,statusCode:n}){let i=S(e);return{statusCode:n,body:t,headers:i,isBase64Encoded:o}}onErrorWhileForwarding({error:e,delegatedResolver:t,respondWithErrors:o,event:n,log:i}){let a=o?e.stack:"",p=this.getResponse({event:n,statusCode:500,body:a||"",headers:{},isBase64Encoded:!1,log:i});t.succeed(p)}getPathFromEvent(e){let t=A(this.options?.stripBasePath,""),o=new RegExp(`^${t}`),n=e.path.replace(o,""),i=e.queryStringParameters;return R(n,i)}};0&&(module.exports={HuaweiApiGatewayAdapter});
4
+ //# sourceMappingURL=index.cjs.map