@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.
- package/CHANGELOG.md +1197 -0
- package/LICENSE +202 -0
- package/__mocks__/emptyModule.js +2 -0
- package/__mocks__/nodeSqlite.mjs +6 -0
- package/package.json +67 -0
- package/rescript.json +39 -0
- package/src/Platform.res +2162 -0
- package/src/Platform.res.mjs +3389 -0
- package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
- package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
- package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
- package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
- package/src/adapter/Auth/LocalAuth.res +239 -0
- package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
- package/src/adapter/Auth/UserStore.res +134 -0
- package/src/adapter/Auth/UserStore.res.mjs +146 -0
- package/src/adapter/Backend.res +46 -0
- package/src/adapter/Backend.res.mjs +66 -0
- package/src/adapter/BackendState.res +34 -0
- package/src/adapter/BackendState.res.mjs +42 -0
- package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
- package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
- package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
- package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
- package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
- package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
- package/src/adapter/Counter/LocalCounterHandler.res +42 -0
- package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
- package/src/adapter/DomainGraphQL_Server.res +565 -0
- package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
- package/src/adapter/DomainMCP_Server.res +369 -0
- package/src/adapter/DomainMCP_Server.res.mjs +358 -0
- package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
- package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
- package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
- package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
- package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
- package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
- package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
- package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
- package/src/adapter/GraphQL_Server.res +6 -0
- package/src/adapter/GraphQL_Server.res.mjs +154 -0
- package/src/adapter/GraphQL_ServerInstance.res +310 -0
- package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
- package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
- package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
- package/src/adapter/LocalBus.res +498 -0
- package/src/adapter/LocalBus.res.mjs +1011 -0
- package/src/adapter/LocalPluginSpec.res +16 -0
- package/src/adapter/LocalPluginSpec.res.mjs +33 -0
- package/src/adapter/LocalSideEffectHandler.res +44 -0
- package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
- package/src/adapter/MCP_Server.res +4 -0
- package/src/adapter/MCP_Server.res.mjs +67 -0
- package/src/adapter/MCP_ServerInstance.res +362 -0
- package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
- package/src/adapter/PlatformGraphQL_Server.res +75 -0
- package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
- package/src/adapter/PlatformMCP_Server.res +23 -0
- package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
- package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
- package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
- package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
- package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
- package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
- package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
- package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
- package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
- package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
- package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
- package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
- package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
- package/src/adapter/SqliteDriver.res +52 -0
- package/src/adapter/SqliteDriver.res.mjs +76 -0
- package/src/adapter/SqliteDriver.resi +31 -0
- package/src/adapter/Task/LocalTaskBucket.res +75 -0
- package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
- package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
- package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
- package/src/components/Aggregate_Builder.res +55 -0
- package/src/components/Aggregate_Builder.res.mjs +140 -0
- package/src/components/AutomationSlice_Builder.res +41 -0
- package/src/components/AutomationSlice_Builder.res.mjs +57 -0
- package/src/components/Counter_Builder.res +14 -0
- package/src/components/Counter_Builder.res.mjs +32 -0
- package/src/components/DcbEventLog_Builder.res +18 -0
- package/src/components/DcbEventLog_Builder.res.mjs +24 -0
- package/src/components/ExtensionPoint_Builder.res +25 -0
- package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
- package/src/components/InboundTranslationSlice_Builder.res +34 -0
- package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
- package/src/components/OutboundTranslationSlice_Builder.res +43 -0
- package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
- package/src/components/Plugin_Builder.res +37 -0
- package/src/components/Plugin_Builder.res.mjs +67 -0
- package/src/components/ReadModel_Builder.res +47 -0
- package/src/components/ReadModel_Builder.res.mjs +54 -0
- package/src/components/StateChangeSlice_Builder.res +19 -0
- package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
- package/src/components/StateViewSlice_Builder.res +42 -0
- package/src/components/StateViewSlice_Builder.res.mjs +58 -0
- package/src/components/Task_Builder.res +28 -0
- package/src/components/Task_Builder.res.mjs +41 -0
- package/src/reexport/CommandTopic.res +3 -0
- package/src/reexport/CommandTopic.res.mjs +55 -0
- package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
- package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
- package/src/test/Mocks/MockEventLogStorage.res +57 -0
- package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
- package/src/test/Mocks/MockPublisher.res +29 -0
- package/src/test/Mocks/MockPublisher.res.mjs +28 -0
- package/src/test/Mocks/MockQueryDbStorage.res +104 -0
- package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
- package/src/test/TestRunner.res +96 -0
- package/src/test/TestRunner.res.mjs +71 -0
- package/tests/SplitApiFixtures.res +84 -0
- package/tests/SplitApiFixtures.res.mjs +88 -0
- package/tests/SplitApiTest.res +102 -0
- package/tests/SplitApiTest.res.mjs +82 -0
- package/tests/TestFixtures.res +54 -0
- package/tests/TestFixtures.res.mjs +65 -0
- package/tests/adapter/BackendParityTest.res +94 -0
- package/tests/adapter/BackendParityTest.res.mjs +96 -0
- package/tests/adapter/CollectNEventsTest.res +82 -0
- package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
- package/tests/adapter/CommandAuthorizationTest.res +200 -0
- package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
- package/tests/adapter/CommandTopicChannelTest.res +174 -0
- package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
- package/tests/adapter/CounterHandlerTest.res +113 -0
- package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
- package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
- package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
- package/tests/adapter/DcbEventLogStorageTest.res +187 -0
- package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
- package/tests/adapter/EventCollectorChannelTest.res +166 -0
- package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
- package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
- package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
- package/tests/adapter/EventTapTest.res +102 -0
- package/tests/adapter/EventTapTest.res.mjs +94 -0
- package/tests/adapter/EventTopicPublisherTest.res +76 -0
- package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
- package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
- package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
- package/tests/adapter/HeartbeatRunnerTest.res +136 -0
- package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
- package/tests/adapter/LocalAuthHttpTest.res +224 -0
- package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
- package/tests/adapter/LocalAuthLoginTest.res +180 -0
- package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
- package/tests/adapter/LocalAuthTest.res +106 -0
- package/tests/adapter/LocalAuthTest.res.mjs +145 -0
- package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
- package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
- package/tests/adapter/LocalBusBoundedTest.res +157 -0
- package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
- package/tests/adapter/LocalBusPubSubTest.res +81 -0
- package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
- package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
- package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
- package/tests/adapter/QueryDbListResolverTest.res +361 -0
- package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
- package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
- package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
- package/tests/adapter/QueryDbStorageTest.res +171 -0
- package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
- package/tests/adapter/QueryEngineTest.res +152 -0
- package/tests/adapter/QueryEngineTest.res.mjs +148 -0
- package/tests/adapter/ScheduledPublisherTest.res +199 -0
- package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
- package/tests/adapter/SortKey_FilterTest.res +103 -0
- package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
- package/tests/adapter/SqliteDriverTest.res +86 -0
- package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
- package/tests/adapter/TaskBucketSqliteTest.res +44 -0
- package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
- package/tests/adapter/TaskBucketTest.res +106 -0
- package/tests/adapter/TaskBucketTest.res.mjs +118 -0
- package/tests/components/aggregate/AggregateFixtures.res +78 -0
- package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
- package/tests/components/aggregate/AggregateTest.res +129 -0
- package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
- package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
- package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
- package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
- package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
- package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
- package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
- package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
- package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
- package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
- package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
- package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
- package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
- package/tests/components/commandtopic/CommandTopicTest.res +55 -0
- package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
- package/tests/components/counter/CounterFixtures.res +42 -0
- package/tests/components/counter/CounterFixtures.res.mjs +34 -0
- package/tests/components/counter/CounterTest.res +46 -0
- package/tests/components/counter/CounterTest.res.mjs +61 -0
- package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
- package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
- package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
- package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
- package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
- package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
- package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
- package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
- package/tests/components/dcb/DcbFixtures.res +145 -0
- package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
- package/tests/components/dcb/DcbTest.res +55 -0
- package/tests/components/dcb/DcbTest.res.mjs +55 -0
- package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
- package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
- package/tests/components/eventcollector/EventCollectorTest.res +37 -0
- package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
- package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
- package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
- package/tests/components/eventlog/EventLogConflictTest.res +86 -0
- package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
- package/tests/components/eventlog/EventLogFixtures.res +52 -0
- package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
- package/tests/components/eventlog/EventLogStreamTest.res +98 -0
- package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
- package/tests/components/eventlog/EventLogTest.res +53 -0
- package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
- package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
- package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
- package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
- package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
- package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
- package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
- package/tests/components/eventtopic/EventTopicTest.res +35 -0
- package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
- package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
- package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
- package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
- package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
- package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
- package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
- package/tests/components/heartbeat/HeartbeatTest.res +67 -0
- package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
- package/tests/components/querydb/QueryDbFixtures.res +39 -0
- package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
- package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
- package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
- package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
- package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
- package/tests/components/querydb/QueryDbTest.res +81 -0
- package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
- package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
- package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
- package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
- package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
- package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
- package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
- package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
- package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
- package/tests/components/readmodel/ReadModelFixtures.res +138 -0
- package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
- package/tests/components/readmodel/ReadModelTest.res +46 -0
- package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
- package/tests/components/scheduler/SchedulerFixtures.res +59 -0
- package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
- package/tests/components/scheduler/SchedulerTest.res +76 -0
- package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
- package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
- package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
- package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
- package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
- package/tests/components/task/TaskFixtures.res +87 -0
- package/tests/components/task/TaskFixtures.res.mjs +82 -0
- package/tests/components/task/TaskTest.res +98 -0
- package/tests/components/task/TaskTest.res.mjs +46 -0
- package/tests/plugin/PluginBehavior_GWT.res +146 -0
- package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
- package/tests/plugin/Plugin_Fixtures.res +61 -0
- package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
- package/tests/plugin/PluginsProjection_GWT.res +95 -0
- package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
- package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
- package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
- 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,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 */
|