@reventlessdev/reventless-local 3.0.0-alpha.113

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 (334) hide show
  1. package/CHANGELOG.md +1197 -0
  2. package/LICENSE +202 -0
  3. package/__mocks__/emptyModule.js +2 -0
  4. package/__mocks__/nodeSqlite.mjs +6 -0
  5. package/package.json +67 -0
  6. package/rescript.json +39 -0
  7. package/src/Platform.res +2162 -0
  8. package/src/Platform.res.mjs +3389 -0
  9. package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
  10. package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
  11. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
  12. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
  13. package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
  14. package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
  15. package/src/adapter/Auth/LocalAuth.res +239 -0
  16. package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
  17. package/src/adapter/Auth/UserStore.res +134 -0
  18. package/src/adapter/Auth/UserStore.res.mjs +146 -0
  19. package/src/adapter/Backend.res +46 -0
  20. package/src/adapter/Backend.res.mjs +66 -0
  21. package/src/adapter/BackendState.res +34 -0
  22. package/src/adapter/BackendState.res.mjs +42 -0
  23. package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
  24. package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
  25. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
  26. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
  27. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
  28. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
  29. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
  30. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
  31. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
  32. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
  33. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
  34. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
  35. package/src/adapter/Counter/LocalCounterHandler.res +42 -0
  36. package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
  37. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
  38. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
  39. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
  40. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
  41. package/src/adapter/DomainGraphQL_Server.res +565 -0
  42. package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
  43. package/src/adapter/DomainMCP_Server.res +369 -0
  44. package/src/adapter/DomainMCP_Server.res.mjs +358 -0
  45. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
  46. package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
  47. package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
  48. package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
  49. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
  50. package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
  51. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
  52. package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
  53. package/src/adapter/GraphQL_Server.res +6 -0
  54. package/src/adapter/GraphQL_Server.res.mjs +154 -0
  55. package/src/adapter/GraphQL_ServerInstance.res +310 -0
  56. package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
  57. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
  58. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
  59. package/src/adapter/LocalBus.res +498 -0
  60. package/src/adapter/LocalBus.res.mjs +1011 -0
  61. package/src/adapter/LocalPluginSpec.res +16 -0
  62. package/src/adapter/LocalPluginSpec.res.mjs +33 -0
  63. package/src/adapter/LocalSideEffectHandler.res +44 -0
  64. package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
  65. package/src/adapter/MCP_Server.res +4 -0
  66. package/src/adapter/MCP_Server.res.mjs +67 -0
  67. package/src/adapter/MCP_ServerInstance.res +362 -0
  68. package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
  69. package/src/adapter/PlatformGraphQL_Server.res +75 -0
  70. package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
  71. package/src/adapter/PlatformMCP_Server.res +23 -0
  72. package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
  73. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
  74. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
  75. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
  76. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
  77. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
  78. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
  79. package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
  80. package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
  81. package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
  82. package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
  83. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
  84. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
  85. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
  86. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
  87. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
  88. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
  89. package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
  90. package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
  91. package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
  92. package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
  93. package/src/adapter/SqliteDriver.res +52 -0
  94. package/src/adapter/SqliteDriver.res.mjs +76 -0
  95. package/src/adapter/SqliteDriver.resi +31 -0
  96. package/src/adapter/Task/LocalTaskBucket.res +75 -0
  97. package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
  98. package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
  99. package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
  100. package/src/components/Aggregate_Builder.res +55 -0
  101. package/src/components/Aggregate_Builder.res.mjs +140 -0
  102. package/src/components/AutomationSlice_Builder.res +41 -0
  103. package/src/components/AutomationSlice_Builder.res.mjs +57 -0
  104. package/src/components/Counter_Builder.res +14 -0
  105. package/src/components/Counter_Builder.res.mjs +32 -0
  106. package/src/components/DcbEventLog_Builder.res +18 -0
  107. package/src/components/DcbEventLog_Builder.res.mjs +24 -0
  108. package/src/components/ExtensionPoint_Builder.res +25 -0
  109. package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
  110. package/src/components/InboundTranslationSlice_Builder.res +34 -0
  111. package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
  112. package/src/components/OutboundTranslationSlice_Builder.res +43 -0
  113. package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
  114. package/src/components/Plugin_Builder.res +37 -0
  115. package/src/components/Plugin_Builder.res.mjs +67 -0
  116. package/src/components/ReadModel_Builder.res +47 -0
  117. package/src/components/ReadModel_Builder.res.mjs +54 -0
  118. package/src/components/StateChangeSlice_Builder.res +19 -0
  119. package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
  120. package/src/components/StateViewSlice_Builder.res +42 -0
  121. package/src/components/StateViewSlice_Builder.res.mjs +58 -0
  122. package/src/components/Task_Builder.res +28 -0
  123. package/src/components/Task_Builder.res.mjs +41 -0
  124. package/src/reexport/CommandTopic.res +3 -0
  125. package/src/reexport/CommandTopic.res.mjs +55 -0
  126. package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
  127. package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
  128. package/src/test/Mocks/MockEventLogStorage.res +57 -0
  129. package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
  130. package/src/test/Mocks/MockPublisher.res +29 -0
  131. package/src/test/Mocks/MockPublisher.res.mjs +28 -0
  132. package/src/test/Mocks/MockQueryDbStorage.res +104 -0
  133. package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
  134. package/src/test/TestRunner.res +96 -0
  135. package/src/test/TestRunner.res.mjs +71 -0
  136. package/tests/SplitApiFixtures.res +84 -0
  137. package/tests/SplitApiFixtures.res.mjs +88 -0
  138. package/tests/SplitApiTest.res +102 -0
  139. package/tests/SplitApiTest.res.mjs +82 -0
  140. package/tests/TestFixtures.res +54 -0
  141. package/tests/TestFixtures.res.mjs +65 -0
  142. package/tests/adapter/BackendParityTest.res +94 -0
  143. package/tests/adapter/BackendParityTest.res.mjs +96 -0
  144. package/tests/adapter/CollectNEventsTest.res +82 -0
  145. package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
  146. package/tests/adapter/CommandAuthorizationTest.res +200 -0
  147. package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
  148. package/tests/adapter/CommandTopicChannelTest.res +174 -0
  149. package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
  150. package/tests/adapter/CounterHandlerTest.res +113 -0
  151. package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
  152. package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
  153. package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
  154. package/tests/adapter/DcbEventLogStorageTest.res +187 -0
  155. package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
  156. package/tests/adapter/EventCollectorChannelTest.res +166 -0
  157. package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
  158. package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
  159. package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
  160. package/tests/adapter/EventTapTest.res +102 -0
  161. package/tests/adapter/EventTapTest.res.mjs +94 -0
  162. package/tests/adapter/EventTopicPublisherTest.res +76 -0
  163. package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
  164. package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
  165. package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
  166. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
  167. package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
  168. package/tests/adapter/HeartbeatRunnerTest.res +136 -0
  169. package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
  170. package/tests/adapter/LocalAuthHttpTest.res +224 -0
  171. package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
  172. package/tests/adapter/LocalAuthLoginTest.res +180 -0
  173. package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
  174. package/tests/adapter/LocalAuthTest.res +106 -0
  175. package/tests/adapter/LocalAuthTest.res.mjs +145 -0
  176. package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
  177. package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
  178. package/tests/adapter/LocalBusBoundedTest.res +157 -0
  179. package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
  180. package/tests/adapter/LocalBusPubSubTest.res +81 -0
  181. package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
  182. package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
  183. package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
  184. package/tests/adapter/QueryDbListResolverTest.res +361 -0
  185. package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
  186. package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
  187. package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
  188. package/tests/adapter/QueryDbStorageTest.res +171 -0
  189. package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
  190. package/tests/adapter/QueryEngineTest.res +152 -0
  191. package/tests/adapter/QueryEngineTest.res.mjs +148 -0
  192. package/tests/adapter/ScheduledPublisherTest.res +199 -0
  193. package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
  194. package/tests/adapter/SortKey_FilterTest.res +103 -0
  195. package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
  196. package/tests/adapter/SqliteDriverTest.res +86 -0
  197. package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
  198. package/tests/adapter/TaskBucketSqliteTest.res +44 -0
  199. package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
  200. package/tests/adapter/TaskBucketTest.res +106 -0
  201. package/tests/adapter/TaskBucketTest.res.mjs +118 -0
  202. package/tests/components/aggregate/AggregateFixtures.res +78 -0
  203. package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
  204. package/tests/components/aggregate/AggregateTest.res +129 -0
  205. package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
  206. package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
  207. package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
  208. package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
  209. package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
  210. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
  211. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
  212. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
  213. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
  214. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
  215. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
  216. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
  217. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
  218. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
  219. package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
  220. package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
  221. package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
  222. package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
  223. package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
  224. package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
  225. package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
  226. package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
  227. package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
  228. package/tests/components/commandtopic/CommandTopicTest.res +55 -0
  229. package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
  230. package/tests/components/counter/CounterFixtures.res +42 -0
  231. package/tests/components/counter/CounterFixtures.res.mjs +34 -0
  232. package/tests/components/counter/CounterTest.res +46 -0
  233. package/tests/components/counter/CounterTest.res.mjs +61 -0
  234. package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
  235. package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
  236. package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
  237. package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
  238. package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
  239. package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
  240. package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
  241. package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
  242. package/tests/components/dcb/DcbFixtures.res +145 -0
  243. package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
  244. package/tests/components/dcb/DcbTest.res +55 -0
  245. package/tests/components/dcb/DcbTest.res.mjs +55 -0
  246. package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
  247. package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
  248. package/tests/components/eventcollector/EventCollectorTest.res +37 -0
  249. package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
  250. package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
  251. package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
  252. package/tests/components/eventlog/EventLogConflictTest.res +86 -0
  253. package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
  254. package/tests/components/eventlog/EventLogFixtures.res +52 -0
  255. package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
  256. package/tests/components/eventlog/EventLogStreamTest.res +98 -0
  257. package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
  258. package/tests/components/eventlog/EventLogTest.res +53 -0
  259. package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
  260. package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
  261. package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
  262. package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
  263. package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
  264. package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
  265. package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
  266. package/tests/components/eventtopic/EventTopicTest.res +35 -0
  267. package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
  268. package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
  269. package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
  270. package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
  271. package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
  272. package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
  273. package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
  274. package/tests/components/heartbeat/HeartbeatTest.res +67 -0
  275. package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
  276. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
  277. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
  278. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
  279. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
  280. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
  281. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
  282. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
  283. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
  284. package/tests/components/querydb/QueryDbFixtures.res +39 -0
  285. package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
  286. package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
  287. package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
  288. package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
  289. package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
  290. package/tests/components/querydb/QueryDbTest.res +81 -0
  291. package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
  292. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
  293. package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
  294. package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
  295. package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
  296. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
  297. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
  298. package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
  299. package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
  300. package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
  301. package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
  302. package/tests/components/readmodel/ReadModelFixtures.res +138 -0
  303. package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
  304. package/tests/components/readmodel/ReadModelTest.res +46 -0
  305. package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
  306. package/tests/components/scheduler/SchedulerFixtures.res +59 -0
  307. package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
  308. package/tests/components/scheduler/SchedulerTest.res +76 -0
  309. package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
  310. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
  311. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
  312. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
  313. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
  314. package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
  315. package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
  316. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
  317. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
  318. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
  319. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
  320. package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
  321. package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
  322. package/tests/components/task/TaskFixtures.res +87 -0
  323. package/tests/components/task/TaskFixtures.res.mjs +82 -0
  324. package/tests/components/task/TaskTest.res +98 -0
  325. package/tests/components/task/TaskTest.res.mjs +46 -0
  326. package/tests/plugin/PluginBehavior_GWT.res +146 -0
  327. package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
  328. package/tests/plugin/Plugin_Fixtures.res +61 -0
  329. package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
  330. package/tests/plugin/PluginsProjection_GWT.res +95 -0
  331. package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
  332. package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
  333. package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
  334. package/tests/setup/sqliteGlobal.cjs +12 -0
@@ -0,0 +1,46 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+
6
+ function getSk(item, skField) {
7
+ return Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(item), d => d[skField]), Stdlib_JSON.Decode.string), "");
8
+ }
9
+
10
+ function apply(items, skField, prefix, from, to_, eq, reverseOpt, limit, offsetOpt) {
11
+ let reverse = reverseOpt !== undefined ? reverseOpt : false;
12
+ let offset = offsetOpt !== undefined ? offsetOpt : 0;
13
+ let filtered = items.filter(item => {
14
+ let sk = getSk(item, skField);
15
+ let okPrefix = Stdlib_Option.getOr(Stdlib_Option.map(prefix, p => sk.startsWith(p)), true);
16
+ let okFrom = Stdlib_Option.getOr(Stdlib_Option.map(from, f => sk >= f), true);
17
+ let okTo = Stdlib_Option.getOr(Stdlib_Option.map(to_, t => sk <= t), true);
18
+ let okEq = Stdlib_Option.getOr(Stdlib_Option.map(eq, e => sk === e), true);
19
+ if (okPrefix && okFrom && okTo) {
20
+ return okEq;
21
+ } else {
22
+ return false;
23
+ }
24
+ });
25
+ let ordered = reverse ? filtered.toReversed() : filtered;
26
+ let sliced = ordered.slice(offset, ordered.length);
27
+ let match = limit !== undefined ? [
28
+ sliced.slice(0, limit),
29
+ sliced.length > limit
30
+ ] : [
31
+ sliced,
32
+ false
33
+ ];
34
+ let page = match[0];
35
+ let nextToken = match[1] ? (offset + page.length | 0).toString() : undefined;
36
+ return {
37
+ items: page,
38
+ nextToken: nextToken
39
+ };
40
+ }
41
+
42
+ export {
43
+ getSk,
44
+ apply,
45
+ }
46
+ /* No side effect */
@@ -0,0 +1,57 @@
1
+ // In-memory QueryEngine — uses Bus storage registry for real scan/query.
2
+ // This is a Make(Bus) functor; callers must first create
3
+ // module QueryEngine = LocalQueryEngine.Make(Bus)
4
+ // and then pass QueryEngine as QueryEngineAdapter to Plugin_Builder.Make or Platform_Admin.Make.
5
+
6
+ open Reventless
7
+
8
+ module Make = (Bus: LocalBus.T) => {
9
+ let valueToString = value =>
10
+ switch value {
11
+ | QueryEngine.String(s) => s
12
+ | QueryEngine.Int(i) => i->Int.toString
13
+ | QueryEngine.Bool(b) => b ? "true" : "false"
14
+ }
15
+
16
+ let make: ReventlessCore.QueryDb_Adapter.queryEngineMaker = _allQueryDbs =>
17
+ Pulumi.Output.make({
18
+ QueryEngine.scan: async (~readModelName, ~filterConfigs as _, ~limit) =>
19
+ switch Bus.getQueryDbStream(readModelName) {
20
+ | Some(makeStream) =>
21
+ await makeStream()->Stream.take(limit)->Stream.runCollect->Effect.runPromise
22
+ | None =>
23
+ // Backward compat: fall back to array scan if no stream registered
24
+ switch Bus.getQueryDbScan(readModelName) {
25
+ | Some(scanAll) => scanAll()
26
+ | None => []
27
+ }
28
+ },
29
+ query: async (
30
+ ~readModelName,
31
+ ~key=?,
32
+ ~id,
33
+ ~subIdConfig as _=?,
34
+ ~filterConfigs as _=?,
35
+ ~ascending as _=?,
36
+ ~limit=?,
37
+ ) => {
38
+ let keyStr = switch key {
39
+ | Some(k) => k
40
+ | None => id->valueToString
41
+ }
42
+ switch Bus.getQueryDb(readModelName) {
43
+ | Some(ops) =>
44
+ let stream = ops.loadStream(keyStr)
45
+ let bounded = switch limit {
46
+ | Some(n) => stream->Stream.take(n)
47
+ | None => stream
48
+ }
49
+ await bounded
50
+ ->Stream.runCollect
51
+ ->Effect.catchAll(_ => Effect.succeed([]))
52
+ ->Effect.runPromise
53
+ | None => []
54
+ }
55
+ },
56
+ })
57
+ }
@@ -0,0 +1,56 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Stream$1 from "effect/Stream";
6
+ import * as Pulumi from "@pulumi/pulumi";
7
+
8
+ function Make(Bus) {
9
+ let valueToString = value => {
10
+ switch (value.TAG) {
11
+ case "String" :
12
+ return value._0;
13
+ case "Int" :
14
+ return value._0.toString();
15
+ case "Bool" :
16
+ if (value._0) {
17
+ return "true";
18
+ } else {
19
+ return "false";
20
+ }
21
+ }
22
+ };
23
+ let make = _allQueryDbs => Pulumi.output({
24
+ scan: async (readModelName, param, limit) => {
25
+ let makeStream = Bus.getQueryDbStream(readModelName);
26
+ if (makeStream !== undefined) {
27
+ return await Effect.runPromise(Stream.runCollect(Stream$1.take(makeStream(), limit)));
28
+ }
29
+ let scanAll = Bus.getQueryDbScan(readModelName);
30
+ if (scanAll !== undefined) {
31
+ return scanAll();
32
+ } else {
33
+ return [];
34
+ }
35
+ },
36
+ query: async (readModelName, key, id, param, param$1, param$2, limit) => {
37
+ let keyStr = key !== undefined ? key : valueToString(id);
38
+ let ops = Bus.getQueryDb(readModelName);
39
+ if (ops === undefined) {
40
+ return [];
41
+ }
42
+ let stream = ops.loadStream(keyStr);
43
+ let bounded = limit !== undefined ? Stream$1.take(stream, limit) : stream;
44
+ return await Effect.runPromise(Effect.catchAll(Stream.runCollect(bounded), param => Effect.succeed([])));
45
+ }
46
+ });
47
+ return {
48
+ valueToString: valueToString,
49
+ make: make
50
+ };
51
+ }
52
+
53
+ export {
54
+ Make,
55
+ }
56
+ /* Stream Not a pure module */
@@ -0,0 +1,91 @@
1
+ // In-memory aggregate runtime builder.
2
+ // Instead of creating Lambda functions and SQS/DynamoDB event source mappings,
3
+ // wires handlers directly via the in-memory bus.
4
+
5
+ module Make = (
6
+ Bus: LocalBus.T,
7
+ CommandTopicChannel: ReventlessCore.CommandTopic_Adapter.Channel
8
+ with type runtimeParts = LocalRuntimeEnvironment.parts,
9
+ EventCollectorChannel: ReventlessCore.EventCollector_Adapter.Channel
10
+ with type runtimeParts = LocalRuntimeEnvironment.parts,
11
+ ): (
12
+ ReventlessCore.AggregateRuntime_Builder.T
13
+ with type context = LocalRuntimeEnvironment.context
14
+ and type runtimeParts = LocalRuntimeEnvironment.parts
15
+ and module CommandTopicChannel = CommandTopicChannel
16
+ and module EventCollectorChannel = EventCollectorChannel
17
+ ) => {
18
+ type context = LocalRuntimeEnvironment.context
19
+ type runtimeParts = LocalRuntimeEnvironment.parts
20
+ module CommandTopicChannel = CommandTopicChannel
21
+ module EventCollectorChannel = EventCollectorChannel
22
+
23
+ let forCommandGenerator = (
24
+ ~handler,
25
+ ~connect,
26
+ ~memorySize as _=?,
27
+ ~timeout as _=?,
28
+ commandGenerator,
29
+ ) => {
30
+ // Call connect(~runtime) so CommandGeneratorResolvers_GraphQL.make registers SDL+resolvers.
31
+ // The runtime's handlerRef is unused by the GraphQL resolver path, but we create a proper
32
+ // runtime so the type is satisfied and future callers that need handlerRef will work.
33
+ let resource = commandGenerator->ReventlessCore.Component.toPulumiResource
34
+ let runtime = LocalRuntimeEnvironment.make(
35
+ ~name=resource.name->ReventlessCore.ComponentType.nameOpt(
36
+ ReventlessCore.CommandGenerator.componentType,
37
+ ),
38
+ ~handler=handler->Pulumi.Output.apply(h =>
39
+ h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
40
+ ),
41
+ )
42
+ connect(~runtime)
43
+ }
44
+
45
+ let forCommandTopic = (
46
+ ~handler,
47
+ ~connect,
48
+ ~memorySize as _=?,
49
+ ~timeout as _=?,
50
+ commandTopic,
51
+ ) => {
52
+ let resource = commandTopic->ReventlessCore.Component.toPulumiResource
53
+ let runtime = LocalRuntimeEnvironment.make(
54
+ ~name=resource.name->ReventlessCore.ComponentType.nameOpt(ReventlessCore.CommandTopic.componentType),
55
+ ~handler=handler->Pulumi.Output.apply(h =>
56
+ h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
57
+ ),
58
+ )
59
+ connect(~runtime)
60
+ }
61
+
62
+ let forEventCollector = (
63
+ ~handler,
64
+ ~eventTopics,
65
+ ~resources,
66
+ ~memorySize as _=?,
67
+ ~timeout as _=?,
68
+ eventCollector,
69
+ ) => {
70
+ let resource = eventCollector->ReventlessCore.Component.toPulumiResource
71
+ let name =
72
+ resource.name->ReventlessCore.ComponentType.nameOpt(ReventlessCore.EventCollector.componentType)
73
+ let opts = {Pulumi.ComponentResource.parent: resource}
74
+ let runtime = LocalRuntimeEnvironment.make(
75
+ ~name,
76
+ ~handler=handler->Pulumi.Output.apply(h =>
77
+ h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
78
+ ),
79
+ )
80
+ let _connectResources = EventCollectorChannel.connect(
81
+ ~name,
82
+ ~channelSpecs=[
83
+ {channel: eventCollector->ReventlessCore.EventCollector_Adapter.channel, eventTopics, resources},
84
+ ],
85
+ ~runtime,
86
+ ~opts,
87
+ )
88
+ }
89
+
90
+ let finish = () => ()
91
+ }
@@ -0,0 +1,50 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Runtime$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/Runtime.res.mjs";
4
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
5
+ import * as CommandTopic$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic.res.mjs";
6
+ import * as ComponentType$ReventlessCore from "@reventlessdev/reventless-core/src/ComponentType.res.mjs";
7
+ import * as EventCollector$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventCollector/EventCollector.res.mjs";
8
+ import * as CommandGenerator$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandGenerator/CommandGenerator.res.mjs";
9
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "./LocalRuntimeEnvironment.res.mjs";
10
+
11
+ function Make(Bus) {
12
+ return CommandTopicChannel => (EventCollectorChannel => {
13
+ let forCommandGenerator = (handler, connect, param, param$1, commandGenerator) => {
14
+ let resource = Component$ReventlessCore.toPulumiResource(commandGenerator);
15
+ return connect(LocalRuntimeEnvironment$ReventlessLocal.make(ComponentType$ReventlessCore.nameOpt(resource.__name, CommandGenerator$ReventlessCore.componentType), handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined));
16
+ };
17
+ let forCommandTopic = (handler, connect, param, param$1, commandTopic) => {
18
+ let resource = Component$ReventlessCore.toPulumiResource(commandTopic);
19
+ return connect(LocalRuntimeEnvironment$ReventlessLocal.make(ComponentType$ReventlessCore.nameOpt(resource.__name, CommandTopic$ReventlessCore.componentType), handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined));
20
+ };
21
+ let forEventCollector = (handler, eventTopics, resources, param, param$1, eventCollector) => {
22
+ let resource = Component$ReventlessCore.toPulumiResource(eventCollector);
23
+ let name = ComponentType$ReventlessCore.nameOpt(resource.__name, EventCollector$ReventlessCore.componentType);
24
+ let opts_parent = resource;
25
+ let opts = {
26
+ parent: opts_parent
27
+ };
28
+ let runtime = LocalRuntimeEnvironment$ReventlessLocal.make(name, handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined);
29
+ EventCollectorChannel.connect(name, [{
30
+ channel: eventCollector.channel,
31
+ eventTopics: eventTopics,
32
+ resources: resources
33
+ }], runtime, opts);
34
+ };
35
+ let finish = () => {};
36
+ return {
37
+ CommandTopicChannel: CommandTopicChannel,
38
+ EventCollectorChannel: EventCollectorChannel,
39
+ forCommandGenerator: forCommandGenerator,
40
+ forCommandTopic: forCommandTopic,
41
+ forEventCollector: forEventCollector,
42
+ finish: finish
43
+ };
44
+ });
45
+ }
46
+
47
+ export {
48
+ Make,
49
+ }
50
+ /* Runtime-ReventlessCore Not a pure module */
@@ -0,0 +1,47 @@
1
+ // In-memory EventCollector runtime builder.
2
+ // Wires event collectors directly via the in-memory bus instead of Lambda + DynamoDB streams.
3
+
4
+ module Make = (
5
+ Bus: LocalBus.T,
6
+ EventCollectorChannel: ReventlessCore.EventCollector_Adapter.Channel
7
+ with type runtimeParts = LocalRuntimeEnvironment.parts,
8
+ ): (
9
+ ReventlessCore.EventCollectorRuntime_Builder.T
10
+ with type context = LocalRuntimeEnvironment.context
11
+ and type runtimeParts = LocalRuntimeEnvironment.parts
12
+ and module EventCollectorChannel = EventCollectorChannel
13
+ ) => {
14
+ type context = LocalRuntimeEnvironment.context
15
+ type runtimeParts = LocalRuntimeEnvironment.parts
16
+ module EventCollectorChannel = EventCollectorChannel
17
+
18
+ let forEventCollector = (
19
+ ~handler,
20
+ ~eventTopics,
21
+ ~resources,
22
+ ~memorySize as _=?,
23
+ ~timeout as _=?,
24
+ eventCollector,
25
+ ) => {
26
+ let resource = eventCollector->ReventlessCore.Component.toPulumiResource
27
+ let name =
28
+ resource.name->ReventlessCore.ComponentType.nameOpt(ReventlessCore.EventCollector.componentType)
29
+ let opts = {Pulumi.ComponentResource.parent: resource}
30
+ let runtime = LocalRuntimeEnvironment.make(
31
+ ~name,
32
+ ~handler=handler->Pulumi.Output.apply(h =>
33
+ h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
34
+ ),
35
+ )
36
+ let _connectResources = EventCollectorChannel.connect(
37
+ ~name,
38
+ ~channelSpecs=[
39
+ {channel: eventCollector->ReventlessCore.EventCollector_Adapter.channel, eventTopics, resources},
40
+ ],
41
+ ~runtime,
42
+ ~opts,
43
+ )
44
+ }
45
+
46
+ let finish = () => ()
47
+ }
@@ -0,0 +1,37 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Runtime$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/Runtime.res.mjs";
4
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
5
+ import * as ComponentType$ReventlessCore from "@reventlessdev/reventless-core/src/ComponentType.res.mjs";
6
+ import * as EventCollector$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventCollector/EventCollector.res.mjs";
7
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "./LocalRuntimeEnvironment.res.mjs";
8
+
9
+ function Make(Bus) {
10
+ return EventCollectorChannel => {
11
+ let forEventCollector = (handler, eventTopics, resources, param, param$1, eventCollector) => {
12
+ let resource = Component$ReventlessCore.toPulumiResource(eventCollector);
13
+ let name = ComponentType$ReventlessCore.nameOpt(resource.__name, EventCollector$ReventlessCore.componentType);
14
+ let opts_parent = resource;
15
+ let opts = {
16
+ parent: opts_parent
17
+ };
18
+ let runtime = LocalRuntimeEnvironment$ReventlessLocal.make(name, handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined);
19
+ EventCollectorChannel.connect(name, [{
20
+ channel: eventCollector.channel,
21
+ eventTopics: eventTopics,
22
+ resources: resources
23
+ }], runtime, opts);
24
+ };
25
+ let finish = () => {};
26
+ return {
27
+ EventCollectorChannel: EventCollectorChannel,
28
+ forEventCollector: forEventCollector,
29
+ finish: finish
30
+ };
31
+ };
32
+ }
33
+
34
+ export {
35
+ Make,
36
+ }
37
+ /* Runtime-ReventlessCore Not a pure module */
@@ -0,0 +1,11 @@
1
+ // In-memory PluginRuntime builder.
2
+ // Wraps PluginRuntime_Builder_Micro with LocalRuntimeEnvironment and LocalEventCollectorChannel.
3
+
4
+ module Make = (Bus: LocalBus.T) => {
5
+ module ECChannel = LocalEventCollectorChannel.Make(Bus)
6
+
7
+ include ReventlessCore.PluginRuntime_Builder_Micro.Make(
8
+ LocalRuntimeEnvironment,
9
+ ECChannel,
10
+ )
11
+ }
@@ -0,0 +1,30 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "./LocalRuntimeEnvironment.res.mjs";
4
+ import * as LocalEventCollectorChannel$ReventlessLocal from "../EventCollector/LocalEventCollectorChannel.res.mjs";
5
+ import * as PluginRuntime_Builder_Micro$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/PluginRuntime_Builder_Micro.res.mjs";
6
+
7
+ function Make(Bus) {
8
+ let ECChannel = LocalEventCollectorChannel$ReventlessLocal.Make(Bus);
9
+ let include = PluginRuntime_Builder_Micro$ReventlessCore.Make({
10
+ make: LocalRuntimeEnvironment$ReventlessLocal.make,
11
+ groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
12
+ extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
13
+ asEventHandler: prim => prim,
14
+ asEffectHandler: prim => prim
15
+ })(ECChannel);
16
+ return {
17
+ ECChannel: ECChannel,
18
+ EventCollectorChannel: include.EventCollectorChannel,
19
+ registerPluginName: include.registerPluginName,
20
+ forPluginEventCollector: include.forPluginEventCollector,
21
+ forPluginHeartbeat: include.forPluginHeartbeat,
22
+ forDcbCommandTopic: include.forDcbCommandTopic,
23
+ finish: include.finish
24
+ };
25
+ }
26
+
27
+ export {
28
+ Make,
29
+ }
30
+ /* LocalRuntimeEnvironment-ReventlessLocal Not a pure module */
@@ -0,0 +1,54 @@
1
+ // In-memory runtime environment.
2
+ // Instead of creating Lambda functions, stores the handler in a Deferred so consumers
3
+ // block until the handler is registered — eliminating the ref<option> race condition.
4
+ //
5
+ // subscriptionLatch is opened by EventCollectorChannel.connect once subscriptions are
6
+ // registered. Callers can await it before publishing to guarantee delivery.
7
+
8
+ type event = JSON.t
9
+ type context = unit
10
+ type handler = (JSON.t, unit) => promise<unit>
11
+ type parts = {
12
+ handlerDeferred: Deferred.t<handler, unit>,
13
+ subscriptionLatch: Latch.t,
14
+ }
15
+
16
+ // Coerce a polymorphic handler to return promise<unit> so we can call it from the bus.
17
+ // The return value is discarded — we only await for side effects.
18
+ external asUnitHandler: ((JSON.t, unit) => promise<'r>) => (JSON.t, unit) => promise<unit> =
19
+ "%identity"
20
+
21
+ let make = (
22
+ ~name as _: string,
23
+ ~handler: Pulumi.Output.t<ReventlessCore.Runtime.eventHandler<event, context, 'result>>,
24
+ ~memorySize as _=1024,
25
+ ~timeout as _=30,
26
+ ~opts as _=?,
27
+ ): ReventlessCore.Runtime.environment<parts> => {
28
+ let handlerDeferred = Deferred.make()->Effect.runSync
29
+ let subscriptionLatch = Effect.makeLatch(false)->Effect.runSync
30
+ // In Pulumi mock mode, Output.apply resolves in ~2 microtask ticks.
31
+ // Use runPromise (not runSync) so fiber wake-ups are properly scheduled.
32
+ let _ = handler->Pulumi.Output.apply(h => {
33
+ Deferred.succeed(handlerDeferred, h->asUnitHandler)->Effect.runPromise->ignore
34
+ })
35
+ {parts: {handlerDeferred, subscriptionLatch}, resources: []}
36
+ }
37
+
38
+ let groupBySource = (event: JSON.t) => {
39
+ let dict: dict<JSON.t> = Dict.make()
40
+ dict->Dict.set("inmemory", event)
41
+ dict
42
+ }
43
+
44
+ let extractCorrelationId = (event: event) =>
45
+ event
46
+ ->JSON.Decode.object
47
+ ->Option.flatMap(obj => obj->Dict.get("meta"))
48
+ ->Option.flatMap(JSON.Decode.object)
49
+ ->Option.flatMap(meta => meta->Dict.get("correlationId"))
50
+ ->Option.flatMap(JSON.Decode.string)
51
+
52
+ external asEventHandler: 'a => ReventlessCore.Runtime.eventHandler<event, context, 'r> = "%identity"
53
+ external asEffectHandler: 'a => ReventlessCore.Runtime.effectHandler<event, context, 'r, 'error> =
54
+ "%identity"
@@ -0,0 +1,40 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Deferred from "effect/Deferred";
7
+
8
+ function make(param, handler, $staropt$star, $staropt$star$1, param$1) {
9
+ $staropt$star !== undefined;
10
+ $staropt$star$1 !== undefined;
11
+ let handlerDeferred = Effect.runSync(Deferred.make());
12
+ let subscriptionLatch = Effect.runSync(Effect.makeLatch(false));
13
+ handler.apply(h => {
14
+ Effect.runPromise(Deferred.succeed(handlerDeferred, h));
15
+ });
16
+ return {
17
+ parts: {
18
+ handlerDeferred: handlerDeferred,
19
+ subscriptionLatch: subscriptionLatch
20
+ },
21
+ resources: []
22
+ };
23
+ }
24
+
25
+ function groupBySource(event) {
26
+ let dict = {};
27
+ dict["inmemory"] = event;
28
+ return dict;
29
+ }
30
+
31
+ function extractCorrelationId(event) {
32
+ return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(event), obj => obj["meta"]), Stdlib_JSON.Decode.object), meta => meta["correlationId"]), Stdlib_JSON.Decode.string);
33
+ }
34
+
35
+ export {
36
+ make,
37
+ groupBySource,
38
+ extractCorrelationId,
39
+ }
40
+ /* effect/Effect Not a pure module */
@@ -0,0 +1,102 @@
1
+ // In-memory ScheduledPublisher — satisfies Scheduler_Adapter.ScheduledPublisher.
2
+ //
3
+ // createSchedule: sets up a setInterval that fires Bus.publishEvent when the schedule triggers.
4
+ // deleteSchedule: clears the interval.
5
+ //
6
+ // The schedule.payload is published as the event body. For Single(…) schedules a
7
+ // one-shot setTimeout is used; all recurring rates use setInterval.
8
+ //
9
+ // Usage: create a Scheduler with Scheduler_Builder.Make(LocalScheduledPublisher.Make(Bus))
10
+ // and pass the resulting component to Plugin_Builder or Task_Builder.
11
+
12
+ module Make = (Bus: LocalBus.T) => {
13
+ type timerHandle
14
+
15
+ @val
16
+ external setIntervalJs: (unit => unit, int) => timerHandle = "setInterval"
17
+ @val
18
+ external setTimeoutJs: (unit => unit, int) => timerHandle = "setTimeout"
19
+ @val
20
+ external clearTimerJs: timerHandle => unit = "clearTimeout"
21
+
22
+ let activeTimers: ref<dict<timerHandle>> = ref(Dict.make())
23
+
24
+ let rateToMs = (rate: Reventless.Schedule.rate) =>
25
+ switch rate {
26
+ | Minutes(n) => n * 60 * 1000
27
+ | Hours(n) => n * 60 * 60 * 1000
28
+ | Days(n) => n * 24 * 60 * 60 * 1000
29
+ | Daily(_, _) => 24 * 60 * 60 * 1000
30
+ | Weekdays(_, _) => 24 * 60 * 60 * 1000
31
+ | WeekdaysAndSaturday(_, _) => 24 * 60 * 60 * 1000
32
+ | Single(_, _, _, _, _) => 0
33
+ }
34
+
35
+ let isSingleShot = rate =>
36
+ switch rate {
37
+ | Reventless.Schedule.Single(_, _, _, _, _) => true
38
+ | _ => false
39
+ }
40
+
41
+ let scheduleMeta: ReventlessCore.Message.meta = {
42
+ service: "Scheduler",
43
+ time: "",
44
+ ip: "",
45
+ user: "Scheduler",
46
+ msgId: "",
47
+ correlationId: "",
48
+ }
49
+
50
+ let make: ReventlessCore.Scheduler_Adapter.scheduledPublisherMaker = (~name as _, ~opts as _) => {
51
+ let createSchedule: ReventlessInfra.Scheduler.createSchedule = async (
52
+ channelResources,
53
+ schedule,
54
+ ) => {
55
+ let topicName = switch channelResources {
56
+ | [] => ""
57
+ | resources => (resources->Array.getUnsafe(0)).name
58
+ }
59
+ let payloadJson = switch schedule.payload->JSON.parseOrThrow {
60
+ | json => json
61
+ | exception _ => schedule.payload->JSON.Encode.string
62
+ }
63
+ let fire = () =>
64
+ Bus.publishEvent(topicName, "Scheduler", scheduleMeta, payloadJson)->ignore
65
+ let handle =
66
+ if schedule.rate->isSingleShot {
67
+ setTimeoutJs(fire, 0)
68
+ } else {
69
+ setIntervalJs(fire, rateToMs(schedule.rate))
70
+ }
71
+ activeTimers.contents->Dict.set(schedule.name, handle)
72
+ }
73
+
74
+ let deleteSchedule: ReventlessInfra.Scheduler.deleteSchedule = async (_, name) => {
75
+ switch activeTimers.contents->Dict.get(name) {
76
+ | Some(handle) =>
77
+ clearTimerJs(handle)
78
+ activeTimers.contents->Dict.delete(name)
79
+ | None => ()
80
+ }
81
+ }
82
+
83
+ {
84
+ resource: ReventlessInfra.Adapter.make(
85
+ ~name=""->Pulumi.Output.make,
86
+ ~id=""->Pulumi.Output.make,
87
+ ~urn=""->Pulumi.Output.make,
88
+ ~service="memory:InMemory"->Pulumi.Output.make,
89
+ ),
90
+ operations: ({
91
+ createSchedule,
92
+ deleteSchedule,
93
+ }: ReventlessInfra.Scheduler.operations)->Pulumi.Output.make,
94
+ }
95
+ }
96
+
97
+ // Clear all active timers — call in afterAll/afterEach for test isolation.
98
+ let reset = () => {
99
+ activeTimers.contents->Dict.valuesToArray->Array.forEach(clearTimerJs)
100
+ activeTimers.contents = Dict.make()
101
+ }
102
+ }