@reventlessdev/reventless-aws 3.0.0-alpha.167

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 (394) hide show
  1. package/CHANGELOG.md +1564 -0
  2. package/README.md +62 -0
  3. package/__mocks__/emptyModule.js +1 -0
  4. package/all-licenses.csv +565 -0
  5. package/docker-compose.dynamodb-local.yml +12 -0
  6. package/jest.setup.cjs +5 -0
  7. package/licenses-analysis.ods +0 -0
  8. package/package.json +73 -0
  9. package/rescript.json +39 -0
  10. package/reventless-licenses-analysis.xls +0 -0
  11. package/scripts/run-integration-tests.sh +43 -0
  12. package/src/Platform.res +1940 -0
  13. package/src/Platform.res.mjs +2281 -0
  14. package/src/Platform_Casts.res +106 -0
  15. package/src/Platform_Casts.res.mjs +13 -0
  16. package/src/Platform_Stack.res +153 -0
  17. package/src/Platform_Stack.res.mjs +121 -0
  18. package/src/Types.res +39 -0
  19. package/src/Types.res.mjs +21 -0
  20. package/src/adapter/AWS.res +96 -0
  21. package/src/adapter/AWS.res.mjs +186 -0
  22. package/src/adapter/AWS_Tags.res +16 -0
  23. package/src/adapter/AWS_Tags.res.mjs +48 -0
  24. package/src/adapter/Adapter_Helpers.res +19 -0
  25. package/src/adapter/Adapter_Helpers.res.mjs +37 -0
  26. package/src/adapter/Api/AppSync_EventsApi.res +172 -0
  27. package/src/adapter/Api/AppSync_EventsApi.res.mjs +96 -0
  28. package/src/adapter/Api/AppSync_Resolver_Native.res +93 -0
  29. package/src/adapter/Api/AppSync_Resolver_Native.res.mjs +67 -0
  30. package/src/adapter/Api/AppSync_Resolver_Retrying.res +653 -0
  31. package/src/adapter/Api/AppSync_Resolver_Retrying.res.mjs +462 -0
  32. package/src/adapter/Api/CommandSubscriptionResolvers_AppSync.res +29 -0
  33. package/src/adapter/Api/CommandSubscriptionResolvers_AppSync.res.mjs +15 -0
  34. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +238 -0
  35. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res.mjs +179 -0
  36. package/src/adapter/Api/Platform_UIFragments_Lambda.res +229 -0
  37. package/src/adapter/Api/Platform_UIFragments_Lambda.res.mjs +245 -0
  38. package/src/adapter/Auth/Auth_Cognito.res +209 -0
  39. package/src/adapter/Auth/Auth_Cognito.res.mjs +135 -0
  40. package/src/adapter/CommandGenerator/CommandGeneratorResolvers.res +2 -0
  41. package/src/adapter/CommandGenerator/CommandGeneratorResolvers.res.mjs +12 -0
  42. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res +251 -0
  43. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res.mjs +126 -0
  44. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res +20 -0
  45. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res.mjs +23 -0
  46. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_Runtime.res +1 -0
  47. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_Runtime.res.mjs +11 -0
  48. package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res +95 -0
  49. package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res.mjs +50 -0
  50. package/src/adapter/CommandTopic/CommandTopicChannel.res +6 -0
  51. package/src/adapter/CommandTopic/CommandTopicChannel.res.mjs +21 -0
  52. package/src/adapter/CommandTopic/CommandTopicChannel_Helpers.res +196 -0
  53. package/src/adapter/CommandTopic/CommandTopicChannel_Helpers.res.mjs +145 -0
  54. package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res +91 -0
  55. package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res.mjs +74 -0
  56. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res +69 -0
  57. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs +62 -0
  58. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res +60 -0
  59. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res.mjs +56 -0
  60. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res +73 -0
  61. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res.mjs +65 -0
  62. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res +88 -0
  63. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs +76 -0
  64. package/src/adapter/CommandTopic/CommandTopicRemoteChannel.res +1 -0
  65. package/src/adapter/CommandTopic/CommandTopicRemoteChannel.res.mjs +9 -0
  66. package/src/adapter/CommandTopic/CommandTopicRemoteChannel_SQS.res +7 -0
  67. package/src/adapter/CommandTopic/CommandTopicRemoteChannel_SQS.res.mjs +17 -0
  68. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res +103 -0
  69. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res.mjs +68 -0
  70. package/src/adapter/Counter/CounterHandler_DynamoDbStream_Runtime.res +107 -0
  71. package/src/adapter/Counter/CounterHandler_DynamoDbStream_Runtime.res.mjs +145 -0
  72. package/src/adapter/DcbEventLog/DcbEventLogStorage.res +1 -0
  73. package/src/adapter/DcbEventLog/DcbEventLogStorage.res.mjs +9 -0
  74. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res +84 -0
  75. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res.mjs +52 -0
  76. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +1436 -0
  77. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res.mjs +1143 -0
  78. package/src/adapter/EventCollector/EventCollectorChannel.res +6 -0
  79. package/src/adapter/EventCollector/EventCollectorChannel.res.mjs +21 -0
  80. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +63 -0
  81. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs +56 -0
  82. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res +20 -0
  83. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res.mjs +32 -0
  84. package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res +266 -0
  85. package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res.mjs +166 -0
  86. package/src/adapter/EventCollector/EventCollectorChannel_SQS.res +81 -0
  87. package/src/adapter/EventCollector/EventCollectorChannel_SQS.res.mjs +54 -0
  88. package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res +59 -0
  89. package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res.mjs +45 -0
  90. package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res +91 -0
  91. package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res.mjs +89 -0
  92. package/src/adapter/EventLog/EventLogStorage.res +3 -0
  93. package/src/adapter/EventLog/EventLogStorage.res.mjs +15 -0
  94. package/src/adapter/EventLog/EventLogStorage_DynamoDb.res +25 -0
  95. package/src/adapter/EventLog/EventLogStorage_DynamoDb.res.mjs +34 -0
  96. package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res +26 -0
  97. package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res.mjs +35 -0
  98. package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res +121 -0
  99. package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res.mjs +137 -0
  100. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res +265 -0
  101. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs +185 -0
  102. package/src/adapter/EventTopic/EventTopicPublisher.res +6 -0
  103. package/src/adapter/EventTopic/EventTopicPublisher.res.mjs +21 -0
  104. package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res +25 -0
  105. package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs +28 -0
  106. package/src/adapter/EventTopic/EventTopicPublisher_SNS.res +40 -0
  107. package/src/adapter/EventTopic/EventTopicPublisher_SNS.res.mjs +39 -0
  108. package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res +39 -0
  109. package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res.mjs +38 -0
  110. package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res +5 -0
  111. package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res.mjs +18 -0
  112. package/src/adapter/Mcp/MCP_Lambda.res +502 -0
  113. package/src/adapter/Mcp/MCP_Lambda.res.mjs +289 -0
  114. package/src/adapter/QueryDb/NodeResolver_AppSync.res +71 -0
  115. package/src/adapter/QueryDb/NodeResolver_AppSync.res.mjs +44 -0
  116. package/src/adapter/QueryDb/QueryDbResolvers.res +2 -0
  117. package/src/adapter/QueryDb/QueryDbResolvers.res.mjs +12 -0
  118. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +434 -0
  119. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res.mjs +243 -0
  120. package/src/adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res +21 -0
  121. package/src/adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res.mjs +14 -0
  122. package/src/adapter/QueryDb/QueryDbResolvers_NoOp.res +21 -0
  123. package/src/adapter/QueryDb/QueryDbResolvers_NoOp.res.mjs +14 -0
  124. package/src/adapter/QueryDb/QueryDbStorage.res +5 -0
  125. package/src/adapter/QueryDb/QueryDbStorage.res.mjs +18 -0
  126. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res +115 -0
  127. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res.mjs +100 -0
  128. package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res +52 -0
  129. package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res.mjs +38 -0
  130. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res +271 -0
  131. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res.mjs +306 -0
  132. package/src/adapter/QueryDb/QueryInterceptor_Lambda.res +20 -0
  133. package/src/adapter/QueryDb/QueryInterceptor_Lambda.res.mjs +22 -0
  134. package/src/adapter/QueryEngine/QueryEngine.res +3 -0
  135. package/src/adapter/QueryEngine/QueryEngine.res.mjs +12 -0
  136. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +184 -0
  137. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs +221 -0
  138. package/src/adapter/Runtime/AdminEventCollectorEntryPoint.mjs +879 -0
  139. package/src/adapter/Runtime/AggregateEntryPoint.mjs +313 -0
  140. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +327 -0
  141. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +239 -0
  142. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +331 -0
  143. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res.mjs +240 -0
  144. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +247 -0
  145. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +185 -0
  146. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +244 -0
  147. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res.mjs +185 -0
  148. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +347 -0
  149. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +244 -0
  150. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +285 -0
  151. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +212 -0
  152. package/src/adapter/Runtime/AutomationSliceEntryPoint.mjs +124 -0
  153. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +187 -0
  154. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs +147 -0
  155. package/src/adapter/Runtime/CounterEntryPoint.mjs +91 -0
  156. package/src/adapter/Runtime/DcbCommandTopicEntryPoint.mjs +265 -0
  157. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +122 -0
  158. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res.mjs +89 -0
  159. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +193 -0
  160. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +137 -0
  161. package/src/adapter/Runtime/EventMapperEntryPoint.mjs +97 -0
  162. package/src/adapter/Runtime/ExtensionPointEntryPoint.mjs +101 -0
  163. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +83 -0
  164. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res.mjs +59 -0
  165. package/src/adapter/Runtime/HandlerFactoryHelpers.mjs +142 -0
  166. package/src/adapter/Runtime/HeartbeatEntryPoint.mjs +38 -0
  167. package/src/adapter/Runtime/PluginExtensionPointEntryPoint.mjs +137 -0
  168. package/src/adapter/Runtime/ReadModelEntryPoint.mjs +143 -0
  169. package/src/adapter/Runtime/RuntimeEnvironment.res +1 -0
  170. package/src/adapter/Runtime/RuntimeEnvironment.res.mjs +9 -0
  171. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +254 -0
  172. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs +169 -0
  173. package/src/adapter/Runtime/SideEffectEntryPoint.mjs +81 -0
  174. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +178 -0
  175. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs +129 -0
  176. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +166 -0
  177. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res.mjs +87 -0
  178. package/src/adapter/Runtime/StateViewSliceEntryPoint.mjs +136 -0
  179. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +344 -0
  180. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs +242 -0
  181. package/src/adapter/Runtime/TaskBucketEntryPoint.mjs +150 -0
  182. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +123 -0
  183. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs +74 -0
  184. package/src/adapter/ScheduledPublisher/ScheduledPublisher.res +2 -0
  185. package/src/adapter/ScheduledPublisher/ScheduledPublisher.res.mjs +12 -0
  186. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res +54 -0
  187. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res.mjs +41 -0
  188. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res +97 -0
  189. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res.mjs +85 -0
  190. package/src/adapter/StateTopic/StateTopic_AppSync.res +418 -0
  191. package/src/adapter/StateTopic/StateTopic_AppSync.res.mjs +295 -0
  192. package/src/adapter/Task/TaskBucket.res +1 -0
  193. package/src/adapter/Task/TaskBucket.res.mjs +9 -0
  194. package/src/adapter/Task/TaskBucket_S3.res +157 -0
  195. package/src/adapter/Task/TaskBucket_S3.res.mjs +108 -0
  196. package/src/adapter/Task/TaskBucket_S3_Runtime.res +11 -0
  197. package/src/adapter/Task/TaskBucket_S3_Runtime.res.mjs +15 -0
  198. package/src/components/Aggregate_Builder.res +1 -0
  199. package/src/components/Aggregate_Builder.res.mjs +25 -0
  200. package/src/components/Aggregate_Builder_Micro.res +63 -0
  201. package/src/components/Aggregate_Builder_Micro.res.mjs +80 -0
  202. package/src/components/Aggregate_Builder_NoResolver.res +61 -0
  203. package/src/components/Aggregate_Builder_NoResolver.res.mjs +80 -0
  204. package/src/components/Aggregate_Builder_PerAggregate.res +57 -0
  205. package/src/components/Aggregate_Builder_PerAggregate.res.mjs +80 -0
  206. package/src/components/Aggregate_Builder_Single.res +59 -0
  207. package/src/components/Aggregate_Builder_Single.res.mjs +80 -0
  208. package/src/components/Aggregate_Builder_Single_Async.res +59 -0
  209. package/src/components/Aggregate_Builder_Single_Async.res.mjs +80 -0
  210. package/src/components/Api/AppSync_Adapter.res +500 -0
  211. package/src/components/Api/AppSync_Adapter.res.mjs +396 -0
  212. package/src/components/AutomationSlice_Builder.res +52 -0
  213. package/src/components/AutomationSlice_Builder.res.mjs +72 -0
  214. package/src/components/AutomationSlice_Builder_Bundled.res.mjs +70 -0
  215. package/src/components/Counter_Builder.res +10 -0
  216. package/src/components/Counter_Builder.res.mjs +16 -0
  217. package/src/components/DataCleaner.res +170 -0
  218. package/src/components/DataCleaner.res.mjs +2 -0
  219. package/src/components/DcbEventLog_Builder.res +8 -0
  220. package/src/components/DcbEventLog_Builder.res.mjs +14 -0
  221. package/src/components/ExtensionPoint_Builder.res +16 -0
  222. package/src/components/ExtensionPoint_Builder.res.mjs +37 -0
  223. package/src/components/ForeignReadModel_Builder.res +19 -0
  224. package/src/components/ForeignReadModel_Builder.res.mjs +48 -0
  225. package/src/components/InboundTranslationSlice_Builder.res +25 -0
  226. package/src/components/InboundTranslationSlice_Builder.res.mjs +31 -0
  227. package/src/components/OutboundTranslationSlice_Builder.res +60 -0
  228. package/src/components/OutboundTranslationSlice_Builder.res.mjs +76 -0
  229. package/src/components/OutboundTranslationSlice_Builder_Bundled.res.mjs +75 -0
  230. package/src/components/Plugin.res +29 -0
  231. package/src/components/Plugin.res.mjs +63 -0
  232. package/src/components/ReadModel_Builder.res +1 -0
  233. package/src/components/ReadModel_Builder.res.mjs +19 -0
  234. package/src/components/ReadModel_Builder_NoResolver.res +55 -0
  235. package/src/components/ReadModel_Builder_NoResolver.res.mjs +64 -0
  236. package/src/components/ReadModel_Builder_NoResolver_Stream.res +60 -0
  237. package/src/components/ReadModel_Builder_NoResolver_Stream.res.mjs +64 -0
  238. package/src/components/ReadModel_Builder_PerReadModel.res +53 -0
  239. package/src/components/ReadModel_Builder_PerReadModel.res.mjs +66 -0
  240. package/src/components/ReadModel_Builder_Single.res +52 -0
  241. package/src/components/ReadModel_Builder_Single.res.mjs +66 -0
  242. package/src/components/ReadModel_Builder_Single_Stream.res +60 -0
  243. package/src/components/ReadModel_Builder_Single_Stream.res.mjs +66 -0
  244. package/src/components/Scheduler.res +1 -0
  245. package/src/components/Scheduler.res.mjs +13 -0
  246. package/src/components/SideEffectHandler.res +1 -0
  247. package/src/components/SideEffectHandler.res.mjs +19 -0
  248. package/src/components/SideEffectHandler_PerSideEffectHandler.res +13 -0
  249. package/src/components/SideEffectHandler_PerSideEffectHandler.res.mjs +52 -0
  250. package/src/components/SideEffectHandler_Single.res +54 -0
  251. package/src/components/SideEffectHandler_Single.res.mjs +60 -0
  252. package/src/components/StateChangeSlice_Builder.res +17 -0
  253. package/src/components/StateChangeSlice_Builder.res.mjs +23 -0
  254. package/src/components/StateViewSlice_Builder.res +46 -0
  255. package/src/components/StateViewSlice_Builder.res.mjs +68 -0
  256. package/src/components/StateViewSlice_Builder_Bundled.res.mjs +69 -0
  257. package/src/components/StateViewSlice_Builder_Stream.res +50 -0
  258. package/src/components/StateViewSlice_Builder_Stream.res.mjs +68 -0
  259. package/src/components/Task_Builder.res +1 -0
  260. package/src/components/Task_Builder.res.mjs +28 -0
  261. package/src/components/Task_Builder_PerBucket.res +22 -0
  262. package/src/components/Task_Builder_PerBucket.res.mjs +63 -0
  263. package/src/components/Vpc.res +214 -0
  264. package/src/components/Vpc.res.mjs +117 -0
  265. package/src/components/Vpc.resi +22 -0
  266. package/src/errors/AppSync_Error.res +36 -0
  267. package/src/errors/AppSync_Error.res.mjs +38 -0
  268. package/src/errors/Cognito_Error.res +36 -0
  269. package/src/errors/Cognito_Error.res.mjs +38 -0
  270. package/src/errors/DynamoDb_Error.res +75 -0
  271. package/src/errors/DynamoDb_Error.res.mjs +86 -0
  272. package/src/errors/Kinesis_Error.res +36 -0
  273. package/src/errors/Kinesis_Error.res.mjs +38 -0
  274. package/src/errors/SNS_Error.res +34 -0
  275. package/src/errors/SNS_Error.res.mjs +38 -0
  276. package/src/errors/SQS_Error.res +40 -0
  277. package/src/errors/SQS_Error.res.mjs +41 -0
  278. package/src/plugin/cloner/ClonerRunner.res +1 -0
  279. package/src/plugin/cloner/ClonerRunner.res.mjs +9 -0
  280. package/src/plugin/cloner/ClonerRunner_Fargate.res +362 -0
  281. package/src/plugin/cloner/ClonerRunner_Fargate.res.mjs +246 -0
  282. package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res +42 -0
  283. package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res.mjs +45 -0
  284. package/src/plugin/heartbeat/HeartbeatRunner.res +1 -0
  285. package/src/plugin/heartbeat/HeartbeatRunner.res.mjs +9 -0
  286. package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res +96 -0
  287. package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res.mjs +69 -0
  288. package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +115 -0
  289. package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res.mjs +88 -0
  290. package/src/plugin/runtime/PluginRuntimeOperations.res +5 -0
  291. package/src/plugin/runtime/PluginRuntimeOperations.res.mjs +14 -0
  292. package/src/plugin/runtime/PluginRuntime_Builder.res +769 -0
  293. package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +464 -0
  294. package/src/plugin/runtime/Util_PluginMessage_Runtime.res +13 -0
  295. package/src/plugin/runtime/Util_PluginMessage_Runtime.res.mjs +19 -0
  296. package/src/plugin/stack/Plugin_ExtensionPoint_Builder.res +28 -0
  297. package/src/plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs +67 -0
  298. package/src/plugin/stack/Plugin_Stack.res +439 -0
  299. package/src/plugin/stack/Plugin_Stack.res.mjs +263 -0
  300. package/src/util/Util.res +29 -0
  301. package/src/util/Util.res.mjs +93 -0
  302. package/src/util/Util_AppSync.res +36 -0
  303. package/src/util/Util_AppSync.res.mjs +35 -0
  304. package/src/util/Util_AppSync_Caller.res +213 -0
  305. package/src/util/Util_AppSync_Caller.res.mjs +170 -0
  306. package/src/util/Util_Bundle.res +255 -0
  307. package/src/util/Util_Bundle.res.mjs +179 -0
  308. package/src/util/Util_Cloudwatch.res +14 -0
  309. package/src/util/Util_Cloudwatch.res.mjs +19 -0
  310. package/src/util/Util_CognitoGroupUser.res +39 -0
  311. package/src/util/Util_CognitoGroupUser.res.mjs +32 -0
  312. package/src/util/Util_CognitoGroupUser_Runtime.res +65 -0
  313. package/src/util/Util_CognitoGroupUser_Runtime.res.mjs +50 -0
  314. package/src/util/Util_Cognito_Runtime.res +52 -0
  315. package/src/util/Util_Cognito_Runtime.res.mjs +35 -0
  316. package/src/util/Util_DeadLetterQueue.res +154 -0
  317. package/src/util/Util_DeadLetterQueue.res.mjs +158 -0
  318. package/src/util/Util_DynamoDb.res +210 -0
  319. package/src/util/Util_DynamoDb.res.mjs +218 -0
  320. package/src/util/Util_DynamoDbStream.res +138 -0
  321. package/src/util/Util_DynamoDbStream.res.mjs +134 -0
  322. package/src/util/Util_DynamoDbStream_Runtime.res +94 -0
  323. package/src/util/Util_DynamoDbStream_Runtime.res.mjs +131 -0
  324. package/src/util/Util_DynamoDb_Runtime.res +216 -0
  325. package/src/util/Util_DynamoDb_Runtime.res.mjs +257 -0
  326. package/src/util/Util_DynamoDb_TableManager.res +23 -0
  327. package/src/util/Util_DynamoDb_TableManager.res.mjs +35 -0
  328. package/src/util/Util_DynamoDb_TableManager.resi +3 -0
  329. package/src/util/Util_Env.res +5 -0
  330. package/src/util/Util_Env.res.mjs +2 -0
  331. package/src/util/Util_EventSourceMapping.res +49 -0
  332. package/src/util/Util_EventSourceMapping.res.mjs +32 -0
  333. package/src/util/Util_HostUiDomain.res +28 -0
  334. package/src/util/Util_HostUiDomain.res.mjs +26 -0
  335. package/src/util/Util_IAM_Role.res +14 -0
  336. package/src/util/Util_IAM_Role.res.mjs +28 -0
  337. package/src/util/Util_Kinesis_Runtime.res +20 -0
  338. package/src/util/Util_Kinesis_Runtime.res.mjs +24 -0
  339. package/src/util/Util_Lambda.res +39 -0
  340. package/src/util/Util_Lambda.res.mjs +45 -0
  341. package/src/util/Util_LocalConfig.res +119 -0
  342. package/src/util/Util_LocalConfig.res.mjs +112 -0
  343. package/src/util/Util_ResourceNaming.res +15 -0
  344. package/src/util/Util_ResourceNaming.res.mjs +26 -0
  345. package/src/util/Util_S3.res +17 -0
  346. package/src/util/Util_S3.res.mjs +30 -0
  347. package/src/util/Util_S3_Runtime.res +11 -0
  348. package/src/util/Util_S3_Runtime.res.mjs +15 -0
  349. package/src/util/Util_SNS.res +33 -0
  350. package/src/util/Util_SNS.res.mjs +50 -0
  351. package/src/util/Util_SNS_FIFO.res +21 -0
  352. package/src/util/Util_SNS_FIFO.res.mjs +27 -0
  353. package/src/util/Util_SNS_Runtime.res +33 -0
  354. package/src/util/Util_SNS_Runtime.res.mjs +27 -0
  355. package/src/util/Util_SQS.res +70 -0
  356. package/src/util/Util_SQS.res.mjs +83 -0
  357. package/src/util/Util_SQS_FIFO.res +16 -0
  358. package/src/util/Util_SQS_FIFO.res.mjs +28 -0
  359. package/src/util/Util_SQS_Runtime.res +169 -0
  360. package/src/util/Util_SQS_Runtime.res.mjs +150 -0
  361. package/src/util/Util_SesPolicy_Runtime.res +54 -0
  362. package/src/util/Util_SesPolicy_Runtime.res.mjs +55 -0
  363. package/src/util/Util_StaticBundle.res +124 -0
  364. package/src/util/Util_StaticBundle.res.mjs +132 -0
  365. package/src/util/Util_Vpc.res +22 -0
  366. package/src/util/Util_Vpc.res.mjs +27 -0
  367. package/tests/AppSync_AdapterTest.res +396 -0
  368. package/tests/AppSync_AdapterTest.res.mjs +326 -0
  369. package/tests/AppSync_Resolver_RetryingTest.res +59 -0
  370. package/tests/AppSync_Resolver_RetryingTest.res.mjs +66 -0
  371. package/tests/Auth_CognitoTest.res +203 -0
  372. package/tests/Auth_CognitoTest.res.mjs +248 -0
  373. package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res +602 -0
  374. package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res.mjs +742 -0
  375. package/tests/EventLogStorage_DynamoDb_RuntimeTest.res +57 -0
  376. package/tests/EventLogStorage_DynamoDb_RuntimeTest.res.mjs +68 -0
  377. package/tests/MCP_LambdaTest.res +101 -0
  378. package/tests/MCP_LambdaTest.res.mjs +56 -0
  379. package/tests/Util_HostUiDomainTest.res +90 -0
  380. package/tests/Util_HostUiDomainTest.res.mjs +50 -0
  381. package/tests/Util_SQS_RuntimeTest.res +46 -0
  382. package/tests/Util_SQS_RuntimeTest.res.mjs +45 -0
  383. package/tests/Util_StaticBundleTest.res +136 -0
  384. package/tests/Util_StaticBundleTest.res.mjs +149 -0
  385. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +101 -0
  386. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res.mjs +91 -0
  387. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +315 -0
  388. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res.mjs +435 -0
  389. package/tests/integration/DcbIntegrationHarness.res +102 -0
  390. package/tests/integration/DcbIntegrationHarness.res.mjs +163 -0
  391. package/tests/integration/EpTestSlice.res +28 -0
  392. package/tests/integration/EpTestSlice.res.mjs +43 -0
  393. package/tests/integration/EpTestSliceBehavior.res +18 -0
  394. package/tests/integration/EpTestSliceBehavior.res.mjs +35 -0
@@ -0,0 +1,285 @@
1
+ // Async variant of AggregateRuntime_Builder_Single.
2
+ // Uses SQS_Async (FIFO) instead of SQS_Sync — commands return CommandPending immediately.
3
+ // Use via Platform.Aggregate.MakeAsync for high-contention aggregates where the caller
4
+ // cannot wait for synchronous processing.
5
+ module CommandTopicChannel = CommandTopicChannel.SQS_Async
6
+ module EventCollectorChannel = EventCollectorChannel.DynamoDbStream
7
+ module RuntimeEnvironment = RuntimeEnvironment.Lambda
8
+
9
+ let log = ReventlessCore.Logger.fromEnv()
10
+
11
+ type context = PulumiAws.Lambda.context
12
+ type runtimeParts = Util.Lambda.runtimeParts
13
+
14
+ type aggregateInfo = {
15
+ specModulePath: string,
16
+ behaviorModulePath: string,
17
+ eventLogTableName: Pulumi.Output.t<string>,
18
+ }
19
+
20
+ let aggregateInfos: dict<aggregateInfo> = Dict.make()
21
+
22
+ // Per-flavor commandHandlerConfig override; populated by Platform.MakeWithConfig
23
+ // from the user-supplied `commandHandlerConfig.aggregates.async` record.
24
+ let configRef: ref<ReventlessCore.Runtime.commandHandlerConfig> = ref(
25
+ ({}: ReventlessCore.Runtime.commandHandlerConfig),
26
+ )
27
+ let setConfig = (c: ReventlessCore.Runtime.commandHandlerConfig) => configRef := c
28
+
29
+ let registerAggregate = (
30
+ ~aggregateName,
31
+ ~specModulePath,
32
+ ~behaviorModulePath,
33
+ ~eventLogTableName,
34
+ ) =>
35
+ aggregateInfos->Dict.set(
36
+ aggregateName,
37
+ {specModulePath, behaviorModulePath, eventLogTableName},
38
+ )
39
+
40
+ type storedSpec = {
41
+ aggregateName: string,
42
+ aggregateResource: Pulumi.Resource.t,
43
+ queueUrl: Pulumi.Output.t<string>,
44
+ queueArn: Pulumi.Output.t<string>,
45
+ connects: array<ReventlessCore.Runtime.connect<runtimeParts>>,
46
+ eventCollectorChannelSpec: option<
47
+ ReventlessCore.EventCollector_Adapter.channelSpec<
48
+ EventCollectorChannel.callbackEvent,
49
+ context,
50
+ EventCollectorChannel.channelParts,
51
+ >,
52
+ >,
53
+ memorySize: int,
54
+ timeout: int,
55
+ }
56
+
57
+ let storedSpecs: dict<storedSpec> = Dict.make()
58
+
59
+ let getStoredSpec = (aggregateName, aggregateResource) =>
60
+ storedSpecs
61
+ ->Dict.get(aggregateName)
62
+ ->Option.getOr({
63
+ aggregateName,
64
+ aggregateResource,
65
+ queueUrl: ""->Pulumi.Output.make,
66
+ queueArn: ""->Pulumi.Output.make,
67
+ connects: [],
68
+ eventCollectorChannelSpec: None,
69
+ memorySize: 0,
70
+ timeout: 0,
71
+ })
72
+
73
+ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
74
+ ReventlessCore.CommandGenerator.effectEventHandler<context>,
75
+ runtimeParts,
76
+ ReventlessCore.CommandGenerator.component,
77
+ > = (
78
+ ~handler as _,
79
+ ~connect,
80
+ ~memorySize=1024,
81
+ ~timeout=30,
82
+ commandGenerator,
83
+ ) => {
84
+ let resource = commandGenerator->ReventlessCore.Component.toPulumiResource
85
+ switch resource.parent {
86
+ | Some(aggregateResource) =>
87
+ let aggregateName = aggregateResource.name->Option.getOr("Unnamed")
88
+ let spec = getStoredSpec(aggregateName, aggregateResource)
89
+ storedSpecs->Dict.set(aggregateName, {
90
+ ...spec,
91
+ connects: spec.connects->Array.concat([connect]),
92
+ memorySize: Math.Int.max(spec.memorySize, memorySize),
93
+ timeout: Math.Int.max(spec.timeout, timeout),
94
+ })
95
+ | None => ()
96
+ }
97
+ }
98
+
99
+ let forCommandTopic: ReventlessCore.Runtime.forComponent<
100
+ ReventlessCore.Runtime.effectHandler<
101
+ CommandTopicChannel.callbackEvent,
102
+ context,
103
+ unit,
104
+ string,
105
+ >,
106
+ runtimeParts,
107
+ ReventlessCore.CommandTopic.component<'op>,
108
+ > = (
109
+ ~handler as _,
110
+ ~connect,
111
+ ~memorySize=1024,
112
+ ~timeout=30,
113
+ commandTopic,
114
+ ) => {
115
+ let commandTopicResource = commandTopic->ReventlessCore.Component.toPulumiResource
116
+ switch commandTopicResource.parent {
117
+ | Some(aggregateResource) =>
118
+ let aggregateName = aggregateResource.name->Option.getOr("Unnamed")
119
+ // Extract the SQS queue from the channel parts
120
+ let channel = commandTopic->ReventlessCore.CommandTopic_Adapter.channel
121
+ let channelParts: Util.SQS.channelParts = Obj.magic(channel.parts)
122
+ let queue = channelParts.queue
123
+
124
+ let spec = getStoredSpec(aggregateName, aggregateResource)
125
+ storedSpecs->Dict.set(aggregateName, {
126
+ ...spec,
127
+ queueUrl: queue.id,
128
+ queueArn: queue.arn,
129
+ connects: spec.connects->Array.concat([connect]),
130
+ memorySize: Math.Int.max(spec.memorySize, memorySize),
131
+ timeout: Math.Int.max(spec.timeout, timeout),
132
+ })
133
+ | None =>
134
+ let name = commandTopicResource.name->Option.getOr("Unnamed")
135
+ JsError.throwWithMessage(
136
+ `forCommandTopic(single-async): commandTopic ${name} has no Aggregate parent`,
137
+ )
138
+ }
139
+ }
140
+
141
+ let forEventCollector: ReventlessCore.Runtime.forEventCollector<
142
+ ReventlessCore.Runtime.effectHandler<
143
+ EventCollectorChannel.callbackEvent,
144
+ context,
145
+ unit,
146
+ string,
147
+ >,
148
+ ReventlessCore.EventCollector.component,
149
+ > = (
150
+ ~handler as _,
151
+ ~eventTopics,
152
+ ~resources,
153
+ ~memorySize=1024,
154
+ ~timeout=30,
155
+ eventCollector,
156
+ ) => {
157
+ let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
158
+ let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
159
+ switch eventCollectorResource.parent->Option.flatMap(parent => parent.parent) {
160
+ | Some(aggregateResource) =>
161
+ let aggregateName = aggregateResource.name->Option.getOr("Unnamed")
162
+ let spec = getStoredSpec(aggregateName, aggregateResource)
163
+ storedSpecs->Dict.set(aggregateName, {
164
+ ...spec,
165
+ eventCollectorChannelSpec: Some({channel, eventTopics, resources}),
166
+ memorySize: Math.Int.max(spec.memorySize, memorySize),
167
+ timeout: Math.Int.max(spec.timeout, timeout),
168
+ })
169
+ | None =>
170
+ let name = eventCollectorResource.name->Option.getOr("Unnamed")
171
+ JsError.throwWithMessage(
172
+ `forEventCollector(single-async): eventCollector ${name} has no Aggregate parent`,
173
+ )
174
+ }
175
+ }
176
+
177
+ let finished = ref(false)
178
+
179
+ let finish = () =>
180
+ if !finished.contents {
181
+ let specs = storedSpecs->Dict.valuesToArray
182
+ if specs->Array.length > 0 {
183
+ // See AggregateRuntime_Builder_Single.finish for the rationale behind
184
+ // dropping the max-of-zeros reduce in favor of `configRef`.
185
+ let parent = specs->Array.reduce(None, (_, {aggregateResource}) => aggregateResource.parent)
186
+ let cfg = configRef.contents
187
+ switch parent {
188
+ | Some(parent) =>
189
+ let opts = {Pulumi.ComponentResource.parent: parent}
190
+
191
+ // Build HANDLER_CONFIG as a single JSON env var.
192
+ // Each handler's dynamic values (table name, queue URL/ARN) are Pulumi Outputs
193
+ // that resolve at deploy time. Static values (module paths) are plain strings.
194
+ let handlerOutputs: array<Pulumi.Output.t<string>> = []
195
+ let packageDirs: dict<string> = Dict.make()
196
+
197
+ specs->Array.forEach(spec => {
198
+ switch aggregateInfos->Dict.get(spec.aggregateName) {
199
+ | Some(info) =>
200
+ let specPkg = Util_Bundle.extractPackageName(info.specModulePath)
201
+ let behaviorPkg = Util_Bundle.extractPackageName(info.behaviorModulePath)
202
+ packageDirs->Dict.set(specPkg, Util_Bundle.resolvePackageRoot(specPkg))
203
+ packageDirs->Dict.set(behaviorPkg, Util_Bundle.resolvePackageRoot(behaviorPkg))
204
+
205
+ let specModule =
206
+ info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
207
+ let behaviorModule =
208
+ info.behaviorModulePath->JSON.stringifyAny->Option.getOr(`""`)
209
+
210
+ let handlerJson =
211
+ Pulumi.Output.all3((info.eventLogTableName, spec.queueUrl, spec.queueArn))
212
+ ->Pulumi.Output.apply(((table, queueUrl, queueArn)) =>
213
+ `{"specModule":${specModule},"behaviorModule":${behaviorModule},"eventLogTable":"${table}","queueUrl":"${queueUrl}","queueArn":"${queueArn}"}`
214
+ )
215
+ let _ = handlerOutputs->Array.push(handlerJson)
216
+ | None =>
217
+ log.warn(
218
+ ~comp="AggregateRuntime_Builder_Single_Async",
219
+ `no handler registered for ${spec.aggregateName}`,
220
+ )
221
+ }
222
+ })
223
+
224
+ let handlerConfigOutput =
225
+ Pulumi.Output.all(handlerOutputs)
226
+ ->Pulumi.Output.apply(handlers =>
227
+ `{"handlers":[${handlers->Array.join(",")}]}`
228
+ )
229
+
230
+ let envVars: dict<Pulumi.Input.t<string>> = Dict.make()
231
+ envVars->Dict.set("HANDLER_CONFIG", handlerConfigOutput->Pulumi.Output.asInput)
232
+ // Flip AggregateEntryPoint into async mode — Route 1 (AppSync direct
233
+ // invoke) becomes fire-and-forget → SQS, returning CommandPending.
234
+ // The sync (default) builder leaves this unset.
235
+ envVars->Dict.set("DISPATCH_MODE", "async"->Pulumi.Input.make)
236
+ cfg.envVars->Option.forEach(extra =>
237
+ extra->Dict.forEachWithKey((value, key) => {
238
+ if envVars->Dict.get(key)->Option.isNone {
239
+ envVars->Dict.set(key, value->Pulumi.Output.make->Pulumi.Output.asInput)
240
+ }
241
+ })
242
+ )
243
+
244
+ // Build AssetArchive: static re-export + user packages
245
+ let {code, sourceCodeHash} = Util_Bundle.buildCodeArchive(
246
+ ~entryPointModule="@reventlessdev/reventless-aws/src/adapter/Runtime/AggregateEntryPoint.mjs",
247
+ ~packageDirs,
248
+ )
249
+
250
+ cfg.sqsBatchSize->Option.forEach(CommandTopicChannel.setBatchSize)
251
+
252
+ let runtime = RuntimeEnvironment_Lambda.makeFromCodeAsset(
253
+ ~name="AllAggregatesAsyncCmdHandler",
254
+ ~code,
255
+ ~sourceCodeHash,
256
+ ~envVars,
257
+ ~memorySize=?cfg.memorySize,
258
+ ~timeout=?cfg.timeout,
259
+ ~reservedConcurrency=?cfg.reservedConcurrency,
260
+ ~ephemeralStorageMb=?cfg.ephemeralStorageMb,
261
+ ~logRetentionDays=?cfg.logRetentionDays,
262
+ ~opts,
263
+ )
264
+
265
+ specs->Array.forEach(({connects}) => {
266
+ connects->Array.forEach(connect => connect(~runtime))
267
+ })
268
+
269
+ CommandTopicChannel.clearBatchSize()
270
+
271
+ let channelSpecs =
272
+ specs
273
+ ->Array.map(({eventCollectorChannelSpec}) => eventCollectorChannelSpec)
274
+ ->Array.keepSome
275
+ let _connectResources = EventCollectorChannel.connect(
276
+ ~name="AllAggregatesAsync",
277
+ ~channelSpecs,
278
+ ~runtime,
279
+ ~opts,
280
+ )
281
+ | None => ()
282
+ }
283
+ }
284
+ finished := true
285
+ }
@@ -0,0 +1,212 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
4
+ import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
5
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
+ import * as Pulumi from "@pulumi/pulumi";
7
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
8
+ import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
9
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
10
+ import * as Util_Bundle$ReventlessAws from "../../util/Util_Bundle.res.mjs";
11
+ import * as RuntimeEnvironment_Lambda$ReventlessAws from "./RuntimeEnvironment_Lambda.res.mjs";
12
+ import * as CommandTopicChannel_SQS_Async$ReventlessAws from "../CommandTopic/CommandTopicChannel_SQS_Async.res.mjs";
13
+ import * as EventCollectorChannel_DynamoDbStream$ReventlessAws from "../EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs";
14
+
15
+ let log = Logger$ReventlessCore.fromEnv();
16
+
17
+ let aggregateInfos = {};
18
+
19
+ let configRef = {
20
+ contents: {}
21
+ };
22
+
23
+ function setConfig(c) {
24
+ configRef.contents = c;
25
+ }
26
+
27
+ function registerAggregate(aggregateName, specModulePath, behaviorModulePath, eventLogTableName) {
28
+ aggregateInfos[aggregateName] = {
29
+ specModulePath: specModulePath,
30
+ behaviorModulePath: behaviorModulePath,
31
+ eventLogTableName: eventLogTableName
32
+ };
33
+ }
34
+
35
+ let storedSpecs = {};
36
+
37
+ function getStoredSpec(aggregateName, aggregateResource) {
38
+ return Stdlib_Option.getOr(storedSpecs[aggregateName], {
39
+ aggregateName: aggregateName,
40
+ aggregateResource: aggregateResource,
41
+ queueUrl: Pulumi.output(""),
42
+ queueArn: Pulumi.output(""),
43
+ connects: [],
44
+ eventCollectorChannelSpec: undefined,
45
+ memorySize: 0,
46
+ timeout: 0
47
+ });
48
+ }
49
+
50
+ function forCommandGenerator(param, connect, memorySizeOpt, timeoutOpt, commandGenerator) {
51
+ let memorySize = memorySizeOpt !== undefined ? memorySizeOpt : 1024;
52
+ let timeout = timeoutOpt !== undefined ? timeoutOpt : 30;
53
+ let resource = Component$ReventlessCore.toPulumiResource(commandGenerator);
54
+ let aggregateResource = resource.__parentResource;
55
+ if (aggregateResource === undefined) {
56
+ return;
57
+ }
58
+ let aggregateName = Stdlib_Option.getOr(aggregateResource.__name, "Unnamed");
59
+ let spec = getStoredSpec(aggregateName, aggregateResource);
60
+ storedSpecs[aggregateName] = {
61
+ aggregateName: spec.aggregateName,
62
+ aggregateResource: spec.aggregateResource,
63
+ queueUrl: spec.queueUrl,
64
+ queueArn: spec.queueArn,
65
+ connects: spec.connects.concat([connect]),
66
+ eventCollectorChannelSpec: spec.eventCollectorChannelSpec,
67
+ memorySize: Math.max(spec.memorySize, memorySize),
68
+ timeout: Math.max(spec.timeout, timeout)
69
+ };
70
+ }
71
+
72
+ function forCommandTopic(param, connect, memorySizeOpt, timeoutOpt, commandTopic) {
73
+ let memorySize = memorySizeOpt !== undefined ? memorySizeOpt : 1024;
74
+ let timeout = timeoutOpt !== undefined ? timeoutOpt : 30;
75
+ let commandTopicResource = Component$ReventlessCore.toPulumiResource(commandTopic);
76
+ let aggregateResource = commandTopicResource.__parentResource;
77
+ if (aggregateResource !== undefined) {
78
+ let aggregateName = Stdlib_Option.getOr(aggregateResource.__name, "Unnamed");
79
+ let channel = commandTopic.channel;
80
+ let channelParts = channel.parts;
81
+ let queue = channelParts.queue;
82
+ let spec = getStoredSpec(aggregateName, aggregateResource);
83
+ storedSpecs[aggregateName] = {
84
+ aggregateName: spec.aggregateName,
85
+ aggregateResource: spec.aggregateResource,
86
+ queueUrl: queue.id,
87
+ queueArn: queue.arn,
88
+ connects: spec.connects.concat([connect]),
89
+ eventCollectorChannelSpec: spec.eventCollectorChannelSpec,
90
+ memorySize: Math.max(spec.memorySize, memorySize),
91
+ timeout: Math.max(spec.timeout, timeout)
92
+ };
93
+ return;
94
+ }
95
+ let name = Stdlib_Option.getOr(commandTopicResource.__name, "Unnamed");
96
+ Stdlib_JsError.throwWithMessage(`forCommandTopic(single-async): commandTopic ` + name + ` has no Aggregate parent`);
97
+ }
98
+
99
+ function forEventCollector(param, eventTopics, resources, memorySizeOpt, timeoutOpt, eventCollector) {
100
+ let memorySize = memorySizeOpt !== undefined ? memorySizeOpt : 1024;
101
+ let timeout = timeoutOpt !== undefined ? timeoutOpt : 30;
102
+ let eventCollectorResource = Component$ReventlessCore.toPulumiResource(eventCollector);
103
+ let channel = eventCollector.channel;
104
+ let aggregateResource = Stdlib_Option.flatMap(eventCollectorResource.__parentResource, parent => parent.__parentResource);
105
+ if (aggregateResource !== undefined) {
106
+ let aggregateName = Stdlib_Option.getOr(aggregateResource.__name, "Unnamed");
107
+ let spec = getStoredSpec(aggregateName, aggregateResource);
108
+ storedSpecs[aggregateName] = {
109
+ aggregateName: spec.aggregateName,
110
+ aggregateResource: spec.aggregateResource,
111
+ queueUrl: spec.queueUrl,
112
+ queueArn: spec.queueArn,
113
+ connects: spec.connects,
114
+ eventCollectorChannelSpec: {
115
+ channel: channel,
116
+ eventTopics: eventTopics,
117
+ resources: resources
118
+ },
119
+ memorySize: Math.max(spec.memorySize, memorySize),
120
+ timeout: Math.max(spec.timeout, timeout)
121
+ };
122
+ return;
123
+ }
124
+ let name = Stdlib_Option.getOr(eventCollectorResource.__name, "Unnamed");
125
+ Stdlib_JsError.throwWithMessage(`forEventCollector(single-async): eventCollector ` + name + ` has no Aggregate parent`);
126
+ }
127
+
128
+ let finished = {
129
+ contents: false
130
+ };
131
+
132
+ function finish() {
133
+ if (finished.contents) {
134
+ return;
135
+ }
136
+ let specs = Object.values(storedSpecs);
137
+ if (specs.length !== 0) {
138
+ let parent = Stdlib_Array.reduce(specs, undefined, (param, param$1) => param$1.aggregateResource.__parentResource);
139
+ let cfg = configRef.contents;
140
+ if (parent !== undefined) {
141
+ let opts_parent = parent;
142
+ let opts = {
143
+ parent: opts_parent
144
+ };
145
+ let handlerOutputs = [];
146
+ let packageDirs = {};
147
+ specs.forEach(spec => {
148
+ let info = aggregateInfos[spec.aggregateName];
149
+ if (info === undefined) {
150
+ return log.warn("AggregateRuntime_Builder_Single_Async", undefined, `no handler registered for ` + spec.aggregateName);
151
+ }
152
+ let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
153
+ let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
154
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
155
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
156
+ let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
157
+ let behaviorModule = Stdlib_Option.getOr(JSON.stringify(info.behaviorModulePath), `""`);
158
+ let handlerJson = Pulumi.all([
159
+ info.eventLogTableName,
160
+ spec.queueUrl,
161
+ spec.queueArn
162
+ ]).apply(param => `{"specModule":` + specModule + `,"behaviorModule":` + behaviorModule + `,"eventLogTable":"` + param[0] + `","queueUrl":"` + param[1] + `","queueArn":"` + param[2] + `"}`);
163
+ handlerOutputs.push(handlerJson);
164
+ });
165
+ let handlerConfigOutput = Pulumi.all(handlerOutputs).apply(handlers => `{"handlers":[` + handlers.join(",") + `]}`);
166
+ let envVars = {};
167
+ envVars["HANDLER_CONFIG"] = handlerConfigOutput;
168
+ envVars["DISPATCH_MODE"] = "async";
169
+ Stdlib_Option.forEach(cfg.envVars, extra => Stdlib_Dict.forEachWithKey(extra, (value, key) => {
170
+ if (Stdlib_Option.isNone(envVars[key])) {
171
+ envVars[key] = Pulumi.output(value);
172
+ return;
173
+ }
174
+ }));
175
+ let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/AggregateEntryPoint.mjs", packageDirs, undefined);
176
+ Stdlib_Option.forEach(cfg.sqsBatchSize, CommandTopicChannel_SQS_Async$ReventlessAws.setBatchSize);
177
+ let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset("AllAggregatesAsyncCmdHandler", match.code, match.sourceCodeHash, envVars, cfg.memorySize, cfg.timeout, cfg.reservedConcurrency, cfg.ephemeralStorageMb, cfg.logRetentionDays, undefined, opts);
178
+ specs.forEach(param => {
179
+ param.connects.forEach(connect => connect(runtime));
180
+ });
181
+ CommandTopicChannel_SQS_Async$ReventlessAws.clearBatchSize();
182
+ let channelSpecs = Stdlib_Array.keepSome(specs.map(param => param.eventCollectorChannelSpec));
183
+ EventCollectorChannel_DynamoDbStream$ReventlessAws.connect("AllAggregatesAsync", channelSpecs, runtime, opts);
184
+ }
185
+ }
186
+ finished.contents = true;
187
+ }
188
+
189
+ let CommandTopicChannel;
190
+
191
+ let EventCollectorChannel;
192
+
193
+ let RuntimeEnvironment;
194
+
195
+ export {
196
+ CommandTopicChannel,
197
+ EventCollectorChannel,
198
+ RuntimeEnvironment,
199
+ log,
200
+ aggregateInfos,
201
+ configRef,
202
+ setConfig,
203
+ registerAggregate,
204
+ storedSpecs,
205
+ getStoredSpec,
206
+ forCommandGenerator,
207
+ forCommandTopic,
208
+ forEventCollector,
209
+ finished,
210
+ finish,
211
+ }
212
+ /* log Not a pure module */
@@ -0,0 +1,124 @@
1
+ // AutomationSlice Lambda entry point.
2
+ // At cold start: reads HANDLER_CONFIG, dynamically imports Spec modules,
3
+ // supports both AutomationSlice and OutboundTranslationSlice callbacks.
4
+ // Decodes events, runs phase1/phase2, then syncs to QueryDb.
5
+
6
+ import * as Effect from "effect/Effect";
7
+ import * as Stream from "effect/Stream";
8
+ import * as Chunk from "effect/Chunk";
9
+ import { parseJsonOrThrow } from "sury/src/S.res.mjs";
10
+ import { makeTableRef, makeQueueRef, log, pluginName } from "./HandlerFactoryHelpers.mjs";
11
+ import { tag as requestContextTag } from "@reventlessdev/reventless-core/src/RequestContext.res.mjs";
12
+ import { save as qdbSave } from "@reventlessdev/reventless-aws/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res.mjs";
13
+ import { publishJsons as sqsPublishJsons } from "@reventlessdev/reventless-aws/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res.mjs";
14
+ import { Make as automationSliceCallbackMake } from "@reventlessdev/reventless-core/src/components/AutomationSlice/AutomationSlice_Callback.res.mjs";
15
+ import { handleStreamEvent } from "@reventlessdev/reventless-aws/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res.mjs";
16
+ import { Make as outboundTranslationSliceCallbackMake } from "@reventlessdev/reventless-core/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res.mjs";
17
+
18
+ const dynamicImport = (specifier) => import('/var/task/node_modules/' + specifier);
19
+
20
+ // Set at handler entry; read by runEffect to tag logs with the Lambda request id.
21
+ let _currentRequestId = "unknown";
22
+
23
+ function runEffect(correlationId, effect) {
24
+ let e = effect
25
+ // Promote correlationId/requestId/plugin to top-level JSON log fields —
26
+ // decoded by EffectLogger.install() from Effect log annotations. Harmless
27
+ // no-op if the unified logger isn't installed.
28
+ .pipe(Effect.annotateLogs("correlationId", correlationId || "unknown"))
29
+ .pipe(Effect.annotateLogs("requestId", _currentRequestId));
30
+ if (pluginName) e = e.pipe(Effect.annotateLogs("plugin", pluginName));
31
+ return e
32
+ .pipe(Effect.provideService(requestContextTag, { correlationId: correlationId || "unknown" }))
33
+ .pipe(Effect.runPromise);
34
+ }
35
+
36
+ function groupBySource(records) {
37
+ const dict = {};
38
+ records.forEach(record => {
39
+ const arn = record.eventSourceARN;
40
+ const existing = dict[arn] || [];
41
+ dict[arn] = existing.concat([record]);
42
+ });
43
+ return dict;
44
+ }
45
+
46
+ function buildHandler(specModule, callbackMake, queryDbTableName, dcbQueueUrl) {
47
+ const callback = callbackMake(specModule);
48
+ const publishJsons = sqsPublishJsons(makeQueueRef(dcbQueueUrl), "SQS_FIFO");
49
+ const table = makeTableRef(queryDbTableName);
50
+ const rawSave = qdbSave(table);
51
+
52
+ const syncToQueryDb = async () => {
53
+ const items = Object.entries(callback.todoItems.contents);
54
+ await Promise.all(items.map(async entry => await rawSave(entry[0], entry[1], "Overwrite", undefined)));
55
+ };
56
+
57
+ const eventSchema = specModule.consumedEventSchema;
58
+
59
+ const jsonEventsHandler = stream => Effect.flatMap(
60
+ Stream.runCollect(
61
+ Stream.flatMap(
62
+ Stream.mapEffect(stream, json => Effect.sync(() => {
63
+ try {
64
+ const eventJson = json.event != null ? json.event : json;
65
+ return [parseJsonOrThrow(eventJson, eventSchema)];
66
+ } catch (exn) {
67
+ log.error("failed to decode event", { comp: "AutomationSliceRuntime", detail: exn && exn.message ? exn.message : String(exn) });
68
+ return [];
69
+ }
70
+ })),
71
+ events => Stream.fromIterable(events)
72
+ )
73
+ ),
74
+ chunk => Effect.promise(async () => {
75
+ const eventsArr = Chunk.toReadonlyArray(chunk);
76
+ callback.phase1(eventsArr);
77
+ await callback.phase2(publishJsons);
78
+ return await syncToQueryDb();
79
+ })
80
+ );
81
+
82
+ return (event, context) => handleStreamEvent(jsonEventsHandler, event, context);
83
+ }
84
+
85
+ async function buildAllHandlers() {
86
+ const configStr = process.env["HANDLER_CONFIG"] || '{"handlers":[]}';
87
+ const config = JSON.parse(configStr);
88
+ const handlers = {};
89
+ await Promise.all(config.handlers.map(async h => {
90
+ const specModule = await dynamicImport(h.specModule);
91
+ const callbackMake = h.callbackType === "outbound"
92
+ ? prim => outboundTranslationSliceCallbackMake(prim)
93
+ : prim => automationSliceCallbackMake(prim);
94
+ const handler = buildHandler(specModule, callbackMake, h.queryDbTableName, h.dcbQueueUrl);
95
+ // Multiple slices can share one source stream (e.g. several automation
96
+ // slices reacting to the same DcbEventLog). Accumulate all handlers per
97
+ // source ARN; a plain assignment collapses them to one (Promise.all race),
98
+ // silently dropping the rest.
99
+ (handlers[h.sourceUrn] ||= []).push(handler);
100
+ }));
101
+ return handlers;
102
+ }
103
+
104
+ const initPromise = buildAllHandlers();
105
+
106
+ export async function handler(event, context) {
107
+ _currentRequestId = context?.awsRequestId || "unknown";
108
+ const handlers = await initPromise;
109
+ const records = event.Records || [];
110
+ const grouped = groupBySource(records);
111
+
112
+ await Promise.all(Object.entries(grouped).map(async ([arn, subRecords]) => {
113
+ const streamHandlers = handlers[arn];
114
+ if (streamHandlers !== undefined && streamHandlers.length > 0) {
115
+ log.debug("found " + streamHandlers.length + " handler(s) for " + arn, { comp: "AutomationSliceRuntime" });
116
+ await Promise.all(streamHandlers.map(h =>
117
+ runEffect(undefined, h({ Records: subRecords }, context))
118
+ ));
119
+ } else {
120
+ log.warn("no handler found: " + arn, { comp: "AutomationSliceRuntime" });
121
+ }
122
+ }));
123
+ return "";
124
+ }