@geekmidas/constructs 1.0.4 → 1.1.0

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 (242) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{AWSLambdaFunction-CDJX0Tr1.d.mts → AWSLambdaFunction-BF1gJJjG.d.mts} +3 -3
  3. package/dist/{AWSLambdaFunction-CDJX0Tr1.d.mts.map → AWSLambdaFunction-BF1gJJjG.d.mts.map} +1 -1
  4. package/dist/{AWSLambdaSubscriberAdaptor-Soie57uM.cjs → AWSLambdaSubscriberAdaptor-BtBKExsh.cjs} +38 -35
  5. package/dist/AWSLambdaSubscriberAdaptor-BtBKExsh.cjs.map +1 -0
  6. package/dist/{AWSLambdaSubscriberAdaptor-BfEGolJA.d.cts → AWSLambdaSubscriberAdaptor-Cj1wjkUP.d.cts} +3 -2
  7. package/dist/{AWSLambdaSubscriberAdaptor-BfEGolJA.d.cts.map → AWSLambdaSubscriberAdaptor-Cj1wjkUP.d.cts.map} +1 -1
  8. package/dist/{AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs → AWSLambdaSubscriberAdaptor-DsRmmGm1.mjs} +38 -35
  9. package/dist/AWSLambdaSubscriberAdaptor-DsRmmGm1.mjs.map +1 -0
  10. package/dist/{AWSLambdaSubscriberAdaptor-Pb7Jof-i.d.mts → AWSLambdaSubscriberAdaptor-OQvj2lKI.d.mts} +4 -3
  11. package/dist/{AWSLambdaSubscriberAdaptor-Pb7Jof-i.d.mts.map → AWSLambdaSubscriberAdaptor-OQvj2lKI.d.mts.map} +1 -1
  12. package/dist/{AmazonApiGatewayEndpointAdaptor-DRG4hu-k.d.mts → AmazonApiGatewayEndpointAdaptor-CQSZArI6.d.mts} +4 -4
  13. package/dist/{AmazonApiGatewayEndpointAdaptor-DRG4hu-k.d.mts.map → AmazonApiGatewayEndpointAdaptor-CQSZArI6.d.mts.map} +1 -1
  14. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Bj9BDhNM.d.mts → AmazonApiGatewayV1EndpointAdaptor-xTrFYt48.d.mts} +4 -4
  15. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Bj9BDhNM.d.mts.map → AmazonApiGatewayV1EndpointAdaptor-xTrFYt48.d.mts.map} +1 -1
  16. package/dist/{AmazonApiGatewayV2EndpointAdaptor-C0199fdk.d.mts → AmazonApiGatewayV2EndpointAdaptor-BBayh2_k.d.mts} +4 -4
  17. package/dist/{AmazonApiGatewayV2EndpointAdaptor-C0199fdk.d.mts.map → AmazonApiGatewayV2EndpointAdaptor-BBayh2_k.d.mts.map} +1 -1
  18. package/dist/{Authorizer-BgjU8-z6.mjs → Authorizer-4unKN3Xn.mjs} +1 -1
  19. package/dist/{Authorizer-BgjU8-z6.mjs.map → Authorizer-4unKN3Xn.mjs.map} +1 -1
  20. package/dist/{Authorizer-DCcYOx3h.d.mts → Authorizer-DBsrDTuf.d.mts} +1 -1
  21. package/dist/{Authorizer-DCcYOx3h.d.mts.map → Authorizer-DBsrDTuf.d.mts.map} +1 -1
  22. package/dist/{Authorizer-BXxBee2P.cjs → Authorizer-Dx57psuM.cjs} +1 -1
  23. package/dist/{Authorizer-BXxBee2P.cjs.map → Authorizer-Dx57psuM.cjs.map} +1 -1
  24. package/dist/{BaseFunctionBuilder-JpN2FtB4.d.mts → BaseFunctionBuilder-CsvFjzA8.d.mts} +2 -2
  25. package/dist/{BaseFunctionBuilder-JpN2FtB4.d.mts.map → BaseFunctionBuilder-CsvFjzA8.d.mts.map} +1 -1
  26. package/dist/{Construct-DvXCkLOP.d.mts → Construct-C2SyofdS.d.mts} +1 -1
  27. package/dist/{Construct-DvXCkLOP.d.mts.map → Construct-C2SyofdS.d.mts.map} +1 -1
  28. package/dist/Construct.d.mts +1 -1
  29. package/dist/{Cron-D5NpDp6y.mjs → Cron-B3vrGuaD.mjs} +1 -1
  30. package/dist/{Cron-D5NpDp6y.mjs.map → Cron-B3vrGuaD.mjs.map} +1 -1
  31. package/dist/{Cron-BJWjEj3U.d.cts → Cron-BDxW6fYg.d.cts} +1 -1
  32. package/dist/{Cron-BJWjEj3U.d.cts.map → Cron-BDxW6fYg.d.cts.map} +1 -1
  33. package/dist/{Cron-BjNvt_Wj.d.mts → Cron-CWxjO2Fg.d.mts} +2 -2
  34. package/dist/{Cron-BjNvt_Wj.d.mts.map → Cron-CWxjO2Fg.d.mts.map} +1 -1
  35. package/dist/{Cron-BV6weqem.cjs → Cron-DEKZg5j4.cjs} +1 -1
  36. package/dist/{Cron-BV6weqem.cjs.map → Cron-DEKZg5j4.cjs.map} +1 -1
  37. package/dist/{CronBuilder-DzPkDCiP.cjs → CronBuilder-BHpY6w3b.cjs} +2 -2
  38. package/dist/{CronBuilder-DzPkDCiP.cjs.map → CronBuilder-BHpY6w3b.cjs.map} +1 -1
  39. package/dist/{CronBuilder-CmPYae1S.d.cts → CronBuilder-CginrW3H.d.cts} +2 -2
  40. package/dist/{CronBuilder-CmPYae1S.d.cts.map → CronBuilder-CginrW3H.d.cts.map} +1 -1
  41. package/dist/{CronBuilder-X4au0zTu.d.mts → CronBuilder-DJnXbDGK.d.mts} +4 -4
  42. package/dist/{CronBuilder-X4au0zTu.d.mts.map → CronBuilder-DJnXbDGK.d.mts.map} +1 -1
  43. package/dist/{CronBuilder-p1Ro6a0n.mjs → CronBuilder-VXpyNfp2.mjs} +2 -2
  44. package/dist/{CronBuilder-p1Ro6a0n.mjs.map → CronBuilder-VXpyNfp2.mjs.map} +1 -1
  45. package/dist/{Endpoint-DU20A9E8.d.mts → Endpoint-BiPM0glm.d.mts} +4 -4
  46. package/dist/{Endpoint-DU20A9E8.d.mts.map → Endpoint-BiPM0glm.d.mts.map} +1 -1
  47. package/dist/{EndpointBuilder-CuVlda7g.d.mts → EndpointBuilder-B0Aj5jbB.d.mts} +5 -5
  48. package/dist/{EndpointBuilder-CuVlda7g.d.mts.map → EndpointBuilder-B0Aj5jbB.d.mts.map} +1 -1
  49. package/dist/{EndpointBuilder-BfzI6Rpc.d.cts → EndpointBuilder-Bel6RS7W.d.cts} +1 -1
  50. package/dist/{EndpointBuilder-BfzI6Rpc.d.cts.map → EndpointBuilder-Bel6RS7W.d.cts.map} +1 -1
  51. package/dist/{EndpointBuilder-CF-ZWtdu.mjs → EndpointBuilder-D1RtrBu1.mjs} +3 -3
  52. package/dist/{EndpointBuilder-CF-ZWtdu.mjs.map → EndpointBuilder-D1RtrBu1.mjs.map} +1 -1
  53. package/dist/{EndpointBuilder-CyszO0bs.cjs → EndpointBuilder-fXmTxRyW.cjs} +3 -3
  54. package/dist/{EndpointBuilder-CyszO0bs.cjs.map → EndpointBuilder-fXmTxRyW.cjs.map} +1 -1
  55. package/dist/{EndpointFactory-Bj7vHtT6.d.mts → EndpointFactory-CWIeWCRG.d.mts} +7 -7
  56. package/dist/EndpointFactory-CWIeWCRG.d.mts.map +1 -0
  57. package/dist/{EndpointFactory-C1miOYUW.d.cts → EndpointFactory-CXvakOkn.d.cts} +5 -5
  58. package/dist/EndpointFactory-CXvakOkn.d.cts.map +1 -0
  59. package/dist/{EndpointFactory-B6fUZPhx.cjs → EndpointFactory-DBfTbSTX.cjs} +6 -6
  60. package/dist/EndpointFactory-DBfTbSTX.cjs.map +1 -0
  61. package/dist/{EndpointFactory-CyM-gSew.mjs → EndpointFactory-DkB8yxdQ.mjs} +6 -6
  62. package/dist/EndpointFactory-DkB8yxdQ.mjs.map +1 -0
  63. package/dist/{Function-DEX2O-SB.d.mts → Function-CZw1DRQ6.d.mts} +2 -2
  64. package/dist/{Function-DEX2O-SB.d.mts.map → Function-CZw1DRQ6.d.mts.map} +1 -1
  65. package/dist/{FunctionBuilder-DRw1s5uT.d.mts → FunctionBuilder-m5BNA2Ap.d.mts} +4 -4
  66. package/dist/{FunctionBuilder-DRw1s5uT.d.mts.map → FunctionBuilder-m5BNA2Ap.d.mts.map} +1 -1
  67. package/dist/{FunctionExecutionWrapper-D2kbmPJG.d.mts → FunctionExecutionWrapper-C7yYXIq-.d.mts} +2 -2
  68. package/dist/{FunctionExecutionWrapper-D2kbmPJG.d.mts.map → FunctionExecutionWrapper-C7yYXIq-.d.mts.map} +1 -1
  69. package/dist/{HonoEndpointAdaptor-C7BBBYuU.d.mts → HonoEndpointAdaptor-C3AdQ0xS.d.mts} +5 -5
  70. package/dist/{HonoEndpointAdaptor-C7BBBYuU.d.mts.map → HonoEndpointAdaptor-C3AdQ0xS.d.mts.map} +1 -1
  71. package/dist/{Subscriber-DKQK5gLD.mjs → Subscriber-BEhOdNQi.mjs} +1 -1
  72. package/dist/{Subscriber-DKQK5gLD.mjs.map → Subscriber-BEhOdNQi.mjs.map} +1 -1
  73. package/dist/{Subscriber-DCgMSkQA.d.mts → Subscriber-BgB3RRxb.d.mts} +2 -2
  74. package/dist/{Subscriber-DCgMSkQA.d.mts.map → Subscriber-BgB3RRxb.d.mts.map} +1 -1
  75. package/dist/{Subscriber-ClqSPbIZ.cjs → Subscriber-Scz7hrV6.cjs} +1 -1
  76. package/dist/{Subscriber-ClqSPbIZ.cjs.map → Subscriber-Scz7hrV6.cjs.map} +1 -1
  77. package/dist/{SubscriberBuilder-BS5B_688.cjs → SubscriberBuilder-B82h4v-S.cjs} +2 -2
  78. package/dist/{SubscriberBuilder-BS5B_688.cjs.map → SubscriberBuilder-B82h4v-S.cjs.map} +1 -1
  79. package/dist/{SubscriberBuilder-UIwW_wIY.d.cts → SubscriberBuilder-B9uva8fZ.d.cts} +1 -1
  80. package/dist/{SubscriberBuilder-BcyK44e_.d.mts.map → SubscriberBuilder-B9uva8fZ.d.cts.map} +1 -1
  81. package/dist/{SubscriberBuilder-BcyK44e_.d.mts → SubscriberBuilder-DaQkh2Nt.d.mts} +2 -2
  82. package/dist/{SubscriberBuilder-UIwW_wIY.d.cts.map → SubscriberBuilder-DaQkh2Nt.d.mts.map} +1 -1
  83. package/dist/{SubscriberBuilder-BswTuvUc.mjs → SubscriberBuilder-DlUaG0Ej.mjs} +2 -2
  84. package/dist/{SubscriberBuilder-BswTuvUc.mjs.map → SubscriberBuilder-DlUaG0Ej.mjs.map} +1 -1
  85. package/dist/{TestEndpointAdaptor-oWNADEl4.d.mts → TestEndpointAdaptor-qSWV8dpS.d.mts} +3 -3
  86. package/dist/{TestEndpointAdaptor-oWNADEl4.d.mts.map → TestEndpointAdaptor-qSWV8dpS.d.mts.map} +1 -1
  87. package/dist/TestFunctionAdaptor-BHk2bDOV.d.cts +30 -0
  88. package/dist/TestFunctionAdaptor-BHk2bDOV.d.cts.map +1 -0
  89. package/dist/TestFunctionAdaptor-CK-dbKpO.mjs +67 -0
  90. package/dist/TestFunctionAdaptor-CK-dbKpO.mjs.map +1 -0
  91. package/dist/TestFunctionAdaptor-CSMX7myB.cjs +73 -0
  92. package/dist/TestFunctionAdaptor-CSMX7myB.cjs.map +1 -0
  93. package/dist/TestFunctionAdaptor-DzT8GRdR.d.mts +30 -0
  94. package/dist/TestFunctionAdaptor-DzT8GRdR.d.mts.map +1 -0
  95. package/dist/TestSubscriberAdaptor-1m-2bM_j.cjs +49 -0
  96. package/dist/TestSubscriberAdaptor-1m-2bM_j.cjs.map +1 -0
  97. package/dist/TestSubscriberAdaptor-CPEiqSfE.d.mts +26 -0
  98. package/dist/TestSubscriberAdaptor-CPEiqSfE.d.mts.map +1 -0
  99. package/dist/TestSubscriberAdaptor-CrqLkyUE.mjs +43 -0
  100. package/dist/TestSubscriberAdaptor-CrqLkyUE.mjs.map +1 -0
  101. package/dist/TestSubscriberAdaptor-DQk5xzb0.d.cts +26 -0
  102. package/dist/TestSubscriberAdaptor-DQk5xzb0.d.cts.map +1 -0
  103. package/dist/adaptors/aws.cjs +1 -1
  104. package/dist/adaptors/aws.d.cts +2 -2
  105. package/dist/adaptors/aws.d.mts +16 -16
  106. package/dist/adaptors/aws.mjs +1 -1
  107. package/dist/adaptors/hono.d.cts +1 -1
  108. package/dist/adaptors/hono.d.mts +9 -9
  109. package/dist/adaptors/testing.cjs +5 -1
  110. package/dist/adaptors/testing.d.cts +5 -2
  111. package/dist/adaptors/testing.d.mts +13 -10
  112. package/dist/adaptors/testing.mjs +3 -1
  113. package/dist/crons/Cron.cjs +1 -1
  114. package/dist/crons/Cron.d.cts +2 -2
  115. package/dist/crons/Cron.d.mts +6 -6
  116. package/dist/crons/Cron.mjs +1 -1
  117. package/dist/crons/CronBuilder.cjs +2 -2
  118. package/dist/crons/CronBuilder.d.cts +3 -3
  119. package/dist/crons/CronBuilder.d.mts +7 -7
  120. package/dist/crons/CronBuilder.mjs +2 -2
  121. package/dist/crons/index.cjs +2 -2
  122. package/dist/crons/index.d.cts +3 -3
  123. package/dist/crons/index.d.mts +7 -7
  124. package/dist/crons/index.mjs +2 -2
  125. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
  126. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +10 -10
  127. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
  128. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +11 -11
  129. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
  130. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +11 -11
  131. package/dist/endpoints/Authorizer.cjs +1 -1
  132. package/dist/endpoints/Authorizer.d.mts +1 -1
  133. package/dist/endpoints/Authorizer.mjs +1 -1
  134. package/dist/endpoints/Endpoint.d.cts +1 -1
  135. package/dist/endpoints/Endpoint.d.mts +8 -8
  136. package/dist/endpoints/EndpointBuilder.cjs +3 -3
  137. package/dist/endpoints/EndpointBuilder.d.cts +2 -2
  138. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  139. package/dist/endpoints/EndpointBuilder.mjs +3 -3
  140. package/dist/endpoints/EndpointFactory.cjs +4 -4
  141. package/dist/endpoints/EndpointFactory.d.cts +3 -3
  142. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  143. package/dist/endpoints/EndpointFactory.mjs +4 -4
  144. package/dist/endpoints/HonoEndpointAdaptor.d.cts +1 -1
  145. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  146. package/dist/endpoints/TestEndpointAdaptor.d.cts +1 -1
  147. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  148. package/dist/endpoints/audit.d.cts +1 -1
  149. package/dist/endpoints/audit.d.mts +8 -8
  150. package/dist/endpoints/helpers.d.cts +1 -1
  151. package/dist/endpoints/helpers.d.mts +8 -8
  152. package/dist/endpoints/index.cjs +4 -4
  153. package/dist/endpoints/index.d.cts +7 -7
  154. package/dist/endpoints/index.d.mts +14 -14
  155. package/dist/endpoints/index.mjs +4 -4
  156. package/dist/endpoints/lazyAccessors.d.cts +2 -2
  157. package/dist/endpoints/lazyAccessors.d.mts +9 -9
  158. package/dist/endpoints/processAudits.d.cts +1 -1
  159. package/dist/endpoints/processAudits.d.mts +8 -8
  160. package/dist/endpoints/rls.cjs +1 -1
  161. package/dist/endpoints/rls.d.cts +1 -1
  162. package/dist/endpoints/rls.d.mts +8 -8
  163. package/dist/endpoints/rls.mjs +1 -1
  164. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  165. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  166. package/dist/functions/Function.d.mts +2 -2
  167. package/dist/functions/FunctionBuilder.d.mts +4 -4
  168. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  169. package/dist/functions/TestFunctionAdaptor.cjs +4 -67
  170. package/dist/functions/TestFunctionAdaptor.d.cts +3 -30
  171. package/dist/functions/TestFunctionAdaptor.d.mts +4 -31
  172. package/dist/functions/TestFunctionAdaptor.mjs +4 -66
  173. package/dist/functions/index.d.cts +1 -1
  174. package/dist/functions/index.d.mts +5 -5
  175. package/dist/index-BfeupgMl.d.cts +12 -0
  176. package/dist/{index-BRZODuxf.d.mts.map → index-BfeupgMl.d.cts.map} +1 -1
  177. package/dist/index-DQo_Csy7.d.mts +12 -0
  178. package/dist/{index-BnoOaBQV.d.cts.map → index-DQo_Csy7.d.mts.map} +1 -1
  179. package/dist/index.d.mts +3 -3
  180. package/dist/{lazyAccessors-D1tbdxUk.d.mts → lazyAccessors-DXkJpnyX.d.mts} +2 -2
  181. package/dist/{lazyAccessors-D1tbdxUk.d.mts.map → lazyAccessors-DXkJpnyX.d.mts.map} +1 -1
  182. package/dist/{lazyAccessors-ZRbwOONj.d.cts → lazyAccessors-DdZaA716.d.cts} +1 -1
  183. package/dist/{lazyAccessors-ZRbwOONj.d.cts.map → lazyAccessors-DdZaA716.d.cts.map} +1 -1
  184. package/dist/{publisher-DdPDps5m.d.cts → publisher-BrzPGnm4.d.cts} +1 -1
  185. package/dist/{publisher-BeouS9lG.d.mts.map → publisher-BrzPGnm4.d.cts.map} +1 -1
  186. package/dist/{publisher-BeouS9lG.d.mts → publisher-CP4gpv-4.d.mts} +2 -2
  187. package/dist/{publisher-DdPDps5m.d.cts.map → publisher-CP4gpv-4.d.mts.map} +1 -1
  188. package/dist/publisher.d.cts +1 -1
  189. package/dist/publisher.d.mts +2 -2
  190. package/dist/{rls-C0cWOnk4.mjs → rls-7XXX7DvY.mjs} +1 -1
  191. package/dist/{rls-C0cWOnk4.mjs.map → rls-7XXX7DvY.mjs.map} +1 -1
  192. package/dist/{rls-BrywnrQb.cjs → rls-DxFqdIA0.cjs} +1 -1
  193. package/dist/{rls-BrywnrQb.cjs.map → rls-DxFqdIA0.cjs.map} +1 -1
  194. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
  195. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +1 -1
  196. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  197. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
  198. package/dist/subscribers/Subscriber.cjs +1 -1
  199. package/dist/subscribers/Subscriber.d.mts +2 -2
  200. package/dist/subscribers/Subscriber.mjs +1 -1
  201. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  202. package/dist/subscribers/SubscriberBuilder.d.cts +1 -1
  203. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  204. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  205. package/dist/subscribers/TestSubscriberAdaptor.cjs +4 -0
  206. package/dist/subscribers/TestSubscriberAdaptor.d.cts +4 -0
  207. package/dist/subscribers/TestSubscriberAdaptor.d.mts +4 -0
  208. package/dist/subscribers/TestSubscriberAdaptor.mjs +4 -0
  209. package/dist/subscribers/index.cjs +5 -2
  210. package/dist/subscribers/index.cjs.map +1 -1
  211. package/dist/subscribers/index.d.cts +3 -2
  212. package/dist/subscribers/index.d.cts.map +1 -1
  213. package/dist/subscribers/index.d.mts +5 -4
  214. package/dist/subscribers/index.d.mts.map +1 -1
  215. package/dist/subscribers/index.mjs +5 -3
  216. package/dist/subscribers/index.mjs.map +1 -1
  217. package/dist/{telemetry-yAHf5yDs.d.mts → telemetry-C-kNOW3C.d.mts} +1 -1
  218. package/dist/{telemetry-yAHf5yDs.d.mts.map → telemetry-C-kNOW3C.d.mts.map} +1 -1
  219. package/dist/telemetry.d.mts +1 -1
  220. package/dist/{types-Dw-iLd3Y.d.mts → types-aFmq5cKh.d.mts} +1 -1
  221. package/dist/{types-Dw-iLd3Y.d.mts.map → types-aFmq5cKh.d.mts.map} +1 -1
  222. package/dist/types.d.mts +1 -1
  223. package/package.json +10 -10
  224. package/src/adaptors/testing.ts +2 -0
  225. package/src/endpoints/EndpointFactory.ts +15 -12
  226. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +61 -37
  227. package/src/subscribers/TestSubscriberAdaptor.ts +127 -0
  228. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +239 -27
  229. package/src/subscribers/__tests__/TestSubscriberAdaptor.spec.ts +558 -0
  230. package/src/subscribers/index.ts +1 -0
  231. package/dist/AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs.map +0 -1
  232. package/dist/AWSLambdaSubscriberAdaptor-Soie57uM.cjs.map +0 -1
  233. package/dist/EndpointFactory-B6fUZPhx.cjs.map +0 -1
  234. package/dist/EndpointFactory-Bj7vHtT6.d.mts.map +0 -1
  235. package/dist/EndpointFactory-C1miOYUW.d.cts.map +0 -1
  236. package/dist/EndpointFactory-CyM-gSew.mjs.map +0 -1
  237. package/dist/functions/TestFunctionAdaptor.cjs.map +0 -1
  238. package/dist/functions/TestFunctionAdaptor.d.cts.map +0 -1
  239. package/dist/functions/TestFunctionAdaptor.d.mts.map +0 -1
  240. package/dist/functions/TestFunctionAdaptor.mjs.map +0 -1
  241. package/dist/index-BRZODuxf.d.mts +0 -12
  242. package/dist/index-BnoOaBQV.d.cts +0 -12
@@ -0,0 +1,558 @@
1
+ import type { EventPublisher, PublishableMessage } from '@geekmidas/events';
2
+ import type { Logger } from '@geekmidas/logger';
3
+ import { ConsoleLogger } from '@geekmidas/logger/console';
4
+ import type { Service } from '@geekmidas/services';
5
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
+ import { z } from 'zod';
7
+ import { Subscriber } from '../Subscriber';
8
+ import { SubscriberBuilder } from '../SubscriberBuilder';
9
+ import { TestSubscriberAdaptor } from '../TestSubscriberAdaptor';
10
+
11
+ // --- Test fixtures ---
12
+
13
+ type UserEvent =
14
+ | PublishableMessage<
15
+ 'user.created',
16
+ { userId: string; email: string; name: string }
17
+ >
18
+ | PublishableMessage<
19
+ 'user.updated',
20
+ { userId: string; changes: Record<string, any> }
21
+ >
22
+ | PublishableMessage<'user.deleted', { userId: string }>;
23
+
24
+ class TestEventPublisher implements EventPublisher<UserEvent> {
25
+ publishedEvents: UserEvent[] = [];
26
+ async publish(events: UserEvent[]): Promise<void> {
27
+ this.publishedEvents.push(...events);
28
+ }
29
+ }
30
+
31
+ const TestEventService: Service<'testEventPublisher', TestEventPublisher> = {
32
+ serviceName: 'testEventPublisher' as const,
33
+ register() {
34
+ return new TestEventPublisher();
35
+ },
36
+ };
37
+
38
+ const TestDbService: Service<'db', { query: () => string }> = {
39
+ serviceName: 'db' as const,
40
+ register() {
41
+ return { query: () => 'result' };
42
+ },
43
+ };
44
+
45
+ describe('TestSubscriberAdaptor', () => {
46
+ let logger: ConsoleLogger;
47
+
48
+ beforeEach(() => {
49
+ logger = new ConsoleLogger();
50
+ vi.clearAllMocks();
51
+ });
52
+
53
+ describe('basic execution', () => {
54
+ it('should invoke a subscriber and return result', async () => {
55
+ const subscriber = new SubscriberBuilder()
56
+ .publisher(TestEventService)
57
+ .subscribe('user.created')
58
+ .handle(async ({ events }) => ({
59
+ processed: events.length,
60
+ }));
61
+
62
+ const adaptor = new TestSubscriberAdaptor(subscriber);
63
+
64
+ const result = await adaptor.invoke({
65
+ events: [
66
+ {
67
+ type: 'user.created',
68
+ payload: {
69
+ userId: '1',
70
+ email: 'test@example.com',
71
+ name: 'Test',
72
+ },
73
+ },
74
+ ],
75
+ services: {},
76
+ });
77
+
78
+ expect(result).toEqual({ processed: 1 });
79
+ });
80
+
81
+ it('should return early with batchItemFailures for empty events', async () => {
82
+ const handler = vi.fn(async () => ({ processed: 0 }));
83
+ const subscriber = new SubscriberBuilder()
84
+ .publisher(TestEventService)
85
+ .subscribe('user.created')
86
+ .handle(handler);
87
+
88
+ const adaptor = new TestSubscriberAdaptor(subscriber);
89
+
90
+ const result = await adaptor.invoke({
91
+ events: [],
92
+ services: {},
93
+ });
94
+
95
+ expect(result).toEqual({ batchItemFailures: [] });
96
+ expect(handler).not.toHaveBeenCalled();
97
+ });
98
+
99
+ it('should handle multiple events in a batch', async () => {
100
+ const processedIds: string[] = [];
101
+ const subscriber = new SubscriberBuilder()
102
+ .publisher(TestEventService)
103
+ .subscribe(['user.created', 'user.updated'])
104
+ .handle(async ({ events }) => {
105
+ for (const event of events) {
106
+ processedIds.push(event.payload.userId);
107
+ }
108
+ return { count: events.length };
109
+ });
110
+
111
+ const adaptor = new TestSubscriberAdaptor(subscriber);
112
+
113
+ const result = await adaptor.invoke({
114
+ events: [
115
+ {
116
+ type: 'user.created',
117
+ payload: {
118
+ userId: '1',
119
+ email: 'a@b.com',
120
+ name: 'A',
121
+ },
122
+ },
123
+ {
124
+ type: 'user.updated',
125
+ payload: {
126
+ userId: '2',
127
+ changes: { name: 'B' },
128
+ },
129
+ },
130
+ ] as any,
131
+ services: {},
132
+ });
133
+
134
+ expect(result).toEqual({ count: 2 });
135
+ expect(processedIds).toEqual(['1', '2']);
136
+ });
137
+ });
138
+
139
+ describe('output validation', () => {
140
+ it('should validate output against schema', async () => {
141
+ const outputSchema = z.object({ processed: z.number() });
142
+
143
+ const subscriber = new SubscriberBuilder()
144
+ .publisher(TestEventService)
145
+ .output(outputSchema)
146
+ .subscribe('user.created')
147
+ .handle(async ({ events }) => ({
148
+ processed: events.length,
149
+ }));
150
+
151
+ const adaptor = new TestSubscriberAdaptor(subscriber);
152
+
153
+ const result = await adaptor.invoke({
154
+ events: [
155
+ {
156
+ type: 'user.created',
157
+ payload: {
158
+ userId: '1',
159
+ email: 'test@example.com',
160
+ name: 'Test',
161
+ },
162
+ },
163
+ ],
164
+ services: {},
165
+ });
166
+
167
+ expect(result).toEqual({ processed: 1 });
168
+ });
169
+
170
+ it('should throw on invalid output', async () => {
171
+ const outputSchema = z.object({ processed: z.number() });
172
+
173
+ const subscriber = new SubscriberBuilder()
174
+ .publisher(TestEventService)
175
+ .output(outputSchema)
176
+ .subscribe('user.created')
177
+ .handle(async () => ({
178
+ processed: 'not-a-number' as any,
179
+ }));
180
+
181
+ const adaptor = new TestSubscriberAdaptor(subscriber);
182
+
183
+ await expect(
184
+ adaptor.invoke({
185
+ events: [
186
+ {
187
+ type: 'user.created',
188
+ payload: {
189
+ userId: '1',
190
+ email: 'test@example.com',
191
+ name: 'Test',
192
+ },
193
+ },
194
+ ],
195
+ services: {},
196
+ }),
197
+ ).rejects.toThrow('Subscriber output validation failed');
198
+ });
199
+ });
200
+
201
+ describe('event filtering', () => {
202
+ it('should filter out events not in subscribedEvents', async () => {
203
+ const receivedEvents: any[] = [];
204
+ const subscriber = new SubscriberBuilder()
205
+ .publisher(TestEventService)
206
+ .subscribe('user.created')
207
+ .handle(async ({ events }) => {
208
+ receivedEvents.push(...events);
209
+ return { count: events.length };
210
+ });
211
+
212
+ const adaptor = new TestSubscriberAdaptor(subscriber);
213
+
214
+ const result = await adaptor.invoke({
215
+ events: [
216
+ {
217
+ type: 'user.created',
218
+ payload: {
219
+ userId: '1',
220
+ email: 'a@b.com',
221
+ name: 'A',
222
+ },
223
+ },
224
+ // This event type is not subscribed — should be filtered
225
+ {
226
+ type: 'user.deleted',
227
+ payload: { userId: '2' },
228
+ },
229
+ ] as any,
230
+ services: {},
231
+ });
232
+
233
+ expect(result).toEqual({ count: 1 });
234
+ expect(receivedEvents).toHaveLength(1);
235
+ expect(receivedEvents[0].type).toBe('user.created');
236
+ });
237
+
238
+ it('should return early if all events are filtered out', async () => {
239
+ const handler = vi.fn(async () => ({}));
240
+ const subscriber = new SubscriberBuilder()
241
+ .publisher(TestEventService)
242
+ .subscribe('user.created')
243
+ .handle(handler);
244
+
245
+ const adaptor = new TestSubscriberAdaptor(subscriber);
246
+
247
+ const result = await adaptor.invoke({
248
+ events: [
249
+ {
250
+ type: 'user.deleted',
251
+ payload: { userId: '1' },
252
+ },
253
+ ] as any,
254
+ services: {},
255
+ });
256
+
257
+ expect(result).toEqual({ batchItemFailures: [] });
258
+ expect(handler).not.toHaveBeenCalled();
259
+ });
260
+
261
+ it('should accept all events when subscribedEvents is undefined', async () => {
262
+ // Build a subscriber without .subscribe() — accepts all
263
+ const subscriber = new Subscriber(
264
+ async ({ events }) => ({ count: events.length }),
265
+ 30000,
266
+ undefined, // no subscribedEvents filter
267
+ );
268
+
269
+ const adaptor = new TestSubscriberAdaptor(subscriber as any);
270
+
271
+ const result = await adaptor.invoke({
272
+ events: [
273
+ { type: 'user.created', payload: { userId: '1' } },
274
+ { type: 'user.deleted', payload: { userId: '2' } },
275
+ ] as any,
276
+ services: {},
277
+ });
278
+
279
+ expect(result).toEqual({ count: 2 });
280
+ });
281
+ });
282
+
283
+ describe('services', () => {
284
+ it('should use provided services from request', async () => {
285
+ const subscriber = new SubscriberBuilder()
286
+ .publisher(TestEventService)
287
+ .services([TestDbService])
288
+ .subscribe('user.created')
289
+ .handle(async ({ services }) => ({
290
+ value: services.db.query(),
291
+ }));
292
+
293
+ const adaptor = new TestSubscriberAdaptor(subscriber);
294
+
295
+ const result = await adaptor.invoke({
296
+ events: [
297
+ {
298
+ type: 'user.created',
299
+ payload: {
300
+ userId: '1',
301
+ email: 'a@b.com',
302
+ name: 'A',
303
+ },
304
+ },
305
+ ],
306
+ services: { db: { query: () => 'injected-result' } },
307
+ });
308
+
309
+ expect(result).toEqual({ value: 'injected-result' });
310
+ });
311
+
312
+ it('should auto-resolve services when not provided', async () => {
313
+ const subscriber = new SubscriberBuilder()
314
+ .publisher(TestEventService)
315
+ .services([TestDbService])
316
+ .subscribe('user.created')
317
+ .handle(async ({ services }) => ({
318
+ value: services.db.query(),
319
+ }));
320
+
321
+ const adaptor = new TestSubscriberAdaptor(subscriber);
322
+
323
+ const result = await adaptor.invoke({
324
+ events: [
325
+ {
326
+ type: 'user.created',
327
+ payload: {
328
+ userId: '1',
329
+ email: 'a@b.com',
330
+ name: 'A',
331
+ },
332
+ },
333
+ ],
334
+ });
335
+
336
+ expect(result).toEqual({ value: 'result' });
337
+ });
338
+
339
+ it('should use custom ServiceDiscovery when provided', async () => {
340
+ const subscriber = new SubscriberBuilder()
341
+ .publisher(TestEventService)
342
+ .services([TestDbService])
343
+ .subscribe('user.created')
344
+ .handle(async ({ services }) => ({
345
+ value: services.db.query(),
346
+ }));
347
+
348
+ const mockDiscovery = {
349
+ register: vi.fn().mockResolvedValue({
350
+ db: { query: () => 'custom-discovery' },
351
+ }),
352
+ } as any;
353
+
354
+ const adaptor = new TestSubscriberAdaptor(subscriber, mockDiscovery);
355
+
356
+ const result = await adaptor.invoke({
357
+ events: [
358
+ {
359
+ type: 'user.created',
360
+ payload: {
361
+ userId: '1',
362
+ email: 'a@b.com',
363
+ name: 'A',
364
+ },
365
+ },
366
+ ],
367
+ });
368
+
369
+ expect(result).toEqual({ value: 'custom-discovery' });
370
+ expect(mockDiscovery.register).toHaveBeenCalledWith(subscriber.services);
371
+ });
372
+ });
373
+
374
+ describe('logging', () => {
375
+ it('should create child logger with test context', async () => {
376
+ const mockLogger: Logger = {
377
+ debug: vi.fn(),
378
+ info: vi.fn(),
379
+ warn: vi.fn(),
380
+ error: vi.fn(),
381
+ fatal: vi.fn(),
382
+ trace: vi.fn(),
383
+ child: vi.fn().mockReturnThis(),
384
+ };
385
+
386
+ const subscriber = new SubscriberBuilder()
387
+ .publisher(TestEventService)
388
+ .logger(mockLogger)
389
+ .subscribe('user.created')
390
+ .handle(async ({ logger }) => {
391
+ logger.info('Processing events');
392
+ return {};
393
+ });
394
+
395
+ const adaptor = new TestSubscriberAdaptor(subscriber);
396
+
397
+ await adaptor.invoke({
398
+ events: [
399
+ {
400
+ type: 'user.created',
401
+ payload: {
402
+ userId: '1',
403
+ email: 'a@b.com',
404
+ name: 'A',
405
+ },
406
+ },
407
+ ],
408
+ services: {},
409
+ });
410
+
411
+ expect(mockLogger.child).toHaveBeenCalledWith({ test: true });
412
+ expect(mockLogger.info).toHaveBeenCalledWith('Processing events');
413
+ });
414
+ });
415
+
416
+ describe('event publishing', () => {
417
+ it('should publish events after successful execution', async () => {
418
+ const testPublisher = new TestEventPublisher();
419
+ const publisherService: Service<'publisher', TestEventPublisher> = {
420
+ serviceName: 'publisher' as const,
421
+ register() {
422
+ return testPublisher;
423
+ },
424
+ };
425
+
426
+ const subscriber = new Subscriber(
427
+ async ({ events }) => ({
428
+ count: events.length,
429
+ }),
430
+ 30000,
431
+ ['user.created'] as any,
432
+ z.object({ count: z.number() }),
433
+ [],
434
+ logger,
435
+ publisherService as any,
436
+ );
437
+
438
+ // Add events to publish after handler completes
439
+ (subscriber as any).events = [
440
+ {
441
+ type: 'user.updated',
442
+ payload: (response: any) => ({
443
+ userId: 'derived',
444
+ changes: { count: response.count },
445
+ }),
446
+ },
447
+ ];
448
+
449
+ const adaptor = new TestSubscriberAdaptor(subscriber as any);
450
+
451
+ await adaptor.invoke({
452
+ events: [
453
+ {
454
+ type: 'user.created',
455
+ payload: {
456
+ userId: '1',
457
+ email: 'a@b.com',
458
+ name: 'A',
459
+ },
460
+ },
461
+ ] as any,
462
+ services: {},
463
+ });
464
+
465
+ expect(testPublisher.publishedEvents).toHaveLength(1);
466
+ expect(testPublisher.publishedEvents[0]).toEqual({
467
+ type: 'user.updated',
468
+ payload: { userId: 'derived', changes: { count: 1 } },
469
+ });
470
+ });
471
+
472
+ it('should conditionally publish events with when clause', async () => {
473
+ const testPublisher = new TestEventPublisher();
474
+ const publisherService: Service<'publisher', TestEventPublisher> = {
475
+ serviceName: 'publisher' as const,
476
+ register() {
477
+ return testPublisher;
478
+ },
479
+ };
480
+
481
+ const subscriber = new Subscriber(
482
+ async () => ({ success: false }),
483
+ 30000,
484
+ ['user.created'] as any,
485
+ z.object({ success: z.boolean() }),
486
+ [],
487
+ logger,
488
+ publisherService as any,
489
+ );
490
+
491
+ (subscriber as any).events = [
492
+ {
493
+ type: 'user.updated',
494
+ payload: () => ({
495
+ userId: 'test',
496
+ changes: {},
497
+ }),
498
+ when: (response: any) => response.success === true,
499
+ },
500
+ ];
501
+
502
+ const adaptor = new TestSubscriberAdaptor(subscriber as any);
503
+
504
+ await adaptor.invoke({
505
+ events: [
506
+ {
507
+ type: 'user.created',
508
+ payload: {
509
+ userId: '1',
510
+ email: 'a@b.com',
511
+ name: 'A',
512
+ },
513
+ },
514
+ ] as any,
515
+ services: {},
516
+ });
517
+
518
+ // when clause returned false — no events published
519
+ expect(testPublisher.publishedEvents).toHaveLength(0);
520
+ });
521
+ });
522
+
523
+ describe('error handling', () => {
524
+ it('should propagate errors from handler execution', async () => {
525
+ const subscriber = new SubscriberBuilder()
526
+ .publisher(TestEventService)
527
+ .subscribe('user.created')
528
+ .handle(async () => {
529
+ throw new Error('Handler failed');
530
+ });
531
+
532
+ const adaptor = new TestSubscriberAdaptor(subscriber);
533
+
534
+ await expect(
535
+ adaptor.invoke({
536
+ events: [
537
+ {
538
+ type: 'user.created',
539
+ payload: {
540
+ userId: '1',
541
+ email: 'a@b.com',
542
+ name: 'A',
543
+ },
544
+ },
545
+ ],
546
+ services: {},
547
+ }),
548
+ ).rejects.toThrow('Handler failed');
549
+ });
550
+ });
551
+
552
+ describe('default service discovery', () => {
553
+ it('should create default service discovery', () => {
554
+ const discovery = TestSubscriberAdaptor.getDefaultServiceDiscovery();
555
+ expect(discovery).toBeDefined();
556
+ });
557
+ });
558
+ });
@@ -2,5 +2,6 @@ import { SubscriberBuilder } from './SubscriberBuilder';
2
2
 
3
3
  export { Subscriber } from './Subscriber';
4
4
  export { SubscriberBuilder };
5
+ export { TestSubscriberAdaptor } from './TestSubscriberAdaptor';
5
6
 
6
7
  export const s = new SubscriberBuilder();
@@ -1 +0,0 @@
1
- {"version":3,"file":"AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs","names":["envParser: EnvironmentParser<{}>","subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>","events: any[]","event: SQSEvent | SNSEvent","record: SNSEventRecord","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 { InferStandardSchema } from '@geekmidas/schema';\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\tContext,\n\tHandler,\n\tSNSEvent,\n\tSNSEventRecord,\n\tSQSEvent,\n\tSQSRecord,\n} from 'aws-lambda';\nimport type { Subscriber } from './Subscriber';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype SubscriberEvent<TServices extends Service[], TLogger extends Logger> = {\n\tevents: any[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n\ntype Middleware<\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n\tSubscriberEvent<TServices, TLogger>,\n\tInferStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaSubscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends any[] = [],\n> {\n\tprivate _logger!: TLogger;\n\tprivate _services!: ServiceRecord<TServices>;\n\n\tconstructor(\n\t\tprivate envParser: EnvironmentParser<{}>,\n\t\treadonly subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>,\n\t) {\n\t\tthis._logger = subscriber.logger;\n\t}\n\n\tget logger(): TLogger {\n\t\treturn this._logger;\n\t}\n\n\tprivate async getServices(): Promise<ServiceRecord<TServices>> {\n\t\tif (this._services) {\n\t\t\treturn this._services;\n\t\t}\n\n\t\tconst serviceDiscovery = ServiceDiscovery.getInstance(this.envParser);\n\n\t\tif (this.subscriber.services.length > 0) {\n\t\t\tconst registered = await serviceDiscovery.register(\n\t\t\t\tthis.subscriber.services,\n\t\t\t);\n\t\t\tthis._services = registered as ServiceRecord<TServices>;\n\t\t} else {\n\t\t\tthis._services = {} as ServiceRecord<TServices>;\n\t\t}\n\n\t\treturn this._services;\n\t}\n\n\tprivate error(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.subscriber.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing subscriber');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.subscriber.logger.child({\n\t\t\t\t\tsubscriber: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate parseEvents(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\tconst { logger, ...e } = req.event;\n\t\t\t\tconst rawEvent = e as any as SQSEvent | SNSEvent;\n\n\t\t\t\tlogger.info({\n\t\t\t\t\trawEvent,\n\t\t\t\t});\n\n\t\t\t\t// Parse events based on the event type\n\t\t\t\tconst events: any[] = [];\n\n\t\t\t\tif ('Records' in rawEvent) {\n\t\t\t\t\tif (this.isSQSEvent(rawEvent)) {\n\t\t\t\t\t\t// SQS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = this.parseSQSRecord(record);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SQS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this.isSNSEvent(rawEvent)) {\n\t\t\t\t\t\t// SNS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = this.parseSNSRecord(record);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SNS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t(req.event as any).events = events;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate isSQSEvent(event: SQSEvent | SNSEvent): event is SQSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'eventSource' in firstRecord &&\n\t\t\tfirstRecord.eventSource === 'aws:sqs'\n\t\t);\n\t}\n\n\tprivate isSNSEvent(event: SQSEvent | SNSEvent): event is SNSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'EventSource' in firstRecord &&\n\t\t\tfirstRecord.EventSource === 'aws:sns'\n\t\t);\n\t}\n\n\tprivate parseSNSRecord(record: SNSEventRecord): any | null {\n\t\ttry {\n\t\t\tconst message = JSON.parse(record.Sns.Message);\n\t\t\t// Resolve type from MessageAttributes (preferred) or message body\n\t\t\tconst messageType =\n\t\t\t\trecord.Sns.MessageAttributes?.type?.Value ?? message.type;\n\n\t\t\tif (message.type) {\n\t\t\t\treturn message; // Full event format: { type, payload }\n\t\t\t}\n\n\t\t\t// Payload-only format: type is in MessageAttributes\n\t\t\treturn messageType ? { type: messageType, payload: message } : message;\n\t\t} catch (error) {\n\t\t\tthis.logger.error({ error, record }, 'Failed to parse SNS record body');\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate parseSQSRecord(record: SQSRecord): any | null {\n\t\ttry {\n\t\t\tconst body = JSON.parse(record.body);\n\n\t\t\t// Check if this is an SNS message wrapped in SQS\n\t\t\tif (body.Type === 'Notification' && body.Message) {\n\t\t\t\tconst snsMessage = JSON.parse(body.Message);\n\n\t\t\t\tif (snsMessage.type) {\n\t\t\t\t\treturn snsMessage; // Full event format: { type, payload }\n\t\t\t\t}\n\n\t\t\t\t// Payload-only format: type is in MessageAttributes\n\t\t\t\tconst messageType =\n\t\t\t\t\tbody.MessageAttributes?.type?.Value ?? snsMessage.type;\n\t\t\t\treturn messageType\n\t\t\t\t\t? { type: messageType, payload: snsMessage }\n\t\t\t\t\t: snsMessage;\n\t\t\t}\n\n\t\t\t// Direct SQS message\n\t\t\treturn body;\n\t\t} catch (error) {\n\t\t\tthis.logger.error({ error, record }, 'Failed to parse SQS record body');\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate isSubscribedEvent(eventType: string): boolean {\n\t\tif (!this.subscriber.subscribedEvents) {\n\t\t\treturn true; // If no events specified, accept all\n\t\t}\n\n\t\treturn this.subscriber.subscribedEvents.includes(eventType as any);\n\t}\n\n\tprivate async _handler(event: SubscriberEvent<TServices, TLogger>) {\n\t\t// If no events after filtering, return early\n\t\tif (event.events.length === 0) {\n\t\t\tthis.logger.info('No subscribed events to process');\n\t\t\treturn {\n\t\t\t\tbatchItemFailures: [],\n\t\t\t};\n\t\t}\n\n\t\t// Execute the subscriber with the parsed context\n\t\tconst result = await this.subscriber.handler({\n\t\t\tevents: event.events,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t});\n\n\t\t// Parse output if schema is provided\n\t\tif (this.subscriber.outputSchema && result) {\n\t\t\tconst validationResult =\n\t\t\t\tawait this.subscriber.outputSchema['~standard'].validate(result);\n\n\t\t\tif (validationResult.issues) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t{ issues: validationResult.issues },\n\t\t\t\t\t'Subscriber output validation failed',\n\t\t\t\t);\n\t\t\t\tthrow new Error('Subscriber output validation failed');\n\t\t\t}\n\n\t\t\treturn validationResult.value;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\treturn middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.parseEvents())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services());\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AWSLambdaSubscriberAdaptor-Soie57uM.cjs","names":["envParser: EnvironmentParser<{}>","subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>","events: any[]","event: SQSEvent | SNSEvent","record: SNSEventRecord","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 { InferStandardSchema } from '@geekmidas/schema';\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\tContext,\n\tHandler,\n\tSNSEvent,\n\tSNSEventRecord,\n\tSQSEvent,\n\tSQSRecord,\n} from 'aws-lambda';\nimport type { Subscriber } from './Subscriber';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype SubscriberEvent<TServices extends Service[], TLogger extends Logger> = {\n\tevents: any[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n\ntype Middleware<\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n\tSubscriberEvent<TServices, TLogger>,\n\tInferStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaSubscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends any[] = [],\n> {\n\tprivate _logger!: TLogger;\n\tprivate _services!: ServiceRecord<TServices>;\n\n\tconstructor(\n\t\tprivate envParser: EnvironmentParser<{}>,\n\t\treadonly subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>,\n\t) {\n\t\tthis._logger = subscriber.logger;\n\t}\n\n\tget logger(): TLogger {\n\t\treturn this._logger;\n\t}\n\n\tprivate async getServices(): Promise<ServiceRecord<TServices>> {\n\t\tif (this._services) {\n\t\t\treturn this._services;\n\t\t}\n\n\t\tconst serviceDiscovery = ServiceDiscovery.getInstance(this.envParser);\n\n\t\tif (this.subscriber.services.length > 0) {\n\t\t\tconst registered = await serviceDiscovery.register(\n\t\t\t\tthis.subscriber.services,\n\t\t\t);\n\t\t\tthis._services = registered as ServiceRecord<TServices>;\n\t\t} else {\n\t\t\tthis._services = {} as ServiceRecord<TServices>;\n\t\t}\n\n\t\treturn this._services;\n\t}\n\n\tprivate error(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.subscriber.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing subscriber');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.subscriber.logger.child({\n\t\t\t\t\tsubscriber: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate parseEvents(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\tconst { logger, ...e } = req.event;\n\t\t\t\tconst rawEvent = e as any as SQSEvent | SNSEvent;\n\n\t\t\t\tlogger.info({\n\t\t\t\t\trawEvent,\n\t\t\t\t});\n\n\t\t\t\t// Parse events based on the event type\n\t\t\t\tconst events: any[] = [];\n\n\t\t\t\tif ('Records' in rawEvent) {\n\t\t\t\t\tif (this.isSQSEvent(rawEvent)) {\n\t\t\t\t\t\t// SQS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = this.parseSQSRecord(record);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SQS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this.isSNSEvent(rawEvent)) {\n\t\t\t\t\t\t// SNS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = this.parseSNSRecord(record);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SNS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t(req.event as any).events = events;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate isSQSEvent(event: SQSEvent | SNSEvent): event is SQSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'eventSource' in firstRecord &&\n\t\t\tfirstRecord.eventSource === 'aws:sqs'\n\t\t);\n\t}\n\n\tprivate isSNSEvent(event: SQSEvent | SNSEvent): event is SNSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'EventSource' in firstRecord &&\n\t\t\tfirstRecord.EventSource === 'aws:sns'\n\t\t);\n\t}\n\n\tprivate parseSNSRecord(record: SNSEventRecord): any | null {\n\t\ttry {\n\t\t\tconst message = JSON.parse(record.Sns.Message);\n\t\t\t// Resolve type from MessageAttributes (preferred) or message body\n\t\t\tconst messageType =\n\t\t\t\trecord.Sns.MessageAttributes?.type?.Value ?? message.type;\n\n\t\t\tif (message.type) {\n\t\t\t\treturn message; // Full event format: { type, payload }\n\t\t\t}\n\n\t\t\t// Payload-only format: type is in MessageAttributes\n\t\t\treturn messageType ? { type: messageType, payload: message } : message;\n\t\t} catch (error) {\n\t\t\tthis.logger.error({ error, record }, 'Failed to parse SNS record body');\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate parseSQSRecord(record: SQSRecord): any | null {\n\t\ttry {\n\t\t\tconst body = JSON.parse(record.body);\n\n\t\t\t// Check if this is an SNS message wrapped in SQS\n\t\t\tif (body.Type === 'Notification' && body.Message) {\n\t\t\t\tconst snsMessage = JSON.parse(body.Message);\n\n\t\t\t\tif (snsMessage.type) {\n\t\t\t\t\treturn snsMessage; // Full event format: { type, payload }\n\t\t\t\t}\n\n\t\t\t\t// Payload-only format: type is in MessageAttributes\n\t\t\t\tconst messageType =\n\t\t\t\t\tbody.MessageAttributes?.type?.Value ?? snsMessage.type;\n\t\t\t\treturn messageType\n\t\t\t\t\t? { type: messageType, payload: snsMessage }\n\t\t\t\t\t: snsMessage;\n\t\t\t}\n\n\t\t\t// Direct SQS message\n\t\t\treturn body;\n\t\t} catch (error) {\n\t\t\tthis.logger.error({ error, record }, 'Failed to parse SQS record body');\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate isSubscribedEvent(eventType: string): boolean {\n\t\tif (!this.subscriber.subscribedEvents) {\n\t\t\treturn true; // If no events specified, accept all\n\t\t}\n\n\t\treturn this.subscriber.subscribedEvents.includes(eventType as any);\n\t}\n\n\tprivate async _handler(event: SubscriberEvent<TServices, TLogger>) {\n\t\t// If no events after filtering, return early\n\t\tif (event.events.length === 0) {\n\t\t\tthis.logger.info('No subscribed events to process');\n\t\t\treturn {\n\t\t\t\tbatchItemFailures: [],\n\t\t\t};\n\t\t}\n\n\t\t// Execute the subscriber with the parsed context\n\t\tconst result = await this.subscriber.handler({\n\t\t\tevents: event.events,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t});\n\n\t\t// Parse output if schema is provided\n\t\tif (this.subscriber.outputSchema && result) {\n\t\t\tconst validationResult =\n\t\t\t\tawait this.subscriber.outputSchema['~standard'].validate(result);\n\n\t\t\tif (validationResult.issues) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t{ issues: validationResult.issues },\n\t\t\t\t\t'Subscriber output validation failed',\n\t\t\t\t);\n\t\t\t\tthrow new Error('Subscriber output validation failed');\n\t\t\t}\n\n\t\t\treturn validationResult.value;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\treturn middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.parseEvents())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services());\n\t}\n}\n"],"mappings":"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"}