@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,295 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Aws from "@pulumi/aws";
4
+ import * as IAM$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/IAM/IAM.res.mjs";
5
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
+ import * as Pulumi from "@pulumi/pulumi";
7
+ import * as Lambda$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/Lambda/Lambda.res.mjs";
8
+ import * as AWS$ReventlessAws from "../AWS.res.mjs";
9
+ import * as AWS_Tags$ReventlessAws from "../AWS_Tags.res.mjs";
10
+ import * as QueryDb$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb.res.mjs";
11
+ import * as PolicyDocument$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/IAM/PolicyDocument.res.mjs";
12
+ import * as Util_Bundle$ReventlessAws from "../../util/Util_Bundle.res.mjs";
13
+ import * as Util_ReadModel$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_ReadModel.res.mjs";
14
+ import * as AppSync_EventsApi$ReventlessAws from "../Api/AppSync_EventsApi.res.mjs";
15
+ import * as Util_DynamoDbStream$ReventlessAws from "../../util/Util_DynamoDbStream.res.mjs";
16
+
17
+ let registry = {};
18
+
19
+ let handlerCode = `
20
+ import { createHmac, createHash } from "node:crypto";
21
+ import { unmarshall } from "@aws-sdk/util-dynamodb";
22
+
23
+ const TOPIC_MAP = JSON.parse(process.env.STATE_TOPIC_MAP || "{}");
24
+ const APPSYNC_ENDPOINT = process.env.APPSYNC_ENDPOINT; // "https://{eventsApi.dns.http}"
25
+ const AWS_REGION = process.env.AWS_REGION ?? "eu-west-1";
26
+
27
+ function sha256hex(data) {
28
+ return createHash("sha256").update(typeof data === "string" ? data : JSON.stringify(data)).digest("hex");
29
+ }
30
+ function hmacBuf(key, data) {
31
+ return createHmac("sha256", key).update(data).digest();
32
+ }
33
+
34
+ async function signedHeaders(host, path, body) {
35
+ const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
36
+ const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
37
+ const sessionToken = process.env.AWS_SESSION_TOKEN;
38
+ const now = new Date();
39
+ const amzDate = now.toISOString().replace(/[:\\-]|\\..../g, "").slice(0, 15) + "Z";
40
+ const dateStamp = now.toISOString().slice(0, 10).replace(/-/g, "");
41
+ const headers = { host, "x-amz-date": amzDate, ...(sessionToken ? { "x-amz-security-token": sessionToken } : {}) };
42
+ const canonH = Object.entries(headers).sort(([a],[b]) => a.localeCompare(b)).map(([k,v]) => \`\${k}:\${v}\\n\`).join("");
43
+ const signH = Object.keys(headers).sort().join(";");
44
+ const cr = ["POST", path, "", canonH, signH, sha256hex(body)].join("\\n");
45
+ const scope = \`\${dateStamp}/\${AWS_REGION}/appsync/aws4_request\`;
46
+ const sts = ["AWS4-HMAC-SHA256", amzDate, scope, sha256hex(cr)].join("\\n");
47
+ const kDate = hmacBuf("AWS4" + secretAccessKey, dateStamp);
48
+ const kSigning = hmacBuf(hmacBuf(hmacBuf(kDate, AWS_REGION), "appsync"), "aws4_request");
49
+ const sig = createHmac("sha256", kSigning).update(sts).digest("hex");
50
+ return { ...headers, Authorization: \`AWS4-HMAC-SHA256 Credential=\${accessKeyId}/\${scope}, SignedHeaders=\${signH}, Signature=\${sig}\` };
51
+ }
52
+
53
+ // AppSync Events channel segments allow only [A-Za-z0-9-]. Anything else
54
+ // (\`@\`, \`.\`, \`:\`, \`_\`, \`/\`, …) collapses to \`-\` so the segment is a
55
+ // legal channel-path token. The UI's AutoLive.normalizeSegment uses the same
56
+ // rule for Entity-scoped subscribes.
57
+ function pathSegment(value) {
58
+ return String(value).replace(/[^A-Za-z0-9-]/g, "-");
59
+ }
60
+
61
+ // Map record.eventSourceARN → topicRoot via STATE_TOPIC_MAP.
62
+ // Stream ARNs look like: arn:aws:dynamodb:<region>:<acct>:table/<TableName>/stream/<ts>
63
+ function topicRootFromEventSourceArn(arn) {
64
+ const m = arn && arn.match(/:table\\/([^/]+)\\/stream\\//);
65
+ if (!m) return undefined;
66
+ const topicName = TOPIC_MAP[m[1]];
67
+ if (topicName === undefined) return undefined;
68
+ return pathSegment(topicName);
69
+ }
70
+
71
+ // Build entityKey from record.dynamodb.Keys. Framework convention:
72
+ // partition-key attr is named "id"; composite tables have one extra attr (the
73
+ // sort key) whose name comes from the projection's subIdConfig.subIdField.
74
+ // Returns the ORIGINAL key string — the descriptor body uses this verbatim so
75
+ // AutoListView can match it against the GraphQL row.id. The channel path
76
+ // segment is derived later via pathSegment().
77
+ function entityKeyFromRecord(record) {
78
+ const keys = unmarshall(record.dynamodb.Keys ?? {});
79
+ const id = keys.id;
80
+ if (id === undefined) {
81
+ // Defensive: framework always names the partition key "id". If a future
82
+ // table breaks the convention, fall back to a stable sort-join.
83
+ const names = Object.keys(keys).sort();
84
+ return names.map((n) => String(keys[n])).join("-");
85
+ }
86
+ const subIdName = Object.keys(keys).find((k) => k !== "id");
87
+ return subIdName === undefined
88
+ ? String(id)
89
+ : String(id) + "-" + String(keys[subIdName]);
90
+ }
91
+
92
+ // Map DDB stream eventName → descriptor changeKind.
93
+ function changeKindFor(eventName) {
94
+ switch (eventName) {
95
+ case "INSERT": return "Added";
96
+ case "MODIFY": return "Updated";
97
+ case "REMOVE": return "Removed";
98
+ default: return "Updated"; // defensive default — shouldn't fire
99
+ }
100
+ }
101
+
102
+ // Pick the "natural" sort timestamp from an unmarshalled image. Conventions
103
+ // in this codebase prefer updatedAt; createdAt is the fallback for views that
104
+ // never mutate after insert. Returns undefined if neither is present.
105
+ function pickSortKeyValue(image) {
106
+ if (image && typeof image.updatedAt === "string") return image.updatedAt;
107
+ if (image && typeof image.createdAt === "string") return image.createdAt;
108
+ return undefined;
109
+ }
110
+
111
+ export async function handler(event) {
112
+ const url = new URL(APPSYNC_ENDPOINT);
113
+ let transientErr;
114
+ for (const record of event.Records) {
115
+ const topicRoot = topicRootFromEventSourceArn(record.eventSourceARN);
116
+ if (topicRoot === undefined) {
117
+ console.warn("StateTopic: unknown table for ARN", record.eventSourceARN);
118
+ continue;
119
+ }
120
+ const channelRoot = "/default/" + topicRoot;
121
+ const image =
122
+ record.eventName === "REMOVE"
123
+ ? record.dynamodb.OldImage
124
+ : record.dynamodb.NewImage;
125
+ if (image === undefined) continue;
126
+ const entityKey = entityKeyFromRecord(record);
127
+ const channel = channelRoot + "/" + pathSegment(entityKey);
128
+ const unmarshalled = unmarshall(image);
129
+ const descriptor = {
130
+ changeKind: changeKindFor(record.eventName),
131
+ id: entityKey,
132
+ };
133
+ const sortKeyValue = pickSortKeyValue(unmarshalled);
134
+ if (sortKeyValue !== undefined) descriptor.sortKeyValue = sortKeyValue;
135
+ const body = JSON.stringify({ id: record.eventID, channel, events: [JSON.stringify(descriptor)] });
136
+ const auth = await signedHeaders(url.hostname, "/event", body);
137
+ try {
138
+ const res = await fetch(APPSYNC_ENDPOINT + "/event", {
139
+ method: "POST",
140
+ headers: { accept: "application/json, text/javascript", "content-encoding": "amz-1.0", "content-type": "application/json; charset=UTF-8", ...auth },
141
+ body,
142
+ });
143
+ if (!res.ok) {
144
+ const txt = await res.text();
145
+ // 4xx: permanent (bad request, auth, channel format) — retrying won't
146
+ // help. Log structurally so a CloudWatch metric filter on
147
+ // "STATE_TOPIC_PUBLISH_FAILED type=permanent" surfaces it; continue
148
+ // processing so one bad record doesn't block the rest of the batch.
149
+ // 5xx / network: transient — record it and throw at the end so the
150
+ // ESM retries (bounded by maximumRetryAttempts + bisectBatch).
151
+ const isTransient = res.status >= 500;
152
+ const tag = isTransient ? "transient" : "permanent";
153
+ console.error(
154
+ "STATE_TOPIC_PUBLISH_FAILED type=" + tag +
155
+ " status=" + res.status +
156
+ " channel=" + channel +
157
+ " body=" + txt.slice(0, 500)
158
+ );
159
+ if (isTransient) transientErr = new Error("StateTopic publish failed: " + res.status);
160
+ }
161
+ } catch (e) {
162
+ // Network-level error (DNS, connection refused, timeout) — always transient.
163
+ console.error(
164
+ "STATE_TOPIC_PUBLISH_FAILED type=transient status=network" +
165
+ " channel=" + channel +
166
+ " err=" + (e && e.message)
167
+ );
168
+ transientErr = e;
169
+ }
170
+ }
171
+ // Throw after the loop so a single transient error doesn't stop us from
172
+ // emitting other records' descriptors first. The ESM will retry the batch;
173
+ // bisectBatchOnFunctionError isolates the bad record across retries.
174
+ if (transientErr) throw transientErr;
175
+ }
176
+ `;
177
+
178
+ function make(readModelName, topicName, allQueryDbs, eventsApi, param) {
179
+ let streamResource = Util_DynamoDbStream$ReventlessAws.findResource(Util_ReadModel$ReventlessCore.queryDbStorageResources(allQueryDbs, readModelName));
180
+ let streamArn = Util_DynamoDbStream$ReventlessAws.streamArnFromDynamoDbTableResource(streamResource);
181
+ let tableName = streamResource.name;
182
+ let key = eventsApi.name;
183
+ let entries = Stdlib_Option.getOr(registry[key], []);
184
+ registry[key] = entries.concat([{
185
+ tableName: tableName,
186
+ streamArn: streamArn,
187
+ topicName: topicName
188
+ }]);
189
+ }
190
+
191
+ function finish(eventsApi, opts) {
192
+ let key = eventsApi.name;
193
+ let entries = registry[key];
194
+ if (entries === undefined) {
195
+ return;
196
+ }
197
+ if (entries.length === 0) {
198
+ return;
199
+ }
200
+ let name = eventsApi.name;
201
+ let lambdaRole = IAM$PulumiAws.Role.makeWithDefaultPolicy(name + "StateTopicRole", Pulumi.output(AWS$ReventlessAws.Lambda.principal), opts);
202
+ let streamArnsOutput = Pulumi.all(entries.map(e => e.streamArn));
203
+ Pulumi.all([
204
+ streamArnsOutput,
205
+ eventsApi.api.apiArn
206
+ ]).apply(param => {
207
+ new (Aws.iam.RolePolicy)(name + "StateTopicPolicy", {
208
+ policy: PolicyDocument$PulumiAws.toJsonString(PolicyDocument$PulumiAws.make(undefined, name + "StateTopicPolicy", [
209
+ {
210
+ Sid: "AllowLambdaLogging",
211
+ Effect: "Allow",
212
+ Action: "logs:*",
213
+ Resource: "arn:aws:logs:*:*:*"
214
+ },
215
+ {
216
+ Sid: "AllowReadDynamoDbStream",
217
+ Effect: "Allow",
218
+ Action: [
219
+ "dynamodb:DescribeStream",
220
+ "dynamodb:GetRecords",
221
+ "dynamodb:GetShardIterator",
222
+ "dynamodb:ListStreams"
223
+ ],
224
+ Resource: param[0]
225
+ },
226
+ {
227
+ Sid: "AllowPublishAppSyncEvents",
228
+ Effect: "Allow",
229
+ Action: "appsync:EventPublish",
230
+ Resource: param[1] + "/*"
231
+ }
232
+ ])),
233
+ role: lambdaRole.id
234
+ }, opts);
235
+ });
236
+ let topicMapJson = Pulumi.all(entries.map(e => e.tableName)).apply(tableNames => {
237
+ let dict = {};
238
+ tableNames.forEach((tableName, i) => {
239
+ let topicName = entries[i].topicName;
240
+ dict[tableName] = topicName;
241
+ });
242
+ return JSON.stringify(dict);
243
+ });
244
+ let archiveContents = {};
245
+ archiveContents["index.mjs"] = new (Pulumi.asset.StringAsset)(handlerCode);
246
+ let code = new (Pulumi.asset.AssetArchive)(archiveContents);
247
+ let sourceCodeHash = Util_Bundle$ReventlessAws.hashString(handlerCode);
248
+ let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
249
+ let appsyncEndpoint = AppSync_EventsApi$ReventlessAws.httpEndpoint(eventsApi);
250
+ let lambda = new (Aws.lambda.Function)(name + "StateTopicPublisher", {
251
+ handler: "index.handler",
252
+ runtime: "nodejs22.x",
253
+ code: code,
254
+ role: lambdaRole.arn,
255
+ memorySize: 256,
256
+ timeout: 30,
257
+ layers: layers,
258
+ tags: AWS_Tags$ReventlessAws.make(name + "StateTopic", QueryDb$ReventlessCore.componentType),
259
+ environment: {
260
+ variables: Object.fromEntries([
261
+ [
262
+ "Environment",
263
+ Pulumi.getStack()
264
+ ],
265
+ [
266
+ "APPSYNC_ENDPOINT",
267
+ appsyncEndpoint
268
+ ],
269
+ [
270
+ "STATE_TOPIC_MAP",
271
+ topicMapJson
272
+ ]
273
+ ])
274
+ },
275
+ sourceCodeHash: sourceCodeHash
276
+ }, opts);
277
+ entries.forEach(entry => {
278
+ new (Aws.lambda.EventSourceMapping)(entry.topicName + "Stream2" + name + "StateTopic", {
279
+ functionName: lambda.arn,
280
+ bisectBatchOnFunctionError: true,
281
+ eventSourceArn: entry.streamArn,
282
+ maximumRetryAttempts: 3,
283
+ startingPosition: "LATEST"
284
+ }, opts);
285
+ });
286
+ registry[key] = [];
287
+ }
288
+
289
+ export {
290
+ registry,
291
+ handlerCode,
292
+ make,
293
+ finish,
294
+ }
295
+ /* @pulumi/aws Not a pure module */
@@ -0,0 +1 @@
1
+ module S3 = TaskBucket_S3
@@ -0,0 +1,9 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ let S3;
5
+
6
+ export {
7
+ S3,
8
+ }
9
+ /* No side effect */
@@ -0,0 +1,157 @@
1
+ type runtimeParts = Util.Lambda.runtimeParts
2
+ type callbackEvent = PulumiAws.S3.Bucket.event
3
+ type context = PulumiAws.Lambda.context
4
+ type bucketParts = PulumiAws.S3.Bucket.t
5
+
6
+ let subscribeLambda2S3Bucket = (lambda: Pulumi.Output.t<PulumiAws.Lambda.Function.t>, name, bucket, opts) => {
7
+ // Coerce Function.t → CallbackFunction.t for S3 bucket notification bindings
8
+ // (structurally compatible: both have arn, id, name)
9
+ let handler: Pulumi.Output.t<PulumiAws.Lambda.CallbackFunction.t> = lambda->Obj.magic
10
+ let _ = handler->Pulumi.Output.apply(handler => {
11
+ let _subscribeResources = [
12
+ bucket->PulumiAws.S3.Bucket.onObjectCreated(~name=name ++ "Created", ~handler, ~opts),
13
+ bucket->PulumiAws.S3.Bucket.onObjectRemoved(~name=name ++ "Deleted", ~handler, ~opts),
14
+ ]
15
+ })
16
+ }
17
+
18
+ open PulumiAws.PolicyDocument
19
+ open ReventlessCore.Adapter
20
+ open Adapter_Helpers
21
+
22
+ let createLambdaPolicy = (
23
+ lambdaRole: PulumiAws.IAM.Role.t,
24
+ name,
25
+ bucket: PulumiAws.S3.Bucket.t,
26
+ bucketMode: ReventlessCore.Task.bucketMode,
27
+ resources: array<ReventlessInfra.Adapter.resource>,
28
+ opts,
29
+ ) => {
30
+ let _ =
31
+ (bucket.arn, resources->ReventlessCore.Adapter.resourcesToResolvedOutput)
32
+ ->Pulumi.Output.all2
33
+ ->Pulumi.Output.apply(((bucketArn, resources)) => {
34
+ let allowLambdaWriteS3 =
35
+ bucketMode == Write || bucketMode == ReadWrite
36
+ ? Some(
37
+ PulumiAws.PolicyDocument.make(
38
+ ~id=name ++ "WriteS3",
39
+ ~statements=[
40
+ {
41
+ sid: "allowLambdaWriteS3",
42
+ effect: Allow,
43
+ actions: Actions(["s3:PutObject", "s3:DeleteObject"]),
44
+ resources: Resource(bucketArn),
45
+ },
46
+ ],
47
+ ),
48
+ )
49
+ : None
50
+ let allowLambdaReadS3 =
51
+ bucketMode == Read || bucketMode == ReadWrite
52
+ ? Some(
53
+ PulumiAws.PolicyDocument.make(
54
+ ~id=name ++ "ReadS3",
55
+ ~statements=[
56
+ {
57
+ sid: "allowLambdaReadS3",
58
+ effect: Allow,
59
+ actions: Actions(["s3:GetObject"]),
60
+ resources: Resource(bucketArn),
61
+ },
62
+ ],
63
+ ),
64
+ )
65
+ : None
66
+ let allowLambdaSendSQS =
67
+ resources->Array.length > 0
68
+ ? {
69
+ Some(
70
+ PulumiAws.PolicyDocument.make(
71
+ ~id=name ++ "SendSQS",
72
+ ~statements=[
73
+ {
74
+ sid: "AllowLambdaSendSQS",
75
+ effect: Allow,
76
+ actions: Action("sqs:SendMessage"),
77
+ resources: Resources(resources->sqsResources->urns),
78
+ },
79
+ ],
80
+ ),
81
+ )
82
+ }
83
+ : None
84
+
85
+ let _lambdaPolicy = PulumiAws.IAM.RolePolicy.make(
86
+ ~name,
87
+ ~args={
88
+ policy: PulumiAws.PolicyDocument.mergePolicyDocuments(
89
+ name ++ "LambdaPolicy",
90
+ [
91
+ Some(PulumiAws.Lambda.defaultLoggingPolicyDocument),
92
+ allowLambdaReadS3,
93
+ allowLambdaWriteS3,
94
+ allowLambdaSendSQS,
95
+ ]->Array.keepSome,
96
+ )->Pulumi.Output.asInput,
97
+ role: lambdaRole.id->Pulumi.Output.asInput,
98
+ },
99
+ ~opts,
100
+ )
101
+ })
102
+ }
103
+
104
+ let connect = (
105
+ ~name,
106
+ ~bucket: ReventlessCore.Task_Adapter.bucket<bucketParts>,
107
+ ~bucketMode: ReventlessCore.Task.bucketMode,
108
+ ~commandTopics: Pulumi.Output.t<ReventlessCore.CommandTopic.allOutputs>,
109
+ ~runtime: ReventlessCore.Runtime.environment<runtimeParts>,
110
+ ~opts,
111
+ ) => {
112
+ let opts = opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
113
+
114
+ let lambda = runtime.parts.lambda
115
+ let lambdaRole = runtime.parts.lambdaRole
116
+
117
+ let _ = commandTopics->Pulumi.Output.apply(allCommandTopics => {
118
+ lambda->subscribeLambda2S3Bucket(name, bucket.parts, opts)
119
+ let resources =
120
+ allCommandTopics->Dict.valuesToArray->Array.flatMap(commandTopic => commandTopic.resources)
121
+ lambdaRole->createLambdaPolicy(name, bucket.parts, bucketMode, resources, opts)
122
+ })
123
+ }
124
+
125
+ let make: ReventlessCore.Task_Adapter.bucketMaker<bucketParts> = (~name, ~opts) => {
126
+ let opts = opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
127
+
128
+ let bucket = {
129
+ PulumiAws.S3.Bucket.make(
130
+ ~name,
131
+ ~args={
132
+ corsRules: [
133
+ {
134
+ PulumiAws.S3.Bucket.allowedHeaders: ["*"],
135
+ allowedMethods: ["HEAD", "GET"],
136
+ allowedOrigins: ["*"],
137
+ exposeHeaders: [
138
+ "x-amz-server-side-encryption",
139
+ ">x-amz-request-id",
140
+ "x-amz-id-2",
141
+ "ETag",
142
+ ],
143
+ maxAgeSeconds: 3000,
144
+ },
145
+ ]->Pulumi.Input.make,
146
+ },
147
+ ~opts,
148
+ )
149
+ }
150
+
151
+ {
152
+ resources: [bucket->Util.S3.toResource],
153
+ parts: bucket,
154
+ }
155
+ }
156
+
157
+ let makeHandler = handleEvents => TaskBucket_S3_Runtime.handleBucketEvent(handleEvents, ...)
@@ -0,0 +1,108 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Aws from "@pulumi/aws";
4
+ import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
5
+ import * as Pulumi from "@pulumi/pulumi";
6
+ import * as Lambda$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/Lambda/Lambda.res.mjs";
7
+ import * as Util_S3$ReventlessAws from "../../util/Util_S3.res.mjs";
8
+ import * as Adapter$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Adapter.res.mjs";
9
+ import * as PolicyDocument$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/IAM/PolicyDocument.res.mjs";
10
+ import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
11
+ import * as Adapter_Helpers$ReventlessAws from "../Adapter_Helpers.res.mjs";
12
+ import * as TaskBucket_S3_Runtime$ReventlessAws from "./TaskBucket_S3_Runtime.res.mjs";
13
+
14
+ function subscribeLambda2S3Bucket(lambda, name, bucket, opts) {
15
+ lambda.apply(handler => {
16
+ [
17
+ bucket.onObjectCreated(name + "Created", handler, undefined, opts),
18
+ bucket.onObjectRemoved(name + "Deleted", handler, undefined, opts)
19
+ ];
20
+ });
21
+ }
22
+
23
+ function createLambdaPolicy(lambdaRole, name, bucket, bucketMode, resources, opts) {
24
+ Pulumi.all([
25
+ bucket.arn,
26
+ Adapter$ReventlessCore.resourcesToResolvedOutput(resources)
27
+ ]).apply(param => {
28
+ let resources = param[1];
29
+ let bucketArn = param[0];
30
+ let allowLambdaWriteS3 = bucketMode === "Write" || bucketMode === "ReadWrite" ? PolicyDocument$PulumiAws.make(undefined, name + "WriteS3", [{
31
+ Sid: "allowLambdaWriteS3",
32
+ Effect: "Allow",
33
+ Action: [
34
+ "s3:PutObject",
35
+ "s3:DeleteObject"
36
+ ],
37
+ Resource: bucketArn
38
+ }]) : undefined;
39
+ let allowLambdaReadS3 = bucketMode === "Read" || bucketMode === "ReadWrite" ? PolicyDocument$PulumiAws.make(undefined, name + "ReadS3", [{
40
+ Sid: "allowLambdaReadS3",
41
+ Effect: "Allow",
42
+ Action: ["s3:GetObject"],
43
+ Resource: bucketArn
44
+ }]) : undefined;
45
+ let allowLambdaSendSQS = resources.length !== 0 ? PolicyDocument$PulumiAws.make(undefined, name + "SendSQS", [{
46
+ Sid: "AllowLambdaSendSQS",
47
+ Effect: "Allow",
48
+ Action: "sqs:SendMessage",
49
+ Resource: Adapter$ReventlessCore.urns(Adapter_Helpers$ReventlessAws.sqsResources(resources))
50
+ }]) : undefined;
51
+ new (Aws.iam.RolePolicy)(name, {
52
+ policy: PolicyDocument$PulumiAws.mergePolicyDocuments(name + "LambdaPolicy", Stdlib_Array.keepSome([
53
+ Lambda$PulumiAws.defaultLoggingPolicyDocument,
54
+ allowLambdaReadS3,
55
+ allowLambdaWriteS3,
56
+ allowLambdaSendSQS
57
+ ])),
58
+ role: lambdaRole.id
59
+ }, opts);
60
+ });
61
+ }
62
+
63
+ function connect(name, bucket, bucketMode, commandTopics, runtime, opts) {
64
+ let opts$1 = Util_Pulumi$ReventlessCore.ComponentResourceOptions.toCustomResourceOptions(opts);
65
+ let lambda = runtime.parts.lambda;
66
+ let lambdaRole = runtime.parts.lambdaRole;
67
+ commandTopics.apply(allCommandTopics => {
68
+ subscribeLambda2S3Bucket(lambda, name, bucket.parts, opts$1);
69
+ let resources = Object.values(allCommandTopics).flatMap(commandTopic => commandTopic.resources);
70
+ createLambdaPolicy(lambdaRole, name, bucket.parts, bucketMode, resources, opts$1);
71
+ });
72
+ }
73
+
74
+ function make(name, opts) {
75
+ let opts$1 = Util_Pulumi$ReventlessCore.ComponentResourceOptions.toCustomResourceOptions(opts);
76
+ let bucket = new (Aws.s3.Bucket)(name, {
77
+ corsRules: [{
78
+ allowedHeaders: ["*"],
79
+ allowedMethods: [
80
+ "HEAD",
81
+ "GET"
82
+ ],
83
+ allowedOrigins: ["*"],
84
+ exposeHeaders: [
85
+ "x-amz-server-side-encryption",
86
+ ">x-amz-request-id",
87
+ "x-amz-id-2",
88
+ "ETag"
89
+ ],
90
+ maxAgeSeconds: 3000
91
+ }]
92
+ }, opts$1);
93
+ return {
94
+ resources: [Util_S3$ReventlessAws.toResource(bucket)],
95
+ parts: bucket
96
+ };
97
+ }
98
+
99
+ let makeHandler = TaskBucket_S3_Runtime$ReventlessAws.handleBucketEvent;
100
+
101
+ export {
102
+ subscribeLambda2S3Bucket,
103
+ createLambdaPolicy,
104
+ connect,
105
+ make,
106
+ makeHandler,
107
+ }
108
+ /* @pulumi/aws Not a pure module */
@@ -0,0 +1,11 @@
1
+ let handleBucketEvent = (handleEvent: ReventlessCore.Task.bucketCallback) =>
2
+ (event: PulumiAws.S3.Bucket.event, _) => {
3
+ event.records
4
+ ->Array.map(record => {
5
+ let eventName = record.eventName
6
+ let key = decodeURIComponent(record.s3.object.key)
7
+ handleEvent(~eventName, ~key)
8
+ })
9
+ ->Promise.all
10
+ ->Promise.thenResolve(actions => actions->Array.flat)
11
+ }
@@ -0,0 +1,15 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ function handleBucketEvent(handleEvent) {
5
+ return (event, param) => Promise.all(event.Records.map(record => {
6
+ let eventName = record.eventName;
7
+ let key = decodeURIComponent(record.s3.object.key);
8
+ return handleEvent(eventName, key);
9
+ })).then(actions => actions.flat());
10
+ }
11
+
12
+ export {
13
+ handleBucketEvent,
14
+ }
15
+ /* No side effect */
@@ -0,0 +1 @@
1
+ include Aggregate_Builder_Single
@@ -0,0 +1,25 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Aggregate_Builder_Single$ReventlessAws from "./Aggregate_Builder_Single.res.mjs";
4
+
5
+ let CommandGeneratorResolvers = Aggregate_Builder_Single$ReventlessAws.CommandGeneratorResolvers;
6
+
7
+ let CommandTopicChannel = Aggregate_Builder_Single$ReventlessAws.CommandTopicChannel;
8
+
9
+ let EventCollectorChannel = Aggregate_Builder_Single$ReventlessAws.EventCollectorChannel;
10
+
11
+ let RuntimeEnvironment = Aggregate_Builder_Single$ReventlessAws.RuntimeEnvironment;
12
+
13
+ let AggregateRuntimeBuilder = Aggregate_Builder_Single$ReventlessAws.AggregateRuntimeBuilder;
14
+
15
+ let Make = Aggregate_Builder_Single$ReventlessAws.Make;
16
+
17
+ export {
18
+ CommandGeneratorResolvers,
19
+ CommandTopicChannel,
20
+ EventCollectorChannel,
21
+ RuntimeEnvironment,
22
+ AggregateRuntimeBuilder,
23
+ Make,
24
+ }
25
+ /* Aggregate_Builder_Single-ReventlessAws Not a pure module */