@geekmidas/constructs 0.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 (329) hide show
  1. package/README.md +614 -0
  2. package/dist/AWSLambdaFunction-CpHFE2m6.d.mts +27 -0
  3. package/dist/AWSLambdaFunction-CwagvPG3.d.cts +27 -0
  4. package/dist/AWSLambdaFunction-DWIZYsCy.mjs +79 -0
  5. package/dist/AWSLambdaFunction-DWIZYsCy.mjs.map +1 -0
  6. package/dist/AWSLambdaFunction-qA5LqPsv.cjs +85 -0
  7. package/dist/AWSLambdaFunction-qA5LqPsv.cjs.map +1 -0
  8. package/dist/AWSLambdaSubscriberAdaptor-C1wQuucQ.d.mts +32 -0
  9. package/dist/AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs +138 -0
  10. package/dist/AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map +1 -0
  11. package/dist/AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs +132 -0
  12. package/dist/AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map +1 -0
  13. package/dist/AWSLambdaSubscriberAdaptor-QKVxR6qh.d.cts +32 -0
  14. package/dist/AmazonApiGatewayEndpointAdaptor-BoBh7vvD.d.mts +61 -0
  15. package/dist/AmazonApiGatewayEndpointAdaptor-Cx1oqcqh.mjs +124 -0
  16. package/dist/AmazonApiGatewayEndpointAdaptor-Cx1oqcqh.mjs.map +1 -0
  17. package/dist/AmazonApiGatewayEndpointAdaptor-DtzgQ9Vb.d.cts +61 -0
  18. package/dist/AmazonApiGatewayEndpointAdaptor-i74DEUbc.cjs +130 -0
  19. package/dist/AmazonApiGatewayEndpointAdaptor-i74DEUbc.cjs.map +1 -0
  20. package/dist/AmazonApiGatewayV1EndpointAdaptor-CLmBDYsl.mjs +42 -0
  21. package/dist/AmazonApiGatewayV1EndpointAdaptor-CLmBDYsl.mjs.map +1 -0
  22. package/dist/AmazonApiGatewayV1EndpointAdaptor-EhMd1YqV.d.mts +21 -0
  23. package/dist/AmazonApiGatewayV1EndpointAdaptor-GkMAUPL5.cjs +47 -0
  24. package/dist/AmazonApiGatewayV1EndpointAdaptor-GkMAUPL5.cjs.map +1 -0
  25. package/dist/AmazonApiGatewayV1EndpointAdaptor-Gw-j61qM.d.cts +21 -0
  26. package/dist/AmazonApiGatewayV2EndpointAdaptor-3RqegmJC.mjs +41 -0
  27. package/dist/AmazonApiGatewayV2EndpointAdaptor-3RqegmJC.mjs.map +1 -0
  28. package/dist/AmazonApiGatewayV2EndpointAdaptor-LUlpwmUW.d.cts +21 -0
  29. package/dist/AmazonApiGatewayV2EndpointAdaptor-YlFoFSS9.cjs +46 -0
  30. package/dist/AmazonApiGatewayV2EndpointAdaptor-YlFoFSS9.cjs.map +1 -0
  31. package/dist/AmazonApiGatewayV2EndpointAdaptor-zfd1gqXA.d.mts +21 -0
  32. package/dist/BaseFunctionBuilder-5QCHkchp.d.cts +31 -0
  33. package/dist/BaseFunctionBuilder-BFPVGnKi.d.mts +31 -0
  34. package/dist/BaseFunctionBuilder-BPE9JBbT.mjs +56 -0
  35. package/dist/BaseFunctionBuilder-BPE9JBbT.mjs.map +1 -0
  36. package/dist/BaseFunctionBuilder-DtO4Nwxm.cjs +62 -0
  37. package/dist/BaseFunctionBuilder-DtO4Nwxm.cjs.map +1 -0
  38. package/dist/Construct-BSEs6uwW.cjs +75 -0
  39. package/dist/Construct-BSEs6uwW.cjs.map +1 -0
  40. package/dist/Construct-BbKCIPQm.mjs +63 -0
  41. package/dist/Construct-BbKCIPQm.mjs.map +1 -0
  42. package/dist/Construct-Bm-PSO2V.d.cts +42 -0
  43. package/dist/Construct-DIguIyw4.d.mts +42 -0
  44. package/dist/Construct.cjs +4 -0
  45. package/dist/Construct.d.cts +2 -0
  46. package/dist/Construct.d.mts +2 -0
  47. package/dist/Construct.mjs +3 -0
  48. package/dist/Cron-Bgs6EQOb.mjs +20 -0
  49. package/dist/Cron-Bgs6EQOb.mjs.map +1 -0
  50. package/dist/Cron-DQiCj3ef.cjs +25 -0
  51. package/dist/Cron-DQiCj3ef.cjs.map +1 -0
  52. package/dist/Cron-FpAw03k6.d.mts +25 -0
  53. package/dist/Cron-ztnK6zgU.d.cts +25 -0
  54. package/dist/CronBuilder-B2clNQSP.d.mts +24 -0
  55. package/dist/CronBuilder-Cje9K8lZ.d.cts +24 -0
  56. package/dist/CronBuilder-DIBqJkh_.cjs +60 -0
  57. package/dist/CronBuilder-DIBqJkh_.cjs.map +1 -0
  58. package/dist/CronBuilder-DecAvvcn.mjs +54 -0
  59. package/dist/CronBuilder-DecAvvcn.mjs.map +1 -0
  60. package/dist/Endpoint-BaHC9y4Z.cjs +291 -0
  61. package/dist/Endpoint-BaHC9y4Z.cjs.map +1 -0
  62. package/dist/Endpoint-C7z9YJHK.d.cts +405 -0
  63. package/dist/Endpoint-DCn53Vd8.d.mts +405 -0
  64. package/dist/Endpoint-ierdM62O.mjs +279 -0
  65. package/dist/Endpoint-ierdM62O.mjs.map +1 -0
  66. package/dist/EndpointBuilder-BHFSpbPR.cjs +107 -0
  67. package/dist/EndpointBuilder-BHFSpbPR.cjs.map +1 -0
  68. package/dist/EndpointBuilder-BLUsoK3l.mjs +101 -0
  69. package/dist/EndpointBuilder-BLUsoK3l.mjs.map +1 -0
  70. package/dist/EndpointBuilder-Bfnb2oJr.d.mts +49 -0
  71. package/dist/EndpointBuilder-CP9RGwZH.d.cts +49 -0
  72. package/dist/EndpointFactory-BYdDVCNj.mjs +127 -0
  73. package/dist/EndpointFactory-BYdDVCNj.mjs.map +1 -0
  74. package/dist/EndpointFactory-CNtMXgIh.d.mts +52 -0
  75. package/dist/EndpointFactory-CXX4E6Gx.cjs +139 -0
  76. package/dist/EndpointFactory-CXX4E6Gx.cjs.map +1 -0
  77. package/dist/EndpointFactory-D2zgWbXZ.d.cts +52 -0
  78. package/dist/Function-BP58p9Mp.d.cts +59 -0
  79. package/dist/Function-BsBxc2wA.d.mts +59 -0
  80. package/dist/Function-C5mW-38v.mjs +72 -0
  81. package/dist/Function-C5mW-38v.mjs.map +1 -0
  82. package/dist/Function-CbO2NZx-.cjs +84 -0
  83. package/dist/Function-CbO2NZx-.cjs.map +1 -0
  84. package/dist/FunctionBuilder-BS1KgxA_.d.cts +24 -0
  85. package/dist/FunctionBuilder-C-PfPN3r.d.mts +24 -0
  86. package/dist/FunctionBuilder-CosgPmMl.mjs +53 -0
  87. package/dist/FunctionBuilder-CosgPmMl.mjs.map +1 -0
  88. package/dist/FunctionBuilder-DuOeWCAl.cjs +59 -0
  89. package/dist/FunctionBuilder-DuOeWCAl.cjs.map +1 -0
  90. package/dist/FunctionExecutionWrapper-Bx-Dl-2a.d.cts +24 -0
  91. package/dist/FunctionExecutionWrapper-CElXEjPe.cjs +42 -0
  92. package/dist/FunctionExecutionWrapper-CElXEjPe.cjs.map +1 -0
  93. package/dist/FunctionExecutionWrapper-DvglBBjE.d.mts +24 -0
  94. package/dist/FunctionExecutionWrapper-XGrSAAPD.mjs +36 -0
  95. package/dist/FunctionExecutionWrapper-XGrSAAPD.mjs.map +1 -0
  96. package/dist/HonoEndpointAdaptor-B0IO1zj2.d.mts +41 -0
  97. package/dist/HonoEndpointAdaptor-B4snrp7v.cjs +154 -0
  98. package/dist/HonoEndpointAdaptor-B4snrp7v.cjs.map +1 -0
  99. package/dist/HonoEndpointAdaptor-B6lW9Q1k.d.cts +41 -0
  100. package/dist/HonoEndpointAdaptor-D-M4-6Tf.mjs +148 -0
  101. package/dist/HonoEndpointAdaptor-D-M4-6Tf.mjs.map +1 -0
  102. package/dist/Subscriber-BoFm12i_.d.cts +33 -0
  103. package/dist/Subscriber-BwuCaC9G.mjs +28 -0
  104. package/dist/Subscriber-BwuCaC9G.mjs.map +1 -0
  105. package/dist/Subscriber-THGsj7Iy.d.mts +33 -0
  106. package/dist/Subscriber-iMRFG7ba.cjs +34 -0
  107. package/dist/Subscriber-iMRFG7ba.cjs.map +1 -0
  108. package/dist/SubscriberBuilder-CiPxgnKT.d.mts +26 -0
  109. package/dist/SubscriberBuilder-Dhz0C_t-.mjs +54 -0
  110. package/dist/SubscriberBuilder-Dhz0C_t-.mjs.map +1 -0
  111. package/dist/SubscriberBuilder-DuIgxuzc.d.cts +26 -0
  112. package/dist/SubscriberBuilder-wthr-FL9.cjs +60 -0
  113. package/dist/SubscriberBuilder-wthr-FL9.cjs.map +1 -0
  114. package/dist/adaptors/aws.cjs +19 -0
  115. package/dist/adaptors/aws.d.cts +15 -0
  116. package/dist/adaptors/aws.d.mts +15 -0
  117. package/dist/adaptors/aws.mjs +16 -0
  118. package/dist/adaptors/hono.cjs +12 -0
  119. package/dist/adaptors/hono.d.cts +9 -0
  120. package/dist/adaptors/hono.d.mts +9 -0
  121. package/dist/adaptors/hono.mjs +12 -0
  122. package/dist/chunk-CUT6urMc.cjs +30 -0
  123. package/dist/crons/Cron.cjs +8 -0
  124. package/dist/crons/Cron.d.cts +7 -0
  125. package/dist/crons/Cron.d.mts +7 -0
  126. package/dist/crons/Cron.mjs +8 -0
  127. package/dist/crons/CronBuilder.cjs +9 -0
  128. package/dist/crons/CronBuilder.d.cts +8 -0
  129. package/dist/crons/CronBuilder.d.mts +8 -0
  130. package/dist/crons/CronBuilder.mjs +9 -0
  131. package/dist/crons/index.cjs +16 -0
  132. package/dist/crons/index.cjs.map +1 -0
  133. package/dist/crons/index.d.cts +16 -0
  134. package/dist/crons/index.d.mts +16 -0
  135. package/dist/crons/index.mjs +14 -0
  136. package/dist/crons/index.mjs.map +1 -0
  137. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +10 -0
  138. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +9 -0
  139. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -0
  140. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +10 -0
  141. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +12 -0
  142. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +10 -0
  143. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -0
  144. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +12 -0
  145. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +12 -0
  146. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +10 -0
  147. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -0
  148. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +12 -0
  149. package/dist/endpoints/Endpoint.cjs +9 -0
  150. package/dist/endpoints/Endpoint.d.cts +8 -0
  151. package/dist/endpoints/Endpoint.d.mts +8 -0
  152. package/dist/endpoints/Endpoint.mjs +8 -0
  153. package/dist/endpoints/EndpointBuilder.cjs +9 -0
  154. package/dist/endpoints/EndpointBuilder.d.cts +9 -0
  155. package/dist/endpoints/EndpointBuilder.d.mts +9 -0
  156. package/dist/endpoints/EndpointBuilder.mjs +9 -0
  157. package/dist/endpoints/EndpointFactory.cjs +11 -0
  158. package/dist/endpoints/EndpointFactory.d.cts +10 -0
  159. package/dist/endpoints/EndpointFactory.d.mts +10 -0
  160. package/dist/endpoints/EndpointFactory.mjs +10 -0
  161. package/dist/endpoints/HonoEndpointAdaptor.cjs +12 -0
  162. package/dist/endpoints/HonoEndpointAdaptor.d.cts +9 -0
  163. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -0
  164. package/dist/endpoints/HonoEndpointAdaptor.mjs +12 -0
  165. package/dist/endpoints/TestEndpointAdaptor.cjs +54 -0
  166. package/dist/endpoints/TestEndpointAdaptor.cjs.map +1 -0
  167. package/dist/endpoints/TestEndpointAdaptor.d.cts +29 -0
  168. package/dist/endpoints/TestEndpointAdaptor.d.mts +29 -0
  169. package/dist/endpoints/TestEndpointAdaptor.mjs +53 -0
  170. package/dist/endpoints/TestEndpointAdaptor.mjs.map +1 -0
  171. package/dist/endpoints/helpers.cjs +10 -0
  172. package/dist/endpoints/helpers.d.cts +58 -0
  173. package/dist/endpoints/helpers.d.mts +58 -0
  174. package/dist/endpoints/helpers.mjs +9 -0
  175. package/dist/endpoints/index.cjs +16 -0
  176. package/dist/endpoints/index.cjs.map +1 -0
  177. package/dist/endpoints/index.d.cts +16 -0
  178. package/dist/endpoints/index.d.mts +16 -0
  179. package/dist/endpoints/index.mjs +15 -0
  180. package/dist/endpoints/index.mjs.map +1 -0
  181. package/dist/endpoints/parseHonoQuery.cjs +3 -0
  182. package/dist/endpoints/parseHonoQuery.d.cts +12 -0
  183. package/dist/endpoints/parseHonoQuery.d.mts +12 -0
  184. package/dist/endpoints/parseHonoQuery.mjs +3 -0
  185. package/dist/endpoints/parseQueryParams.cjs +3 -0
  186. package/dist/endpoints/parseQueryParams.d.cts +13 -0
  187. package/dist/endpoints/parseQueryParams.d.mts +13 -0
  188. package/dist/endpoints/parseQueryParams.mjs +3 -0
  189. package/dist/functions/AWSLambdaFunction.cjs +9 -0
  190. package/dist/functions/AWSLambdaFunction.d.cts +5 -0
  191. package/dist/functions/AWSLambdaFunction.d.mts +5 -0
  192. package/dist/functions/AWSLambdaFunction.mjs +9 -0
  193. package/dist/functions/BaseFunctionBuilder.cjs +4 -0
  194. package/dist/functions/BaseFunctionBuilder.d.cts +3 -0
  195. package/dist/functions/BaseFunctionBuilder.d.mts +3 -0
  196. package/dist/functions/BaseFunctionBuilder.mjs +4 -0
  197. package/dist/functions/Function.cjs +5 -0
  198. package/dist/functions/Function.d.cts +3 -0
  199. package/dist/functions/Function.d.mts +3 -0
  200. package/dist/functions/Function.mjs +4 -0
  201. package/dist/functions/FunctionBuilder.cjs +6 -0
  202. package/dist/functions/FunctionBuilder.d.cts +5 -0
  203. package/dist/functions/FunctionBuilder.d.mts +5 -0
  204. package/dist/functions/FunctionBuilder.mjs +6 -0
  205. package/dist/functions/FunctionExecutionWrapper.cjs +8 -0
  206. package/dist/functions/FunctionExecutionWrapper.d.cts +4 -0
  207. package/dist/functions/FunctionExecutionWrapper.d.mts +4 -0
  208. package/dist/functions/FunctionExecutionWrapper.mjs +8 -0
  209. package/dist/functions/TestFunctionAdaptor.cjs +38 -0
  210. package/dist/functions/TestFunctionAdaptor.cjs.map +1 -0
  211. package/dist/functions/TestFunctionAdaptor.d.cts +26 -0
  212. package/dist/functions/TestFunctionAdaptor.d.mts +26 -0
  213. package/dist/functions/TestFunctionAdaptor.mjs +37 -0
  214. package/dist/functions/TestFunctionAdaptor.mjs.map +1 -0
  215. package/dist/functions/index.cjs +10 -0
  216. package/dist/functions/index.d.cts +6 -0
  217. package/dist/functions/index.d.mts +6 -0
  218. package/dist/functions/index.mjs +7 -0
  219. package/dist/functions-DVDb5wEA.cjs +13 -0
  220. package/dist/functions-DVDb5wEA.cjs.map +1 -0
  221. package/dist/functions-mM-jcphA.mjs +8 -0
  222. package/dist/functions-mM-jcphA.mjs.map +1 -0
  223. package/dist/helpers-BeGM4pP_.cjs +95 -0
  224. package/dist/helpers-BeGM4pP_.cjs.map +1 -0
  225. package/dist/helpers-DbpO95aE.mjs +83 -0
  226. package/dist/helpers-DbpO95aE.mjs.map +1 -0
  227. package/dist/index-CuGR4L7O.d.mts +9 -0
  228. package/dist/index-Fg3N3EKD.d.cts +9 -0
  229. package/dist/index.cjs +4 -0
  230. package/dist/index.d.cts +4 -0
  231. package/dist/index.d.mts +4 -0
  232. package/dist/index.mjs +3 -0
  233. package/dist/parseHonoQuery-DopC24vB.cjs +37 -0
  234. package/dist/parseHonoQuery-DopC24vB.cjs.map +1 -0
  235. package/dist/parseHonoQuery-znDKBhdE.mjs +31 -0
  236. package/dist/parseHonoQuery-znDKBhdE.mjs.map +1 -0
  237. package/dist/parseQueryParams-BJaRh3OB.mjs +32 -0
  238. package/dist/parseQueryParams-BJaRh3OB.mjs.map +1 -0
  239. package/dist/parseQueryParams-BzPop4I1.cjs +38 -0
  240. package/dist/parseQueryParams-BzPop4I1.cjs.map +1 -0
  241. package/dist/publisher-Bw4770Hi.mjs +41 -0
  242. package/dist/publisher-Bw4770Hi.mjs.map +1 -0
  243. package/dist/publisher-lFQleddL.cjs +53 -0
  244. package/dist/publisher-lFQleddL.cjs.map +1 -0
  245. package/dist/publisher.cjs +4 -0
  246. package/dist/publisher.d.cts +13 -0
  247. package/dist/publisher.d.mts +13 -0
  248. package/dist/publisher.mjs +3 -0
  249. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +3 -0
  250. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +4 -0
  251. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +4 -0
  252. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +3 -0
  253. package/dist/subscribers/Subscriber.cjs +4 -0
  254. package/dist/subscribers/Subscriber.d.cts +3 -0
  255. package/dist/subscribers/Subscriber.d.mts +3 -0
  256. package/dist/subscribers/Subscriber.mjs +4 -0
  257. package/dist/subscribers/SubscriberBuilder.cjs +5 -0
  258. package/dist/subscribers/SubscriberBuilder.d.cts +4 -0
  259. package/dist/subscribers/SubscriberBuilder.d.mts +4 -0
  260. package/dist/subscribers/SubscriberBuilder.mjs +5 -0
  261. package/dist/subscribers/index.cjs +12 -0
  262. package/dist/subscribers/index.cjs.map +1 -0
  263. package/dist/subscribers/index.d.cts +10 -0
  264. package/dist/subscribers/index.d.mts +10 -0
  265. package/dist/subscribers/index.mjs +10 -0
  266. package/dist/subscribers/index.mjs.map +1 -0
  267. package/dist/types-Bp9ysFXd.d.cts +7 -0
  268. package/dist/types-DBKNYvsW.d.mts +7 -0
  269. package/dist/types.cjs +0 -0
  270. package/dist/types.d.cts +2 -0
  271. package/dist/types.d.mts +2 -0
  272. package/dist/types.mjs +0 -0
  273. package/package.json +91 -0
  274. package/src/Construct.ts +98 -0
  275. package/src/__tests__/Construct.environment.spec.ts +360 -0
  276. package/src/__tests__/publisher.setting.spec.ts +511 -0
  277. package/src/__tests__/publisher.spec.ts +454 -0
  278. package/src/adaptors/aws.ts +4 -0
  279. package/src/adaptors/hono.ts +1 -0
  280. package/src/crons/Cron.ts +137 -0
  281. package/src/crons/CronBuilder.ts +192 -0
  282. package/src/crons/__tests__/Cron.spec.ts +464 -0
  283. package/src/crons/index.ts +11 -0
  284. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +315 -0
  285. package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +101 -0
  286. package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +95 -0
  287. package/src/endpoints/Endpoint.ts +771 -0
  288. package/src/endpoints/EndpointBuilder.ts +308 -0
  289. package/src/endpoints/EndpointFactory.ts +329 -0
  290. package/src/endpoints/HonoEndpointAdaptor.ts +365 -0
  291. package/src/endpoints/TestEndpointAdaptor.ts +130 -0
  292. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +553 -0
  293. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +927 -0
  294. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +721 -0
  295. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +296 -0
  296. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +441 -0
  297. package/src/endpoints/__tests__/Endpoint.spec.ts +800 -0
  298. package/src/endpoints/__tests__/EndpointBuilder.spec.ts +488 -0
  299. package/src/endpoints/__tests__/EndpointFactory.spec.ts +479 -0
  300. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +569 -0
  301. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +313 -0
  302. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +1078 -0
  303. package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +236 -0
  304. package/src/endpoints/__tests__/__snapshots__/HonoEndpointAdaptor.spec.ts.snap +54 -0
  305. package/src/endpoints/__tests__/endpoint-types.test.ts +88 -0
  306. package/src/endpoints/helpers.ts +99 -0
  307. package/src/endpoints/index.ts +5 -0
  308. package/src/endpoints/parseHonoQuery.ts +51 -0
  309. package/src/endpoints/parseQueryParams.ts +51 -0
  310. package/src/functions/AWSLambdaFunction.ts +222 -0
  311. package/src/functions/BaseFunctionBuilder.ts +110 -0
  312. package/src/functions/Function.ts +160 -0
  313. package/src/functions/FunctionBuilder.ts +182 -0
  314. package/src/functions/FunctionExecutionWrapper.ts +86 -0
  315. package/src/functions/TestFunctionAdaptor.ts +125 -0
  316. package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +376 -0
  317. package/src/functions/__tests__/Function.spec.ts +402 -0
  318. package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +398 -0
  319. package/src/functions/index.ts +10 -0
  320. package/src/index.ts +14 -0
  321. package/src/publisher.ts +83 -0
  322. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +269 -0
  323. package/src/subscribers/Subscriber.ts +112 -0
  324. package/src/subscribers/SubscriberBuilder.ts +150 -0
  325. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +623 -0
  326. package/src/subscribers/__tests__/Subscriber.spec.ts +432 -0
  327. package/src/subscribers/index.ts +5 -0
  328. package/src/types.ts +13 -0
  329. package/tsdown.config.ts +3 -0
@@ -0,0 +1,79 @@
1
+ import { FunctionBuilder } from "./FunctionBuilder-CosgPmMl.mjs";
2
+ import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-XGrSAAPD.mjs";
3
+ import { wrapError } from "@geekmidas/errors";
4
+ import middy from "@middy/core";
5
+
6
+ //#region src/functions/AWSLambdaFunction.ts
7
+ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
8
+ constructor(envParser, fn) {
9
+ super(envParser, fn);
10
+ this.fn = fn;
11
+ }
12
+ error() {
13
+ return { onError: (req) => {
14
+ const logger = req.event?.logger || this.fn.logger;
15
+ logger.error(req.error || {}, "Error processing function");
16
+ throw wrapError(req.error);
17
+ } };
18
+ }
19
+ baseInput() {
20
+ return { before: (req) => {} };
21
+ }
22
+ input() {
23
+ return { before: async (req) => {
24
+ try {
25
+ if (this.fn.input) {
26
+ const parsedInput = await FunctionBuilder.parseComposableStandardSchema(req.event, this.fn.input);
27
+ req.event.parsedInput = parsedInput;
28
+ } else req.event.parsedInput = req.event;
29
+ } catch (error) {
30
+ this.logger.error({
31
+ error,
32
+ event: req.event
33
+ }, "Failed to parse input");
34
+ throw error;
35
+ }
36
+ } };
37
+ }
38
+ loggerMiddleware() {
39
+ return { before: (req) => {
40
+ this._logger = this.fn.logger.child({
41
+ fn: {
42
+ name: req.context.functionName,
43
+ version: req.context.functionVersion,
44
+ memory: req.context.memoryLimitInMB
45
+ },
46
+ req: { id: req.context.awsRequestId }
47
+ });
48
+ req.event.logger = this._logger;
49
+ } };
50
+ }
51
+ services() {
52
+ return { before: async (req) => {
53
+ req.event.services = await this.getServices();
54
+ } };
55
+ }
56
+ events() {
57
+ return { after: async (req) => {
58
+ const response = req.response || void 0;
59
+ await this.publishEvents(response);
60
+ } };
61
+ }
62
+ async _handler(event) {
63
+ const result = await this.fn["fn"]({
64
+ input: event.parsedInput,
65
+ services: event.services,
66
+ logger: event.logger
67
+ });
68
+ const output = await this.fn.parseOutput(result);
69
+ return output;
70
+ }
71
+ get handler() {
72
+ const handler = this._handler.bind(this);
73
+ return middy(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.input()).use(this.events());
74
+ }
75
+ };
76
+
77
+ //#endregion
78
+ export { AWSLambdaFunction };
79
+ //# sourceMappingURL=AWSLambdaFunction-DWIZYsCy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSLambdaFunction-DWIZYsCy.mjs","names":["envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n FunctionHandler<TInput, TServices, TLogger, TOutSchema>,\n TEventPublisher,\n TEventPublisherServiceName\n >","event: FunctionEvent<TEvent, TInput, TServices, TLogger>"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n FunctionHandler<TInput, TServices, TLogger, TOutSchema>,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<TEvent, TInput, TServices, TLogger, TOutSchema> {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<TEvent, TInput, TServices, TLogger>,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n });\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;AA+CA,IAAa,oBAAb,cAOU,yBAOR;CACA,YACEA,WACSC,IAST;AACA,QAAM,WAAW,GAAG;EAVX;CAWV;CAED,AAAQ,QAMN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,UAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAMN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAEwD;AAC9D,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,gBAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAMN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAMN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,SAMN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OACA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;EACf,EAAC;EAGF,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,MAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
@@ -0,0 +1,85 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const require_FunctionBuilder = require('./FunctionBuilder-DuOeWCAl.cjs');
3
+ const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-CElXEjPe.cjs');
4
+ const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
5
+ const __middy_core = require_chunk.__toESM(require("@middy/core"));
6
+
7
+ //#region src/functions/AWSLambdaFunction.ts
8
+ var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionExecutionWrapper {
9
+ constructor(envParser, fn) {
10
+ super(envParser, fn);
11
+ this.fn = fn;
12
+ }
13
+ error() {
14
+ return { onError: (req) => {
15
+ const logger = req.event?.logger || this.fn.logger;
16
+ logger.error(req.error || {}, "Error processing function");
17
+ throw (0, __geekmidas_errors.wrapError)(req.error);
18
+ } };
19
+ }
20
+ baseInput() {
21
+ return { before: (req) => {} };
22
+ }
23
+ input() {
24
+ return { before: async (req) => {
25
+ try {
26
+ if (this.fn.input) {
27
+ const parsedInput = await require_FunctionBuilder.FunctionBuilder.parseComposableStandardSchema(req.event, this.fn.input);
28
+ req.event.parsedInput = parsedInput;
29
+ } else req.event.parsedInput = req.event;
30
+ } catch (error) {
31
+ this.logger.error({
32
+ error,
33
+ event: req.event
34
+ }, "Failed to parse input");
35
+ throw error;
36
+ }
37
+ } };
38
+ }
39
+ loggerMiddleware() {
40
+ return { before: (req) => {
41
+ this._logger = this.fn.logger.child({
42
+ fn: {
43
+ name: req.context.functionName,
44
+ version: req.context.functionVersion,
45
+ memory: req.context.memoryLimitInMB
46
+ },
47
+ req: { id: req.context.awsRequestId }
48
+ });
49
+ req.event.logger = this._logger;
50
+ } };
51
+ }
52
+ services() {
53
+ return { before: async (req) => {
54
+ req.event.services = await this.getServices();
55
+ } };
56
+ }
57
+ events() {
58
+ return { after: async (req) => {
59
+ const response = req.response || void 0;
60
+ await this.publishEvents(response);
61
+ } };
62
+ }
63
+ async _handler(event) {
64
+ const result = await this.fn["fn"]({
65
+ input: event.parsedInput,
66
+ services: event.services,
67
+ logger: event.logger
68
+ });
69
+ const output = await this.fn.parseOutput(result);
70
+ return output;
71
+ }
72
+ get handler() {
73
+ const handler = this._handler.bind(this);
74
+ return (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.input()).use(this.events());
75
+ }
76
+ };
77
+
78
+ //#endregion
79
+ Object.defineProperty(exports, 'AWSLambdaFunction', {
80
+ enumerable: true,
81
+ get: function () {
82
+ return AWSLambdaFunction;
83
+ }
84
+ });
85
+ //# sourceMappingURL=AWSLambdaFunction-qA5LqPsv.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSLambdaFunction-qA5LqPsv.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n FunctionHandler<TInput, TServices, TLogger, TOutSchema>,\n TEventPublisher,\n TEventPublisherServiceName\n >","event: FunctionEvent<TEvent, TInput, TServices, TLogger>"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n FunctionHandler<TInput, TServices, TLogger, TOutSchema>,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<TEvent, TInput, TServices, TLogger, TOutSchema> {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<TEvent, TInput, TServices, TLogger>,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n });\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;;AA+CA,IAAa,oBAAb,cAOUA,0DAOR;CACA,YACEC,WACSC,IAST;AACA,QAAM,WAAW,GAAG;EAVX;CAWV;CAED,AAAQ,QAMN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAMN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAEwD;AAC9D,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,wCAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAMN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAMN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,SAMN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OACA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;EACf,EAAC;EAGF,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
@@ -0,0 +1,32 @@
1
+ import { Subscriber } from "./Subscriber-THGsj7Iy.mjs";
2
+ import { EnvironmentParser } from "@geekmidas/envkit";
3
+ import { Service } from "@geekmidas/services";
4
+ import { EventPublisher } from "@geekmidas/events";
5
+ import { Logger } from "@geekmidas/logger";
6
+ import { StandardSchemaV1 } from "@standard-schema/spec";
7
+ import { Handler } from "aws-lambda";
8
+
9
+ //#region src/subscribers/AWSLambdaSubscriberAdaptor.d.ts
10
+ type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
11
+ declare class AWSLambdaSubscriber<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TSubscribedEvents extends any[] = []> {
12
+ private envParser;
13
+ readonly subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents>;
14
+ private _logger;
15
+ private _services;
16
+ constructor(envParser: EnvironmentParser<{}>, subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents>);
17
+ get logger(): TLogger;
18
+ private getServices;
19
+ private error;
20
+ private loggerMiddleware;
21
+ private services;
22
+ private parseEvents;
23
+ private isSQSEvent;
24
+ private isSNSEvent;
25
+ private parseSQSRecord;
26
+ private isSubscribedEvent;
27
+ private _handler;
28
+ get handler(): AWSLambdaHandler;
29
+ }
30
+ //#endregion
31
+ export { AWSLambdaHandler, AWSLambdaSubscriber };
32
+ //# sourceMappingURL=AWSLambdaSubscriberAdaptor-C1wQuucQ.d.mts.map
@@ -0,0 +1,138 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
3
+ const __middy_core = require_chunk.__toESM(require("@middy/core"));
4
+ const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
5
+
6
+ //#region src/subscribers/AWSLambdaSubscriberAdaptor.ts
7
+ var AWSLambdaSubscriber = class {
8
+ _logger;
9
+ _services;
10
+ constructor(envParser, subscriber) {
11
+ this.envParser = envParser;
12
+ this.subscriber = subscriber;
13
+ this._logger = subscriber.logger;
14
+ }
15
+ get logger() {
16
+ return this._logger;
17
+ }
18
+ async getServices() {
19
+ if (this._services) return this._services;
20
+ const serviceDiscovery = __geekmidas_services.ServiceDiscovery.getInstance(this.logger, this.envParser);
21
+ if (this.subscriber.services.length > 0) {
22
+ const registered = await serviceDiscovery.register(this.subscriber.services);
23
+ this._services = registered;
24
+ } else this._services = {};
25
+ return this._services;
26
+ }
27
+ error() {
28
+ return { onError: (req) => {
29
+ const logger = req.event?.logger || this.subscriber.logger;
30
+ logger.error(req.error || {}, "Error processing subscriber");
31
+ throw (0, __geekmidas_errors.wrapError)(req.error);
32
+ } };
33
+ }
34
+ loggerMiddleware() {
35
+ return { before: (req) => {
36
+ this._logger = this.subscriber.logger.child({
37
+ subscriber: {
38
+ name: req.context.functionName,
39
+ version: req.context.functionVersion,
40
+ memory: req.context.memoryLimitInMB
41
+ },
42
+ req: { id: req.context.awsRequestId }
43
+ });
44
+ req.event.logger = this._logger;
45
+ } };
46
+ }
47
+ services() {
48
+ return { before: async (req) => {
49
+ req.event.services = await this.getServices();
50
+ } };
51
+ }
52
+ parseEvents() {
53
+ return { before: async (req) => {
54
+ const rawEvent = req.event;
55
+ const events = [];
56
+ if ("Records" in rawEvent) {
57
+ if (this.isSQSEvent(rawEvent)) for (const record of rawEvent.Records) try {
58
+ const event = this.parseSQSRecord(record);
59
+ if (event && this.isSubscribedEvent(event.type)) events.push(event);
60
+ } catch (error) {
61
+ this.logger.error({
62
+ error,
63
+ record
64
+ }, "Failed to parse SQS record");
65
+ }
66
+ else if (this.isSNSEvent(rawEvent)) for (const record of rawEvent.Records) try {
67
+ const event = JSON.parse(record.Sns.Message);
68
+ if (event && this.isSubscribedEvent(event.type)) events.push(event);
69
+ } catch (error) {
70
+ this.logger.error({
71
+ error,
72
+ record
73
+ }, "Failed to parse SNS record");
74
+ }
75
+ }
76
+ req.event.events = events;
77
+ } };
78
+ }
79
+ isSQSEvent(event) {
80
+ return "Records" in event && event.Records.length > 0 && "eventSource" in event.Records[0] && event.Records[0].eventSource === "aws:sqs";
81
+ }
82
+ isSNSEvent(event) {
83
+ return "Records" in event && event.Records.length > 0 && "EventSource" in event.Records[0] && event.Records[0].EventSource === "aws:sns";
84
+ }
85
+ parseSQSRecord(record) {
86
+ try {
87
+ const body = JSON.parse(record.body);
88
+ if (body.Type === "Notification" && body.Message) {
89
+ const snsMessage = JSON.parse(body.Message);
90
+ return snsMessage;
91
+ }
92
+ return body;
93
+ } catch (error) {
94
+ this.logger.error({
95
+ error,
96
+ record
97
+ }, "Failed to parse SQS record body");
98
+ return null;
99
+ }
100
+ }
101
+ isSubscribedEvent(eventType) {
102
+ if (!this.subscriber.subscribedEvents) return true;
103
+ return this.subscriber.subscribedEvents.includes(eventType);
104
+ }
105
+ async _handler(event) {
106
+ if (event.events.length === 0) {
107
+ this.logger.info("No subscribed events to process");
108
+ return { batchItemFailures: [] };
109
+ }
110
+ const result = await this.subscriber.handler({
111
+ events: event.events,
112
+ services: event.services,
113
+ logger: event.logger
114
+ });
115
+ if (this.subscriber.outputSchema && result) {
116
+ const validationResult = await this.subscriber.outputSchema["~standard"].validate(result);
117
+ if (validationResult.issues) {
118
+ this.logger.error({ issues: validationResult.issues }, "Subscriber output validation failed");
119
+ throw new Error("Subscriber output validation failed");
120
+ }
121
+ return validationResult.value;
122
+ }
123
+ return result;
124
+ }
125
+ get handler() {
126
+ const handler = this._handler.bind(this);
127
+ return (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.error()).use(this.services()).use(this.parseEvents());
128
+ }
129
+ };
130
+
131
+ //#endregion
132
+ Object.defineProperty(exports, 'AWSLambdaSubscriber', {
133
+ enumerable: true,
134
+ get: function () {
135
+ return AWSLambdaSubscriber;
136
+ }
137
+ });
138
+ //# sourceMappingURL=AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs","names":["envParser: EnvironmentParser<{}>","subscriber: Subscriber<\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TSubscribedEvents\n >","events: any[]","event: SQSEvent | SNSEvent","record: SQSRecord","eventType: string","event: SubscriberEvent<TServices, TLogger>"],"sources":["../src/subscribers/AWSLambdaSubscriberAdaptor.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { ServiceDiscovery } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n Context,\n Handler,\n SNSEvent,\n SQSEvent,\n SQSRecord,\n} from 'aws-lambda';\n\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Subscriber } from './Subscriber';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype SubscriberEvent<TServices extends Service[], TLogger extends Logger> = {\n events: any[];\n services: ServiceRecord<TServices>;\n logger: TLogger;\n};\n\ntype Middleware<\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n SubscriberEvent<TServices, TLogger>,\n InferStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaSubscriber<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TSubscribedEvents extends any[] = [],\n> {\n private _logger!: TLogger;\n private _services!: ServiceRecord<TServices>;\n\n constructor(\n private envParser: EnvironmentParser<{}>,\n readonly subscriber: Subscriber<\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TSubscribedEvents\n >,\n ) {\n this._logger = subscriber.logger;\n }\n\n get logger(): TLogger {\n return this._logger;\n }\n\n private async getServices(): Promise<ServiceRecord<TServices>> {\n if (this._services) {\n return this._services;\n }\n\n const serviceDiscovery = ServiceDiscovery.getInstance(\n this.logger,\n this.envParser,\n );\n\n if (this.subscriber.services.length > 0) {\n const registered = await serviceDiscovery.register(\n this.subscriber.services,\n );\n this._services = registered as ServiceRecord<TServices>;\n } else {\n this._services = {} as ServiceRecord<TServices>;\n }\n\n return this._services;\n }\n\n private error(): Middleware<TServices, TLogger, OutSchema> {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.subscriber.logger;\n logger.error(req.error || {}, 'Error processing subscriber');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private loggerMiddleware(): Middleware<TServices, TLogger, OutSchema> {\n return {\n before: (req) => {\n this._logger = this.subscriber.logger.child({\n subscriber: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services(): Middleware<TServices, TLogger, OutSchema> {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private parseEvents(): Middleware<TServices, TLogger, OutSchema> {\n return {\n before: async (req) => {\n const rawEvent = (req as any).event as SQSEvent | SNSEvent;\n\n // Parse events based on the event type\n const events: any[] = [];\n\n if ('Records' in rawEvent) {\n if (this.isSQSEvent(rawEvent)) {\n // SQS Event\n for (const record of rawEvent.Records) {\n try {\n const event = this.parseSQSRecord(record);\n if (event && this.isSubscribedEvent(event.type)) {\n events.push(event);\n }\n } catch (error) {\n this.logger.error(\n { error, record },\n 'Failed to parse SQS record',\n );\n }\n }\n } else if (this.isSNSEvent(rawEvent)) {\n // SNS Event\n for (const record of rawEvent.Records) {\n try {\n const event = JSON.parse(record.Sns.Message);\n if (event && this.isSubscribedEvent(event.type)) {\n events.push(event);\n }\n } catch (error) {\n this.logger.error(\n { error, record },\n 'Failed to parse SNS record',\n );\n }\n }\n }\n }\n\n (req.event as any).events = events;\n },\n };\n }\n\n private isSQSEvent(event: SQSEvent | SNSEvent): event is SQSEvent {\n return (\n 'Records' in event &&\n event.Records.length > 0 &&\n 'eventSource' in event.Records[0] &&\n event.Records[0].eventSource === 'aws:sqs'\n );\n }\n\n private isSNSEvent(event: SQSEvent | SNSEvent): event is SNSEvent {\n return (\n 'Records' in event &&\n event.Records.length > 0 &&\n 'EventSource' in event.Records[0] &&\n event.Records[0].EventSource === 'aws:sns'\n );\n }\n\n private parseSQSRecord(record: SQSRecord): any | null {\n try {\n const body = JSON.parse(record.body);\n\n // Check if this is an SNS message wrapped in SQS\n if (body.Type === 'Notification' && body.Message) {\n // Parse the SNS message\n const snsMessage = JSON.parse(body.Message);\n return snsMessage;\n }\n\n // Direct SQS message\n return body;\n } catch (error) {\n this.logger.error({ error, record }, 'Failed to parse SQS record body');\n return null;\n }\n }\n\n private isSubscribedEvent(eventType: string): boolean {\n if (!this.subscriber.subscribedEvents) {\n return true; // If no events specified, accept all\n }\n\n return this.subscriber.subscribedEvents.includes(eventType as any);\n }\n\n private async _handler(event: SubscriberEvent<TServices, TLogger>) {\n // If no events after filtering, return early\n if (event.events.length === 0) {\n this.logger.info('No subscribed events to process');\n return {\n batchItemFailures: [],\n };\n }\n\n // Execute the subscriber with the parsed context\n const result = await this.subscriber.handler({\n events: event.events,\n services: event.services,\n logger: event.logger,\n });\n\n // Parse output if schema is provided\n if (this.subscriber.outputSchema && result) {\n const validationResult =\n await this.subscriber.outputSchema['~standard'].validate(result);\n\n if (validationResult.issues) {\n this.logger.error(\n { issues: validationResult.issues },\n 'Subscriber output validation failed',\n );\n throw new Error('Subscriber output validation failed');\n }\n\n return validationResult.value;\n }\n\n return result;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.error())\n .use(this.services())\n .use(this.parseEvents()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;AAyCA,IAAa,sBAAb,MAOE;CACA,AAAQ;CACR,AAAQ;CAER,YACUA,WACCC,YAQT;EATQ;EACC;AAST,OAAK,UAAU,WAAW;CAC3B;CAED,IAAI,SAAkB;AACpB,SAAO,KAAK;CACb;CAED,MAAc,cAAiD;AAC7D,MAAI,KAAK,UACP,QAAO,KAAK;EAGd,MAAM,mBAAmB,sCAAiB,YACxC,KAAK,QACL,KAAK,UACN;AAED,MAAI,KAAK,WAAW,SAAS,SAAS,GAAG;GACvC,MAAM,aAAa,MAAM,iBAAiB,SACxC,KAAK,WAAW,SACjB;AACD,QAAK,YAAY;EAClB,MACC,MAAK,YAAY,CAAE;AAGrB,SAAO,KAAK;CACb;CAED,AAAQ,QAAmD;AACzD,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,WAAW;AACpD,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,8BAA8B;AAG5D,SAAM,kCAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,mBAA8D;AACpE,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,WAAW,OAAO,MAAM;IAC1C,YAAY;KACV,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAAsD;AAC5D,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,cAAyD;AAC/D,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,WAAY,IAAY;GAG9B,MAAMC,SAAgB,CAAE;AAExB,OAAI,aAAa,UACf;QAAI,KAAK,WAAW,SAAS,CAE3B,MAAK,MAAM,UAAU,SAAS,QAC5B,KAAI;KACF,MAAM,QAAQ,KAAK,eAAe,OAAO;AACzC,SAAI,SAAS,KAAK,kBAAkB,MAAM,KAAK,CAC7C,QAAO,KAAK,MAAM;IAErB,SAAQ,OAAO;AACd,UAAK,OAAO,MACV;MAAE;MAAO;KAAQ,GACjB,6BACD;IACF;aAEM,KAAK,WAAW,SAAS,CAElC,MAAK,MAAM,UAAU,SAAS,QAC5B,KAAI;KACF,MAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,QAAQ;AAC5C,SAAI,SAAS,KAAK,kBAAkB,MAAM,KAAK,CAC7C,QAAO,KAAK,MAAM;IAErB,SAAQ,OAAO;AACd,UAAK,OAAO,MACV;MAAE;MAAO;KAAQ,GACjB,6BACD;IACF;GAEJ;AAGH,GAAC,IAAI,MAAc,SAAS;EAC7B,EACF;CACF;CAED,AAAQ,WAAWC,OAA+C;AAChE,SACE,aAAa,SACb,MAAM,QAAQ,SAAS,KACvB,iBAAiB,MAAM,QAAQ,MAC/B,MAAM,QAAQ,GAAG,gBAAgB;CAEpC;CAED,AAAQ,WAAWA,OAA+C;AAChE,SACE,aAAa,SACb,MAAM,QAAQ,SAAS,KACvB,iBAAiB,MAAM,QAAQ,MAC/B,MAAM,QAAQ,GAAG,gBAAgB;CAEpC;CAED,AAAQ,eAAeC,QAA+B;AACpD,MAAI;GACF,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK;AAGpC,OAAI,KAAK,SAAS,kBAAkB,KAAK,SAAS;IAEhD,MAAM,aAAa,KAAK,MAAM,KAAK,QAAQ;AAC3C,WAAO;GACR;AAGD,UAAO;EACR,SAAQ,OAAO;AACd,QAAK,OAAO,MAAM;IAAE;IAAO;GAAQ,GAAE,kCAAkC;AACvE,UAAO;EACR;CACF;CAED,AAAQ,kBAAkBC,WAA4B;AACpD,OAAK,KAAK,WAAW,iBACnB,QAAO;AAGT,SAAO,KAAK,WAAW,iBAAiB,SAAS,UAAiB;CACnE;CAED,MAAc,SAASC,OAA4C;AAEjE,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,QAAK,OAAO,KAAK,kCAAkC;AACnD,UAAO,EACL,mBAAmB,CAAE,EACtB;EACF;EAGD,MAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;GAC3C,QAAQ,MAAM;GACd,UAAU,MAAM;GAChB,QAAQ,MAAM;EACf,EAAC;AAGF,MAAI,KAAK,WAAW,gBAAgB,QAAQ;GAC1C,MAAM,mBACJ,MAAM,KAAK,WAAW,aAAa,aAAa,SAAS,OAAO;AAElE,OAAI,iBAAiB,QAAQ;AAC3B,SAAK,OAAO,MACV,EAAE,QAAQ,iBAAiB,OAAQ,GACnC,sCACD;AACD,UAAM,IAAI,MAAM;GACjB;AAED,UAAO,iBAAiB;EACzB;AAED,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,aAAa,CAAC;CAC3B;AACF"}
@@ -0,0 +1,132 @@
1
+ import { wrapError } from "@geekmidas/errors";
2
+ import middy from "@middy/core";
3
+ import { ServiceDiscovery } from "@geekmidas/services";
4
+
5
+ //#region src/subscribers/AWSLambdaSubscriberAdaptor.ts
6
+ var AWSLambdaSubscriber = class {
7
+ _logger;
8
+ _services;
9
+ constructor(envParser, subscriber) {
10
+ this.envParser = envParser;
11
+ this.subscriber = subscriber;
12
+ this._logger = subscriber.logger;
13
+ }
14
+ get logger() {
15
+ return this._logger;
16
+ }
17
+ async getServices() {
18
+ if (this._services) return this._services;
19
+ const serviceDiscovery = ServiceDiscovery.getInstance(this.logger, this.envParser);
20
+ if (this.subscriber.services.length > 0) {
21
+ const registered = await serviceDiscovery.register(this.subscriber.services);
22
+ this._services = registered;
23
+ } else this._services = {};
24
+ return this._services;
25
+ }
26
+ error() {
27
+ return { onError: (req) => {
28
+ const logger = req.event?.logger || this.subscriber.logger;
29
+ logger.error(req.error || {}, "Error processing subscriber");
30
+ throw wrapError(req.error);
31
+ } };
32
+ }
33
+ loggerMiddleware() {
34
+ return { before: (req) => {
35
+ this._logger = this.subscriber.logger.child({
36
+ subscriber: {
37
+ name: req.context.functionName,
38
+ version: req.context.functionVersion,
39
+ memory: req.context.memoryLimitInMB
40
+ },
41
+ req: { id: req.context.awsRequestId }
42
+ });
43
+ req.event.logger = this._logger;
44
+ } };
45
+ }
46
+ services() {
47
+ return { before: async (req) => {
48
+ req.event.services = await this.getServices();
49
+ } };
50
+ }
51
+ parseEvents() {
52
+ return { before: async (req) => {
53
+ const rawEvent = req.event;
54
+ const events = [];
55
+ if ("Records" in rawEvent) {
56
+ if (this.isSQSEvent(rawEvent)) for (const record of rawEvent.Records) try {
57
+ const event = this.parseSQSRecord(record);
58
+ if (event && this.isSubscribedEvent(event.type)) events.push(event);
59
+ } catch (error) {
60
+ this.logger.error({
61
+ error,
62
+ record
63
+ }, "Failed to parse SQS record");
64
+ }
65
+ else if (this.isSNSEvent(rawEvent)) for (const record of rawEvent.Records) try {
66
+ const event = JSON.parse(record.Sns.Message);
67
+ if (event && this.isSubscribedEvent(event.type)) events.push(event);
68
+ } catch (error) {
69
+ this.logger.error({
70
+ error,
71
+ record
72
+ }, "Failed to parse SNS record");
73
+ }
74
+ }
75
+ req.event.events = events;
76
+ } };
77
+ }
78
+ isSQSEvent(event) {
79
+ return "Records" in event && event.Records.length > 0 && "eventSource" in event.Records[0] && event.Records[0].eventSource === "aws:sqs";
80
+ }
81
+ isSNSEvent(event) {
82
+ return "Records" in event && event.Records.length > 0 && "EventSource" in event.Records[0] && event.Records[0].EventSource === "aws:sns";
83
+ }
84
+ parseSQSRecord(record) {
85
+ try {
86
+ const body = JSON.parse(record.body);
87
+ if (body.Type === "Notification" && body.Message) {
88
+ const snsMessage = JSON.parse(body.Message);
89
+ return snsMessage;
90
+ }
91
+ return body;
92
+ } catch (error) {
93
+ this.logger.error({
94
+ error,
95
+ record
96
+ }, "Failed to parse SQS record body");
97
+ return null;
98
+ }
99
+ }
100
+ isSubscribedEvent(eventType) {
101
+ if (!this.subscriber.subscribedEvents) return true;
102
+ return this.subscriber.subscribedEvents.includes(eventType);
103
+ }
104
+ async _handler(event) {
105
+ if (event.events.length === 0) {
106
+ this.logger.info("No subscribed events to process");
107
+ return { batchItemFailures: [] };
108
+ }
109
+ const result = await this.subscriber.handler({
110
+ events: event.events,
111
+ services: event.services,
112
+ logger: event.logger
113
+ });
114
+ if (this.subscriber.outputSchema && result) {
115
+ const validationResult = await this.subscriber.outputSchema["~standard"].validate(result);
116
+ if (validationResult.issues) {
117
+ this.logger.error({ issues: validationResult.issues }, "Subscriber output validation failed");
118
+ throw new Error("Subscriber output validation failed");
119
+ }
120
+ return validationResult.value;
121
+ }
122
+ return result;
123
+ }
124
+ get handler() {
125
+ const handler = this._handler.bind(this);
126
+ return middy(handler).use(this.loggerMiddleware()).use(this.error()).use(this.services()).use(this.parseEvents());
127
+ }
128
+ };
129
+
130
+ //#endregion
131
+ export { AWSLambdaSubscriber };
132
+ //# sourceMappingURL=AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs","names":["envParser: EnvironmentParser<{}>","subscriber: Subscriber<\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TSubscribedEvents\n >","events: any[]","event: SQSEvent | SNSEvent","record: SQSRecord","eventType: string","event: SubscriberEvent<TServices, TLogger>"],"sources":["../src/subscribers/AWSLambdaSubscriberAdaptor.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { ServiceDiscovery } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n Context,\n Handler,\n SNSEvent,\n SQSEvent,\n SQSRecord,\n} from 'aws-lambda';\n\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Subscriber } from './Subscriber';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype SubscriberEvent<TServices extends Service[], TLogger extends Logger> = {\n events: any[];\n services: ServiceRecord<TServices>;\n logger: TLogger;\n};\n\ntype Middleware<\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n SubscriberEvent<TServices, TLogger>,\n InferStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaSubscriber<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TSubscribedEvents extends any[] = [],\n> {\n private _logger!: TLogger;\n private _services!: ServiceRecord<TServices>;\n\n constructor(\n private envParser: EnvironmentParser<{}>,\n readonly subscriber: Subscriber<\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TSubscribedEvents\n >,\n ) {\n this._logger = subscriber.logger;\n }\n\n get logger(): TLogger {\n return this._logger;\n }\n\n private async getServices(): Promise<ServiceRecord<TServices>> {\n if (this._services) {\n return this._services;\n }\n\n const serviceDiscovery = ServiceDiscovery.getInstance(\n this.logger,\n this.envParser,\n );\n\n if (this.subscriber.services.length > 0) {\n const registered = await serviceDiscovery.register(\n this.subscriber.services,\n );\n this._services = registered as ServiceRecord<TServices>;\n } else {\n this._services = {} as ServiceRecord<TServices>;\n }\n\n return this._services;\n }\n\n private error(): Middleware<TServices, TLogger, OutSchema> {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.subscriber.logger;\n logger.error(req.error || {}, 'Error processing subscriber');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private loggerMiddleware(): Middleware<TServices, TLogger, OutSchema> {\n return {\n before: (req) => {\n this._logger = this.subscriber.logger.child({\n subscriber: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services(): Middleware<TServices, TLogger, OutSchema> {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private parseEvents(): Middleware<TServices, TLogger, OutSchema> {\n return {\n before: async (req) => {\n const rawEvent = (req as any).event as SQSEvent | SNSEvent;\n\n // Parse events based on the event type\n const events: any[] = [];\n\n if ('Records' in rawEvent) {\n if (this.isSQSEvent(rawEvent)) {\n // SQS Event\n for (const record of rawEvent.Records) {\n try {\n const event = this.parseSQSRecord(record);\n if (event && this.isSubscribedEvent(event.type)) {\n events.push(event);\n }\n } catch (error) {\n this.logger.error(\n { error, record },\n 'Failed to parse SQS record',\n );\n }\n }\n } else if (this.isSNSEvent(rawEvent)) {\n // SNS Event\n for (const record of rawEvent.Records) {\n try {\n const event = JSON.parse(record.Sns.Message);\n if (event && this.isSubscribedEvent(event.type)) {\n events.push(event);\n }\n } catch (error) {\n this.logger.error(\n { error, record },\n 'Failed to parse SNS record',\n );\n }\n }\n }\n }\n\n (req.event as any).events = events;\n },\n };\n }\n\n private isSQSEvent(event: SQSEvent | SNSEvent): event is SQSEvent {\n return (\n 'Records' in event &&\n event.Records.length > 0 &&\n 'eventSource' in event.Records[0] &&\n event.Records[0].eventSource === 'aws:sqs'\n );\n }\n\n private isSNSEvent(event: SQSEvent | SNSEvent): event is SNSEvent {\n return (\n 'Records' in event &&\n event.Records.length > 0 &&\n 'EventSource' in event.Records[0] &&\n event.Records[0].EventSource === 'aws:sns'\n );\n }\n\n private parseSQSRecord(record: SQSRecord): any | null {\n try {\n const body = JSON.parse(record.body);\n\n // Check if this is an SNS message wrapped in SQS\n if (body.Type === 'Notification' && body.Message) {\n // Parse the SNS message\n const snsMessage = JSON.parse(body.Message);\n return snsMessage;\n }\n\n // Direct SQS message\n return body;\n } catch (error) {\n this.logger.error({ error, record }, 'Failed to parse SQS record body');\n return null;\n }\n }\n\n private isSubscribedEvent(eventType: string): boolean {\n if (!this.subscriber.subscribedEvents) {\n return true; // If no events specified, accept all\n }\n\n return this.subscriber.subscribedEvents.includes(eventType as any);\n }\n\n private async _handler(event: SubscriberEvent<TServices, TLogger>) {\n // If no events after filtering, return early\n if (event.events.length === 0) {\n this.logger.info('No subscribed events to process');\n return {\n batchItemFailures: [],\n };\n }\n\n // Execute the subscriber with the parsed context\n const result = await this.subscriber.handler({\n events: event.events,\n services: event.services,\n logger: event.logger,\n });\n\n // Parse output if schema is provided\n if (this.subscriber.outputSchema && result) {\n const validationResult =\n await this.subscriber.outputSchema['~standard'].validate(result);\n\n if (validationResult.issues) {\n this.logger.error(\n { issues: validationResult.issues },\n 'Subscriber output validation failed',\n );\n throw new Error('Subscriber output validation failed');\n }\n\n return validationResult.value;\n }\n\n return result;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.error())\n .use(this.services())\n .use(this.parseEvents()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Subscriber } from "./Subscriber-BoFm12i_.cjs";
2
+ import { EventPublisher } from "@geekmidas/events";
3
+ import { Logger } from "@geekmidas/logger";
4
+ import { Service } from "@geekmidas/services";
5
+ import { StandardSchemaV1 } from "@standard-schema/spec";
6
+ import { EnvironmentParser } from "@geekmidas/envkit";
7
+ import { Handler } from "aws-lambda";
8
+
9
+ //#region src/subscribers/AWSLambdaSubscriberAdaptor.d.ts
10
+ type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
11
+ declare class AWSLambdaSubscriber<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TSubscribedEvents extends any[] = []> {
12
+ private envParser;
13
+ readonly subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents>;
14
+ private _logger;
15
+ private _services;
16
+ constructor(envParser: EnvironmentParser<{}>, subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents>);
17
+ get logger(): TLogger;
18
+ private getServices;
19
+ private error;
20
+ private loggerMiddleware;
21
+ private services;
22
+ private parseEvents;
23
+ private isSQSEvent;
24
+ private isSNSEvent;
25
+ private parseSQSRecord;
26
+ private isSubscribedEvent;
27
+ private _handler;
28
+ get handler(): AWSLambdaHandler;
29
+ }
30
+ //#endregion
31
+ export { AWSLambdaHandler, AWSLambdaSubscriber };
32
+ //# sourceMappingURL=AWSLambdaSubscriberAdaptor-QKVxR6qh.d.cts.map
@@ -0,0 +1,61 @@
1
+ import { HttpMethod } from "./types-DBKNYvsW.mjs";
2
+ import { Endpoint, EndpointSchemas } from "./Endpoint-DCn53Vd8.mjs";
3
+ import { EnvironmentParser } from "@geekmidas/envkit";
4
+ import { Service, ServiceRecord } from "@geekmidas/services";
5
+ import { EventPublisher } from "@geekmidas/events";
6
+ import { Logger } from "@geekmidas/logger";
7
+ import { StandardSchemaV1 } from "@standard-schema/spec";
8
+ import { InferComposableStandardSchema } from "@geekmidas/schema";
9
+ import { APIGatewayProxyEvent, APIGatewayProxyEventV2, Context } from "aws-lambda";
10
+
11
+ //#region src/endpoints/AmazonApiGatewayEndpointAdaptor.d.ts
12
+ declare abstract class AmazonApiGatewayEndpoint<THandler extends AmazonApiGatewayV1EndpointHandler | AmazonApiGatewayV2EndpointHandler, TEvent extends HandlerEvent<THandler>, TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string> {
13
+ protected envParser: EnvironmentParser<{}>;
14
+ protected readonly endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName>;
15
+ constructor(envParser: EnvironmentParser<{}>, endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName>);
16
+ private error;
17
+ abstract getInput(e: TEvent): GetInputResponse;
18
+ private input;
19
+ abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;
20
+ private logger;
21
+ private services;
22
+ private authorize;
23
+ private session;
24
+ private events;
25
+ private _handler;
26
+ get handler(): THandler;
27
+ }
28
+ type Event<TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2, TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown> = {
29
+ services: ServiceRecord<TServices>;
30
+ logger: TLogger;
31
+ header(key: string): string | undefined;
32
+ session: TSession;
33
+ } & TEvent & InferComposableStandardSchema<TInput>;
34
+ type AmazonApiGatewayEndpointHandlerResponse = {
35
+ statusCode: number;
36
+ body: string | undefined;
37
+ };
38
+ type LoggerContext = {
39
+ fn: {
40
+ name: string;
41
+ version: string;
42
+ };
43
+ req: {
44
+ id: string | undefined;
45
+ awsRequestId: string;
46
+ path: string;
47
+ ip: string | undefined;
48
+ userAgent: string | undefined;
49
+ };
50
+ };
51
+ type GetInputResponse = {
52
+ body: any;
53
+ query: any;
54
+ params: any;
55
+ };
56
+ type AmazonApiGatewayV1EndpointHandler = (event: APIGatewayProxyEvent, context: Context) => Promise<AmazonApiGatewayEndpointHandlerResponse>;
57
+ type AmazonApiGatewayV2EndpointHandler = (event: APIGatewayProxyEventV2, context: Context) => Promise<AmazonApiGatewayEndpointHandlerResponse>;
58
+ type HandlerEvent<T extends Function> = T extends ((event: infer E, context: Context) => any) ? E : never;
59
+ //#endregion
60
+ export { AmazonApiGatewayEndpoint, AmazonApiGatewayEndpointHandlerResponse, AmazonApiGatewayV1EndpointHandler, AmazonApiGatewayV2EndpointHandler, Event, GetInputResponse, HandlerEvent, LoggerContext };
61
+ //# sourceMappingURL=AmazonApiGatewayEndpointAdaptor-BoBh7vvD.d.mts.map