@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,19 @@
1
+ // StateChangeSlice builder — no platform-specific adapters needed.
2
+
3
+ module Make = (
4
+ Spec: Reventless.StateChangeSlice.Spec,
5
+ Behavior: Reventless.StateChangeSlice.Behavior with module Spec := Spec,
6
+ ) => {
7
+ module Inner = ReventlessCore.StateChangeSlice_Builder.Make(Spec, Behavior)
8
+ module Spec = Spec
9
+ module Behavior = Behavior
10
+ let isAsync = Inner.isAsync
11
+ type component = Inner.component
12
+ let make: (
13
+ ~dcbEventLog: ReventlessInfra.DcbEventLog.component,
14
+ ~publishJsons: Pulumi.Output.t<ReventlessInfra.CommandTopic.publishJsons>,
15
+ ~tagKeysByEventType: Dict.t<array<string>>=?,
16
+ ~crossPartitionTagKeys: array<string>=?,
17
+ ~opts: Pulumi.ComponentResource.options=?,
18
+ ) => component = Inner.make
19
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as StateChangeSlice_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/StateChangeSlice/StateChangeSlice_Builder.res.mjs";
4
+
5
+ function Make(Spec) {
6
+ return Behavior => {
7
+ let Inner = StateChangeSlice_Builder$ReventlessCore.Make(Spec)(Behavior);
8
+ return {
9
+ Inner: Inner,
10
+ Spec: Spec,
11
+ Behavior: Behavior,
12
+ isAsync: Inner.isAsync,
13
+ make: Inner.make
14
+ };
15
+ };
16
+ }
17
+
18
+ export {
19
+ Make,
20
+ }
21
+ /* StateChangeSlice_Builder-ReventlessCore Not a pure module */
@@ -0,0 +1,42 @@
1
+ // In-memory StateViewSlice builder.
2
+ // Wires in-memory adapters and delegates to the core ReventlessCore.StateViewSlice_Builder.
3
+
4
+ module Make = (Bus: LocalBus.T) => {
5
+ module RuntimeEnvironment = LocalRuntimeEnvironment
6
+ module EventCollectorChannel = LocalEventCollectorChannel.Make(Bus)
7
+ module EventCollectorRuntimeBuilder = LocalEventCollectorRuntime_Builder.Make(
8
+ Bus,
9
+ EventCollectorChannel,
10
+ )
11
+ module QueryDbStorage = QueryDbStorage_InMemory.Make(Bus)
12
+ module QueryDbResolvers = QueryDbResolvers_GraphQL.Make(Bus)
13
+
14
+ // InMemory api/apiRole are both unit
15
+ module Api = {
16
+ let api = () => ()
17
+ let apiRole = () => ()
18
+ }
19
+
20
+ module CoreMaker = ReventlessCore.StateViewSlice_Builder.Make(
21
+ RuntimeEnvironment,
22
+ QueryDbStorage,
23
+ QueryDbResolvers,
24
+ EventCollectorChannel,
25
+ EventCollectorRuntimeBuilder,
26
+ Api,
27
+ )
28
+
29
+ module Make = (
30
+ Spec: Reventless.StateViewSlice.Spec,
31
+ Projection: Reventless.StateViewSlice.Projection with module Spec := Spec,
32
+ ) => {
33
+ module Inner = CoreMaker.Make(Spec, Projection)
34
+ module Spec = Spec
35
+ module Projection = Projection
36
+ type component = Inner.component
37
+ let make = Inner.make
38
+ // Re-expose operations for test resolution
39
+ let operations: component => Pulumi.Output.t<ReventlessCore.StateViewSlice.operations> =
40
+ ReventlessCore.Component.operations
41
+ }
42
+ }
@@ -0,0 +1,58 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
4
+ import * as StateViewSlice_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/StateViewSlice/StateViewSlice_Builder.res.mjs";
5
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "../adapter/Runtime/LocalRuntimeEnvironment.res.mjs";
6
+ import * as QueryDbStorage_InMemory$ReventlessLocal from "../adapter/QueryDb/QueryDbStorage_InMemory.res.mjs";
7
+ import * as QueryDbResolvers_GraphQL$ReventlessLocal from "../adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs";
8
+ import * as LocalEventCollectorChannel$ReventlessLocal from "../adapter/EventCollector/LocalEventCollectorChannel.res.mjs";
9
+ import * as LocalEventCollectorRuntime_Builder$ReventlessLocal from "../adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs";
10
+
11
+ function Make(Bus) {
12
+ let EventCollectorChannel = LocalEventCollectorChannel$ReventlessLocal.Make(Bus);
13
+ let EventCollectorRuntimeBuilder = LocalEventCollectorRuntime_Builder$ReventlessLocal.Make(Bus)(EventCollectorChannel);
14
+ let QueryDbStorage = QueryDbStorage_InMemory$ReventlessLocal.Make(Bus);
15
+ let QueryDbResolvers = QueryDbResolvers_GraphQL$ReventlessLocal.Make(Bus);
16
+ let api = () => {};
17
+ let apiRole = () => {};
18
+ let Api = {
19
+ api: api,
20
+ apiRole: apiRole
21
+ };
22
+ let CoreMaker = StateViewSlice_Builder$ReventlessCore.Make({
23
+ make: LocalRuntimeEnvironment$ReventlessLocal.make,
24
+ groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
25
+ extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
26
+ asEventHandler: prim => prim,
27
+ asEffectHandler: prim => prim
28
+ })({
29
+ make: QueryDbStorage.make
30
+ })({
31
+ make: QueryDbResolvers.make
32
+ })(EventCollectorChannel)(EventCollectorRuntimeBuilder)(Api);
33
+ let Make$1 = Spec => (Projection => {
34
+ let Inner = CoreMaker.Make(Spec)(Projection);
35
+ return {
36
+ Inner: Inner,
37
+ Spec: Spec,
38
+ Projection: Projection,
39
+ make: Inner.make,
40
+ operations: Component$ReventlessCore.operations
41
+ };
42
+ });
43
+ return {
44
+ RuntimeEnvironment: undefined,
45
+ EventCollectorChannel: EventCollectorChannel,
46
+ EventCollectorRuntimeBuilder: EventCollectorRuntimeBuilder,
47
+ QueryDbStorage: QueryDbStorage,
48
+ QueryDbResolvers: QueryDbResolvers,
49
+ Api: Api,
50
+ CoreMaker: CoreMaker,
51
+ Make: Make$1
52
+ };
53
+ }
54
+
55
+ export {
56
+ Make,
57
+ }
58
+ /* Component-ReventlessCore Not a pure module */
@@ -0,0 +1,28 @@
1
+ // In-memory Task builder.
2
+
3
+ module Make = (Bus: LocalBus.T) => {
4
+ module RuntimeEnvironment = LocalRuntimeEnvironment
5
+ module EventCollectorChannel = LocalEventCollectorChannel.Make(Bus)
6
+ module EventCollectorRuntimeBuilder = LocalEventCollectorRuntime_Builder.Make(
7
+ Bus,
8
+ EventCollectorChannel,
9
+ )
10
+ module TaskRuntimeBuilder = ReventlessCore.TaskRuntime_Builder_PerBucket.Make(
11
+ RuntimeEnvironment,
12
+ LocalTaskBucket,
13
+ )
14
+ module SideEffectHandler = LocalSideEffectHandler
15
+
16
+ module Make = (
17
+ Spec: ReventlessCore.Task.Spec,
18
+ ): (ReventlessCore.Task.T with module Spec = Spec) =>
19
+ ReventlessCore.Task_Builder.Make(
20
+ Spec,
21
+ RuntimeEnvironment,
22
+ EventCollectorChannel,
23
+ EventCollectorRuntimeBuilder,
24
+ TaskRuntimeBuilder,
25
+ LocalTaskBucket,
26
+ SideEffectHandler,
27
+ )
28
+ }
@@ -0,0 +1,41 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Task_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/Task/Task_Builder.res.mjs";
4
+ import * as LocalTaskBucket$ReventlessLocal from "../adapter/Task/LocalTaskBucket.res.mjs";
5
+ import * as LocalSideEffectHandler$ReventlessLocal from "../adapter/LocalSideEffectHandler.res.mjs";
6
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "../adapter/Runtime/LocalRuntimeEnvironment.res.mjs";
7
+ import * as LocalEventCollectorChannel$ReventlessLocal from "../adapter/EventCollector/LocalEventCollectorChannel.res.mjs";
8
+ import * as TaskRuntime_Builder_PerBucket$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs";
9
+ import * as LocalEventCollectorRuntime_Builder$ReventlessLocal from "../adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs";
10
+
11
+ function Make(Bus) {
12
+ let EventCollectorChannel = LocalEventCollectorChannel$ReventlessLocal.Make(Bus);
13
+ let EventCollectorRuntimeBuilder = LocalEventCollectorRuntime_Builder$ReventlessLocal.Make(Bus)(EventCollectorChannel);
14
+ let TaskRuntimeBuilder = TaskRuntime_Builder_PerBucket$ReventlessCore.Make({
15
+ make: LocalRuntimeEnvironment$ReventlessLocal.make,
16
+ groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
17
+ extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
18
+ asEventHandler: prim => prim,
19
+ asEffectHandler: prim => prim
20
+ })(LocalTaskBucket$ReventlessLocal);
21
+ let Make$1 = Spec => Task_Builder$ReventlessCore.Make(Spec)({
22
+ make: LocalRuntimeEnvironment$ReventlessLocal.make,
23
+ groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
24
+ extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
25
+ asEventHandler: prim => prim,
26
+ asEffectHandler: prim => prim
27
+ })(EventCollectorChannel)(EventCollectorRuntimeBuilder)(TaskRuntimeBuilder)(LocalTaskBucket$ReventlessLocal)(LocalSideEffectHandler$ReventlessLocal);
28
+ return {
29
+ RuntimeEnvironment: undefined,
30
+ EventCollectorChannel: EventCollectorChannel,
31
+ EventCollectorRuntimeBuilder: EventCollectorRuntimeBuilder,
32
+ TaskRuntimeBuilder: TaskRuntimeBuilder,
33
+ SideEffectHandler: undefined,
34
+ Make: Make$1
35
+ };
36
+ }
37
+
38
+ export {
39
+ Make,
40
+ }
41
+ /* Task_Builder-ReventlessCore Not a pure module */
@@ -0,0 +1,3 @@
1
+ // Re-exported from ReventlessCore so that consuming packages (examples, app plugins)
2
+ // only need to depend on reventless-local, not reventless, for testing.
3
+ include ReventlessCore.CommandTopic
@@ -0,0 +1,55 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as CommandTopic$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic.res.mjs";
4
+
5
+ let componentType = CommandTopic$ReventlessCore.componentType;
6
+
7
+ let NotPublishedToChannel = CommandTopic$ReventlessCore.NotPublishedToChannel;
8
+
9
+ let acceptedResultChannel = CommandTopic$ReventlessCore.acceptedResultChannel;
10
+
11
+ let rejectedResultChannel = CommandTopic$ReventlessCore.rejectedResultChannel;
12
+
13
+ let reportAccepted = CommandTopic$ReventlessCore.reportAccepted;
14
+
15
+ let reportRejected = CommandTopic$ReventlessCore.reportRejected;
16
+
17
+ let commandOutcomeToJson = CommandTopic$ReventlessCore.commandOutcomeToJson;
18
+
19
+ let encodeCommandJson = CommandTopic$ReventlessCore.encodeCommandJson;
20
+
21
+ let runInlineAndCollect = CommandTopic$ReventlessCore.runInlineAndCollect;
22
+
23
+ let callHandlerWithArray = CommandTopic$ReventlessCore.callHandlerWithArray;
24
+
25
+ let extractTypeNamesFromSchema = CommandTopic$ReventlessCore.extractTypeNamesFromSchema;
26
+
27
+ let globalRegistry = CommandTopic$ReventlessCore.globalRegistry;
28
+
29
+ let registerHandler = CommandTopic$ReventlessCore.registerHandler;
30
+
31
+ let getHandlers = CommandTopic$ReventlessCore.getHandlers;
32
+
33
+ let toResolvedOutputs = CommandTopic$ReventlessCore.toResolvedOutputs;
34
+
35
+ let filter = CommandTopic$ReventlessCore.filter;
36
+
37
+ export {
38
+ componentType,
39
+ NotPublishedToChannel,
40
+ acceptedResultChannel,
41
+ rejectedResultChannel,
42
+ reportAccepted,
43
+ reportRejected,
44
+ commandOutcomeToJson,
45
+ encodeCommandJson,
46
+ runInlineAndCollect,
47
+ callHandlerWithArray,
48
+ extractTypeNamesFromSchema,
49
+ globalRegistry,
50
+ registerHandler,
51
+ getHandlers,
52
+ toResolvedOutputs,
53
+ filter,
54
+ }
55
+ /* CommandTopic-ReventlessCore Not a pure module */
@@ -0,0 +1,136 @@
1
+ // Mock in-memory DCB event log storage.
2
+ // Conforms to ReventlessCore.DcbEventLog_Adapter.storage.
3
+ // Extracted from DcbFixtures.makeMockStorage with reset() and failNextAppends.
4
+
5
+ open ReventlessCore
6
+
7
+ type publishedEvent = {
8
+ service: string,
9
+ meta: Reventless.Message.meta,
10
+ json: JSON.t,
11
+ }
12
+
13
+ type t = {
14
+ storage: DcbEventLog_Adapter.storage,
15
+ getEvents: unit => array<DcbEventLog_Adapter.rawSequencedEvent>,
16
+ publishedEvents: ref<array<publishedEvent>>,
17
+ mockPublishJson: ReventlessInfra.EventTopic.publishJson,
18
+ failNextAppends: ref<int>,
19
+ reset: unit => unit,
20
+ }
21
+
22
+ let posToInt = (pos: string) => pos->Int.fromString->Option.getOr(0)
23
+
24
+ let matchesQuery = (event: DcbEventLog_Adapter.rawSequencedEvent, query: Reventless.DcbTag.query) =>
25
+ if query->Array.length == 0 {
26
+ true
27
+ } else {
28
+ query->Array.some(queryItem => {
29
+ let typeMatch = switch queryItem.eventTypes {
30
+ | Some(types) => types->Array.includes(event.eventType)
31
+ | None => true
32
+ }
33
+ let tagMatch = switch queryItem.tags {
34
+ | Some(tags) =>
35
+ tags->Array.every(tag =>
36
+ event.tags->Array.some(et => et.key == tag.key && et.value == tag.value)
37
+ )
38
+ | None => true
39
+ }
40
+ typeMatch && tagMatch
41
+ })
42
+ }
43
+
44
+ let make = (~name="mock-dcb-log", ~indexes: array<string>=[], ~opts: Pulumi.CustomResourceOptions.t={}) => {
45
+ let _ = (name, indexes, opts)
46
+ let events: ref<array<DcbEventLog_Adapter.rawSequencedEvent>> = ref([])
47
+ let position = ref(0)
48
+ let publishedEventsRef: ref<array<publishedEvent>> = ref([])
49
+ let failNextAppends = ref(0)
50
+
51
+ let read = async (~query, ~after=?) => {
52
+ let filtered = events.contents->Array.filter(event => {
53
+ let afterMatch = switch after {
54
+ | Some(afterPos) => event.position->posToInt > afterPos->posToInt
55
+ | None => true
56
+ }
57
+ afterMatch && matchesQuery(event, query)
58
+ })
59
+ let headPosition =
60
+ events.contents
61
+ ->Array.get(events.contents->Array.length - 1)
62
+ ->Option.map(e => e.position)
63
+ {
64
+ DcbEventLog_Adapter.events: filtered,
65
+ ?headPosition,
66
+ }
67
+ }
68
+
69
+ let append = async (newEvents, ~condition=?) => {
70
+ if failNextAppends.contents > 0 {
71
+ failNextAppends := failNextAppends.contents - 1
72
+ Error("mock append failure")
73
+ } else {
74
+ let conflictDetected = switch condition {
75
+ | Some(cond: Reventless.DcbTag.appendCondition) =>
76
+ events.contents->Array.some(event => {
77
+ let afterMatch = switch cond.after {
78
+ | Some(pos) => event.position->posToInt > pos->posToInt
79
+ | None => true
80
+ }
81
+ afterMatch && matchesQuery(event, cond.query)
82
+ })
83
+ | None => false
84
+ }
85
+ if conflictDetected {
86
+ Error("conflict: condition check failed")
87
+ } else {
88
+ let storedEvents = newEvents->Array.map((event: DcbEventLog_Adapter.rawStoredEvent) => {
89
+ position := position.contents + 1
90
+ let pos = position.contents->Int.toString
91
+ {
92
+ DcbEventLog_Adapter.position: pos,
93
+ eventType: event.eventType,
94
+ data: event.data,
95
+ tags: event.tags,
96
+ meta: event.meta,
97
+ recordedAt: Message.nowAsISOString(),
98
+ }
99
+ })
100
+ events := events.contents->Array.concat(storedEvents)
101
+ Ok(position.contents->Int.toString)
102
+ }
103
+ }
104
+ }
105
+
106
+ let mockPublishJson: ReventlessInfra.EventTopic.publishJson = async (service, meta, json) => {
107
+ publishedEventsRef := publishedEventsRef.contents->Array.concat([{service, meta, json}])
108
+ }
109
+
110
+ let readStream = (~query, ~after=?, ~strongConsistency as _=?) =>
111
+ Effect.promise(() => read(~query, ~after?))
112
+ ->Effect.map(result => result.events)
113
+ ->Stream.fromEffect
114
+ ->Stream.flatMap(arr => Stream.fromIterable(arr))
115
+
116
+ let storage: DcbEventLog_Adapter.storage = {
117
+ resources: [],
118
+ operations: Pulumi.Output.make({DcbEventLog_Adapter.read, append, readStream}),
119
+ }
120
+
121
+ let reset = () => {
122
+ events := []
123
+ position := 0
124
+ publishedEventsRef := []
125
+ failNextAppends := 0
126
+ }
127
+
128
+ {
129
+ storage,
130
+ getEvents: () => events.contents,
131
+ publishedEvents: publishedEventsRef,
132
+ mockPublishJson,
133
+ failNextAppends,
134
+ reset,
135
+ }
136
+ }
@@ -0,0 +1,146 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Int from "@rescript/runtime/lib/es6/Stdlib_Int.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Stream from "effect/Stream";
7
+ import * as Pulumi from "@pulumi/pulumi";
8
+ import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
9
+
10
+ function posToInt(pos) {
11
+ return Stdlib_Option.getOr(Stdlib_Int.fromString(pos, undefined), 0);
12
+ }
13
+
14
+ function matchesQuery(event, query) {
15
+ if (query.length === 0) {
16
+ return true;
17
+ } else {
18
+ return query.some(queryItem => {
19
+ let types = queryItem.eventTypes;
20
+ let typeMatch = types !== undefined ? types.includes(event.eventType) : true;
21
+ let tags = queryItem.tags;
22
+ let tagMatch = tags !== undefined ? tags.every(tag => event.tags.some(et => {
23
+ if (et.key === tag.key) {
24
+ return et.value === tag.value;
25
+ } else {
26
+ return false;
27
+ }
28
+ })) : true;
29
+ if (typeMatch) {
30
+ return tagMatch;
31
+ } else {
32
+ return false;
33
+ }
34
+ });
35
+ }
36
+ }
37
+
38
+ function make(nameOpt, indexesOpt, optsOpt) {
39
+ let events = {
40
+ contents: []
41
+ };
42
+ let position = {
43
+ contents: 0
44
+ };
45
+ let publishedEventsRef = {
46
+ contents: []
47
+ };
48
+ let failNextAppends = {
49
+ contents: 0
50
+ };
51
+ let read = async (query, after) => {
52
+ let filtered = events.contents.filter(event => {
53
+ let afterMatch = after !== undefined ? posToInt(event.position) > posToInt(after) : true;
54
+ if (afterMatch) {
55
+ return matchesQuery(event, query);
56
+ } else {
57
+ return false;
58
+ }
59
+ });
60
+ let headPosition = Stdlib_Option.map(events.contents[events.contents.length - 1 | 0], e => e.position);
61
+ return {
62
+ events: filtered,
63
+ headPosition: headPosition
64
+ };
65
+ };
66
+ let append = async (newEvents, condition) => {
67
+ if (failNextAppends.contents > 0) {
68
+ failNextAppends.contents = failNextAppends.contents - 1 | 0;
69
+ return {
70
+ TAG: "Error",
71
+ _0: "mock append failure"
72
+ };
73
+ }
74
+ let conflictDetected = condition !== undefined ? events.contents.some(event => {
75
+ let pos = condition.after;
76
+ let afterMatch = pos !== undefined ? posToInt(event.position) > posToInt(pos) : true;
77
+ if (afterMatch) {
78
+ return matchesQuery(event, condition.query);
79
+ } else {
80
+ return false;
81
+ }
82
+ }) : false;
83
+ if (conflictDetected) {
84
+ return {
85
+ TAG: "Error",
86
+ _0: "conflict: condition check failed"
87
+ };
88
+ }
89
+ let storedEvents = newEvents.map(event => {
90
+ position.contents = position.contents + 1 | 0;
91
+ let pos = position.contents.toString();
92
+ return {
93
+ position: pos,
94
+ eventType: event.eventType,
95
+ data: event.data,
96
+ tags: event.tags,
97
+ meta: event.meta,
98
+ recordedAt: Message$ReventlessCore.nowAsISOString()
99
+ };
100
+ });
101
+ events.contents = events.contents.concat(storedEvents);
102
+ return {
103
+ TAG: "Ok",
104
+ _0: position.contents.toString()
105
+ };
106
+ };
107
+ let mockPublishJson = async (service, meta, json) => {
108
+ publishedEventsRef.contents = publishedEventsRef.contents.concat([{
109
+ service: service,
110
+ meta: meta,
111
+ json: json
112
+ }]);
113
+ };
114
+ let readStream = (query, after, param) => Stream.flatMap(Stream.fromEffect(Effect.map(Effect.promise(() => read(query, after)), result => result.events)), arr => Stream.fromIterable(arr));
115
+ let storage_resources = [];
116
+ let storage_operations = Pulumi.output({
117
+ read: read,
118
+ append: append,
119
+ readStream: readStream
120
+ });
121
+ let storage = {
122
+ resources: storage_resources,
123
+ operations: storage_operations
124
+ };
125
+ let reset = () => {
126
+ events.contents = [];
127
+ position.contents = 0;
128
+ publishedEventsRef.contents = [];
129
+ failNextAppends.contents = 0;
130
+ };
131
+ return {
132
+ storage: storage,
133
+ getEvents: () => events.contents,
134
+ publishedEvents: publishedEventsRef,
135
+ mockPublishJson: mockPublishJson,
136
+ failNextAppends: failNextAppends,
137
+ reset: reset
138
+ };
139
+ }
140
+
141
+ export {
142
+ posToInt,
143
+ matchesQuery,
144
+ make,
145
+ }
146
+ /* effect/Effect Not a pure module */
@@ -0,0 +1,57 @@
1
+ // Mock in-memory event log storage.
2
+ // Conforms to ReventlessCore.EventLog_Adapter.storage.
3
+ // Adds reset() and failNextAppends counter for test isolation and failure injection.
4
+
5
+ type t = {
6
+ storage: ReventlessCore.EventLog_Adapter.storage,
7
+ failNextAppends: ref<int>,
8
+ reset: unit => unit,
9
+ }
10
+
11
+ let make = (~name as _="mock-event-log", ~opts as _: Pulumi.CustomResourceOptions.t={}) => {
12
+ let events: ref<dict<array<JSON.t>>> = ref(Dict.make())
13
+ let failNextAppends = ref(0)
14
+
15
+ let append: ReventlessCore.EventLog.append<string, JSON.t> = async (_seqNr, id, jsons) => {
16
+ if failNextAppends.contents > 0 {
17
+ failNextAppends := failNextAppends.contents - 1
18
+ Error("mock append failure")
19
+ } else {
20
+ let existing = events.contents->Dict.get(id)->Option.getOr([])
21
+ events.contents->Dict.set(id, existing->Array.concat(jsons))
22
+ Ok()
23
+ }
24
+ }
25
+
26
+ let replay: ReventlessCore.EventLog.replay<string, JSON.t> = async id => {
27
+ events.contents->Dict.get(id)->Option.getOr([])
28
+ }
29
+
30
+ let replayStream: string => Stream.t<JSON.t, string, unit> = id =>
31
+ events.contents->Dict.get(id)->Option.getOr([])->Stream.fromIterable
32
+
33
+ let appendStream: ReventlessCore.EventLog.appendStream<string, JSON.t> = (_startingSeqNr, id, stream) =>
34
+ stream->Stream.runForEach(json =>
35
+ Effect.sync(() => {
36
+ let existing = events.contents->Dict.get(id)->Option.getOr([])
37
+ events.contents->Dict.set(id, existing->Array.concat([json]))
38
+ })
39
+ )
40
+
41
+ let storage: ReventlessCore.EventLog_Adapter.storage = {
42
+ resources: [],
43
+ operations: Pulumi.Output.make({
44
+ ReventlessCore.EventLog_Adapter.append,
45
+ replay,
46
+ replayStream,
47
+ appendStream,
48
+ }),
49
+ }
50
+
51
+ let reset = () => {
52
+ events := Dict.make()
53
+ failNextAppends := 0
54
+ }
55
+
56
+ {storage, failNextAppends, reset}
57
+ }
@@ -0,0 +1,65 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Stream from "effect/Stream";
6
+ import * as Pulumi from "@pulumi/pulumi";
7
+
8
+ function make($staropt$star, $staropt$star$1) {
9
+ $staropt$star !== undefined;
10
+ if ($staropt$star$1 === undefined) {
11
+
12
+ }
13
+ let events = {
14
+ contents: {}
15
+ };
16
+ let failNextAppends = {
17
+ contents: 0
18
+ };
19
+ let append = async (_seqNr, id, jsons) => {
20
+ if (failNextAppends.contents > 0) {
21
+ failNextAppends.contents = failNextAppends.contents - 1 | 0;
22
+ return {
23
+ TAG: "Error",
24
+ _0: "mock append failure"
25
+ };
26
+ }
27
+ let existing = Stdlib_Option.getOr(events.contents[id], []);
28
+ events.contents[id] = existing.concat(jsons);
29
+ return {
30
+ TAG: "Ok",
31
+ _0: undefined
32
+ };
33
+ };
34
+ let replay = async id => Stdlib_Option.getOr(events.contents[id], []);
35
+ let replayStream = id => Stream.fromIterable(Stdlib_Option.getOr(events.contents[id], []));
36
+ let appendStream = (_startingSeqNr, id, stream) => Stream.runForEach(stream, json => Effect.sync(() => {
37
+ let existing = Stdlib_Option.getOr(events.contents[id], []);
38
+ events.contents[id] = existing.concat([json]);
39
+ }));
40
+ let storage_resources = [];
41
+ let storage_operations = Pulumi.output({
42
+ append: append,
43
+ replay: replay,
44
+ replayStream: replayStream,
45
+ appendStream: appendStream
46
+ });
47
+ let storage = {
48
+ resources: storage_resources,
49
+ operations: storage_operations
50
+ };
51
+ let reset = () => {
52
+ events.contents = {};
53
+ failNextAppends.contents = 0;
54
+ };
55
+ return {
56
+ storage: storage,
57
+ failNextAppends: failNextAppends,
58
+ reset: reset
59
+ };
60
+ }
61
+
62
+ export {
63
+ make,
64
+ }
65
+ /* effect/Effect Not a pure module */