@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,46 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
|
|
4
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
5
|
+
|
|
6
|
+
function getSk(item, skField) {
|
|
7
|
+
return Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(item), d => d[skField]), Stdlib_JSON.Decode.string), "");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function apply(items, skField, prefix, from, to_, eq, reverseOpt, limit, offsetOpt) {
|
|
11
|
+
let reverse = reverseOpt !== undefined ? reverseOpt : false;
|
|
12
|
+
let offset = offsetOpt !== undefined ? offsetOpt : 0;
|
|
13
|
+
let filtered = items.filter(item => {
|
|
14
|
+
let sk = getSk(item, skField);
|
|
15
|
+
let okPrefix = Stdlib_Option.getOr(Stdlib_Option.map(prefix, p => sk.startsWith(p)), true);
|
|
16
|
+
let okFrom = Stdlib_Option.getOr(Stdlib_Option.map(from, f => sk >= f), true);
|
|
17
|
+
let okTo = Stdlib_Option.getOr(Stdlib_Option.map(to_, t => sk <= t), true);
|
|
18
|
+
let okEq = Stdlib_Option.getOr(Stdlib_Option.map(eq, e => sk === e), true);
|
|
19
|
+
if (okPrefix && okFrom && okTo) {
|
|
20
|
+
return okEq;
|
|
21
|
+
} else {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
let ordered = reverse ? filtered.toReversed() : filtered;
|
|
26
|
+
let sliced = ordered.slice(offset, ordered.length);
|
|
27
|
+
let match = limit !== undefined ? [
|
|
28
|
+
sliced.slice(0, limit),
|
|
29
|
+
sliced.length > limit
|
|
30
|
+
] : [
|
|
31
|
+
sliced,
|
|
32
|
+
false
|
|
33
|
+
];
|
|
34
|
+
let page = match[0];
|
|
35
|
+
let nextToken = match[1] ? (offset + page.length | 0).toString() : undefined;
|
|
36
|
+
return {
|
|
37
|
+
items: page,
|
|
38
|
+
nextToken: nextToken
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
getSk,
|
|
44
|
+
apply,
|
|
45
|
+
}
|
|
46
|
+
/* No side effect */
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// In-memory QueryEngine — uses Bus storage registry for real scan/query.
|
|
2
|
+
// This is a Make(Bus) functor; callers must first create
|
|
3
|
+
// module QueryEngine = LocalQueryEngine.Make(Bus)
|
|
4
|
+
// and then pass QueryEngine as QueryEngineAdapter to Plugin_Builder.Make or Platform_Admin.Make.
|
|
5
|
+
|
|
6
|
+
open Reventless
|
|
7
|
+
|
|
8
|
+
module Make = (Bus: LocalBus.T) => {
|
|
9
|
+
let valueToString = value =>
|
|
10
|
+
switch value {
|
|
11
|
+
| QueryEngine.String(s) => s
|
|
12
|
+
| QueryEngine.Int(i) => i->Int.toString
|
|
13
|
+
| QueryEngine.Bool(b) => b ? "true" : "false"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let make: ReventlessCore.QueryDb_Adapter.queryEngineMaker = _allQueryDbs =>
|
|
17
|
+
Pulumi.Output.make({
|
|
18
|
+
QueryEngine.scan: async (~readModelName, ~filterConfigs as _, ~limit) =>
|
|
19
|
+
switch Bus.getQueryDbStream(readModelName) {
|
|
20
|
+
| Some(makeStream) =>
|
|
21
|
+
await makeStream()->Stream.take(limit)->Stream.runCollect->Effect.runPromise
|
|
22
|
+
| None =>
|
|
23
|
+
// Backward compat: fall back to array scan if no stream registered
|
|
24
|
+
switch Bus.getQueryDbScan(readModelName) {
|
|
25
|
+
| Some(scanAll) => scanAll()
|
|
26
|
+
| None => []
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
query: async (
|
|
30
|
+
~readModelName,
|
|
31
|
+
~key=?,
|
|
32
|
+
~id,
|
|
33
|
+
~subIdConfig as _=?,
|
|
34
|
+
~filterConfigs as _=?,
|
|
35
|
+
~ascending as _=?,
|
|
36
|
+
~limit=?,
|
|
37
|
+
) => {
|
|
38
|
+
let keyStr = switch key {
|
|
39
|
+
| Some(k) => k
|
|
40
|
+
| None => id->valueToString
|
|
41
|
+
}
|
|
42
|
+
switch Bus.getQueryDb(readModelName) {
|
|
43
|
+
| Some(ops) =>
|
|
44
|
+
let stream = ops.loadStream(keyStr)
|
|
45
|
+
let bounded = switch limit {
|
|
46
|
+
| Some(n) => stream->Stream.take(n)
|
|
47
|
+
| None => stream
|
|
48
|
+
}
|
|
49
|
+
await bounded
|
|
50
|
+
->Stream.runCollect
|
|
51
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
52
|
+
->Effect.runPromise
|
|
53
|
+
| None => []
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
})
|
|
57
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Stream$1 from "effect/Stream";
|
|
6
|
+
import * as Pulumi from "@pulumi/pulumi";
|
|
7
|
+
|
|
8
|
+
function Make(Bus) {
|
|
9
|
+
let valueToString = value => {
|
|
10
|
+
switch (value.TAG) {
|
|
11
|
+
case "String" :
|
|
12
|
+
return value._0;
|
|
13
|
+
case "Int" :
|
|
14
|
+
return value._0.toString();
|
|
15
|
+
case "Bool" :
|
|
16
|
+
if (value._0) {
|
|
17
|
+
return "true";
|
|
18
|
+
} else {
|
|
19
|
+
return "false";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
let make = _allQueryDbs => Pulumi.output({
|
|
24
|
+
scan: async (readModelName, param, limit) => {
|
|
25
|
+
let makeStream = Bus.getQueryDbStream(readModelName);
|
|
26
|
+
if (makeStream !== undefined) {
|
|
27
|
+
return await Effect.runPromise(Stream.runCollect(Stream$1.take(makeStream(), limit)));
|
|
28
|
+
}
|
|
29
|
+
let scanAll = Bus.getQueryDbScan(readModelName);
|
|
30
|
+
if (scanAll !== undefined) {
|
|
31
|
+
return scanAll();
|
|
32
|
+
} else {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
query: async (readModelName, key, id, param, param$1, param$2, limit) => {
|
|
37
|
+
let keyStr = key !== undefined ? key : valueToString(id);
|
|
38
|
+
let ops = Bus.getQueryDb(readModelName);
|
|
39
|
+
if (ops === undefined) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
let stream = ops.loadStream(keyStr);
|
|
43
|
+
let bounded = limit !== undefined ? Stream$1.take(stream, limit) : stream;
|
|
44
|
+
return await Effect.runPromise(Effect.catchAll(Stream.runCollect(bounded), param => Effect.succeed([])));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
valueToString: valueToString,
|
|
49
|
+
make: make
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
Make,
|
|
55
|
+
}
|
|
56
|
+
/* Stream Not a pure module */
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// In-memory aggregate runtime builder.
|
|
2
|
+
// Instead of creating Lambda functions and SQS/DynamoDB event source mappings,
|
|
3
|
+
// wires handlers directly via the in-memory bus.
|
|
4
|
+
|
|
5
|
+
module Make = (
|
|
6
|
+
Bus: LocalBus.T,
|
|
7
|
+
CommandTopicChannel: ReventlessCore.CommandTopic_Adapter.Channel
|
|
8
|
+
with type runtimeParts = LocalRuntimeEnvironment.parts,
|
|
9
|
+
EventCollectorChannel: ReventlessCore.EventCollector_Adapter.Channel
|
|
10
|
+
with type runtimeParts = LocalRuntimeEnvironment.parts,
|
|
11
|
+
): (
|
|
12
|
+
ReventlessCore.AggregateRuntime_Builder.T
|
|
13
|
+
with type context = LocalRuntimeEnvironment.context
|
|
14
|
+
and type runtimeParts = LocalRuntimeEnvironment.parts
|
|
15
|
+
and module CommandTopicChannel = CommandTopicChannel
|
|
16
|
+
and module EventCollectorChannel = EventCollectorChannel
|
|
17
|
+
) => {
|
|
18
|
+
type context = LocalRuntimeEnvironment.context
|
|
19
|
+
type runtimeParts = LocalRuntimeEnvironment.parts
|
|
20
|
+
module CommandTopicChannel = CommandTopicChannel
|
|
21
|
+
module EventCollectorChannel = EventCollectorChannel
|
|
22
|
+
|
|
23
|
+
let forCommandGenerator = (
|
|
24
|
+
~handler,
|
|
25
|
+
~connect,
|
|
26
|
+
~memorySize as _=?,
|
|
27
|
+
~timeout as _=?,
|
|
28
|
+
commandGenerator,
|
|
29
|
+
) => {
|
|
30
|
+
// Call connect(~runtime) so CommandGeneratorResolvers_GraphQL.make registers SDL+resolvers.
|
|
31
|
+
// The runtime's handlerRef is unused by the GraphQL resolver path, but we create a proper
|
|
32
|
+
// runtime so the type is satisfied and future callers that need handlerRef will work.
|
|
33
|
+
let resource = commandGenerator->ReventlessCore.Component.toPulumiResource
|
|
34
|
+
let runtime = LocalRuntimeEnvironment.make(
|
|
35
|
+
~name=resource.name->ReventlessCore.ComponentType.nameOpt(
|
|
36
|
+
ReventlessCore.CommandGenerator.componentType,
|
|
37
|
+
),
|
|
38
|
+
~handler=handler->Pulumi.Output.apply(h =>
|
|
39
|
+
h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
|
|
40
|
+
),
|
|
41
|
+
)
|
|
42
|
+
connect(~runtime)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let forCommandTopic = (
|
|
46
|
+
~handler,
|
|
47
|
+
~connect,
|
|
48
|
+
~memorySize as _=?,
|
|
49
|
+
~timeout as _=?,
|
|
50
|
+
commandTopic,
|
|
51
|
+
) => {
|
|
52
|
+
let resource = commandTopic->ReventlessCore.Component.toPulumiResource
|
|
53
|
+
let runtime = LocalRuntimeEnvironment.make(
|
|
54
|
+
~name=resource.name->ReventlessCore.ComponentType.nameOpt(ReventlessCore.CommandTopic.componentType),
|
|
55
|
+
~handler=handler->Pulumi.Output.apply(h =>
|
|
56
|
+
h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
|
|
57
|
+
),
|
|
58
|
+
)
|
|
59
|
+
connect(~runtime)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let forEventCollector = (
|
|
63
|
+
~handler,
|
|
64
|
+
~eventTopics,
|
|
65
|
+
~resources,
|
|
66
|
+
~memorySize as _=?,
|
|
67
|
+
~timeout as _=?,
|
|
68
|
+
eventCollector,
|
|
69
|
+
) => {
|
|
70
|
+
let resource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
71
|
+
let name =
|
|
72
|
+
resource.name->ReventlessCore.ComponentType.nameOpt(ReventlessCore.EventCollector.componentType)
|
|
73
|
+
let opts = {Pulumi.ComponentResource.parent: resource}
|
|
74
|
+
let runtime = LocalRuntimeEnvironment.make(
|
|
75
|
+
~name,
|
|
76
|
+
~handler=handler->Pulumi.Output.apply(h =>
|
|
77
|
+
h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
|
|
78
|
+
),
|
|
79
|
+
)
|
|
80
|
+
let _connectResources = EventCollectorChannel.connect(
|
|
81
|
+
~name,
|
|
82
|
+
~channelSpecs=[
|
|
83
|
+
{channel: eventCollector->ReventlessCore.EventCollector_Adapter.channel, eventTopics, resources},
|
|
84
|
+
],
|
|
85
|
+
~runtime,
|
|
86
|
+
~opts,
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let finish = () => ()
|
|
91
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Runtime$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/Runtime.res.mjs";
|
|
4
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
5
|
+
import * as CommandTopic$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic.res.mjs";
|
|
6
|
+
import * as ComponentType$ReventlessCore from "@reventlessdev/reventless-core/src/ComponentType.res.mjs";
|
|
7
|
+
import * as EventCollector$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventCollector/EventCollector.res.mjs";
|
|
8
|
+
import * as CommandGenerator$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandGenerator/CommandGenerator.res.mjs";
|
|
9
|
+
import * as LocalRuntimeEnvironment$ReventlessLocal from "./LocalRuntimeEnvironment.res.mjs";
|
|
10
|
+
|
|
11
|
+
function Make(Bus) {
|
|
12
|
+
return CommandTopicChannel => (EventCollectorChannel => {
|
|
13
|
+
let forCommandGenerator = (handler, connect, param, param$1, commandGenerator) => {
|
|
14
|
+
let resource = Component$ReventlessCore.toPulumiResource(commandGenerator);
|
|
15
|
+
return connect(LocalRuntimeEnvironment$ReventlessLocal.make(ComponentType$ReventlessCore.nameOpt(resource.__name, CommandGenerator$ReventlessCore.componentType), handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined));
|
|
16
|
+
};
|
|
17
|
+
let forCommandTopic = (handler, connect, param, param$1, commandTopic) => {
|
|
18
|
+
let resource = Component$ReventlessCore.toPulumiResource(commandTopic);
|
|
19
|
+
return connect(LocalRuntimeEnvironment$ReventlessLocal.make(ComponentType$ReventlessCore.nameOpt(resource.__name, CommandTopic$ReventlessCore.componentType), handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined));
|
|
20
|
+
};
|
|
21
|
+
let forEventCollector = (handler, eventTopics, resources, param, param$1, eventCollector) => {
|
|
22
|
+
let resource = Component$ReventlessCore.toPulumiResource(eventCollector);
|
|
23
|
+
let name = ComponentType$ReventlessCore.nameOpt(resource.__name, EventCollector$ReventlessCore.componentType);
|
|
24
|
+
let opts_parent = resource;
|
|
25
|
+
let opts = {
|
|
26
|
+
parent: opts_parent
|
|
27
|
+
};
|
|
28
|
+
let runtime = LocalRuntimeEnvironment$ReventlessLocal.make(name, handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined);
|
|
29
|
+
EventCollectorChannel.connect(name, [{
|
|
30
|
+
channel: eventCollector.channel,
|
|
31
|
+
eventTopics: eventTopics,
|
|
32
|
+
resources: resources
|
|
33
|
+
}], runtime, opts);
|
|
34
|
+
};
|
|
35
|
+
let finish = () => {};
|
|
36
|
+
return {
|
|
37
|
+
CommandTopicChannel: CommandTopicChannel,
|
|
38
|
+
EventCollectorChannel: EventCollectorChannel,
|
|
39
|
+
forCommandGenerator: forCommandGenerator,
|
|
40
|
+
forCommandTopic: forCommandTopic,
|
|
41
|
+
forEventCollector: forEventCollector,
|
|
42
|
+
finish: finish
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
Make,
|
|
49
|
+
}
|
|
50
|
+
/* Runtime-ReventlessCore Not a pure module */
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// In-memory EventCollector runtime builder.
|
|
2
|
+
// Wires event collectors directly via the in-memory bus instead of Lambda + DynamoDB streams.
|
|
3
|
+
|
|
4
|
+
module Make = (
|
|
5
|
+
Bus: LocalBus.T,
|
|
6
|
+
EventCollectorChannel: ReventlessCore.EventCollector_Adapter.Channel
|
|
7
|
+
with type runtimeParts = LocalRuntimeEnvironment.parts,
|
|
8
|
+
): (
|
|
9
|
+
ReventlessCore.EventCollectorRuntime_Builder.T
|
|
10
|
+
with type context = LocalRuntimeEnvironment.context
|
|
11
|
+
and type runtimeParts = LocalRuntimeEnvironment.parts
|
|
12
|
+
and module EventCollectorChannel = EventCollectorChannel
|
|
13
|
+
) => {
|
|
14
|
+
type context = LocalRuntimeEnvironment.context
|
|
15
|
+
type runtimeParts = LocalRuntimeEnvironment.parts
|
|
16
|
+
module EventCollectorChannel = EventCollectorChannel
|
|
17
|
+
|
|
18
|
+
let forEventCollector = (
|
|
19
|
+
~handler,
|
|
20
|
+
~eventTopics,
|
|
21
|
+
~resources,
|
|
22
|
+
~memorySize as _=?,
|
|
23
|
+
~timeout as _=?,
|
|
24
|
+
eventCollector,
|
|
25
|
+
) => {
|
|
26
|
+
let resource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
27
|
+
let name =
|
|
28
|
+
resource.name->ReventlessCore.ComponentType.nameOpt(ReventlessCore.EventCollector.componentType)
|
|
29
|
+
let opts = {Pulumi.ComponentResource.parent: resource}
|
|
30
|
+
let runtime = LocalRuntimeEnvironment.make(
|
|
31
|
+
~name,
|
|
32
|
+
~handler=handler->Pulumi.Output.apply(h =>
|
|
33
|
+
h->LocalRuntimeEnvironment.asEffectHandler->ReventlessCore.Runtime.runEffectHandler
|
|
34
|
+
),
|
|
35
|
+
)
|
|
36
|
+
let _connectResources = EventCollectorChannel.connect(
|
|
37
|
+
~name,
|
|
38
|
+
~channelSpecs=[
|
|
39
|
+
{channel: eventCollector->ReventlessCore.EventCollector_Adapter.channel, eventTopics, resources},
|
|
40
|
+
],
|
|
41
|
+
~runtime,
|
|
42
|
+
~opts,
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let finish = () => ()
|
|
47
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Runtime$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/Runtime.res.mjs";
|
|
4
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
5
|
+
import * as ComponentType$ReventlessCore from "@reventlessdev/reventless-core/src/ComponentType.res.mjs";
|
|
6
|
+
import * as EventCollector$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventCollector/EventCollector.res.mjs";
|
|
7
|
+
import * as LocalRuntimeEnvironment$ReventlessLocal from "./LocalRuntimeEnvironment.res.mjs";
|
|
8
|
+
|
|
9
|
+
function Make(Bus) {
|
|
10
|
+
return EventCollectorChannel => {
|
|
11
|
+
let forEventCollector = (handler, eventTopics, resources, param, param$1, eventCollector) => {
|
|
12
|
+
let resource = Component$ReventlessCore.toPulumiResource(eventCollector);
|
|
13
|
+
let name = ComponentType$ReventlessCore.nameOpt(resource.__name, EventCollector$ReventlessCore.componentType);
|
|
14
|
+
let opts_parent = resource;
|
|
15
|
+
let opts = {
|
|
16
|
+
parent: opts_parent
|
|
17
|
+
};
|
|
18
|
+
let runtime = LocalRuntimeEnvironment$ReventlessLocal.make(name, handler.apply(Runtime$ReventlessCore.runEffectHandler), undefined, undefined, undefined);
|
|
19
|
+
EventCollectorChannel.connect(name, [{
|
|
20
|
+
channel: eventCollector.channel,
|
|
21
|
+
eventTopics: eventTopics,
|
|
22
|
+
resources: resources
|
|
23
|
+
}], runtime, opts);
|
|
24
|
+
};
|
|
25
|
+
let finish = () => {};
|
|
26
|
+
return {
|
|
27
|
+
EventCollectorChannel: EventCollectorChannel,
|
|
28
|
+
forEventCollector: forEventCollector,
|
|
29
|
+
finish: finish
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
Make,
|
|
36
|
+
}
|
|
37
|
+
/* Runtime-ReventlessCore Not a pure module */
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// In-memory PluginRuntime builder.
|
|
2
|
+
// Wraps PluginRuntime_Builder_Micro with LocalRuntimeEnvironment and LocalEventCollectorChannel.
|
|
3
|
+
|
|
4
|
+
module Make = (Bus: LocalBus.T) => {
|
|
5
|
+
module ECChannel = LocalEventCollectorChannel.Make(Bus)
|
|
6
|
+
|
|
7
|
+
include ReventlessCore.PluginRuntime_Builder_Micro.Make(
|
|
8
|
+
LocalRuntimeEnvironment,
|
|
9
|
+
ECChannel,
|
|
10
|
+
)
|
|
11
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as LocalRuntimeEnvironment$ReventlessLocal from "./LocalRuntimeEnvironment.res.mjs";
|
|
4
|
+
import * as LocalEventCollectorChannel$ReventlessLocal from "../EventCollector/LocalEventCollectorChannel.res.mjs";
|
|
5
|
+
import * as PluginRuntime_Builder_Micro$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/PluginRuntime_Builder_Micro.res.mjs";
|
|
6
|
+
|
|
7
|
+
function Make(Bus) {
|
|
8
|
+
let ECChannel = LocalEventCollectorChannel$ReventlessLocal.Make(Bus);
|
|
9
|
+
let include = PluginRuntime_Builder_Micro$ReventlessCore.Make({
|
|
10
|
+
make: LocalRuntimeEnvironment$ReventlessLocal.make,
|
|
11
|
+
groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
|
|
12
|
+
extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
|
|
13
|
+
asEventHandler: prim => prim,
|
|
14
|
+
asEffectHandler: prim => prim
|
|
15
|
+
})(ECChannel);
|
|
16
|
+
return {
|
|
17
|
+
ECChannel: ECChannel,
|
|
18
|
+
EventCollectorChannel: include.EventCollectorChannel,
|
|
19
|
+
registerPluginName: include.registerPluginName,
|
|
20
|
+
forPluginEventCollector: include.forPluginEventCollector,
|
|
21
|
+
forPluginHeartbeat: include.forPluginHeartbeat,
|
|
22
|
+
forDcbCommandTopic: include.forDcbCommandTopic,
|
|
23
|
+
finish: include.finish
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
Make,
|
|
29
|
+
}
|
|
30
|
+
/* LocalRuntimeEnvironment-ReventlessLocal Not a pure module */
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// In-memory runtime environment.
|
|
2
|
+
// Instead of creating Lambda functions, stores the handler in a Deferred so consumers
|
|
3
|
+
// block until the handler is registered — eliminating the ref<option> race condition.
|
|
4
|
+
//
|
|
5
|
+
// subscriptionLatch is opened by EventCollectorChannel.connect once subscriptions are
|
|
6
|
+
// registered. Callers can await it before publishing to guarantee delivery.
|
|
7
|
+
|
|
8
|
+
type event = JSON.t
|
|
9
|
+
type context = unit
|
|
10
|
+
type handler = (JSON.t, unit) => promise<unit>
|
|
11
|
+
type parts = {
|
|
12
|
+
handlerDeferred: Deferred.t<handler, unit>,
|
|
13
|
+
subscriptionLatch: Latch.t,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Coerce a polymorphic handler to return promise<unit> so we can call it from the bus.
|
|
17
|
+
// The return value is discarded — we only await for side effects.
|
|
18
|
+
external asUnitHandler: ((JSON.t, unit) => promise<'r>) => (JSON.t, unit) => promise<unit> =
|
|
19
|
+
"%identity"
|
|
20
|
+
|
|
21
|
+
let make = (
|
|
22
|
+
~name as _: string,
|
|
23
|
+
~handler: Pulumi.Output.t<ReventlessCore.Runtime.eventHandler<event, context, 'result>>,
|
|
24
|
+
~memorySize as _=1024,
|
|
25
|
+
~timeout as _=30,
|
|
26
|
+
~opts as _=?,
|
|
27
|
+
): ReventlessCore.Runtime.environment<parts> => {
|
|
28
|
+
let handlerDeferred = Deferred.make()->Effect.runSync
|
|
29
|
+
let subscriptionLatch = Effect.makeLatch(false)->Effect.runSync
|
|
30
|
+
// In Pulumi mock mode, Output.apply resolves in ~2 microtask ticks.
|
|
31
|
+
// Use runPromise (not runSync) so fiber wake-ups are properly scheduled.
|
|
32
|
+
let _ = handler->Pulumi.Output.apply(h => {
|
|
33
|
+
Deferred.succeed(handlerDeferred, h->asUnitHandler)->Effect.runPromise->ignore
|
|
34
|
+
})
|
|
35
|
+
{parts: {handlerDeferred, subscriptionLatch}, resources: []}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let groupBySource = (event: JSON.t) => {
|
|
39
|
+
let dict: dict<JSON.t> = Dict.make()
|
|
40
|
+
dict->Dict.set("inmemory", event)
|
|
41
|
+
dict
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let extractCorrelationId = (event: event) =>
|
|
45
|
+
event
|
|
46
|
+
->JSON.Decode.object
|
|
47
|
+
->Option.flatMap(obj => obj->Dict.get("meta"))
|
|
48
|
+
->Option.flatMap(JSON.Decode.object)
|
|
49
|
+
->Option.flatMap(meta => meta->Dict.get("correlationId"))
|
|
50
|
+
->Option.flatMap(JSON.Decode.string)
|
|
51
|
+
|
|
52
|
+
external asEventHandler: 'a => ReventlessCore.Runtime.eventHandler<event, context, 'r> = "%identity"
|
|
53
|
+
external asEffectHandler: 'a => ReventlessCore.Runtime.effectHandler<event, context, 'r, 'error> =
|
|
54
|
+
"%identity"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
|
|
4
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Deferred from "effect/Deferred";
|
|
7
|
+
|
|
8
|
+
function make(param, handler, $staropt$star, $staropt$star$1, param$1) {
|
|
9
|
+
$staropt$star !== undefined;
|
|
10
|
+
$staropt$star$1 !== undefined;
|
|
11
|
+
let handlerDeferred = Effect.runSync(Deferred.make());
|
|
12
|
+
let subscriptionLatch = Effect.runSync(Effect.makeLatch(false));
|
|
13
|
+
handler.apply(h => {
|
|
14
|
+
Effect.runPromise(Deferred.succeed(handlerDeferred, h));
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
parts: {
|
|
18
|
+
handlerDeferred: handlerDeferred,
|
|
19
|
+
subscriptionLatch: subscriptionLatch
|
|
20
|
+
},
|
|
21
|
+
resources: []
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function groupBySource(event) {
|
|
26
|
+
let dict = {};
|
|
27
|
+
dict["inmemory"] = event;
|
|
28
|
+
return dict;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function extractCorrelationId(event) {
|
|
32
|
+
return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(event), obj => obj["meta"]), Stdlib_JSON.Decode.object), meta => meta["correlationId"]), Stdlib_JSON.Decode.string);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
make,
|
|
37
|
+
groupBySource,
|
|
38
|
+
extractCorrelationId,
|
|
39
|
+
}
|
|
40
|
+
/* effect/Effect Not a pure module */
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// In-memory ScheduledPublisher — satisfies Scheduler_Adapter.ScheduledPublisher.
|
|
2
|
+
//
|
|
3
|
+
// createSchedule: sets up a setInterval that fires Bus.publishEvent when the schedule triggers.
|
|
4
|
+
// deleteSchedule: clears the interval.
|
|
5
|
+
//
|
|
6
|
+
// The schedule.payload is published as the event body. For Single(…) schedules a
|
|
7
|
+
// one-shot setTimeout is used; all recurring rates use setInterval.
|
|
8
|
+
//
|
|
9
|
+
// Usage: create a Scheduler with Scheduler_Builder.Make(LocalScheduledPublisher.Make(Bus))
|
|
10
|
+
// and pass the resulting component to Plugin_Builder or Task_Builder.
|
|
11
|
+
|
|
12
|
+
module Make = (Bus: LocalBus.T) => {
|
|
13
|
+
type timerHandle
|
|
14
|
+
|
|
15
|
+
@val
|
|
16
|
+
external setIntervalJs: (unit => unit, int) => timerHandle = "setInterval"
|
|
17
|
+
@val
|
|
18
|
+
external setTimeoutJs: (unit => unit, int) => timerHandle = "setTimeout"
|
|
19
|
+
@val
|
|
20
|
+
external clearTimerJs: timerHandle => unit = "clearTimeout"
|
|
21
|
+
|
|
22
|
+
let activeTimers: ref<dict<timerHandle>> = ref(Dict.make())
|
|
23
|
+
|
|
24
|
+
let rateToMs = (rate: Reventless.Schedule.rate) =>
|
|
25
|
+
switch rate {
|
|
26
|
+
| Minutes(n) => n * 60 * 1000
|
|
27
|
+
| Hours(n) => n * 60 * 60 * 1000
|
|
28
|
+
| Days(n) => n * 24 * 60 * 60 * 1000
|
|
29
|
+
| Daily(_, _) => 24 * 60 * 60 * 1000
|
|
30
|
+
| Weekdays(_, _) => 24 * 60 * 60 * 1000
|
|
31
|
+
| WeekdaysAndSaturday(_, _) => 24 * 60 * 60 * 1000
|
|
32
|
+
| Single(_, _, _, _, _) => 0
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let isSingleShot = rate =>
|
|
36
|
+
switch rate {
|
|
37
|
+
| Reventless.Schedule.Single(_, _, _, _, _) => true
|
|
38
|
+
| _ => false
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let scheduleMeta: ReventlessCore.Message.meta = {
|
|
42
|
+
service: "Scheduler",
|
|
43
|
+
time: "",
|
|
44
|
+
ip: "",
|
|
45
|
+
user: "Scheduler",
|
|
46
|
+
msgId: "",
|
|
47
|
+
correlationId: "",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let make: ReventlessCore.Scheduler_Adapter.scheduledPublisherMaker = (~name as _, ~opts as _) => {
|
|
51
|
+
let createSchedule: ReventlessInfra.Scheduler.createSchedule = async (
|
|
52
|
+
channelResources,
|
|
53
|
+
schedule,
|
|
54
|
+
) => {
|
|
55
|
+
let topicName = switch channelResources {
|
|
56
|
+
| [] => ""
|
|
57
|
+
| resources => (resources->Array.getUnsafe(0)).name
|
|
58
|
+
}
|
|
59
|
+
let payloadJson = switch schedule.payload->JSON.parseOrThrow {
|
|
60
|
+
| json => json
|
|
61
|
+
| exception _ => schedule.payload->JSON.Encode.string
|
|
62
|
+
}
|
|
63
|
+
let fire = () =>
|
|
64
|
+
Bus.publishEvent(topicName, "Scheduler", scheduleMeta, payloadJson)->ignore
|
|
65
|
+
let handle =
|
|
66
|
+
if schedule.rate->isSingleShot {
|
|
67
|
+
setTimeoutJs(fire, 0)
|
|
68
|
+
} else {
|
|
69
|
+
setIntervalJs(fire, rateToMs(schedule.rate))
|
|
70
|
+
}
|
|
71
|
+
activeTimers.contents->Dict.set(schedule.name, handle)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let deleteSchedule: ReventlessInfra.Scheduler.deleteSchedule = async (_, name) => {
|
|
75
|
+
switch activeTimers.contents->Dict.get(name) {
|
|
76
|
+
| Some(handle) =>
|
|
77
|
+
clearTimerJs(handle)
|
|
78
|
+
activeTimers.contents->Dict.delete(name)
|
|
79
|
+
| None => ()
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
{
|
|
84
|
+
resource: ReventlessInfra.Adapter.make(
|
|
85
|
+
~name=""->Pulumi.Output.make,
|
|
86
|
+
~id=""->Pulumi.Output.make,
|
|
87
|
+
~urn=""->Pulumi.Output.make,
|
|
88
|
+
~service="memory:InMemory"->Pulumi.Output.make,
|
|
89
|
+
),
|
|
90
|
+
operations: ({
|
|
91
|
+
createSchedule,
|
|
92
|
+
deleteSchedule,
|
|
93
|
+
}: ReventlessInfra.Scheduler.operations)->Pulumi.Output.make,
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Clear all active timers — call in afterAll/afterEach for test isolation.
|
|
98
|
+
let reset = () => {
|
|
99
|
+
activeTimers.contents->Dict.valuesToArray->Array.forEach(clearTimerJs)
|
|
100
|
+
activeTimers.contents = Dict.make()
|
|
101
|
+
}
|
|
102
|
+
}
|