@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,161 @@
1
+ // Integration test: Bus events + QueryDb writes → yoga PubSub → subscription delivery.
2
+ //
3
+ // Phase 6 verification (Sources A and B).
4
+ // Source C (mutation-triggered) is not covered: in-memory mutation resolvers would
5
+ // need to cross-publish to the subscription PubSub, which is future work.
6
+ //
7
+ // The test subscribes to the yoga PubSub topic directly (rather than going through
8
+ // a real WebSocket connection) — this validates the bus→PubSub bridge, which is the
9
+ // integration Reventless owns. yoga's own graphql-ws transport is framework territory.
10
+
11
+ @@warning("-44")
12
+
13
+ open JestGlobals
14
+
15
+ let _ = TestRunner.setup()
16
+
17
+ // AsyncIterable.next() binding. yoga's PubSub returns `{value: JSON.t, done: bool}`.
18
+ type asyncIterResult = {value: JSON.t, done: bool}
19
+ @send external iterNext: 'a => promise<asyncIterResult> = "next"
20
+
21
+ @val external setTimeout: (unit => unit, int) => int = "setTimeout"
22
+
23
+ // Start consuming an AsyncIterable eagerly so its listener registers before
24
+ // the publisher fires. Returns a Promise resolving to the first message
25
+ // (or null on timeout / iterator close / error). yoga's Repeater-based
26
+ // AsyncIterable registers its push callback lazily on first next() — so this
27
+ // must be called (and then yieldTick awaited) before publishing.
28
+ let startConsumer = (iter: 'iter, timeoutMs: int): promise<Null.t<JSON.t>> => {
29
+ let timeoutP = Promise.make((resolve, _) => {
30
+ let _: int = setTimeout(() => resolve(Null.null), timeoutMs)
31
+ })
32
+ let consumeP = async () =>
33
+ try {
34
+ let result = await iter->iterNext
35
+ result.done ? Null.null : result.value->Null.make
36
+ } catch {
37
+ | _ => Null.null
38
+ }
39
+ Promise.race([timeoutP, consumeP()])
40
+ }
41
+
42
+ // Yield one macrotask so the consumer above has registered its push listener.
43
+ let yieldTick = (): promise<unit> =>
44
+ Promise.make((resolve, _) => {
45
+ let _: int = setTimeout(() => resolve(), 10)
46
+ })
47
+
48
+ let testMeta: ReventlessCore.Message.meta = {
49
+ service: "test",
50
+ time: "2025-01-01T00:00:00Z",
51
+ ip: "127.0.0.1",
52
+ user: "test-user",
53
+ msgId: "msg-1",
54
+ correlationId: "corr-1",
55
+ }
56
+
57
+ describe("LocalGraphQL_SubscriptionResolvers", () => {
58
+ beforeEach(() => {
59
+ LocalGraphQL_SubscriptionResolvers.reset()
60
+ })
61
+
62
+ describe("Source B — state-change bridge", () => {
63
+ testPromise("Bus.publishStateChange → yoga PubSub subscriber receives descriptor", async () => {
64
+ module TestBus = LocalBus.Make()
65
+
66
+ // Wire the bridge before subscribing, so the bus callback publishes to the PubSub.
67
+ LocalGraphQL_SubscriptionResolvers.bridgeSourceB(
68
+ ~subscribeToStateChanges=TestBus.subscribeToStateChanges,
69
+ ~readModelName="Product",
70
+ ~returnTypeName="CatalogProduct",
71
+ )
72
+
73
+ // Start the consumer BEFORE publishing — yoga's PubSub drops messages
74
+ // on topics whose AsyncIterable listener isn't registered yet.
75
+ let ps = LocalGraphQL_SubscriptionResolvers.getPubSub()
76
+ let iter = ps->GraphqlYoga.pubSubSubscribe("onCatalogProduct_stateChanged")
77
+ let consumerPromise = startConsumer(iter, 1000)
78
+ await yieldTick() // ensure listener is registered before publish
79
+
80
+ // Bus payload is now the change descriptor (Phase 8) matching the
81
+ // AWS StateTopic Lambda output shape: {changeKind, id, sortKeyValue?}.
82
+ let state = JSON.Encode.object(
83
+ Dict.fromArray([
84
+ ("id", JSON.Encode.string("prod-1")),
85
+ ("name", JSON.Encode.string("Widget")),
86
+ ("updatedAt", JSON.Encode.string("2026-05-19T12:00:00Z")),
87
+ ]),
88
+ )
89
+ let descriptor = LocalBus.makeStateChangeDescriptor(
90
+ ~changeKind="Updated",
91
+ ~id="prod-1",
92
+ ~state=Some(state),
93
+ )
94
+ TestBus.publishStateChange(~name="Product", ~descriptor)
95
+
96
+ let received = await consumerPromise
97
+ switch received->Null.toOption {
98
+ | Some(msg) => expect(msg)->toEqual(descriptor)
99
+ | None => expect("onCatalogProduct_stateChanged: timed out")->toBe("received")
100
+ }
101
+ })
102
+
103
+ testPromise("state change for unregistered ReadModel → no publish", async () => {
104
+ module TestBus = LocalBus.Make()
105
+
106
+ LocalGraphQL_SubscriptionResolvers.bridgeSourceB(
107
+ ~subscribeToStateChanges=TestBus.subscribeToStateChanges,
108
+ ~readModelName="Product",
109
+ ~returnTypeName="CatalogProduct",
110
+ )
111
+
112
+ let ps = LocalGraphQL_SubscriptionResolvers.getPubSub()
113
+ let iter = ps->GraphqlYoga.pubSubSubscribe("onCatalogProduct_stateChanged")
114
+ let consumerPromise = startConsumer(iter, 300)
115
+ await yieldTick()
116
+
117
+ // Publish for a DIFFERENT ReadModel — should NOT reach our topic.
118
+ let foreignDescriptor = LocalBus.makeStateChangeDescriptor(
119
+ ~changeKind="Updated",
120
+ ~id="cat-1",
121
+ ~state=Some(JSON.Encode.object(Dict.fromArray([("id", JSON.Encode.string("cat-1"))]))),
122
+ )
123
+ TestBus.publishStateChange(~name="Category", ~descriptor=foreignDescriptor)
124
+
125
+ let received = await consumerPromise
126
+ expect(received->Null.toOption)->toEqual(None)
127
+ })
128
+ })
129
+
130
+ describe("Source A — event-stream bridge", () => {
131
+ testPromise("Bus.publishEvent → yoga PubSub subscriber receives event", async () => {
132
+ module TestBus = LocalBus.Make()
133
+
134
+ LocalGraphQL_SubscriptionResolvers.bridgeSourceA(
135
+ ~subscribeToEvents=TestBus.subscribeToEvents,
136
+ ~displayName="Catalog",
137
+ ~busTopicName="catalog-events",
138
+ )
139
+
140
+ let ps = LocalGraphQL_SubscriptionResolvers.getPubSub()
141
+ let iter = ps->GraphqlYoga.pubSubSubscribe("onCatalogEventLog_eventAppended")
142
+ let consumerPromise = startConsumer(iter, 1000)
143
+ await yieldTick()
144
+
145
+ let event = JSON.Encode.object(
146
+ Dict.fromArray([
147
+ ("eventType", JSON.Encode.string("ProductAdded")),
148
+ ("id", JSON.Encode.string("prod-1")),
149
+ ("name", JSON.Encode.string("Widget")),
150
+ ]),
151
+ )
152
+ await TestBus.publishEvent("catalog-events", "svc", testMeta, event)
153
+
154
+ let received = await consumerPromise
155
+ switch received->Null.toOption {
156
+ | Some(msg) => expect(msg)->toEqual(event)
157
+ | None => expect("onCatalogEventLog_eventAppended: timed out")->toBe("received")
158
+ }
159
+ })
160
+ })
161
+ })
@@ -0,0 +1,134 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
4
+ import * as LocalBus$ReventlessLocal from "../../src/adapter/LocalBus.res.mjs";
5
+ import * as TestRunner$ReventlessLocal from "../../src/test/TestRunner.res.mjs";
6
+ import * as LocalGraphQL_SubscriptionResolvers$ReventlessLocal from "../../src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs";
7
+
8
+ TestRunner$ReventlessLocal.setup();
9
+
10
+ function startConsumer(iter, timeoutMs) {
11
+ let timeoutP = new Promise((resolve, param) => {
12
+ setTimeout(() => resolve(null), timeoutMs);
13
+ });
14
+ let consumeP = async () => {
15
+ try {
16
+ let result = await iter.next();
17
+ if (result.done) {
18
+ return null;
19
+ } else {
20
+ return result.value;
21
+ }
22
+ } catch (exn) {
23
+ return null;
24
+ }
25
+ };
26
+ return Promise.race([
27
+ timeoutP,
28
+ consumeP()
29
+ ]);
30
+ }
31
+
32
+ function yieldTick() {
33
+ return new Promise((resolve, param) => {
34
+ setTimeout(() => resolve(), 10);
35
+ });
36
+ }
37
+
38
+ let testMeta = {
39
+ service: "test",
40
+ time: "2025-01-01T00:00:00Z",
41
+ ip: "127.0.0.1",
42
+ user: "test-user",
43
+ msgId: "msg-1",
44
+ correlationId: "corr-1"
45
+ };
46
+
47
+ globalThis.describe("LocalGraphQL_SubscriptionResolvers", () => {
48
+ globalThis.beforeEach(() => LocalGraphQL_SubscriptionResolvers$ReventlessLocal.reset());
49
+ globalThis.describe("Source B — state-change bridge", () => {
50
+ globalThis.test("Bus.publishStateChange → yoga PubSub subscriber receives descriptor", async () => {
51
+ let TestBus = LocalBus$ReventlessLocal.Make({});
52
+ LocalGraphQL_SubscriptionResolvers$ReventlessLocal.bridgeSourceB(TestBus.subscribeToStateChanges, "Product", "CatalogProduct");
53
+ let ps = LocalGraphQL_SubscriptionResolvers$ReventlessLocal.getPubSub();
54
+ let iter = ps.subscribe("onCatalogProduct_stateChanged");
55
+ let consumerPromise = startConsumer(iter, 1000);
56
+ await yieldTick();
57
+ let state = Object.fromEntries([
58
+ [
59
+ "id",
60
+ "prod-1"
61
+ ],
62
+ [
63
+ "name",
64
+ "Widget"
65
+ ],
66
+ [
67
+ "updatedAt",
68
+ "2026-05-19T12:00:00Z"
69
+ ]
70
+ ]);
71
+ let descriptor = LocalBus$ReventlessLocal.makeStateChangeDescriptor("Updated", "prod-1", state);
72
+ TestBus.publishStateChange("Product", descriptor);
73
+ let received = await consumerPromise;
74
+ if (received !== null) {
75
+ globalThis.expect(received).toEqual(descriptor);
76
+ } else {
77
+ globalThis.expect("onCatalogProduct_stateChanged: timed out").toBe("received");
78
+ }
79
+ });
80
+ globalThis.test("state change for unregistered ReadModel → no publish", async () => {
81
+ let TestBus = LocalBus$ReventlessLocal.Make({});
82
+ LocalGraphQL_SubscriptionResolvers$ReventlessLocal.bridgeSourceB(TestBus.subscribeToStateChanges, "Product", "CatalogProduct");
83
+ let ps = LocalGraphQL_SubscriptionResolvers$ReventlessLocal.getPubSub();
84
+ let iter = ps.subscribe("onCatalogProduct_stateChanged");
85
+ let consumerPromise = startConsumer(iter, 300);
86
+ await yieldTick();
87
+ let foreignDescriptor = LocalBus$ReventlessLocal.makeStateChangeDescriptor("Updated", "cat-1", Object.fromEntries([[
88
+ "id",
89
+ "cat-1"
90
+ ]]));
91
+ TestBus.publishStateChange("Category", foreignDescriptor);
92
+ let received = await consumerPromise;
93
+ globalThis.expect(received === null ? undefined : Primitive_option.some(received)).toEqual(undefined);
94
+ });
95
+ });
96
+ globalThis.describe("Source A — event-stream bridge", () => {
97
+ globalThis.test("Bus.publishEvent → yoga PubSub subscriber receives event", async () => {
98
+ let TestBus = LocalBus$ReventlessLocal.Make({});
99
+ LocalGraphQL_SubscriptionResolvers$ReventlessLocal.bridgeSourceA(TestBus.subscribeToEvents, "Catalog", "catalog-events");
100
+ let ps = LocalGraphQL_SubscriptionResolvers$ReventlessLocal.getPubSub();
101
+ let iter = ps.subscribe("onCatalogEventLog_eventAppended");
102
+ let consumerPromise = startConsumer(iter, 1000);
103
+ await yieldTick();
104
+ let event = Object.fromEntries([
105
+ [
106
+ "eventType",
107
+ "ProductAdded"
108
+ ],
109
+ [
110
+ "id",
111
+ "prod-1"
112
+ ],
113
+ [
114
+ "name",
115
+ "Widget"
116
+ ]
117
+ ]);
118
+ await TestBus.publishEvent("catalog-events", "svc", testMeta, event);
119
+ let received = await consumerPromise;
120
+ if (received !== null) {
121
+ globalThis.expect(received).toEqual(event);
122
+ } else {
123
+ globalThis.expect("onCatalogEventLog_eventAppended: timed out").toBe("received");
124
+ }
125
+ });
126
+ });
127
+ });
128
+
129
+ export {
130
+ startConsumer,
131
+ yieldTick,
132
+ testMeta,
133
+ }
134
+ /* Not a pure module */
@@ -0,0 +1,136 @@
1
+ // Unit tests for LocalHeartbeatRunner.
2
+ // Uses fake timers to verify that the heartbeat interval fires the runtime handler.
3
+
4
+ open JestGlobals
5
+
6
+ // ─────────────────────────────────────────────────────────────
7
+ // Fake timer bindings
8
+ // ─────────────────────────────────────────────────────────────
9
+
10
+ type jestObj
11
+ @module("@jest/globals") external jest: jestObj = "jest"
12
+ @send external useFakeTimers: jestObj => unit = "useFakeTimers"
13
+ @send external useRealTimers: jestObj => unit = "useRealTimers"
14
+ @send external advanceTimersByTime: (jestObj, int) => unit = "advanceTimersByTime"
15
+
16
+ // In Jest ESM mode, jest global is only available inside callbacks (not at module top level).
17
+ let _ = beforeAll(() => {
18
+ jest->useFakeTimers
19
+ })
20
+
21
+ // ─────────────────────────────────────────────────────────────
22
+ // Restore real timers and clear heartbeat intervals after all tests
23
+ // ─────────────────────────────────────────────────────────────
24
+
25
+ let _ = afterAll(() => {
26
+ LocalHeartbeatRunner.reset()
27
+ jest->useRealTimers
28
+ })
29
+
30
+ // ─────────────────────────────────────────────────────────────
31
+ // Helper: build a minimal runtime with a completed handler Deferred
32
+ // ─────────────────────────────────────────────────────────────
33
+
34
+ let makeRuntime = (
35
+ handler: LocalRuntimeEnvironment.handler,
36
+ ): ReventlessCore.Runtime.environment<LocalHeartbeatRunner.runtimeParts> => {
37
+ let handlerDeferred: Deferred.t<LocalRuntimeEnvironment.handler, unit> =
38
+ Deferred.make()->Effect.runSync
39
+ // Complete before any fiber waits — runSync is safe here
40
+ Deferred.succeed(handlerDeferred, handler)->Effect.runSync->ignore
41
+ {
42
+ parts: {
43
+ handlerDeferred,
44
+ subscriptionLatch: Effect.makeLatch(false)->Effect.runSync,
45
+ },
46
+ resources: [],
47
+ }
48
+ }
49
+
50
+ describe("LocalHeartbeatRunner", () => {
51
+ describe("make", () => {
52
+ testPromise("after advanceTimersByTime(timeout * 60 * 1000), handler is called", async () => {
53
+ let count: ref<int> = ref(0)
54
+ let runtime = makeRuntime(async (_, _) => {
55
+ count := count.contents + 1
56
+ })
57
+ let _runner = LocalHeartbeatRunner.make(
58
+ ~name="hb-test",
59
+ ~remoteChannel=Obj.magic(()),
60
+ ~timeout=1,
61
+ ~runtime,
62
+ ~opts={},
63
+ )
64
+ jest->advanceTimersByTime(1 * 60 * 1000)
65
+ // Give the Effect.runPromise microtask one tick to complete
66
+ let _ = await Promise.resolve()
67
+ expect(count.contents)->toBe(1)
68
+ LocalHeartbeatRunner.reset()
69
+ })
70
+
71
+ testPromise("handler fires again on each subsequent interval", async () => {
72
+ let count: ref<int> = ref(0)
73
+ let runtime = makeRuntime(async (_, _) => {
74
+ count := count.contents + 1
75
+ })
76
+ let _runner = LocalHeartbeatRunner.make(
77
+ ~name="hb-test-2",
78
+ ~remoteChannel=Obj.magic(()),
79
+ ~timeout=2,
80
+ ~runtime,
81
+ ~opts={},
82
+ )
83
+ jest->advanceTimersByTime(2 * 60 * 1000)
84
+ let _ = await Promise.resolve()
85
+ jest->advanceTimersByTime(2 * 60 * 1000)
86
+ let _ = await Promise.resolve()
87
+ expect(count.contents)->toBe(2)
88
+ LocalHeartbeatRunner.reset()
89
+ })
90
+
91
+ testPromise("unresolved Deferred does not crash when interval fires", async () => {
92
+ // Deferred intentionally left incomplete — simulates handler not yet registered.
93
+ // Effect.runPromise stays pending (no crash); test verifies no exception.
94
+ let handlerDeferred: Deferred.t<LocalRuntimeEnvironment.handler, unit> =
95
+ Deferred.make()->Effect.runSync
96
+ let runtime: ReventlessCore.Runtime.environment<LocalHeartbeatRunner.runtimeParts> = {
97
+ parts: {
98
+ handlerDeferred,
99
+ subscriptionLatch: Effect.makeLatch(false)->Effect.runSync,
100
+ },
101
+ resources: [],
102
+ }
103
+ let _runner = LocalHeartbeatRunner.make(
104
+ ~name="hb-no-handler",
105
+ ~remoteChannel=Obj.magic(()),
106
+ ~timeout=1,
107
+ ~runtime,
108
+ ~opts={},
109
+ )
110
+ jest->advanceTimersByTime(1 * 60 * 1000)
111
+ expect(true)->toBe(true)
112
+ LocalHeartbeatRunner.reset()
113
+ // Complete the Deferred to avoid open handle — interval is already cleared
114
+ Deferred.succeed(handlerDeferred, async (_, _) => ())->Effect.runSync->ignore
115
+ })
116
+ })
117
+
118
+ describe("reset", () => {
119
+ testPromise("clears all intervals; subsequent advance does not fire handler", async () => {
120
+ let count: ref<int> = ref(0)
121
+ let runtime = makeRuntime(async (_, _) => {
122
+ count := count.contents + 1
123
+ })
124
+ let _runner = LocalHeartbeatRunner.make(
125
+ ~name="hb-reset",
126
+ ~remoteChannel=Obj.magic(()),
127
+ ~timeout=1,
128
+ ~runtime,
129
+ ~opts={},
130
+ )
131
+ LocalHeartbeatRunner.reset()
132
+ jest->advanceTimersByTime(1 * 60 * 1000)
133
+ expect(count.contents)->toBe(0)
134
+ })
135
+ })
136
+ })
@@ -0,0 +1,96 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Globals from "@jest/globals";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Deferred from "effect/Deferred";
6
+ import * as LocalHeartbeatRunner$ReventlessLocal from "../../src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs";
7
+
8
+ globalThis.beforeAll(() => {
9
+ Globals.jest.useFakeTimers();
10
+ });
11
+
12
+ globalThis.afterAll(() => {
13
+ LocalHeartbeatRunner$ReventlessLocal.reset();
14
+ Globals.jest.useRealTimers();
15
+ });
16
+
17
+ function makeRuntime(handler) {
18
+ let handlerDeferred = Effect.runSync(Deferred.make());
19
+ Effect.runSync(Deferred.succeed(handlerDeferred, handler));
20
+ return {
21
+ parts: {
22
+ handlerDeferred: handlerDeferred,
23
+ subscriptionLatch: Effect.runSync(Effect.makeLatch(false))
24
+ },
25
+ resources: []
26
+ };
27
+ }
28
+
29
+ globalThis.describe("LocalHeartbeatRunner", () => {
30
+ globalThis.describe("make", () => {
31
+ globalThis.test("after advanceTimersByTime(timeout * 60 * 1000), handler is called", async () => {
32
+ let count = {
33
+ contents: 0
34
+ };
35
+ let runtime = makeRuntime(async (param, param$1) => {
36
+ count.contents = count.contents + 1 | 0;
37
+ });
38
+ LocalHeartbeatRunner$ReventlessLocal.make("hb-test", undefined, 1, runtime, {});
39
+ Globals.jest.advanceTimersByTime(60000);
40
+ await Promise.resolve();
41
+ globalThis.expect(count.contents).toBe(1);
42
+ return LocalHeartbeatRunner$ReventlessLocal.reset();
43
+ });
44
+ globalThis.test("handler fires again on each subsequent interval", async () => {
45
+ let count = {
46
+ contents: 0
47
+ };
48
+ let runtime = makeRuntime(async (param, param$1) => {
49
+ count.contents = count.contents + 1 | 0;
50
+ });
51
+ LocalHeartbeatRunner$ReventlessLocal.make("hb-test-2", undefined, 2, runtime, {});
52
+ Globals.jest.advanceTimersByTime(120000);
53
+ await Promise.resolve();
54
+ Globals.jest.advanceTimersByTime(120000);
55
+ await Promise.resolve();
56
+ globalThis.expect(count.contents).toBe(2);
57
+ return LocalHeartbeatRunner$ReventlessLocal.reset();
58
+ });
59
+ globalThis.test("unresolved Deferred does not crash when interval fires", async () => {
60
+ let handlerDeferred = Effect.runSync(Deferred.make());
61
+ let runtime_parts = {
62
+ handlerDeferred: handlerDeferred,
63
+ subscriptionLatch: Effect.runSync(Effect.makeLatch(false))
64
+ };
65
+ let runtime_resources = [];
66
+ let runtime = {
67
+ parts: runtime_parts,
68
+ resources: runtime_resources
69
+ };
70
+ LocalHeartbeatRunner$ReventlessLocal.make("hb-no-handler", undefined, 1, runtime, {});
71
+ Globals.jest.advanceTimersByTime(60000);
72
+ globalThis.expect(true).toBe(true);
73
+ LocalHeartbeatRunner$ReventlessLocal.reset();
74
+ Effect.runSync(Deferred.succeed(handlerDeferred, async (param, param$1) => {}));
75
+ });
76
+ });
77
+ globalThis.describe("reset", () => {
78
+ globalThis.test("clears all intervals; subsequent advance does not fire handler", async () => {
79
+ let count = {
80
+ contents: 0
81
+ };
82
+ let runtime = makeRuntime(async (param, param$1) => {
83
+ count.contents = count.contents + 1 | 0;
84
+ });
85
+ LocalHeartbeatRunner$ReventlessLocal.make("hb-reset", undefined, 1, runtime, {});
86
+ LocalHeartbeatRunner$ReventlessLocal.reset();
87
+ Globals.jest.advanceTimersByTime(60000);
88
+ globalThis.expect(count.contents).toBe(0);
89
+ });
90
+ });
91
+ });
92
+
93
+ export {
94
+ makeRuntime,
95
+ }
96
+ /* Not a pure module */