@geekmidas/constructs 9.0.2 → 10.0.0-alpha.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 (385) hide show
  1. package/README.md +71 -44
  2. package/dist/{AWSScheduledFunction-Bn99MceY.d.cts → AWSScheduledFunction-9bJS4WdJ.d.cts} +8 -3
  3. package/dist/{AWSScheduledFunction-ysaCsdWx.d.mts.map → AWSScheduledFunction-9bJS4WdJ.d.cts.map} +1 -1
  4. package/dist/{AWSScheduledFunction-CufMMhGB.mjs → AWSScheduledFunction-BJjj8B5V.mjs} +3 -3
  5. package/dist/{AWSScheduledFunction-CufMMhGB.mjs.map → AWSScheduledFunction-BJjj8B5V.mjs.map} +1 -1
  6. package/dist/{AWSScheduledFunction-ysaCsdWx.d.mts → AWSScheduledFunction-BO5iEMSh.d.mts} +9 -4
  7. package/dist/{AWSScheduledFunction-Bn99MceY.d.cts.map → AWSScheduledFunction-BO5iEMSh.d.mts.map} +1 -1
  8. package/dist/{AWSScheduledFunction-DbkDr8CA.cjs → AWSScheduledFunction-qu4ieRZR.cjs} +9 -9
  9. package/dist/{AWSScheduledFunction-DbkDr8CA.cjs.map → AWSScheduledFunction-qu4ieRZR.cjs.map} +1 -1
  10. package/dist/{Construct-_1wX7p_Y.d.cts → Construct-B-xc0SE9.d.mts} +27 -5
  11. package/dist/Construct-B-xc0SE9.d.mts.map +1 -0
  12. package/dist/{Construct-r0U2zBwW.mjs → Construct-CdhThxDI.mjs} +3 -2
  13. package/dist/Construct-CdhThxDI.mjs.map +1 -0
  14. package/dist/{Construct-DCMuYOox.d.mts → Construct-WhCXIOPV.d.cts} +29 -7
  15. package/dist/Construct-WhCXIOPV.d.cts.map +1 -0
  16. package/dist/{Construct-vXMZJgRp.cjs → Construct-roId57cU.cjs} +7 -43
  17. package/dist/Construct-roId57cU.cjs.map +1 -0
  18. package/dist/{lazyAccessors-DmTG8sQH.cjs → Endpoint-BBkV6l0k.cjs} +869 -1079
  19. package/dist/Endpoint-BBkV6l0k.cjs.map +1 -0
  20. package/dist/{Endpoint-DgfRslct.d.cts → Endpoint-BKR5QH6O.d.mts} +57 -8
  21. package/dist/Endpoint-BKR5QH6O.d.mts.map +1 -0
  22. package/dist/{Endpoint-CLPSIl6S.d.mts → Endpoint-BQ9O0P1w.d.cts} +58 -9
  23. package/dist/Endpoint-BQ9O0P1w.d.cts.map +1 -0
  24. package/dist/{lazyAccessors-DfqZR6C4.mjs → Endpoint-BTj58Gob.mjs} +840 -1003
  25. package/dist/Endpoint-BTj58Gob.mjs.map +1 -0
  26. package/dist/EndpointFactory-BejSTzbB.mjs +808 -0
  27. package/dist/EndpointFactory-BejSTzbB.mjs.map +1 -0
  28. package/dist/EndpointFactory-DYoGLaIT.cjs +850 -0
  29. package/dist/EndpointFactory-DYoGLaIT.cjs.map +1 -0
  30. package/dist/{HonoEndpointAdaptor-DJDT3PMx.mjs → HonoEndpointAdaptor-7aYNdqJq.mjs} +5 -4
  31. package/dist/HonoEndpointAdaptor-7aYNdqJq.mjs.map +1 -0
  32. package/dist/{HonoEndpointAdaptor-CkJENANP.cjs → HonoEndpointAdaptor-wMsCyMgt.cjs} +24 -23
  33. package/dist/HonoEndpointAdaptor-wMsCyMgt.cjs.map +1 -0
  34. package/dist/{Queue-DaxjwmOQ.d.cts → Queue-D6WeziRD.d.cts} +43 -4
  35. package/dist/Queue-D6WeziRD.d.cts.map +1 -0
  36. package/dist/{Queue-HBDf0fqz.d.mts → Queue-DpUeqdC8.d.mts} +43 -4
  37. package/dist/Queue-DpUeqdC8.d.mts.map +1 -0
  38. package/dist/{Subscriber-B69ngPwl.d.cts → Subscriber-4rBJgDKI.d.mts} +9 -4
  39. package/dist/{Subscriber-B69ngPwl.d.cts.map → Subscriber-4rBJgDKI.d.mts.map} +1 -1
  40. package/dist/{Subscriber-D8Xm-86W.d.mts → Subscriber-DVQowdyj.d.cts} +11 -6
  41. package/dist/Subscriber-DVQowdyj.d.cts.map +1 -0
  42. package/dist/{Topic-C5ZMfveW.d.cts → Topic-Ohx9dvWr.d.cts} +33 -2
  43. package/dist/Topic-Ohx9dvWr.d.cts.map +1 -0
  44. package/dist/{Topic-DT10AqHk.d.mts → Topic-cmy2jOUy.d.mts} +33 -2
  45. package/dist/Topic-cmy2jOUy.d.mts.map +1 -0
  46. package/dist/adaptors/aws.cjs +39 -26
  47. package/dist/adaptors/aws.cjs.map +1 -1
  48. package/dist/adaptors/aws.d.cts +24 -16
  49. package/dist/adaptors/aws.d.cts.map +1 -1
  50. package/dist/adaptors/aws.d.mts +25 -17
  51. package/dist/adaptors/aws.d.mts.map +1 -1
  52. package/dist/adaptors/aws.mjs +26 -14
  53. package/dist/adaptors/aws.mjs.map +1 -1
  54. package/dist/adaptors/hono.cjs +9 -6
  55. package/dist/adaptors/hono.d.cts +7 -6
  56. package/dist/adaptors/hono.d.cts.map +1 -1
  57. package/dist/adaptors/hono.d.mts +8 -7
  58. package/dist/adaptors/hono.d.mts.map +1 -1
  59. package/dist/adaptors/hono.mjs +9 -6
  60. package/dist/adaptors/testing.cjs +18 -14
  61. package/dist/adaptors/testing.cjs.map +1 -1
  62. package/dist/adaptors/testing.d.cts +7 -6
  63. package/dist/adaptors/testing.d.cts.map +1 -1
  64. package/dist/adaptors/testing.d.mts +11 -10
  65. package/dist/adaptors/testing.d.mts.map +1 -1
  66. package/dist/adaptors/testing.mjs +10 -7
  67. package/dist/adaptors/testing.mjs.map +1 -1
  68. package/dist/auth.cjs +165 -0
  69. package/dist/auth.cjs.map +1 -0
  70. package/dist/auth.d.cts +108 -0
  71. package/dist/auth.d.cts.map +1 -0
  72. package/dist/auth.d.mts +108 -0
  73. package/dist/auth.d.mts.map +1 -0
  74. package/dist/auth.mjs +164 -0
  75. package/dist/auth.mjs.map +1 -0
  76. package/dist/cache-0ANvRQnD.mjs +51 -0
  77. package/dist/cache-0ANvRQnD.mjs.map +1 -0
  78. package/dist/cache-3WSvAulx.cjs +57 -0
  79. package/dist/cache-3WSvAulx.cjs.map +1 -0
  80. package/dist/cache-CdQ7OLpR.d.cts +47 -0
  81. package/dist/cache-CdQ7OLpR.d.cts.map +1 -0
  82. package/dist/cache-DYoJFcfd.d.mts +47 -0
  83. package/dist/cache-DYoJFcfd.d.mts.map +1 -0
  84. package/dist/cache.cjs +3 -0
  85. package/dist/cache.d.cts +3 -0
  86. package/dist/cache.d.mts +3 -0
  87. package/dist/cache.mjs +3 -0
  88. package/dist/chunk-DWy1uDak.cjs +39 -0
  89. package/dist/clone-DblgEZZa.mjs +39 -0
  90. package/dist/clone-DblgEZZa.mjs.map +1 -0
  91. package/dist/clone-Dy0cR2SZ.cjs +45 -0
  92. package/dist/clone-Dy0cR2SZ.cjs.map +1 -0
  93. package/dist/construct-interface-BfjcOD_E.cjs +117 -0
  94. package/dist/construct-interface-BfjcOD_E.cjs.map +1 -0
  95. package/dist/construct-interface-BqwRNYA2.d.mts +131 -0
  96. package/dist/construct-interface-BqwRNYA2.d.mts.map +1 -0
  97. package/dist/construct-interface-D2nNkHUN.d.cts +131 -0
  98. package/dist/construct-interface-D2nNkHUN.d.cts.map +1 -0
  99. package/dist/construct-interface-Z4CpS8tK.mjs +81 -0
  100. package/dist/construct-interface-Z4CpS8tK.mjs.map +1 -0
  101. package/dist/construct-interface.cjs +8 -0
  102. package/dist/construct-interface.d.cts +2 -0
  103. package/dist/construct-interface.d.mts +2 -0
  104. package/dist/construct-interface.mjs +3 -0
  105. package/dist/credential.cjs +96 -0
  106. package/dist/credential.cjs.map +1 -0
  107. package/dist/credential.d.cts +61 -0
  108. package/dist/credential.d.cts.map +1 -0
  109. package/dist/credential.d.mts +61 -0
  110. package/dist/credential.d.mts.map +1 -0
  111. package/dist/credential.mjs +94 -0
  112. package/dist/credential.mjs.map +1 -0
  113. package/dist/crons/index.cjs +39 -37
  114. package/dist/crons/index.cjs.map +1 -1
  115. package/dist/crons/index.d.cts +21 -8
  116. package/dist/crons/index.d.cts.map +1 -1
  117. package/dist/crons/index.d.mts +29 -13
  118. package/dist/crons/index.d.mts.map +1 -1
  119. package/dist/crons/index.mjs +37 -36
  120. package/dist/crons/index.mjs.map +1 -1
  121. package/dist/database/kysely.cjs +181 -0
  122. package/dist/database/kysely.cjs.map +1 -0
  123. package/dist/database/kysely.d.cts +152 -0
  124. package/dist/database/kysely.d.cts.map +1 -0
  125. package/dist/database/kysely.d.mts +152 -0
  126. package/dist/database/kysely.d.mts.map +1 -0
  127. package/dist/database/kysely.mjs +180 -0
  128. package/dist/database/kysely.mjs.map +1 -0
  129. package/dist/email.cjs +59 -0
  130. package/dist/email.cjs.map +1 -0
  131. package/dist/email.d.cts +50 -0
  132. package/dist/email.d.cts.map +1 -0
  133. package/dist/email.d.mts +50 -0
  134. package/dist/email.d.mts.map +1 -0
  135. package/dist/email.mjs +58 -0
  136. package/dist/email.mjs.map +1 -0
  137. package/dist/endpoints/index.cjs +21 -747
  138. package/dist/endpoints/index.d.cts +7 -343
  139. package/dist/endpoints/index.d.mts +7 -342
  140. package/dist/endpoints/index.mjs +11 -738
  141. package/dist/file-server.cjs +154 -0
  142. package/dist/file-server.cjs.map +1 -0
  143. package/dist/file-server.d.cts +156 -0
  144. package/dist/file-server.d.cts.map +1 -0
  145. package/dist/file-server.d.mts +156 -0
  146. package/dist/file-server.d.mts.map +1 -0
  147. package/dist/file-server.mjs +152 -0
  148. package/dist/file-server.mjs.map +1 -0
  149. package/dist/functions/index.cjs +4 -2
  150. package/dist/functions/index.d.cts +3 -2
  151. package/dist/functions/index.d.mts +3 -2
  152. package/dist/functions/index.mjs +4 -2
  153. package/dist/{functions-B-qt91O7.mjs → functions-Cpff1uZH.mjs} +55 -51
  154. package/dist/functions-Cpff1uZH.mjs.map +1 -0
  155. package/dist/{functions-C8i1kCMM.cjs → functions-DukjG8ov.cjs} +62 -57
  156. package/dist/functions-DukjG8ov.cjs.map +1 -0
  157. package/dist/{index-BVs9DvIj.d.cts → index-BTvozlUD.d.cts} +36 -9
  158. package/dist/index-BTvozlUD.d.cts.map +1 -0
  159. package/dist/index-Cvz551AO.d.mts +419 -0
  160. package/dist/index-Cvz551AO.d.mts.map +1 -0
  161. package/dist/index-D5zqAJ2e.d.cts +419 -0
  162. package/dist/index-D5zqAJ2e.d.cts.map +1 -0
  163. package/dist/{index-DP6fqv0I.d.mts → index-L7pz0R0T.d.mts} +48 -19
  164. package/dist/index-L7pz0R0T.d.mts.map +1 -0
  165. package/dist/index.cjs +1 -1
  166. package/dist/index.d.cts +3 -3
  167. package/dist/index.d.mts +3 -3
  168. package/dist/index.mjs +1 -1
  169. package/dist/lazyAccessors-DM6HcXQk.mjs +175 -0
  170. package/dist/lazyAccessors-DM6HcXQk.mjs.map +1 -0
  171. package/dist/lazyAccessors-DrJj8NpA.cjs +223 -0
  172. package/dist/lazyAccessors-DrJj8NpA.cjs.map +1 -0
  173. package/dist/object-storage.cjs +48 -0
  174. package/dist/object-storage.cjs.map +1 -0
  175. package/dist/object-storage.d.cts +36 -0
  176. package/dist/object-storage.d.cts.map +1 -0
  177. package/dist/object-storage.d.mts +36 -0
  178. package/dist/object-storage.d.mts.map +1 -0
  179. package/dist/object-storage.mjs +47 -0
  180. package/dist/object-storage.mjs.map +1 -0
  181. package/dist/{processAudits-CKjjivyz.cjs → processAudits-Bc8rz6Ev.cjs} +3 -3
  182. package/dist/{processAudits-CKjjivyz.cjs.map → processAudits-Bc8rz6Ev.cjs.map} +1 -1
  183. package/dist/{processAudits-ySnizdMG.mjs → processAudits-D89tICM4.mjs} +1 -1
  184. package/dist/{processAudits-ySnizdMG.mjs.map → processAudits-D89tICM4.mjs.map} +1 -1
  185. package/dist/{publisher-BrFOF847.mjs → publisher-CGEo8UKD.mjs} +1 -1
  186. package/dist/{publisher-BrFOF847.mjs.map → publisher-CGEo8UKD.mjs.map} +1 -1
  187. package/dist/{publisher-lFQleddL.cjs → publisher-CqGsXB2X.cjs} +1 -1
  188. package/dist/{publisher-lFQleddL.cjs.map → publisher-CqGsXB2X.cjs.map} +1 -1
  189. package/dist/queue/index.cjs +92 -30
  190. package/dist/queue/index.cjs.map +1 -1
  191. package/dist/queue/index.d.cts +19 -4
  192. package/dist/queue/index.d.cts.map +1 -1
  193. package/dist/queue/index.d.mts +22 -6
  194. package/dist/queue/index.d.mts.map +1 -1
  195. package/dist/queue/index.mjs +90 -29
  196. package/dist/queue/index.mjs.map +1 -1
  197. package/dist/rest-api.cjs +187 -0
  198. package/dist/rest-api.cjs.map +1 -0
  199. package/dist/rest-api.d.cts +221 -0
  200. package/dist/rest-api.d.cts.map +1 -0
  201. package/dist/rest-api.d.mts +221 -0
  202. package/dist/rest-api.d.mts.map +1 -0
  203. package/dist/rest-api.mjs +186 -0
  204. package/dist/rest-api.mjs.map +1 -0
  205. package/dist/site.cjs +48 -0
  206. package/dist/site.cjs.map +1 -0
  207. package/dist/site.d.cts +101 -0
  208. package/dist/site.d.cts.map +1 -0
  209. package/dist/site.d.mts +101 -0
  210. package/dist/site.d.mts.map +1 -0
  211. package/dist/site.mjs +47 -0
  212. package/dist/site.mjs.map +1 -0
  213. package/dist/subscribers/index.cjs +35 -27
  214. package/dist/subscribers/index.cjs.map +1 -1
  215. package/dist/subscribers/index.d.cts +20 -5
  216. package/dist/subscribers/index.d.cts.map +1 -1
  217. package/dist/subscribers/index.d.mts +23 -7
  218. package/dist/subscribers/index.d.mts.map +1 -1
  219. package/dist/subscribers/index.mjs +34 -27
  220. package/dist/subscribers/index.mjs.map +1 -1
  221. package/dist/surfaceEnv-BFXEms2f.cjs +39 -0
  222. package/dist/surfaceEnv-BFXEms2f.cjs.map +1 -0
  223. package/dist/surfaceEnv-C3Ktahea.mjs +27 -0
  224. package/dist/surfaceEnv-C3Ktahea.mjs.map +1 -0
  225. package/dist/{telemetry-3vdxGn4q.d.mts → telemetry-C3L0iS28.d.cts} +2 -2
  226. package/dist/{telemetry-3vdxGn4q.d.mts.map → telemetry-C3L0iS28.d.cts.map} +1 -1
  227. package/dist/{telemetry-Dqx-D3F7.d.cts → telemetry-D7bVFLGi.d.mts} +2 -2
  228. package/dist/{telemetry-Dqx-D3F7.d.cts.map → telemetry-D7bVFLGi.d.mts.map} +1 -1
  229. package/dist/topic/index.cjs +56 -13
  230. package/dist/topic/index.cjs.map +1 -1
  231. package/dist/topic/index.d.cts +2 -2
  232. package/dist/topic/index.d.cts.map +1 -1
  233. package/dist/topic/index.d.mts +2 -2
  234. package/dist/topic/index.d.mts.map +1 -1
  235. package/dist/topic/index.mjs +54 -12
  236. package/dist/topic/index.mjs.map +1 -1
  237. package/dist/{types-BDNGr7pv.d.mts → types-BlAkSuGI.d.cts} +1 -1
  238. package/dist/{types-BDNGr7pv.d.mts.map → types-BlAkSuGI.d.cts.map} +1 -1
  239. package/dist/{types-BdAaYDvd.d.cts → types-aKksMEWL.d.mts} +1 -1
  240. package/dist/{types-BdAaYDvd.d.cts.map → types-aKksMEWL.d.mts.map} +1 -1
  241. package/dist/types.d.cts +1 -1
  242. package/dist/types.d.mts +1 -1
  243. package/package.json +155 -23
  244. package/CHANGELOG.md +0 -396
  245. package/dist/Construct-DCMuYOox.d.mts.map +0 -1
  246. package/dist/Construct-_1wX7p_Y.d.cts.map +0 -1
  247. package/dist/Construct-r0U2zBwW.mjs.map +0 -1
  248. package/dist/Construct-vXMZJgRp.cjs.map +0 -1
  249. package/dist/Endpoint-CLPSIl6S.d.mts.map +0 -1
  250. package/dist/Endpoint-DgfRslct.d.cts.map +0 -1
  251. package/dist/HonoEndpointAdaptor-CkJENANP.cjs.map +0 -1
  252. package/dist/HonoEndpointAdaptor-DJDT3PMx.mjs.map +0 -1
  253. package/dist/Queue-DaxjwmOQ.d.cts.map +0 -1
  254. package/dist/Queue-HBDf0fqz.d.mts.map +0 -1
  255. package/dist/Subscriber-D8Xm-86W.d.mts.map +0 -1
  256. package/dist/Topic-C5ZMfveW.d.cts.map +0 -1
  257. package/dist/Topic-DT10AqHk.d.mts.map +0 -1
  258. package/dist/endpoints/index.cjs.map +0 -1
  259. package/dist/endpoints/index.d.cts.map +0 -1
  260. package/dist/endpoints/index.d.mts.map +0 -1
  261. package/dist/endpoints/index.mjs.map +0 -1
  262. package/dist/functions-B-qt91O7.mjs.map +0 -1
  263. package/dist/functions-C8i1kCMM.cjs.map +0 -1
  264. package/dist/index-BVs9DvIj.d.cts.map +0 -1
  265. package/dist/index-DP6fqv0I.d.mts.map +0 -1
  266. package/dist/lazyAccessors-DfqZR6C4.mjs.map +0 -1
  267. package/dist/lazyAccessors-DmTG8sQH.cjs.map +0 -1
  268. package/src/Construct.ts +0 -204
  269. package/src/__benchmarks__/build-time-optimization.bench.ts +0 -274
  270. package/src/__benchmarks__/endpoint.bench.ts +0 -494
  271. package/src/__benchmarks__/fixtures.ts +0 -241
  272. package/src/__benchmarks__/hono-adaptor.bench.ts +0 -533
  273. package/src/__benchmarks__/hono-server.bench.ts +0 -249
  274. package/src/__benchmarks__/response-builder.bench.ts +0 -428
  275. package/src/__benchmarks__/strategies/strategy-a-lazy-services.ts +0 -319
  276. package/src/__benchmarks__/strategies/strategy-c-middleware.ts +0 -530
  277. package/src/__benchmarks__/strategies/strategy-d-opt-in-events.ts +0 -567
  278. package/src/__tests__/Construct.environment.spec.ts +0 -704
  279. package/src/__tests__/publisher.setting.spec.ts +0 -508
  280. package/src/__tests__/publisher.spec.ts +0 -452
  281. package/src/adaptors/aws.ts +0 -6
  282. package/src/adaptors/hono.ts +0 -1
  283. package/src/adaptors/testing.ts +0 -11
  284. package/src/crons/AWSScheduledFunction.ts +0 -73
  285. package/src/crons/Cron.ts +0 -149
  286. package/src/crons/CronBuilder.ts +0 -271
  287. package/src/crons/__tests__/AWSScheduledFunction.spec.ts +0 -152
  288. package/src/crons/__tests__/Cron.spec.ts +0 -464
  289. package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +0 -227
  290. package/src/crons/index.ts +0 -12
  291. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +0 -677
  292. package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +0 -105
  293. package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +0 -97
  294. package/src/endpoints/Authorizer.ts +0 -152
  295. package/src/endpoints/Endpoint.ts +0 -1287
  296. package/src/endpoints/EndpointBuilder.ts +0 -758
  297. package/src/endpoints/EndpointFactory.ts +0 -1148
  298. package/src/endpoints/HonoEndpointAdaptor.ts +0 -677
  299. package/src/endpoints/MswEndpointAdaptor.ts +0 -226
  300. package/src/endpoints/TestEndpointAdaptor.ts +0 -422
  301. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.audits.spec.ts +0 -499
  302. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +0 -560
  303. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +0 -1304
  304. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +0 -626
  305. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +0 -732
  306. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +0 -296
  307. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +0 -951
  308. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.responseType.spec.ts +0 -111
  309. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.rls.spec.ts +0 -307
  310. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +0 -629
  311. package/src/endpoints/__tests__/Authorizer.spec.ts +0 -286
  312. package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +0 -207
  313. package/src/endpoints/__tests__/Endpoint.headers.spec.ts +0 -187
  314. package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +0 -175
  315. package/src/endpoints/__tests__/Endpoint.spec.ts +0 -857
  316. package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +0 -448
  317. package/src/endpoints/__tests__/EndpointBuilder.responseType.spec.ts +0 -47
  318. package/src/endpoints/__tests__/EndpointBuilder.spec.ts +0 -523
  319. package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +0 -492
  320. package/src/endpoints/__tests__/EndpointFactory.database-auditor.spec.ts +0 -509
  321. package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +0 -190
  322. package/src/endpoints/__tests__/EndpointFactory.spec.ts +0 -479
  323. package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +0 -155
  324. package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +0 -703
  325. package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +0 -632
  326. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +0 -577
  327. package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +0 -1067
  328. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +0 -317
  329. package/src/endpoints/__tests__/HonoEndpointAdaptor.pgboss-publisher.spec.ts +0 -289
  330. package/src/endpoints/__tests__/HonoEndpointAdaptor.responseType.spec.ts +0 -128
  331. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +0 -1207
  332. package/src/endpoints/__tests__/MswEndpointAdaptor.spec.ts +0 -211
  333. package/src/endpoints/__tests__/ResponseBuilder.spec.ts +0 -235
  334. package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +0 -602
  335. package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +0 -1044
  336. package/src/endpoints/__tests__/__snapshots__/HonoEndpointAdaptor.spec.ts.snap +0 -54
  337. package/src/endpoints/__tests__/endpoint-types.test.ts +0 -88
  338. package/src/endpoints/__tests__/helpers.spec.ts +0 -37
  339. package/src/endpoints/__tests__/lazyAccessors.spec.ts +0 -330
  340. package/src/endpoints/__tests__/processAudits.spec.ts +0 -631
  341. package/src/endpoints/audit.ts +0 -87
  342. package/src/endpoints/helpers.ts +0 -98
  343. package/src/endpoints/index.ts +0 -42
  344. package/src/endpoints/lazyAccessors.ts +0 -241
  345. package/src/endpoints/parseHonoQuery.ts +0 -16
  346. package/src/endpoints/parseQueryParams.ts +0 -32
  347. package/src/endpoints/processAudits.ts +0 -371
  348. package/src/endpoints/rls.ts +0 -67
  349. package/src/functions/AWSLambdaFunction.ts +0 -348
  350. package/src/functions/BaseFunctionBuilder.ts +0 -201
  351. package/src/functions/Function.ts +0 -238
  352. package/src/functions/FunctionBuilder.ts +0 -391
  353. package/src/functions/FunctionExecutionWrapper.ts +0 -216
  354. package/src/functions/TestFunctionAdaptor.ts +0 -217
  355. package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +0 -513
  356. package/src/functions/__tests__/Function.audits.spec.ts +0 -393
  357. package/src/functions/__tests__/Function.spec.ts +0 -477
  358. package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +0 -207
  359. package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +0 -480
  360. package/src/functions/index.ts +0 -12
  361. package/src/index.ts +0 -23
  362. package/src/publisher.ts +0 -93
  363. package/src/queue/AWSLambdaQueueAdaptor.ts +0 -162
  364. package/src/queue/Queue.ts +0 -128
  365. package/src/queue/QueueBuilder.ts +0 -115
  366. package/src/queue/TestQueueAdaptor.ts +0 -63
  367. package/src/queue/__tests__/QueueBuilder.spec.ts +0 -137
  368. package/src/queue/index.ts +0 -12
  369. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +0 -342
  370. package/src/subscribers/Subscriber.ts +0 -117
  371. package/src/subscribers/SubscriberBuilder.ts +0 -186
  372. package/src/subscribers/TestSubscriberAdaptor.ts +0 -133
  373. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +0 -1018
  374. package/src/subscribers/__tests__/Subscriber.spec.ts +0 -430
  375. package/src/subscribers/__tests__/TestSubscriberAdaptor.spec.ts +0 -652
  376. package/src/subscribers/index.ts +0 -6
  377. package/src/telemetry.ts +0 -103
  378. package/src/topic/Topic.ts +0 -103
  379. package/src/topic/TopicBuilder.ts +0 -51
  380. package/src/topic/__tests__/TopicBuilder.spec.ts +0 -82
  381. package/src/topic/index.ts +0 -11
  382. package/src/types.ts +0 -13
  383. package/test.ts +0 -91
  384. package/tsconfig.json +0 -9
  385. package/tsdown.config.ts +0 -34
@@ -1,1018 +0,0 @@
1
- import { EnvironmentParser } from '@geekmidas/envkit';
2
- import { ConsoleLogger } from '@geekmidas/logger/console';
3
- import type { Service } from '@geekmidas/services';
4
- import { serviceContext } from '@geekmidas/services';
5
- import type {
6
- Context,
7
- SNSEvent,
8
- SNSEventRecord,
9
- SQSEvent,
10
- SQSRecord,
11
- } from 'aws-lambda';
12
- import { beforeEach, describe, expect, it, vi } from 'vitest';
13
- import { z } from 'zod/v4';
14
- import { AWSLambdaSubscriber } from '../AWSLambdaSubscriberAdaptor';
15
- import { Subscriber } from '../Subscriber';
16
-
17
- // Mock services
18
- class TestService implements Service<'TestService', TestService> {
19
- serviceName = 'TestService' as const;
20
- static serviceName = 'TestService';
21
-
22
- async register() {
23
- return this;
24
- }
25
-
26
- getValue() {
27
- return 'test-value';
28
- }
29
- }
30
-
31
- // Mock Lambda context
32
- const createMockContext = (): Context => ({
33
- functionName: 'test-subscriber',
34
- functionVersion: '1',
35
- invokedFunctionArn: 'arn:aws:lambda:region:account:function:test-subscriber',
36
- memoryLimitInMB: '512',
37
- awsRequestId: 'test-request-id',
38
- logGroupName: '/aws/lambda/test-subscriber',
39
- logStreamName: '2023/01/01/[$LATEST]test-stream',
40
- getRemainingTimeInMillis: () => 30000,
41
- done: vi.fn(),
42
- fail: vi.fn(),
43
- succeed: vi.fn(),
44
- callbackWaitsForEmptyEventLoop: true,
45
- });
46
-
47
- // Helper to create SQS event
48
- const createSQSEvent = (messages: any[]): SQSEvent => ({
49
- Records: messages.map(
50
- (body, index) =>
51
- ({
52
- messageId: `message-${index}`,
53
- receiptHandle: `receipt-${index}`,
54
- body: JSON.stringify(body),
55
- attributes: {
56
- ApproximateReceiveCount: '1',
57
- SentTimestamp: '1234567890',
58
- SenderId: 'sender-id',
59
- ApproximateFirstReceiveTimestamp: '1234567890',
60
- },
61
- messageAttributes: {},
62
- md5OfBody: 'md5',
63
- eventSource: 'aws:sqs',
64
- eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
65
- awsRegion: 'us-east-1',
66
- }) as SQSRecord,
67
- ),
68
- });
69
-
70
- // Helper to create SNS event with full event format (type in message body)
71
- const createSNSEvent = (messages: any[]): SNSEvent => ({
72
- Records: messages.map(
73
- (message, index) =>
74
- ({
75
- EventSource: 'aws:sns',
76
- EventVersion: '1.0',
77
- EventSubscriptionArn: 'arn:aws:sns:region:account:topic-name',
78
- Sns: {
79
- Type: 'Notification',
80
- MessageId: `message-${index}`,
81
- TopicArn: 'arn:aws:sns:region:account:topic-name',
82
- Subject: 'Test',
83
- Message: JSON.stringify(message),
84
- Timestamp: '2023-01-01T00:00:00.000Z',
85
- SignatureVersion: '1',
86
- Signature: 'signature',
87
- SigningCertUrl: 'https://example.com/cert',
88
- UnsubscribeUrl: 'https://example.com/unsubscribe',
89
- },
90
- }) as SNSEventRecord,
91
- ),
92
- });
93
-
94
- // Helper to create SNS event with payload-only format (type in MessageAttributes)
95
- const createSNSEventWithMessageAttributes = (
96
- messages: { type: string; payload: any }[],
97
- ): SNSEvent => ({
98
- Records: messages.map(
99
- (message, index) =>
100
- ({
101
- EventSource: 'aws:sns',
102
- EventVersion: '1.0',
103
- EventSubscriptionArn: 'arn:aws:sns:region:account:topic-name',
104
- Sns: {
105
- Type: 'Notification',
106
- MessageId: `message-${index}`,
107
- TopicArn: 'arn:aws:sns:region:account:topic-name',
108
- Subject: undefined,
109
- Message: JSON.stringify(message.payload),
110
- Timestamp: '2023-01-01T00:00:00.000Z',
111
- SignatureVersion: '1',
112
- Signature: 'signature',
113
- SigningCertUrl: 'https://example.com/cert',
114
- UnsubscribeUrl: 'https://example.com/unsubscribe',
115
- MessageAttributes: {
116
- type: {
117
- Type: 'String',
118
- Value: message.type,
119
- },
120
- },
121
- },
122
- }) satisfies SNSEventRecord,
123
- ),
124
- });
125
-
126
- // Helper to create SNS wrapped in SQS
127
- const createSNSWrappedInSQS = (messages: any[]): SQSEvent => {
128
- return createSQSEvent(
129
- messages.map((message) => ({
130
- Type: 'Notification',
131
- MessageId: 'message-id',
132
- TopicArn: 'arn:aws:sns:region:account:topic-name',
133
- Message: JSON.stringify(message),
134
- Timestamp: '2023-01-01T00:00:00.000Z',
135
- })),
136
- );
137
- };
138
-
139
- // Helper to create SNS wrapped in SQS with payload-only format (type in MessageAttributes)
140
- const createSNSWrappedInSQSWithMessageAttributes = (
141
- messages: { type: string; payload: any }[],
142
- ): SQSEvent => {
143
- return createSQSEvent(
144
- messages.map((message) => ({
145
- Type: 'Notification',
146
- MessageId: 'message-id',
147
- TopicArn: 'arn:aws:sns:region:account:topic-name',
148
- Message: JSON.stringify(message.payload),
149
- Timestamp: '2023-01-01T00:00:00.000Z',
150
- MessageAttributes: {
151
- type: {
152
- Type: 'String',
153
- Value: message.type,
154
- },
155
- },
156
- })),
157
- );
158
- };
159
-
160
- describe('AWSLambdaSubscriber', () => {
161
- let envParser: EnvironmentParser<{}>;
162
- let logger: ConsoleLogger;
163
-
164
- beforeEach(() => {
165
- envParser = new EnvironmentParser({});
166
- logger = new ConsoleLogger();
167
- vi.clearAllMocks();
168
- });
169
-
170
- describe('SQS event processing', () => {
171
- it('should process direct SQS messages', async () => {
172
- const handler = vi.fn(async ({ events }) => {
173
- expect(events).toHaveLength(2);
174
- expect(events[0]).toEqual({
175
- type: 'user.created',
176
- payload: { userId: '1', email: 'user1@example.com' },
177
- });
178
- expect(events[1]).toEqual({
179
- type: 'user.created',
180
- payload: { userId: '2', email: 'user2@example.com' },
181
- });
182
- });
183
-
184
- const subscriber = new Subscriber(
185
- handler,
186
- 30000, // timeout
187
- undefined, // subscribedEvents
188
- undefined, // outputSchema
189
- [], // services
190
- logger, // logger
191
- );
192
-
193
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
194
- const lambdaHandler = adapter.handler;
195
-
196
- const sqsEvent = createSQSEvent([
197
- {
198
- type: 'user.created',
199
- payload: { userId: '1', email: 'user1@example.com' },
200
- },
201
- {
202
- type: 'user.created',
203
- payload: { userId: '2', email: 'user2@example.com' },
204
- },
205
- ]);
206
-
207
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
208
-
209
- expect(handler).toHaveBeenCalled();
210
- });
211
-
212
- it('should process SNS messages wrapped in SQS', async () => {
213
- const handler = vi.fn(async ({ events }) => {
214
- expect(events).toHaveLength(2);
215
- expect(events[0]).toEqual({
216
- type: 'order.placed',
217
- payload: { orderId: 'order-1' },
218
- });
219
- });
220
-
221
- const subscriber = new Subscriber(
222
- handler,
223
- 30000, // timeout
224
- undefined, // subscribedEvents
225
- undefined, // outputSchema
226
- [], // services
227
- logger, // logger
228
- );
229
-
230
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
231
- const lambdaHandler = adapter.handler;
232
-
233
- const sqsEvent = createSNSWrappedInSQS([
234
- { type: 'order.placed', payload: { orderId: 'order-1' } },
235
- { type: 'order.placed', payload: { orderId: 'order-2' } },
236
- ]);
237
-
238
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
239
-
240
- expect(handler).toHaveBeenCalled();
241
- });
242
- });
243
-
244
- describe('SNS event processing', () => {
245
- it('should process SNS events directly', async () => {
246
- const handler = vi.fn(async ({ events }) => {
247
- expect(events).toHaveLength(2);
248
- expect(events[0]).toEqual({
249
- type: 'user.created',
250
- payload: { userId: '1', email: 'user1@example.com' },
251
- });
252
- });
253
-
254
- const subscriber = new Subscriber(
255
- handler,
256
- 30000, // timeout
257
- undefined, // subscribedEvents
258
- undefined, // outputSchema
259
- [], // services
260
- logger, // logger
261
- );
262
-
263
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
264
- const lambdaHandler = adapter.handler;
265
-
266
- const snsEvent = createSNSEvent([
267
- {
268
- type: 'user.created',
269
- payload: { userId: '1', email: 'user1@example.com' },
270
- },
271
- {
272
- type: 'user.created',
273
- payload: { userId: '2', email: 'user2@example.com' },
274
- },
275
- ]);
276
-
277
- await lambdaHandler(snsEvent, createMockContext(), vi.fn());
278
-
279
- expect(handler).toHaveBeenCalled();
280
- });
281
-
282
- it('should process SNS events with type in MessageAttributes (payload-only format)', async () => {
283
- const handler = vi.fn(async ({ events }) => {
284
- expect(events).toHaveLength(1);
285
- expect(events[0]).toEqual({
286
- type: 'tenant.created',
287
- payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
288
- });
289
- });
290
-
291
- const subscriber = new Subscriber(
292
- handler,
293
- 30000,
294
- ['tenant.created'] as any,
295
- undefined,
296
- [],
297
- logger,
298
- );
299
-
300
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
301
- const lambdaHandler = adapter.handler;
302
-
303
- const snsEvent = createSNSEventWithMessageAttributes([
304
- {
305
- type: 'tenant.created',
306
- payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
307
- },
308
- ]);
309
-
310
- await lambdaHandler(snsEvent, createMockContext(), vi.fn());
311
-
312
- expect(handler).toHaveBeenCalled();
313
- });
314
-
315
- it('should process SNS-wrapped-in-SQS with type in MessageAttributes (payload-only format)', async () => {
316
- const handler = vi.fn(async ({ events }) => {
317
- expect(events).toHaveLength(1);
318
- expect(events[0]).toEqual({
319
- type: 'tenant.created',
320
- payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
321
- });
322
- });
323
-
324
- const subscriber = new Subscriber(
325
- handler,
326
- 30000,
327
- ['tenant.created'] as any,
328
- undefined,
329
- [],
330
- logger,
331
- );
332
-
333
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
334
- const lambdaHandler = adapter.handler;
335
-
336
- const sqsEvent = createSNSWrappedInSQSWithMessageAttributes([
337
- {
338
- type: 'tenant.created',
339
- payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
340
- },
341
- ]);
342
-
343
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
344
-
345
- expect(handler).toHaveBeenCalled();
346
- });
347
- });
348
-
349
- describe('event type filtering', () => {
350
- it('should filter events by subscribed types', async () => {
351
- const handler = vi.fn(async ({ events }) => {
352
- expect(events).toHaveLength(2);
353
- expect(events.every((e: any) => e.type === 'user.created')).toBe(true);
354
- });
355
-
356
- const subscriber = new Subscriber(
357
- handler,
358
- 30000, // timeout
359
- ['user.created'] as any, // subscribedEvents - Only subscribe to user.created
360
- undefined, // outputSchema
361
- [], // services
362
- logger, // logger
363
- );
364
-
365
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
366
- const lambdaHandler = adapter.handler;
367
-
368
- const sqsEvent = createSQSEvent([
369
- {
370
- type: 'user.created',
371
- payload: { userId: '1', email: 'user1@example.com' },
372
- },
373
- { type: 'order.placed', payload: { orderId: 'order-1' } }, // Should be filtered out
374
- {
375
- type: 'user.created',
376
- payload: { userId: '2', email: 'user2@example.com' },
377
- },
378
- ]);
379
-
380
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
381
-
382
- expect(handler).toHaveBeenCalled();
383
- });
384
-
385
- it('should accept all events when no subscribed types specified', async () => {
386
- const handler = vi.fn(async ({ events }) => {
387
- expect(events).toHaveLength(3);
388
- });
389
-
390
- const subscriber = new Subscriber(
391
- handler,
392
- 30000, // timeout
393
- undefined, // subscribedEvents - No filter
394
- undefined, // outputSchema
395
- [], // services
396
- logger, // logger
397
- );
398
-
399
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
400
- const lambdaHandler = adapter.handler;
401
-
402
- const sqsEvent = createSQSEvent([
403
- {
404
- type: 'user.created',
405
- payload: { userId: '1', email: 'user1@example.com' },
406
- },
407
- { type: 'order.placed', payload: { orderId: 'order-1' } },
408
- { type: 'user.updated', payload: { userId: '1' } },
409
- ]);
410
-
411
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
412
-
413
- expect(handler).toHaveBeenCalled();
414
- });
415
-
416
- it('should return early when no subscribed events after filtering', async () => {
417
- const handler = vi.fn();
418
-
419
- const subscriber = new Subscriber(
420
- handler,
421
- 30000, // timeout
422
- ['user.deleted'] as any, // subscribedEvents - Subscribe to events that won't come
423
- undefined, // outputSchema
424
- [], // services
425
- logger, // logger
426
- );
427
-
428
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
429
- const lambdaHandler = adapter.handler;
430
-
431
- const sqsEvent = createSQSEvent([
432
- {
433
- type: 'user.created',
434
- payload: { userId: '1', email: 'user1@example.com' },
435
- },
436
- { type: 'order.placed', payload: { orderId: 'order-1' } },
437
- ]);
438
-
439
- const result = await lambdaHandler(
440
- sqsEvent,
441
- createMockContext(),
442
- vi.fn(),
443
- );
444
-
445
- expect(handler).not.toHaveBeenCalled();
446
- expect(result).toEqual({ batchItemFailures: [] });
447
- });
448
- });
449
-
450
- describe('services', () => {
451
- it('should inject services into subscriber context', async () => {
452
- const service = new TestService();
453
- const handler = vi.fn(async ({ services }) => {
454
- expect(services.TestService.getValue()).toBe('test-value');
455
- });
456
-
457
- const subscriber = new Subscriber(
458
- handler,
459
- 30000, // timeout
460
- undefined, // subscribedEvents
461
- undefined, // outputSchema
462
- [service], // services
463
- logger, // logger
464
- );
465
-
466
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
467
- const lambdaHandler = adapter.handler;
468
-
469
- const sqsEvent = createSQSEvent([
470
- {
471
- type: 'user.created',
472
- payload: { userId: '1', email: 'user1@example.com' },
473
- },
474
- ]);
475
-
476
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
477
-
478
- expect(handler).toHaveBeenCalledWith(
479
- expect.objectContaining({
480
- services: expect.objectContaining({
481
- TestService: expect.any(TestService),
482
- }),
483
- }),
484
- );
485
- });
486
- });
487
-
488
- describe('logging', () => {
489
- it('should create child logger with Lambda context', async () => {
490
- const childLogger = {
491
- info: vi.fn(),
492
- error: vi.fn(),
493
- warn: vi.fn(),
494
- debug: vi.fn(),
495
- child: vi.fn(),
496
- };
497
-
498
- const mockLogger = {
499
- child: vi.fn().mockReturnValue(childLogger),
500
- info: vi.fn(),
501
- error: vi.fn(),
502
- warn: vi.fn(),
503
- debug: vi.fn(),
504
- };
505
-
506
- const subscriber = new Subscriber(
507
- async ({ logger }) => {
508
- logger.info('Processing events');
509
- },
510
- 30000, // timeout
511
- undefined, // subscribedEvents
512
- undefined, // outputSchema
513
- [], // services
514
- mockLogger as any, // logger
515
- );
516
-
517
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
518
- const lambdaHandler = adapter.handler;
519
-
520
- const context = createMockContext();
521
- const sqsEvent = createSQSEvent([
522
- {
523
- type: 'user.created',
524
- payload: { userId: '1', email: 'user1@example.com' },
525
- },
526
- ]);
527
-
528
- await lambdaHandler(sqsEvent, context, vi.fn());
529
-
530
- expect(mockLogger.child).toHaveBeenCalledWith({
531
- subscriber: {
532
- name: 'test-subscriber',
533
- version: '1',
534
- memory: '512',
535
- },
536
- req: {
537
- id: 'test-request-id',
538
- },
539
- });
540
- expect(childLogger.info).toHaveBeenCalledWith('Processing events');
541
- });
542
- });
543
-
544
- describe('output validation', () => {
545
- it('should validate output against schema', async () => {
546
- const outputSchema = z.object({
547
- processed: z.number(),
548
- });
549
-
550
- const subscriber = new Subscriber(
551
- async ({ events }) => ({
552
- processed: events.length,
553
- }),
554
- 30000, // timeout
555
- undefined, // subscribedEvents
556
- outputSchema, // outputSchema
557
- [], // services
558
- logger, // logger
559
- );
560
-
561
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
562
- const lambdaHandler = adapter.handler;
563
-
564
- const sqsEvent = createSQSEvent([
565
- {
566
- type: 'user.created',
567
- payload: { userId: '1', email: 'user1@example.com' },
568
- },
569
- {
570
- type: 'user.created',
571
- payload: { userId: '2', email: 'user2@example.com' },
572
- },
573
- ]);
574
-
575
- const result = await lambdaHandler(
576
- sqsEvent,
577
- createMockContext(),
578
- vi.fn(),
579
- );
580
-
581
- expect(result).toEqual({ processed: 2 });
582
- });
583
-
584
- it('should fail with invalid output', async () => {
585
- const outputSchema = z.object({
586
- processed: z.number(),
587
- });
588
-
589
- const subscriber = new Subscriber(
590
- // @ts-expect-error - intentionally returning wrong type
591
- async () => ({
592
- processed: 'not a number',
593
- }),
594
- 30000, // timeout
595
- undefined, // subscribedEvents
596
- outputSchema, // outputSchema
597
- [], // services
598
- logger, // logger
599
- );
600
-
601
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
602
- const lambdaHandler = adapter.handler;
603
-
604
- const sqsEvent = createSQSEvent([
605
- {
606
- type: 'user.created',
607
- payload: { userId: '1', email: 'user1@example.com' },
608
- },
609
- ]);
610
-
611
- await expect(
612
- lambdaHandler(sqsEvent, createMockContext(), vi.fn()),
613
- ).rejects.toThrow();
614
- });
615
- });
616
-
617
- describe('error handling', () => {
618
- it('should wrap and log errors', async () => {
619
- const childLogger = {
620
- info: vi.fn(),
621
- error: vi.fn(),
622
- warn: vi.fn(),
623
- debug: vi.fn(),
624
- child: vi.fn(),
625
- };
626
-
627
- const mockLogger = {
628
- child: vi.fn().mockReturnValue(childLogger),
629
- error: vi.fn(),
630
- info: vi.fn(),
631
- warn: vi.fn(),
632
- debug: vi.fn(),
633
- };
634
-
635
- const subscriber = new Subscriber(
636
- async () => {
637
- throw new Error('Processing failed');
638
- },
639
- 30000, // timeout
640
- undefined, // subscribedEvents
641
- undefined, // outputSchema
642
- [], // services
643
- mockLogger as any, // logger
644
- );
645
-
646
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
647
- const lambdaHandler = adapter.handler;
648
-
649
- const sqsEvent = createSQSEvent([
650
- {
651
- type: 'user.created',
652
- payload: { userId: '1', email: 'user1@example.com' },
653
- },
654
- ]);
655
-
656
- await expect(
657
- lambdaHandler(sqsEvent, createMockContext(), vi.fn()),
658
- ).rejects.toThrow();
659
-
660
- expect(childLogger.error).toHaveBeenCalledWith(
661
- expect.any(Error),
662
- 'Error processing subscriber',
663
- );
664
- });
665
-
666
- it('should wrap non-JSON SNS message with type from MessageAttributes in SQS', async () => {
667
- const handler = vi.fn(async ({ events }) => {
668
- expect(events).toHaveLength(1);
669
- expect(events[0]).toEqual({
670
- type: 'notification.sent',
671
- payload: 'this is not json',
672
- });
673
- });
674
-
675
- const subscriber = new Subscriber(
676
- handler,
677
- 30000,
678
- undefined,
679
- undefined,
680
- [],
681
- logger,
682
- );
683
-
684
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
685
- const lambdaHandler = adapter.handler;
686
-
687
- const sqsEvent: SQSEvent = {
688
- Records: [
689
- {
690
- messageId: 'message-1',
691
- receiptHandle: 'receipt-1',
692
- body: JSON.stringify({
693
- Type: 'Notification',
694
- MessageId: 'sns-msg-1',
695
- TopicArn: 'arn:aws:sns:region:account:topic',
696
- Message: 'this is not json',
697
- Timestamp: '2023-01-01T00:00:00.000Z',
698
- MessageAttributes: {
699
- type: { Type: 'String', Value: 'notification.sent' },
700
- },
701
- }),
702
- attributes: {} as any,
703
- messageAttributes: {},
704
- md5OfBody: 'md5',
705
- eventSource: 'aws:sqs',
706
- eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
707
- awsRegion: 'us-east-1',
708
- } as SQSRecord,
709
- ],
710
- };
711
-
712
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
713
-
714
- expect(handler).toHaveBeenCalled();
715
- });
716
-
717
- it('should pass through non-JSON SNS message without type as raw string', async () => {
718
- const handler = vi.fn(async ({ events }) => {
719
- expect(events).toHaveLength(1);
720
- expect(events[0]).toBe('plain text without type');
721
- });
722
-
723
- const subscriber = new Subscriber(
724
- handler,
725
- 30000,
726
- undefined,
727
- undefined,
728
- [],
729
- logger,
730
- );
731
-
732
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
733
- const lambdaHandler = adapter.handler;
734
-
735
- const sqsEvent: SQSEvent = {
736
- Records: [
737
- {
738
- messageId: 'message-1',
739
- receiptHandle: 'receipt-1',
740
- body: JSON.stringify({
741
- Type: 'Notification',
742
- MessageId: 'sns-msg-1',
743
- TopicArn: 'arn:aws:sns:region:account:topic',
744
- Message: 'plain text without type',
745
- Timestamp: '2023-01-01T00:00:00.000Z',
746
- }),
747
- attributes: {} as any,
748
- messageAttributes: {},
749
- md5OfBody: 'md5',
750
- eventSource: 'aws:sqs',
751
- eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
752
- awsRegion: 'us-east-1',
753
- } as SQSRecord,
754
- ],
755
- };
756
-
757
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
758
-
759
- expect(handler).toHaveBeenCalled();
760
- });
761
-
762
- it('should wrap non-JSON SNS record with type from MessageAttributes', async () => {
763
- const handler = vi.fn(async ({ events }) => {
764
- expect(events).toHaveLength(1);
765
- expect(events[0]).toEqual({
766
- type: 'alert.fired',
767
- payload: 'plain text, not json',
768
- });
769
- });
770
-
771
- const subscriber = new Subscriber(
772
- handler,
773
- 30000,
774
- undefined,
775
- undefined,
776
- [],
777
- logger,
778
- );
779
-
780
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
781
- const lambdaHandler = adapter.handler;
782
-
783
- const snsEvent: SNSEvent = {
784
- Records: [
785
- {
786
- EventSource: 'aws:sns',
787
- EventVersion: '1.0',
788
- EventSubscriptionArn: 'arn:aws:sns:region:account:topic',
789
- Sns: {
790
- Type: 'Notification',
791
- MessageId: 'msg-1',
792
- TopicArn: 'arn:aws:sns:region:account:topic',
793
- Subject: 'Test',
794
- Message: 'plain text, not json',
795
- Timestamp: '2023-01-01T00:00:00.000Z',
796
- SignatureVersion: '1',
797
- Signature: 'sig',
798
- SigningCertUrl: 'https://example.com/cert',
799
- UnsubscribeUrl: 'https://example.com/unsub',
800
- MessageAttributes: {
801
- type: { Type: 'String', Value: 'alert.fired' },
802
- },
803
- },
804
- } as SNSEventRecord,
805
- ],
806
- };
807
-
808
- await lambdaHandler(snsEvent, createMockContext(), vi.fn());
809
-
810
- expect(handler).toHaveBeenCalled();
811
- });
812
-
813
- it('should pass through non-JSON SNS record without type as raw string', async () => {
814
- const handler = vi.fn(async ({ events }) => {
815
- expect(events).toHaveLength(1);
816
- expect(events[0]).toBe('plain text, no type attr');
817
- });
818
-
819
- const subscriber = new Subscriber(
820
- handler,
821
- 30000,
822
- undefined,
823
- undefined,
824
- [],
825
- logger,
826
- );
827
-
828
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
829
- const lambdaHandler = adapter.handler;
830
-
831
- const snsEvent: SNSEvent = {
832
- Records: [
833
- {
834
- EventSource: 'aws:sns',
835
- EventVersion: '1.0',
836
- EventSubscriptionArn: 'arn:aws:sns:region:account:topic',
837
- Sns: {
838
- Type: 'Notification',
839
- MessageId: 'msg-1',
840
- TopicArn: 'arn:aws:sns:region:account:topic',
841
- Subject: 'Test',
842
- Message: 'plain text, no type attr',
843
- Timestamp: '2023-01-01T00:00:00.000Z',
844
- SignatureVersion: '1',
845
- Signature: 'sig',
846
- SigningCertUrl: 'https://example.com/cert',
847
- UnsubscribeUrl: 'https://example.com/unsub',
848
- },
849
- } as SNSEventRecord,
850
- ],
851
- };
852
-
853
- await lambdaHandler(snsEvent, createMockContext(), vi.fn());
854
-
855
- expect(handler).toHaveBeenCalled();
856
- });
857
-
858
- it('should pass through non-JSON SQS body', async () => {
859
- const handler = vi.fn(async ({ events }) => {
860
- expect(events).toHaveLength(1);
861
- expect(events[0]).toBe('raw text body');
862
- });
863
-
864
- const subscriber = new Subscriber(
865
- handler,
866
- 30000,
867
- undefined,
868
- undefined,
869
- [],
870
- logger,
871
- );
872
-
873
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
874
- const lambdaHandler = adapter.handler;
875
-
876
- const sqsEvent: SQSEvent = {
877
- Records: [
878
- {
879
- messageId: 'message-1',
880
- receiptHandle: 'receipt-1',
881
- body: 'raw text body',
882
- attributes: {} as any,
883
- messageAttributes: {},
884
- md5OfBody: 'md5',
885
- eventSource: 'aws:sqs',
886
- eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
887
- awsRegion: 'us-east-1',
888
- } as SQSRecord,
889
- ],
890
- };
891
-
892
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
893
-
894
- expect(handler).toHaveBeenCalled();
895
- });
896
-
897
- it('should pass through invalid JSON SQS records alongside valid ones', async () => {
898
- const handler = vi.fn(async ({ events }) => {
899
- // Both records should be passed through
900
- expect(events).toHaveLength(2);
901
- expect(events[0]).toBe('invalid json{');
902
- expect(events[1]).toEqual({
903
- type: 'user.created',
904
- payload: { userId: '1', email: 'user1@example.com' },
905
- });
906
- });
907
-
908
- const subscriber = new Subscriber(
909
- handler,
910
- 30000,
911
- undefined,
912
- undefined,
913
- [],
914
- logger,
915
- );
916
-
917
- const adapter = new AWSLambdaSubscriber(envParser, subscriber);
918
- const lambdaHandler = adapter.handler;
919
-
920
- const sqsEvent: SQSEvent = {
921
- Records: [
922
- {
923
- messageId: 'message-1',
924
- receiptHandle: 'receipt-1',
925
- body: 'invalid json{',
926
- attributes: {} as any,
927
- messageAttributes: {},
928
- md5OfBody: 'md5',
929
- eventSource: 'aws:sqs',
930
- eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
931
- awsRegion: 'us-east-1',
932
- } as SQSRecord,
933
- {
934
- messageId: 'message-2',
935
- receiptHandle: 'receipt-2',
936
- body: JSON.stringify({
937
- type: 'user.created',
938
- payload: { userId: '1', email: 'user1@example.com' },
939
- }),
940
- attributes: {} as any,
941
- messageAttributes: {},
942
- md5OfBody: 'md5',
943
- eventSource: 'aws:sqs',
944
- eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
945
- awsRegion: 'us-east-1',
946
- } as SQSRecord,
947
- ],
948
- };
949
-
950
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
951
-
952
- expect(handler).toHaveBeenCalled();
953
- });
954
- });
955
-
956
- describe('request context', () => {
957
- it('should make serviceContext.getLogger() available inside handler', async () => {
958
- let contextLogger: any;
959
- let contextRequestId: string | undefined;
960
-
961
- const handler = vi.fn(async () => {
962
- contextLogger = serviceContext.getLogger();
963
- contextRequestId = serviceContext.getRequestId();
964
- return {};
965
- });
966
-
967
- const subscriber = new Subscriber(
968
- handler,
969
- 30000,
970
- ['user.created'] as any,
971
- undefined,
972
- [],
973
- logger,
974
- );
975
-
976
- const adaptor = new AWSLambdaSubscriber(envParser, subscriber);
977
- const lambdaHandler = adaptor.handler;
978
-
979
- const sqsEvent = createSQSEvent([
980
- { type: 'user.created', payload: { userId: '1' } },
981
- ]);
982
-
983
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
984
-
985
- expect(contextLogger).toBeDefined();
986
- expect(contextRequestId).toBe('test-request-id');
987
- });
988
-
989
- it('should make serviceContext.hasContext() return true inside handler', async () => {
990
- let hasContext = false;
991
-
992
- const handler = vi.fn(async () => {
993
- hasContext = serviceContext.hasContext();
994
- return {};
995
- });
996
-
997
- const subscriber = new Subscriber(
998
- handler,
999
- 30000,
1000
- ['user.created'] as any,
1001
- undefined,
1002
- [],
1003
- logger,
1004
- );
1005
-
1006
- const adaptor = new AWSLambdaSubscriber(envParser, subscriber);
1007
- const lambdaHandler = adaptor.handler;
1008
-
1009
- const sqsEvent = createSQSEvent([
1010
- { type: 'user.created', payload: { userId: '1' } },
1011
- ]);
1012
-
1013
- await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
1014
-
1015
- expect(hasContext).toBe(true);
1016
- });
1017
- });
1018
- });