@reventlessdev/reventless-aws 3.0.0-alpha.167
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 +1564 -0
- package/README.md +62 -0
- package/__mocks__/emptyModule.js +1 -0
- package/all-licenses.csv +565 -0
- package/docker-compose.dynamodb-local.yml +12 -0
- package/jest.setup.cjs +5 -0
- package/licenses-analysis.ods +0 -0
- package/package.json +73 -0
- package/rescript.json +39 -0
- package/reventless-licenses-analysis.xls +0 -0
- package/scripts/run-integration-tests.sh +43 -0
- package/src/Platform.res +1940 -0
- package/src/Platform.res.mjs +2281 -0
- package/src/Platform_Casts.res +106 -0
- package/src/Platform_Casts.res.mjs +13 -0
- package/src/Platform_Stack.res +153 -0
- package/src/Platform_Stack.res.mjs +121 -0
- package/src/Types.res +39 -0
- package/src/Types.res.mjs +21 -0
- package/src/adapter/AWS.res +96 -0
- package/src/adapter/AWS.res.mjs +186 -0
- package/src/adapter/AWS_Tags.res +16 -0
- package/src/adapter/AWS_Tags.res.mjs +48 -0
- package/src/adapter/Adapter_Helpers.res +19 -0
- package/src/adapter/Adapter_Helpers.res.mjs +37 -0
- package/src/adapter/Api/AppSync_EventsApi.res +172 -0
- package/src/adapter/Api/AppSync_EventsApi.res.mjs +96 -0
- package/src/adapter/Api/AppSync_Resolver_Native.res +93 -0
- package/src/adapter/Api/AppSync_Resolver_Native.res.mjs +67 -0
- package/src/adapter/Api/AppSync_Resolver_Retrying.res +653 -0
- package/src/adapter/Api/AppSync_Resolver_Retrying.res.mjs +462 -0
- package/src/adapter/Api/CommandSubscriptionResolvers_AppSync.res +29 -0
- package/src/adapter/Api/CommandSubscriptionResolvers_AppSync.res.mjs +15 -0
- package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +238 -0
- package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res.mjs +179 -0
- package/src/adapter/Api/Platform_UIFragments_Lambda.res +229 -0
- package/src/adapter/Api/Platform_UIFragments_Lambda.res.mjs +245 -0
- package/src/adapter/Auth/Auth_Cognito.res +209 -0
- package/src/adapter/Auth/Auth_Cognito.res.mjs +135 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers.res +2 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers.res.mjs +12 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res +251 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res.mjs +126 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res +20 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res.mjs +23 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_Runtime.res +1 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_Runtime.res.mjs +11 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res +95 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res.mjs +50 -0
- package/src/adapter/CommandTopic/CommandTopicChannel.res +6 -0
- package/src/adapter/CommandTopic/CommandTopicChannel.res.mjs +21 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_Helpers.res +196 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_Helpers.res.mjs +145 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res +91 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res.mjs +74 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res +69 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs +62 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res +60 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res.mjs +56 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res +73 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res.mjs +65 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res +88 -0
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs +76 -0
- package/src/adapter/CommandTopic/CommandTopicRemoteChannel.res +1 -0
- package/src/adapter/CommandTopic/CommandTopicRemoteChannel.res.mjs +9 -0
- package/src/adapter/CommandTopic/CommandTopicRemoteChannel_SQS.res +7 -0
- package/src/adapter/CommandTopic/CommandTopicRemoteChannel_SQS.res.mjs +17 -0
- package/src/adapter/Counter/CounterHandler_DynamoDbStream.res +103 -0
- package/src/adapter/Counter/CounterHandler_DynamoDbStream.res.mjs +68 -0
- package/src/adapter/Counter/CounterHandler_DynamoDbStream_Runtime.res +107 -0
- package/src/adapter/Counter/CounterHandler_DynamoDbStream_Runtime.res.mjs +145 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage.res +1 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage.res.mjs +9 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res +84 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res.mjs +52 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +1436 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res.mjs +1143 -0
- package/src/adapter/EventCollector/EventCollectorChannel.res +6 -0
- package/src/adapter/EventCollector/EventCollectorChannel.res.mjs +21 -0
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +63 -0
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs +56 -0
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res +20 -0
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res.mjs +32 -0
- package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res +266 -0
- package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res.mjs +166 -0
- package/src/adapter/EventCollector/EventCollectorChannel_SQS.res +81 -0
- package/src/adapter/EventCollector/EventCollectorChannel_SQS.res.mjs +54 -0
- package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res +59 -0
- package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res.mjs +45 -0
- package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res +91 -0
- package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res.mjs +89 -0
- package/src/adapter/EventLog/EventLogStorage.res +3 -0
- package/src/adapter/EventLog/EventLogStorage.res.mjs +15 -0
- package/src/adapter/EventLog/EventLogStorage_DynamoDb.res +25 -0
- package/src/adapter/EventLog/EventLogStorage_DynamoDb.res.mjs +34 -0
- package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res +26 -0
- package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res.mjs +35 -0
- package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res +121 -0
- package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res.mjs +137 -0
- package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res +265 -0
- package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs +185 -0
- package/src/adapter/EventTopic/EventTopicPublisher.res +6 -0
- package/src/adapter/EventTopic/EventTopicPublisher.res.mjs +21 -0
- package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res +25 -0
- package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs +28 -0
- package/src/adapter/EventTopic/EventTopicPublisher_SNS.res +40 -0
- package/src/adapter/EventTopic/EventTopicPublisher_SNS.res.mjs +39 -0
- package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res +39 -0
- package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res.mjs +38 -0
- package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res +5 -0
- package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res.mjs +18 -0
- package/src/adapter/Mcp/MCP_Lambda.res +502 -0
- package/src/adapter/Mcp/MCP_Lambda.res.mjs +289 -0
- package/src/adapter/QueryDb/NodeResolver_AppSync.res +71 -0
- package/src/adapter/QueryDb/NodeResolver_AppSync.res.mjs +44 -0
- package/src/adapter/QueryDb/QueryDbResolvers.res +2 -0
- package/src/adapter/QueryDb/QueryDbResolvers.res.mjs +12 -0
- package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +434 -0
- package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res.mjs +243 -0
- package/src/adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res +21 -0
- package/src/adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res.mjs +14 -0
- package/src/adapter/QueryDb/QueryDbResolvers_NoOp.res +21 -0
- package/src/adapter/QueryDb/QueryDbResolvers_NoOp.res.mjs +14 -0
- package/src/adapter/QueryDb/QueryDbStorage.res +5 -0
- package/src/adapter/QueryDb/QueryDbStorage.res.mjs +18 -0
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res +115 -0
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res.mjs +100 -0
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res +52 -0
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res.mjs +38 -0
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res +271 -0
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res.mjs +306 -0
- package/src/adapter/QueryDb/QueryInterceptor_Lambda.res +20 -0
- package/src/adapter/QueryDb/QueryInterceptor_Lambda.res.mjs +22 -0
- package/src/adapter/QueryEngine/QueryEngine.res +3 -0
- package/src/adapter/QueryEngine/QueryEngine.res.mjs +12 -0
- package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +184 -0
- package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs +221 -0
- package/src/adapter/Runtime/AdminEventCollectorEntryPoint.mjs +879 -0
- package/src/adapter/Runtime/AggregateEntryPoint.mjs +313 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +327 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +239 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +331 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res.mjs +240 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +247 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +185 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +244 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res.mjs +185 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +347 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +244 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +285 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +212 -0
- package/src/adapter/Runtime/AutomationSliceEntryPoint.mjs +124 -0
- package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +187 -0
- package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs +147 -0
- package/src/adapter/Runtime/CounterEntryPoint.mjs +91 -0
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint.mjs +265 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +122 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res.mjs +89 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +193 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +137 -0
- package/src/adapter/Runtime/EventMapperEntryPoint.mjs +97 -0
- package/src/adapter/Runtime/ExtensionPointEntryPoint.mjs +101 -0
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +83 -0
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res.mjs +59 -0
- package/src/adapter/Runtime/HandlerFactoryHelpers.mjs +142 -0
- package/src/adapter/Runtime/HeartbeatEntryPoint.mjs +38 -0
- package/src/adapter/Runtime/PluginExtensionPointEntryPoint.mjs +137 -0
- package/src/adapter/Runtime/ReadModelEntryPoint.mjs +143 -0
- package/src/adapter/Runtime/RuntimeEnvironment.res +1 -0
- package/src/adapter/Runtime/RuntimeEnvironment.res.mjs +9 -0
- package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +254 -0
- package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs +169 -0
- package/src/adapter/Runtime/SideEffectEntryPoint.mjs +81 -0
- package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +178 -0
- package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs +129 -0
- package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +166 -0
- package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res.mjs +87 -0
- package/src/adapter/Runtime/StateViewSliceEntryPoint.mjs +136 -0
- package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +344 -0
- package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs +242 -0
- package/src/adapter/Runtime/TaskBucketEntryPoint.mjs +150 -0
- package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +123 -0
- package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs +74 -0
- package/src/adapter/ScheduledPublisher/ScheduledPublisher.res +2 -0
- package/src/adapter/ScheduledPublisher/ScheduledPublisher.res.mjs +12 -0
- package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res +54 -0
- package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res.mjs +41 -0
- package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res +97 -0
- package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res.mjs +85 -0
- package/src/adapter/StateTopic/StateTopic_AppSync.res +418 -0
- package/src/adapter/StateTopic/StateTopic_AppSync.res.mjs +295 -0
- package/src/adapter/Task/TaskBucket.res +1 -0
- package/src/adapter/Task/TaskBucket.res.mjs +9 -0
- package/src/adapter/Task/TaskBucket_S3.res +157 -0
- package/src/adapter/Task/TaskBucket_S3.res.mjs +108 -0
- package/src/adapter/Task/TaskBucket_S3_Runtime.res +11 -0
- package/src/adapter/Task/TaskBucket_S3_Runtime.res.mjs +15 -0
- package/src/components/Aggregate_Builder.res +1 -0
- package/src/components/Aggregate_Builder.res.mjs +25 -0
- package/src/components/Aggregate_Builder_Micro.res +63 -0
- package/src/components/Aggregate_Builder_Micro.res.mjs +80 -0
- package/src/components/Aggregate_Builder_NoResolver.res +61 -0
- package/src/components/Aggregate_Builder_NoResolver.res.mjs +80 -0
- package/src/components/Aggregate_Builder_PerAggregate.res +57 -0
- package/src/components/Aggregate_Builder_PerAggregate.res.mjs +80 -0
- package/src/components/Aggregate_Builder_Single.res +59 -0
- package/src/components/Aggregate_Builder_Single.res.mjs +80 -0
- package/src/components/Aggregate_Builder_Single_Async.res +59 -0
- package/src/components/Aggregate_Builder_Single_Async.res.mjs +80 -0
- package/src/components/Api/AppSync_Adapter.res +500 -0
- package/src/components/Api/AppSync_Adapter.res.mjs +396 -0
- package/src/components/AutomationSlice_Builder.res +52 -0
- package/src/components/AutomationSlice_Builder.res.mjs +72 -0
- package/src/components/AutomationSlice_Builder_Bundled.res.mjs +70 -0
- package/src/components/Counter_Builder.res +10 -0
- package/src/components/Counter_Builder.res.mjs +16 -0
- package/src/components/DataCleaner.res +170 -0
- package/src/components/DataCleaner.res.mjs +2 -0
- package/src/components/DcbEventLog_Builder.res +8 -0
- package/src/components/DcbEventLog_Builder.res.mjs +14 -0
- package/src/components/ExtensionPoint_Builder.res +16 -0
- package/src/components/ExtensionPoint_Builder.res.mjs +37 -0
- package/src/components/ForeignReadModel_Builder.res +19 -0
- package/src/components/ForeignReadModel_Builder.res.mjs +48 -0
- package/src/components/InboundTranslationSlice_Builder.res +25 -0
- package/src/components/InboundTranslationSlice_Builder.res.mjs +31 -0
- package/src/components/OutboundTranslationSlice_Builder.res +60 -0
- package/src/components/OutboundTranslationSlice_Builder.res.mjs +76 -0
- package/src/components/OutboundTranslationSlice_Builder_Bundled.res.mjs +75 -0
- package/src/components/Plugin.res +29 -0
- package/src/components/Plugin.res.mjs +63 -0
- package/src/components/ReadModel_Builder.res +1 -0
- package/src/components/ReadModel_Builder.res.mjs +19 -0
- package/src/components/ReadModel_Builder_NoResolver.res +55 -0
- package/src/components/ReadModel_Builder_NoResolver.res.mjs +64 -0
- package/src/components/ReadModel_Builder_NoResolver_Stream.res +60 -0
- package/src/components/ReadModel_Builder_NoResolver_Stream.res.mjs +64 -0
- package/src/components/ReadModel_Builder_PerReadModel.res +53 -0
- package/src/components/ReadModel_Builder_PerReadModel.res.mjs +66 -0
- package/src/components/ReadModel_Builder_Single.res +52 -0
- package/src/components/ReadModel_Builder_Single.res.mjs +66 -0
- package/src/components/ReadModel_Builder_Single_Stream.res +60 -0
- package/src/components/ReadModel_Builder_Single_Stream.res.mjs +66 -0
- package/src/components/Scheduler.res +1 -0
- package/src/components/Scheduler.res.mjs +13 -0
- package/src/components/SideEffectHandler.res +1 -0
- package/src/components/SideEffectHandler.res.mjs +19 -0
- package/src/components/SideEffectHandler_PerSideEffectHandler.res +13 -0
- package/src/components/SideEffectHandler_PerSideEffectHandler.res.mjs +52 -0
- package/src/components/SideEffectHandler_Single.res +54 -0
- package/src/components/SideEffectHandler_Single.res.mjs +60 -0
- package/src/components/StateChangeSlice_Builder.res +17 -0
- package/src/components/StateChangeSlice_Builder.res.mjs +23 -0
- package/src/components/StateViewSlice_Builder.res +46 -0
- package/src/components/StateViewSlice_Builder.res.mjs +68 -0
- package/src/components/StateViewSlice_Builder_Bundled.res.mjs +69 -0
- package/src/components/StateViewSlice_Builder_Stream.res +50 -0
- package/src/components/StateViewSlice_Builder_Stream.res.mjs +68 -0
- package/src/components/Task_Builder.res +1 -0
- package/src/components/Task_Builder.res.mjs +28 -0
- package/src/components/Task_Builder_PerBucket.res +22 -0
- package/src/components/Task_Builder_PerBucket.res.mjs +63 -0
- package/src/components/Vpc.res +214 -0
- package/src/components/Vpc.res.mjs +117 -0
- package/src/components/Vpc.resi +22 -0
- package/src/errors/AppSync_Error.res +36 -0
- package/src/errors/AppSync_Error.res.mjs +38 -0
- package/src/errors/Cognito_Error.res +36 -0
- package/src/errors/Cognito_Error.res.mjs +38 -0
- package/src/errors/DynamoDb_Error.res +75 -0
- package/src/errors/DynamoDb_Error.res.mjs +86 -0
- package/src/errors/Kinesis_Error.res +36 -0
- package/src/errors/Kinesis_Error.res.mjs +38 -0
- package/src/errors/SNS_Error.res +34 -0
- package/src/errors/SNS_Error.res.mjs +38 -0
- package/src/errors/SQS_Error.res +40 -0
- package/src/errors/SQS_Error.res.mjs +41 -0
- package/src/plugin/cloner/ClonerRunner.res +1 -0
- package/src/plugin/cloner/ClonerRunner.res.mjs +9 -0
- package/src/plugin/cloner/ClonerRunner_Fargate.res +362 -0
- package/src/plugin/cloner/ClonerRunner_Fargate.res.mjs +246 -0
- package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res +42 -0
- package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res.mjs +45 -0
- package/src/plugin/heartbeat/HeartbeatRunner.res +1 -0
- package/src/plugin/heartbeat/HeartbeatRunner.res.mjs +9 -0
- package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res +96 -0
- package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res.mjs +69 -0
- package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +115 -0
- package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res.mjs +88 -0
- package/src/plugin/runtime/PluginRuntimeOperations.res +5 -0
- package/src/plugin/runtime/PluginRuntimeOperations.res.mjs +14 -0
- package/src/plugin/runtime/PluginRuntime_Builder.res +769 -0
- package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +464 -0
- package/src/plugin/runtime/Util_PluginMessage_Runtime.res +13 -0
- package/src/plugin/runtime/Util_PluginMessage_Runtime.res.mjs +19 -0
- package/src/plugin/stack/Plugin_ExtensionPoint_Builder.res +28 -0
- package/src/plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs +67 -0
- package/src/plugin/stack/Plugin_Stack.res +439 -0
- package/src/plugin/stack/Plugin_Stack.res.mjs +263 -0
- package/src/util/Util.res +29 -0
- package/src/util/Util.res.mjs +93 -0
- package/src/util/Util_AppSync.res +36 -0
- package/src/util/Util_AppSync.res.mjs +35 -0
- package/src/util/Util_AppSync_Caller.res +213 -0
- package/src/util/Util_AppSync_Caller.res.mjs +170 -0
- package/src/util/Util_Bundle.res +255 -0
- package/src/util/Util_Bundle.res.mjs +179 -0
- package/src/util/Util_Cloudwatch.res +14 -0
- package/src/util/Util_Cloudwatch.res.mjs +19 -0
- package/src/util/Util_CognitoGroupUser.res +39 -0
- package/src/util/Util_CognitoGroupUser.res.mjs +32 -0
- package/src/util/Util_CognitoGroupUser_Runtime.res +65 -0
- package/src/util/Util_CognitoGroupUser_Runtime.res.mjs +50 -0
- package/src/util/Util_Cognito_Runtime.res +52 -0
- package/src/util/Util_Cognito_Runtime.res.mjs +35 -0
- package/src/util/Util_DeadLetterQueue.res +154 -0
- package/src/util/Util_DeadLetterQueue.res.mjs +158 -0
- package/src/util/Util_DynamoDb.res +210 -0
- package/src/util/Util_DynamoDb.res.mjs +218 -0
- package/src/util/Util_DynamoDbStream.res +138 -0
- package/src/util/Util_DynamoDbStream.res.mjs +134 -0
- package/src/util/Util_DynamoDbStream_Runtime.res +94 -0
- package/src/util/Util_DynamoDbStream_Runtime.res.mjs +131 -0
- package/src/util/Util_DynamoDb_Runtime.res +216 -0
- package/src/util/Util_DynamoDb_Runtime.res.mjs +257 -0
- package/src/util/Util_DynamoDb_TableManager.res +23 -0
- package/src/util/Util_DynamoDb_TableManager.res.mjs +35 -0
- package/src/util/Util_DynamoDb_TableManager.resi +3 -0
- package/src/util/Util_Env.res +5 -0
- package/src/util/Util_Env.res.mjs +2 -0
- package/src/util/Util_EventSourceMapping.res +49 -0
- package/src/util/Util_EventSourceMapping.res.mjs +32 -0
- package/src/util/Util_HostUiDomain.res +28 -0
- package/src/util/Util_HostUiDomain.res.mjs +26 -0
- package/src/util/Util_IAM_Role.res +14 -0
- package/src/util/Util_IAM_Role.res.mjs +28 -0
- package/src/util/Util_Kinesis_Runtime.res +20 -0
- package/src/util/Util_Kinesis_Runtime.res.mjs +24 -0
- package/src/util/Util_Lambda.res +39 -0
- package/src/util/Util_Lambda.res.mjs +45 -0
- package/src/util/Util_LocalConfig.res +119 -0
- package/src/util/Util_LocalConfig.res.mjs +112 -0
- package/src/util/Util_ResourceNaming.res +15 -0
- package/src/util/Util_ResourceNaming.res.mjs +26 -0
- package/src/util/Util_S3.res +17 -0
- package/src/util/Util_S3.res.mjs +30 -0
- package/src/util/Util_S3_Runtime.res +11 -0
- package/src/util/Util_S3_Runtime.res.mjs +15 -0
- package/src/util/Util_SNS.res +33 -0
- package/src/util/Util_SNS.res.mjs +50 -0
- package/src/util/Util_SNS_FIFO.res +21 -0
- package/src/util/Util_SNS_FIFO.res.mjs +27 -0
- package/src/util/Util_SNS_Runtime.res +33 -0
- package/src/util/Util_SNS_Runtime.res.mjs +27 -0
- package/src/util/Util_SQS.res +70 -0
- package/src/util/Util_SQS.res.mjs +83 -0
- package/src/util/Util_SQS_FIFO.res +16 -0
- package/src/util/Util_SQS_FIFO.res.mjs +28 -0
- package/src/util/Util_SQS_Runtime.res +169 -0
- package/src/util/Util_SQS_Runtime.res.mjs +150 -0
- package/src/util/Util_SesPolicy_Runtime.res +54 -0
- package/src/util/Util_SesPolicy_Runtime.res.mjs +55 -0
- package/src/util/Util_StaticBundle.res +124 -0
- package/src/util/Util_StaticBundle.res.mjs +132 -0
- package/src/util/Util_Vpc.res +22 -0
- package/src/util/Util_Vpc.res.mjs +27 -0
- package/tests/AppSync_AdapterTest.res +396 -0
- package/tests/AppSync_AdapterTest.res.mjs +326 -0
- package/tests/AppSync_Resolver_RetryingTest.res +59 -0
- package/tests/AppSync_Resolver_RetryingTest.res.mjs +66 -0
- package/tests/Auth_CognitoTest.res +203 -0
- package/tests/Auth_CognitoTest.res.mjs +248 -0
- package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res +602 -0
- package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res.mjs +742 -0
- package/tests/EventLogStorage_DynamoDb_RuntimeTest.res +57 -0
- package/tests/EventLogStorage_DynamoDb_RuntimeTest.res.mjs +68 -0
- package/tests/MCP_LambdaTest.res +101 -0
- package/tests/MCP_LambdaTest.res.mjs +56 -0
- package/tests/Util_HostUiDomainTest.res +90 -0
- package/tests/Util_HostUiDomainTest.res.mjs +50 -0
- package/tests/Util_SQS_RuntimeTest.res +46 -0
- package/tests/Util_SQS_RuntimeTest.res.mjs +45 -0
- package/tests/Util_StaticBundleTest.res +136 -0
- package/tests/Util_StaticBundleTest.res.mjs +149 -0
- package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +101 -0
- package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res.mjs +91 -0
- package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +315 -0
- package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res.mjs +435 -0
- package/tests/integration/DcbIntegrationHarness.res +102 -0
- package/tests/integration/DcbIntegrationHarness.res.mjs +163 -0
- package/tests/integration/EpTestSlice.res +28 -0
- package/tests/integration/EpTestSlice.res.mjs +43 -0
- package/tests/integration/EpTestSliceBehavior.res +18 -0
- package/tests/integration/EpTestSliceBehavior.res.mjs +35 -0
|
@@ -0,0 +1,1143 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S from "sury/src/S.res.mjs";
|
|
4
|
+
import * as Uuid from "uuid";
|
|
5
|
+
import * as Effect from "@reventlessdev/rescript-effect/src/Effect.res.mjs";
|
|
6
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
7
|
+
import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
|
|
8
|
+
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
9
|
+
import * as Queue from "effect/Queue";
|
|
10
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
11
|
+
import * as Effect$1 from "effect/Effect";
|
|
12
|
+
import * as Stream$1 from "effect/Stream";
|
|
13
|
+
import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
|
|
14
|
+
import * as Primitive_string from "@rescript/runtime/lib/es6/Primitive_string.js";
|
|
15
|
+
import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
|
|
16
|
+
import * as Message$Reventless from "@reventlessdev/reventless-spec/src/types/Message.res.mjs";
|
|
17
|
+
import * as LibDynamodb from "@aws-sdk/lib-dynamodb";
|
|
18
|
+
import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
|
|
19
|
+
import * as DynamoDb_Error$ReventlessAws from "../../errors/DynamoDb_Error.res.mjs";
|
|
20
|
+
import * as DynamoDb_DocumentClient$AwsSdk from "@reventlessdev/rescript-aws-sdk/src/DynamoDb_DocumentClient.res.mjs";
|
|
21
|
+
import * as Util_DynamoDb_Runtime$ReventlessAws from "../../util/Util_DynamoDb_Runtime.res.mjs";
|
|
22
|
+
|
|
23
|
+
function generatePosition() {
|
|
24
|
+
let timestamp = new Date().getTime().toString();
|
|
25
|
+
let uuid = Uuid.v4();
|
|
26
|
+
return timestamp + `-` + uuid;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function generatePositionForBatch(basePosition, index) {
|
|
30
|
+
if (index === 0) {
|
|
31
|
+
return basePosition;
|
|
32
|
+
} else {
|
|
33
|
+
return basePosition + `-` + index.toString().padStart(3, "0");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function tagToAttributeName(tagKey) {
|
|
38
|
+
return `tag_` + tagKey;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let compositeIndexName = "tag_composite";
|
|
42
|
+
|
|
43
|
+
function indexKeepsFullProjection(indexName) {
|
|
44
|
+
return indexName === compositeIndexName;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function compositeTagKey(tags) {
|
|
48
|
+
return tags.toSorted((a, b) => Primitive_string.compare(a.key, b.key)).map(t => t.key + `:` + t.value).join("#");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function derivePartitionKey(partitionTag, tags) {
|
|
52
|
+
if (tags.length === 0) {
|
|
53
|
+
return "dcb";
|
|
54
|
+
}
|
|
55
|
+
if (partitionTag !== undefined) {
|
|
56
|
+
if (partitionTag.TAG !== "Simple") {
|
|
57
|
+
return DcbTag$Reventless.getCompositePartitionKeyValue(tags, partitionTag._0);
|
|
58
|
+
}
|
|
59
|
+
let pt = partitionTag._0;
|
|
60
|
+
let t = tags.find(t => t.key === pt.key);
|
|
61
|
+
let tag = t !== undefined ? t : tags[0];
|
|
62
|
+
return tag.key + `:` + tag.value;
|
|
63
|
+
}
|
|
64
|
+
let tag$1 = tags[0];
|
|
65
|
+
return tag$1.key + `:` + tag$1.value;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function toItem(position, event, partitionTag, recordedAt) {
|
|
69
|
+
let item = {};
|
|
70
|
+
item["id"] = derivePartitionKey(partitionTag, event.tags);
|
|
71
|
+
item["position"] = position;
|
|
72
|
+
item["event"] = event.eventType;
|
|
73
|
+
item["data"] = event.data;
|
|
74
|
+
item["recordedAt"] = recordedAt;
|
|
75
|
+
let tagsJson = event.tags.map(tag => Object.fromEntries([
|
|
76
|
+
[
|
|
77
|
+
"key",
|
|
78
|
+
tag.key
|
|
79
|
+
],
|
|
80
|
+
[
|
|
81
|
+
"value",
|
|
82
|
+
tag.value
|
|
83
|
+
]
|
|
84
|
+
]));
|
|
85
|
+
item["tags"] = tagsJson;
|
|
86
|
+
Message$ReventlessCore.decomposeMeta(event.meta).forEach(param => {
|
|
87
|
+
item[param[0]] = param[1];
|
|
88
|
+
});
|
|
89
|
+
event.tags.forEach(tag => {
|
|
90
|
+
let attrName = tagToAttributeName(tag.key);
|
|
91
|
+
item[attrName] = tag.value;
|
|
92
|
+
});
|
|
93
|
+
if (event.tags.length > 1) {
|
|
94
|
+
let composite = compositeTagKey(event.tags);
|
|
95
|
+
item["tag_composite"] = composite;
|
|
96
|
+
}
|
|
97
|
+
return item;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function fromItem(item) {
|
|
101
|
+
let obj = Stdlib_JSON.Decode.object(item);
|
|
102
|
+
if (obj === undefined) {
|
|
103
|
+
return Stdlib_JsError.throwWithMessage("Invalid DcbEventLog item: not an object");
|
|
104
|
+
}
|
|
105
|
+
let position = Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(obj["position"], Stdlib_JSON.Decode.string), undefined);
|
|
106
|
+
let eventType = Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(obj["event"], Stdlib_JSON.Decode.string), undefined);
|
|
107
|
+
let data = Stdlib_Option.getOrThrow(obj["data"], undefined);
|
|
108
|
+
let tags = Stdlib_Option.mapOr(Stdlib_Option.flatMap(obj["tags"], Stdlib_JSON.Decode.array), [], tagArray => Stdlib_Array.filterMap(tagArray, tagJson => {
|
|
109
|
+
let tagObj = Stdlib_JSON.Decode.object(tagJson);
|
|
110
|
+
if (tagObj === undefined) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
let key = Stdlib_Option.flatMap(tagObj["key"], Stdlib_JSON.Decode.string);
|
|
114
|
+
let value = Stdlib_Option.flatMap(tagObj["value"], Stdlib_JSON.Decode.string);
|
|
115
|
+
if (key !== undefined && value !== undefined) {
|
|
116
|
+
return {
|
|
117
|
+
key: key,
|
|
118
|
+
value: value
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}));
|
|
122
|
+
let recordedAt = Stdlib_Option.getOr(Stdlib_Option.flatMap(obj["recordedAt"], Stdlib_JSON.Decode.string), "");
|
|
123
|
+
let meta = S.parseJsonOrThrow(Message$ReventlessCore.composeMeta(obj), Message$Reventless.metaSchema);
|
|
124
|
+
return {
|
|
125
|
+
position: position,
|
|
126
|
+
eventType: eventType,
|
|
127
|
+
data: data,
|
|
128
|
+
tags: tags,
|
|
129
|
+
meta: meta,
|
|
130
|
+
recordedAt: recordedAt
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function queryByCompositeTags(table, tags, after) {
|
|
135
|
+
let composite = compositeTagKey(tags);
|
|
136
|
+
let expressionAttributeValues = Object.fromEntries([[
|
|
137
|
+
":composite",
|
|
138
|
+
composite
|
|
139
|
+
]]);
|
|
140
|
+
let match = after !== undefined ? (expressionAttributeValues[":after"] = after, [
|
|
141
|
+
"tag_composite = :composite AND #pos > :after",
|
|
142
|
+
Object.fromEntries([[
|
|
143
|
+
"#pos",
|
|
144
|
+
"position"
|
|
145
|
+
]])
|
|
146
|
+
]) : [
|
|
147
|
+
"tag_composite = :composite",
|
|
148
|
+
undefined
|
|
149
|
+
];
|
|
150
|
+
let queryParams_TableName = table.name;
|
|
151
|
+
let queryParams_ExpressionAttributeNames = match[1];
|
|
152
|
+
let queryParams_ExpressionAttributeValues = expressionAttributeValues;
|
|
153
|
+
let queryParams_IndexName = "tag_composite";
|
|
154
|
+
let queryParams_KeyConditionExpression = match[0];
|
|
155
|
+
let queryParams = {
|
|
156
|
+
TableName: queryParams_TableName,
|
|
157
|
+
ExpressionAttributeNames: queryParams_ExpressionAttributeNames,
|
|
158
|
+
ExpressionAttributeValues: queryParams_ExpressionAttributeValues,
|
|
159
|
+
IndexName: queryParams_IndexName,
|
|
160
|
+
KeyConditionExpression: queryParams_KeyConditionExpression
|
|
161
|
+
};
|
|
162
|
+
return await Effect$1.runPromise(Stream.runCollect(Util_DynamoDb_Runtime$ReventlessAws.queryStream(queryParams)));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function buildScanFilter(eventTypes) {
|
|
166
|
+
let expressionAttributeValues = {};
|
|
167
|
+
let expressionAttributeNames = Object.fromEntries([[
|
|
168
|
+
"#evt",
|
|
169
|
+
"event"
|
|
170
|
+
]]);
|
|
171
|
+
let filterParts = ["attribute_exists(#evt)"];
|
|
172
|
+
if (eventTypes !== undefined && eventTypes.length !== 0) {
|
|
173
|
+
let typeConditions = eventTypes.map((typ, idx) => {
|
|
174
|
+
let placeholder = `:type` + idx.toString();
|
|
175
|
+
expressionAttributeValues[placeholder] = typ;
|
|
176
|
+
return `#evt = ` + placeholder;
|
|
177
|
+
});
|
|
178
|
+
filterParts.push(`(` + typeConditions.join(" OR ") + `)`);
|
|
179
|
+
}
|
|
180
|
+
let hasAttributeValues = Object.keys(expressionAttributeValues).length !== 0;
|
|
181
|
+
return {
|
|
182
|
+
filterExpression: filterParts.join(" AND "),
|
|
183
|
+
expressionAttributeNames: expressionAttributeNames,
|
|
184
|
+
expressionAttributeValues: hasAttributeValues ? expressionAttributeValues : undefined
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function scanWithFilter(table, eventTypes, after) {
|
|
189
|
+
let filter = buildScanFilter(eventTypes);
|
|
190
|
+
let scanParams_TableName = table.name;
|
|
191
|
+
let scanParams_ExpressionAttributeNames = filter.expressionAttributeNames;
|
|
192
|
+
let scanParams_ExpressionAttributeValues = filter.expressionAttributeValues;
|
|
193
|
+
let scanParams_FilterExpression = filter.filterExpression;
|
|
194
|
+
let scanParams = {
|
|
195
|
+
TableName: scanParams_TableName,
|
|
196
|
+
ExpressionAttributeNames: scanParams_ExpressionAttributeNames,
|
|
197
|
+
ExpressionAttributeValues: scanParams_ExpressionAttributeValues,
|
|
198
|
+
FilterExpression: scanParams_FilterExpression
|
|
199
|
+
};
|
|
200
|
+
let rawItems = await Effect$1.runPromise(Stream.runCollect(Util_DynamoDb_Runtime$ReventlessAws.scanStream(scanParams)));
|
|
201
|
+
if (after !== undefined) {
|
|
202
|
+
return rawItems.filter(item => Stdlib_Option.mapOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(item), obj => obj["position"]), Stdlib_JSON.Decode.string), false, pos => Primitive_string.compare(pos, after) > 0));
|
|
203
|
+
} else {
|
|
204
|
+
return rawItems;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function buildQueryByPartitionKeyInput(table, partitionKey, after, strongConsistencyOpt) {
|
|
209
|
+
let strongConsistency = strongConsistencyOpt !== undefined ? strongConsistencyOpt : false;
|
|
210
|
+
let expressionAttributeValues = Object.fromEntries([[
|
|
211
|
+
":pk",
|
|
212
|
+
partitionKey
|
|
213
|
+
]]);
|
|
214
|
+
let match = after !== undefined ? (expressionAttributeValues[":after"] = after, [
|
|
215
|
+
"id = :pk AND #pos > :after",
|
|
216
|
+
Object.fromEntries([[
|
|
217
|
+
"#pos",
|
|
218
|
+
"position"
|
|
219
|
+
]])
|
|
220
|
+
]) : [
|
|
221
|
+
"id = :pk",
|
|
222
|
+
undefined
|
|
223
|
+
];
|
|
224
|
+
let consistentRead = strongConsistency ? true : undefined;
|
|
225
|
+
return {
|
|
226
|
+
TableName: table.name,
|
|
227
|
+
ConsistentRead: consistentRead,
|
|
228
|
+
ExpressionAttributeNames: match[1],
|
|
229
|
+
ExpressionAttributeValues: expressionAttributeValues,
|
|
230
|
+
KeyConditionExpression: match[0]
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async function queryByPartitionKey(table, partitionKey, after) {
|
|
235
|
+
let queryParams = buildQueryByPartitionKeyInput(table, partitionKey, after, undefined);
|
|
236
|
+
return await Effect$1.runPromise(Stream.runCollect(Util_DynamoDb_Runtime$ReventlessAws.queryStream(queryParams)));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function resolveBaseItem(table, keyItem) {
|
|
240
|
+
let obj = Stdlib_JSON.Decode.object(keyItem);
|
|
241
|
+
if (obj === undefined) {
|
|
242
|
+
return Effect$1.succeed(undefined);
|
|
243
|
+
}
|
|
244
|
+
let match = obj["id"];
|
|
245
|
+
let match$1 = obj["position"];
|
|
246
|
+
if (match === undefined) {
|
|
247
|
+
return Effect$1.succeed(undefined);
|
|
248
|
+
}
|
|
249
|
+
if (match$1 === undefined) {
|
|
250
|
+
return Effect$1.succeed(undefined);
|
|
251
|
+
}
|
|
252
|
+
let key = Object.fromEntries([
|
|
253
|
+
[
|
|
254
|
+
"id",
|
|
255
|
+
match
|
|
256
|
+
],
|
|
257
|
+
[
|
|
258
|
+
"position",
|
|
259
|
+
match$1
|
|
260
|
+
]
|
|
261
|
+
]);
|
|
262
|
+
return Effect$1.map(Effect$1.catchAll(Effect$1.retry(Effect.tryPromise(DynamoDb_Error$ReventlessAws.classify, () => DynamoDb_DocumentClient$AwsSdk.GetCommand.send(new LibDynamodb.GetCommand({
|
|
263
|
+
TableName: table.name,
|
|
264
|
+
Key: key
|
|
265
|
+
}))), DynamoDb_Error$ReventlessAws.retrySchedule), err => Effect$1.fail(DynamoDb_Error$ReventlessAws.message(err))), result => result.Item);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function queryBySingleTagCrossPartitionStream(table, tag, after) {
|
|
269
|
+
let indexName = tagToAttributeName(tag.key);
|
|
270
|
+
let expressionAttributeValues = Object.fromEntries([[
|
|
271
|
+
":val",
|
|
272
|
+
tag.value
|
|
273
|
+
]]);
|
|
274
|
+
let expressionAttributeNames = Object.fromEntries([[
|
|
275
|
+
"#tag",
|
|
276
|
+
indexName
|
|
277
|
+
]]);
|
|
278
|
+
let keyConditionExpression = after !== undefined ? (expressionAttributeValues[":after"] = after, expressionAttributeNames["#pos"] = "position", "#tag = :val AND #pos > :after") : "#tag = :val";
|
|
279
|
+
let baseParams_TableName = table.name;
|
|
280
|
+
let baseParams_ExpressionAttributeNames = expressionAttributeNames;
|
|
281
|
+
let baseParams_ExpressionAttributeValues = expressionAttributeValues;
|
|
282
|
+
let baseParams_IndexName = indexName;
|
|
283
|
+
let baseParams_KeyConditionExpression = keyConditionExpression;
|
|
284
|
+
let baseParams = {
|
|
285
|
+
TableName: baseParams_TableName,
|
|
286
|
+
ExpressionAttributeNames: baseParams_ExpressionAttributeNames,
|
|
287
|
+
ExpressionAttributeValues: baseParams_ExpressionAttributeValues,
|
|
288
|
+
IndexName: baseParams_IndexName,
|
|
289
|
+
KeyConditionExpression: baseParams_KeyConditionExpression
|
|
290
|
+
};
|
|
291
|
+
return Stream$1.flatMap(Stream$1.mapEffect(Stream.paginateEffect(undefined, cursor => Effect$1.map(Effect$1.catchAll(Effect$1.retry(Effect.tryPromise(DynamoDb_Error$ReventlessAws.classify, () => {
|
|
292
|
+
let params;
|
|
293
|
+
if (cursor !== undefined) {
|
|
294
|
+
let newrecord = {...baseParams};
|
|
295
|
+
newrecord.ExclusiveStartKey = cursor;
|
|
296
|
+
params = newrecord;
|
|
297
|
+
} else {
|
|
298
|
+
params = baseParams;
|
|
299
|
+
}
|
|
300
|
+
return DynamoDb_DocumentClient$AwsSdk.QueryCommand.send(new LibDynamodb.QueryCommand(params));
|
|
301
|
+
}), DynamoDb_Error$ReventlessAws.retrySchedule), err => Effect$1.fail(DynamoDb_Error$ReventlessAws.message(err))), result => [
|
|
302
|
+
Stdlib_Option.getOr(result.Items, []),
|
|
303
|
+
Stdlib_Option.map(result.LastEvaluatedKey, key => key)
|
|
304
|
+
])), keyItem => resolveBaseItem(table, keyItem)), opt => {
|
|
305
|
+
if (opt !== undefined) {
|
|
306
|
+
return Stream$1.fromIterable([opt]);
|
|
307
|
+
} else {
|
|
308
|
+
return Stream$1.empty;
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async function executeQueryItem(table, queryItem, after, crossPartitionTagKeysOpt) {
|
|
314
|
+
let crossPartitionTagKeys = crossPartitionTagKeysOpt !== undefined ? crossPartitionTagKeysOpt : [];
|
|
315
|
+
let tags = queryItem.tags;
|
|
316
|
+
if (tags !== undefined) {
|
|
317
|
+
if (tags.length !== 1) {
|
|
318
|
+
if (tags.length > 1) {
|
|
319
|
+
return await queryByCompositeTags(table, tags, after);
|
|
320
|
+
}
|
|
321
|
+
tags.length !== 0;
|
|
322
|
+
} else {
|
|
323
|
+
let tag = tags[0];
|
|
324
|
+
if (crossPartitionTagKeys.includes(tag.key)) {
|
|
325
|
+
return await Effect$1.runPromise(Stream.runCollect(queryBySingleTagCrossPartitionStream(table, tag, after)));
|
|
326
|
+
} else {
|
|
327
|
+
return await queryByPartitionKey(table, tag.key + `:` + tag.value, after);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
let eventTypes = queryItem.eventTypes;
|
|
332
|
+
if (eventTypes !== undefined) {
|
|
333
|
+
return await scanWithFilter(table, eventTypes, after);
|
|
334
|
+
} else {
|
|
335
|
+
return await scanWithFilter(table, undefined, after);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function deduplicateByPosition(events) {
|
|
340
|
+
let seen = new Set();
|
|
341
|
+
return events.filter(event => {
|
|
342
|
+
if (seen.has(event.position)) {
|
|
343
|
+
return false;
|
|
344
|
+
} else {
|
|
345
|
+
seen.add(event.position);
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function initSlot(stream) {
|
|
352
|
+
return Effect$1.flatMap(Queue.bounded(1), queue => {
|
|
353
|
+
let producer = Effect$1.catchAll(Effect$1.ensuring(Stream$1.runForEach(stream, event => Effect$1.map(Queue.offer(queue, event), param => {})), Effect$1.map(Queue.offer(queue, undefined), param => {})), param => Effect$1.succeed());
|
|
354
|
+
return Effect$1.flatMap(Effect$1.fork(producer), param => Effect$1.map(Queue.take(queue), head => ({
|
|
355
|
+
queue: queue,
|
|
356
|
+
head: head
|
|
357
|
+
})));
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function findMinSlotIdx(slots) {
|
|
362
|
+
return Stdlib_Array.reduceWithIndex(slots, undefined, (minOpt, slot, idx) => {
|
|
363
|
+
let match = slot.head;
|
|
364
|
+
if (match === undefined) {
|
|
365
|
+
return minOpt;
|
|
366
|
+
}
|
|
367
|
+
if (minOpt === undefined) {
|
|
368
|
+
return idx;
|
|
369
|
+
}
|
|
370
|
+
let minSlot = slots[minOpt];
|
|
371
|
+
let minHead = minSlot.head;
|
|
372
|
+
if (minHead !== undefined && Primitive_string.compare(match.position, minHead.position) >= 0) {
|
|
373
|
+
return minOpt;
|
|
374
|
+
} else {
|
|
375
|
+
return idx;
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function dedupByPosition(stream) {
|
|
381
|
+
let lastPos = {
|
|
382
|
+
contents: undefined
|
|
383
|
+
};
|
|
384
|
+
return Stream$1.filter(stream, event => {
|
|
385
|
+
let pos = lastPos.contents;
|
|
386
|
+
if (pos !== undefined && pos === event.position) {
|
|
387
|
+
return false;
|
|
388
|
+
} else {
|
|
389
|
+
lastPos.contents = event.position;
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function mergeSortedEvents(streams) {
|
|
396
|
+
return Stream$1.flatMap(Stream$1.fromEffect(Effect$1.all(streams.map(initSlot), {
|
|
397
|
+
concurrency: "unbounded"
|
|
398
|
+
})), initialSlots => Stream.paginateEffect(initialSlots, slots => {
|
|
399
|
+
let idx = findMinSlotIdx(slots);
|
|
400
|
+
if (idx === undefined) {
|
|
401
|
+
return Effect$1.succeed([
|
|
402
|
+
[],
|
|
403
|
+
undefined
|
|
404
|
+
]);
|
|
405
|
+
}
|
|
406
|
+
let slot = slots[idx];
|
|
407
|
+
let emitEvent = Stdlib_Option.getOrThrow(slot.head, undefined);
|
|
408
|
+
return Effect$1.map(Queue.take(slot.queue), nextHead => {
|
|
409
|
+
let newSlots = slots.map((s, i) => {
|
|
410
|
+
if (i === idx) {
|
|
411
|
+
return {
|
|
412
|
+
queue: s.queue,
|
|
413
|
+
head: nextHead
|
|
414
|
+
};
|
|
415
|
+
} else {
|
|
416
|
+
return s;
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
let hasActive = newSlots.some(s => Stdlib_Option.isSome(s.head));
|
|
420
|
+
return [
|
|
421
|
+
[emitEvent],
|
|
422
|
+
hasActive ? newSlots : undefined
|
|
423
|
+
];
|
|
424
|
+
});
|
|
425
|
+
}));
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function read(table, $staropt$star) {
|
|
429
|
+
return async (query, after) => {
|
|
430
|
+
let crossPartitionTagKeys = $staropt$star !== undefined ? $staropt$star : [];
|
|
431
|
+
let queryResults = await Promise.all(query.map(queryItem => executeQueryItem(table, queryItem, after, crossPartitionTagKeys)));
|
|
432
|
+
let allItems = queryResults.flat();
|
|
433
|
+
let allEvents = allItems.map(fromItem);
|
|
434
|
+
let deduplicatedEvents = deduplicateByPosition(allEvents);
|
|
435
|
+
let sortedEvents = deduplicatedEvents.toSorted((a, b) => Primitive_string.compare(a.position, b.position));
|
|
436
|
+
let headPosition = Stdlib_Option.map(sortedEvents.toReversed().at(0), event => event.position);
|
|
437
|
+
return {
|
|
438
|
+
events: sortedEvents,
|
|
439
|
+
headPosition: headPosition
|
|
440
|
+
};
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
let fenceSortKey = "FENCE";
|
|
445
|
+
|
|
446
|
+
function fencePartitionKey(tag) {
|
|
447
|
+
return `fence#` + tag.key + `:` + tag.value;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
function fenceKey(tag) {
|
|
451
|
+
return Object.fromEntries([
|
|
452
|
+
[
|
|
453
|
+
"id",
|
|
454
|
+
fencePartitionKey(tag)
|
|
455
|
+
],
|
|
456
|
+
[
|
|
457
|
+
"position",
|
|
458
|
+
fenceSortKey
|
|
459
|
+
]
|
|
460
|
+
]);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
function collectQueryTags(query) {
|
|
464
|
+
let seen = new Set();
|
|
465
|
+
let acc = [];
|
|
466
|
+
query.forEach(qi => {
|
|
467
|
+
let tags = qi.tags;
|
|
468
|
+
if (tags !== undefined) {
|
|
469
|
+
tags.forEach(tag => {
|
|
470
|
+
let k = tag.key + `:` + tag.value;
|
|
471
|
+
if (!seen.has(k)) {
|
|
472
|
+
seen.add(k);
|
|
473
|
+
acc.push(tag);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
return acc;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
function collectEventTags(events) {
|
|
484
|
+
let seen = new Set();
|
|
485
|
+
let acc = [];
|
|
486
|
+
events.forEach(event => {
|
|
487
|
+
event.tags.forEach(tag => {
|
|
488
|
+
let k = tag.key + `:` + tag.value;
|
|
489
|
+
if (!seen.has(k)) {
|
|
490
|
+
seen.add(k);
|
|
491
|
+
acc.push(tag);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
return acc;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function fenceTypeAttr(eventType) {
|
|
500
|
+
return `pos#` + eventType;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
function dedupStrings(xs) {
|
|
504
|
+
let seen = new Set();
|
|
505
|
+
return xs.filter(x => {
|
|
506
|
+
if (seen.has(x)) {
|
|
507
|
+
return false;
|
|
508
|
+
} else {
|
|
509
|
+
seen.add(x);
|
|
510
|
+
return true;
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
function carriedTypesByTag(events) {
|
|
516
|
+
let d = {};
|
|
517
|
+
events.forEach(e => {
|
|
518
|
+
e.tags.forEach(t => {
|
|
519
|
+
let k = t.key + `:` + t.value;
|
|
520
|
+
let cur = Stdlib_Option.getOr(d[k], []);
|
|
521
|
+
if (!cur.includes(e.eventType)) {
|
|
522
|
+
d[k] = cur.concat([e.eventType]);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
});
|
|
527
|
+
return d;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function buildConditionalFenceUpdate(tableName, tag, consumedTypes, producedTypes, newPosition, after) {
|
|
531
|
+
let names = {};
|
|
532
|
+
let values = Object.fromEntries([[
|
|
533
|
+
":new",
|
|
534
|
+
newPosition
|
|
535
|
+
]]);
|
|
536
|
+
let setClauses = producedTypes.map((pt, i) => {
|
|
537
|
+
let ph = `#p` + i.toString();
|
|
538
|
+
names[ph] = fenceTypeAttr(pt);
|
|
539
|
+
return ph + ` = :new`;
|
|
540
|
+
});
|
|
541
|
+
let conditionExpression;
|
|
542
|
+
if (after !== undefined) {
|
|
543
|
+
values[":after"] = after;
|
|
544
|
+
let checkTypes = consumedTypes.length === 0 ? producedTypes : consumedTypes;
|
|
545
|
+
conditionExpression = checkTypes.map((t, i) => {
|
|
546
|
+
let ph = `#c` + i.toString();
|
|
547
|
+
names[ph] = fenceTypeAttr(t);
|
|
548
|
+
return `(attribute_not_exists(` + ph + `) OR ` + ph + ` <= :after)`;
|
|
549
|
+
}).join(" AND ");
|
|
550
|
+
} else {
|
|
551
|
+
conditionExpression = dedupStrings(consumedTypes.concat(producedTypes)).map((t, i) => {
|
|
552
|
+
let ph = `#c` + i.toString();
|
|
553
|
+
names[ph] = fenceTypeAttr(t);
|
|
554
|
+
return `attribute_not_exists(` + ph + `)`;
|
|
555
|
+
}).join(" AND ");
|
|
556
|
+
}
|
|
557
|
+
return {
|
|
558
|
+
Key: fenceKey(tag),
|
|
559
|
+
TableName: tableName,
|
|
560
|
+
UpdateExpression: `SET ` + setClauses.join(", "),
|
|
561
|
+
ConditionExpression: conditionExpression,
|
|
562
|
+
ExpressionAttributeNames: names,
|
|
563
|
+
ExpressionAttributeValues: values
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function buildUnconditionalFenceUpdate(tableName, tag, producedTypes, newPosition) {
|
|
568
|
+
let names = {};
|
|
569
|
+
let values = Object.fromEntries([[
|
|
570
|
+
":new",
|
|
571
|
+
newPosition
|
|
572
|
+
]]);
|
|
573
|
+
let setClauses = producedTypes.map((pt, i) => {
|
|
574
|
+
let ph = `#p` + i.toString();
|
|
575
|
+
names[ph] = fenceTypeAttr(pt);
|
|
576
|
+
return ph + ` = :new`;
|
|
577
|
+
});
|
|
578
|
+
return {
|
|
579
|
+
Key: fenceKey(tag),
|
|
580
|
+
TableName: tableName,
|
|
581
|
+
UpdateExpression: `SET ` + setClauses.join(", "),
|
|
582
|
+
ExpressionAttributeNames: names,
|
|
583
|
+
ExpressionAttributeValues: values
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function buildFenceConditionCheck(tableName, tag, consumedTypes, after) {
|
|
588
|
+
let names = {};
|
|
589
|
+
if (after !== undefined) {
|
|
590
|
+
let conditionExpression = consumedTypes.map((t, i) => {
|
|
591
|
+
let ph = `#c` + i.toString();
|
|
592
|
+
names[ph] = fenceTypeAttr(t);
|
|
593
|
+
return `(attribute_not_exists(` + ph + `) OR ` + ph + ` <= :after)`;
|
|
594
|
+
}).join(" AND ");
|
|
595
|
+
return {
|
|
596
|
+
Key: fenceKey(tag),
|
|
597
|
+
TableName: tableName,
|
|
598
|
+
ConditionExpression: conditionExpression,
|
|
599
|
+
ExpressionAttributeNames: names,
|
|
600
|
+
ExpressionAttributeValues: Object.fromEntries([[
|
|
601
|
+
":after",
|
|
602
|
+
after
|
|
603
|
+
]])
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
let conditionExpression$1 = consumedTypes.map((t, i) => {
|
|
607
|
+
let ph = `#c` + i.toString();
|
|
608
|
+
names[ph] = fenceTypeAttr(t);
|
|
609
|
+
return `attribute_not_exists(` + ph + `)`;
|
|
610
|
+
}).join(" AND ");
|
|
611
|
+
return {
|
|
612
|
+
Key: fenceKey(tag),
|
|
613
|
+
TableName: tableName,
|
|
614
|
+
ConditionExpression: conditionExpression$1,
|
|
615
|
+
ExpressionAttributeNames: names
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
function buildEventPuts(table, events, basePosition, partitionTag) {
|
|
620
|
+
return events.map((event, idx) => {
|
|
621
|
+
let position = generatePositionForBatch(basePosition, idx);
|
|
622
|
+
let recordedAt = Message$ReventlessCore.nowAsISOString();
|
|
623
|
+
let item = toItem(position, event, partitionTag, recordedAt);
|
|
624
|
+
let put_TableName = table.name;
|
|
625
|
+
let put = {
|
|
626
|
+
Item: item,
|
|
627
|
+
TableName: put_TableName
|
|
628
|
+
};
|
|
629
|
+
return {
|
|
630
|
+
Put: put
|
|
631
|
+
};
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
async function runTransactWrite(input, basePosition, errorPrefix) {
|
|
636
|
+
return await Effect$1.runPromise(Effect$1.catchAll(Effect$1.map(Effect.tryPromise(DynamoDb_Error$ReventlessAws.classify, () => DynamoDb_DocumentClient$AwsSdk.TransactWriteCommand.send(new LibDynamodb.TransactWriteCommand(input))), param => ({
|
|
637
|
+
TAG: "Ok",
|
|
638
|
+
_0: basePosition
|
|
639
|
+
})), err => {
|
|
640
|
+
switch (err.TAG) {
|
|
641
|
+
case "StaleState" :
|
|
642
|
+
return Effect$1.succeed({
|
|
643
|
+
TAG: "Error",
|
|
644
|
+
_0: `Conflict: ` + err._0
|
|
645
|
+
});
|
|
646
|
+
case "Transient" :
|
|
647
|
+
case "Permanent" :
|
|
648
|
+
break;
|
|
649
|
+
}
|
|
650
|
+
return Effect$1.succeed({
|
|
651
|
+
TAG: "Error",
|
|
652
|
+
_0: errorPrefix + `: ` + err._0
|
|
653
|
+
});
|
|
654
|
+
}));
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
async function appendUnconditional(table, events, partitionTag) {
|
|
658
|
+
let eventTags = collectEventTags(events);
|
|
659
|
+
let totalItems = events.length + eventTags.length | 0;
|
|
660
|
+
if (events.length === 0) {
|
|
661
|
+
return {
|
|
662
|
+
TAG: "Ok",
|
|
663
|
+
_0: generatePosition()
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
if (totalItems > 100) {
|
|
667
|
+
return {
|
|
668
|
+
TAG: "Error",
|
|
669
|
+
_0: `DCB append: TransactWriteItems limit exceeded (` + totalItems.toString() + ` > ` + (100).toString() + `); reduce events or distinct tag values per command`
|
|
670
|
+
};
|
|
671
|
+
}
|
|
672
|
+
let basePosition = generatePosition();
|
|
673
|
+
let carriedMap = carriedTypesByTag(events);
|
|
674
|
+
let putItems = buildEventPuts(table, events, basePosition, partitionTag);
|
|
675
|
+
let updateItems = Stdlib_Array.filterMap(eventTags, tag => {
|
|
676
|
+
let producedTypes = Stdlib_Option.getOr(carriedMap[tag.key + `:` + tag.value], []);
|
|
677
|
+
if (producedTypes.length === 0) {
|
|
678
|
+
return;
|
|
679
|
+
} else {
|
|
680
|
+
return {
|
|
681
|
+
Update: buildUnconditionalFenceUpdate(table.name, tag, producedTypes, basePosition)
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
let input_TransactItems = putItems.concat(updateItems);
|
|
686
|
+
let input = {
|
|
687
|
+
TransactItems: input_TransactItems
|
|
688
|
+
};
|
|
689
|
+
return await runTransactWrite(input, basePosition, "DCB append failed");
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
function eventPartitionTags(event, partitionTag) {
|
|
693
|
+
if (partitionTag !== undefined) {
|
|
694
|
+
if (partitionTag.TAG !== "Simple") {
|
|
695
|
+
return event.tags;
|
|
696
|
+
}
|
|
697
|
+
let pt = partitionTag._0;
|
|
698
|
+
let t = event.tags.find(t => t.key === pt.key);
|
|
699
|
+
if (t !== undefined) {
|
|
700
|
+
return [t];
|
|
701
|
+
}
|
|
702
|
+
let t$1 = event.tags[0];
|
|
703
|
+
if (t$1 !== undefined) {
|
|
704
|
+
return [t$1];
|
|
705
|
+
} else {
|
|
706
|
+
return [];
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
let t$2 = event.tags[0];
|
|
710
|
+
if (t$2 !== undefined) {
|
|
711
|
+
return [t$2];
|
|
712
|
+
} else {
|
|
713
|
+
return [];
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
function collectEventPartitionTags(events, partitionTag) {
|
|
718
|
+
let seen = new Set();
|
|
719
|
+
let acc = [];
|
|
720
|
+
events.forEach(event => {
|
|
721
|
+
eventPartitionTags(event, partitionTag).forEach(tag => {
|
|
722
|
+
let k = tag.key + `:` + tag.value;
|
|
723
|
+
if (!seen.has(k)) {
|
|
724
|
+
seen.add(k);
|
|
725
|
+
acc.push(tag);
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
});
|
|
729
|
+
});
|
|
730
|
+
return acc;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
function partitionTypesByTag(events, partitionTag) {
|
|
734
|
+
let d = {};
|
|
735
|
+
events.forEach(e => {
|
|
736
|
+
eventPartitionTags(e, partitionTag).forEach(t => {
|
|
737
|
+
let k = t.key + `:` + t.value;
|
|
738
|
+
let cur = Stdlib_Option.getOr(d[k], []);
|
|
739
|
+
if (!cur.includes(e.eventType)) {
|
|
740
|
+
d[k] = cur.concat([e.eventType]);
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
});
|
|
744
|
+
});
|
|
745
|
+
return d;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
function buildConditionalTransactItems(table, events, cond, basePosition, partitionTag, crossPartitionTagKeysOpt) {
|
|
749
|
+
let crossPartitionTagKeys = crossPartitionTagKeysOpt !== undefined ? crossPartitionTagKeysOpt : [];
|
|
750
|
+
let partitionTags = collectEventPartitionTags(events, partitionTag);
|
|
751
|
+
let partitionKeySet = new Set();
|
|
752
|
+
partitionTags.forEach(t => {
|
|
753
|
+
partitionKeySet.add(t.key + `:` + t.value);
|
|
754
|
+
});
|
|
755
|
+
let isPartition = t => partitionKeySet.has(t.key + `:` + t.value);
|
|
756
|
+
let isCrossPartition = t => crossPartitionTagKeys.includes(t.key);
|
|
757
|
+
let crossPartitionEventTags = collectEventTags(events).filter(isCrossPartition);
|
|
758
|
+
let carriedMap = carriedTypesByTag(events);
|
|
759
|
+
let partitionMap = partitionTypesByTag(events, partitionTag);
|
|
760
|
+
let producedTypesFor = t => {
|
|
761
|
+
let k = t.key + `:` + t.value;
|
|
762
|
+
return Stdlib_Option.getOr((
|
|
763
|
+
isPartition(t) && !crossPartitionTagKeys.includes(t.key) ? partitionMap : carriedMap
|
|
764
|
+
)[k], []);
|
|
765
|
+
};
|
|
766
|
+
let consumedMap = {};
|
|
767
|
+
cond.query.forEach(qi => {
|
|
768
|
+
let match = qi.tags;
|
|
769
|
+
let match$1 = qi.eventTypes;
|
|
770
|
+
if (match !== undefined && match$1 !== undefined) {
|
|
771
|
+
match.forEach(t => {
|
|
772
|
+
let k = t.key + `:` + t.value;
|
|
773
|
+
let cur = Stdlib_Option.getOr(consumedMap[k], []);
|
|
774
|
+
consumedMap[k] = dedupStrings(cur.concat(match$1));
|
|
775
|
+
});
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
let consumedTypesFor = t => Stdlib_Option.getOr(consumedMap[t.key + `:` + t.value], []);
|
|
780
|
+
let compositeKeySet = new Set();
|
|
781
|
+
let compositeQueryTags = [];
|
|
782
|
+
cond.query.forEach(qi => {
|
|
783
|
+
let tags = qi.tags;
|
|
784
|
+
if (tags !== undefined && tags.length > 1) {
|
|
785
|
+
tags.forEach(tag => {
|
|
786
|
+
let k = tag.key + `:` + tag.value;
|
|
787
|
+
if (!compositeKeySet.has(k)) {
|
|
788
|
+
compositeKeySet.add(k);
|
|
789
|
+
compositeQueryTags.push(tag);
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
});
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
});
|
|
796
|
+
let isCompositeQueryTag = t => compositeKeySet.has(t.key + `:` + t.value);
|
|
797
|
+
let updateKeySet = new Set();
|
|
798
|
+
let conditionalUpdateTags = [];
|
|
799
|
+
let checkKeySet = new Set();
|
|
800
|
+
let conditionCheckTags = [];
|
|
801
|
+
let pushUpdate = tag => {
|
|
802
|
+
let k = tag.key + `:` + tag.value;
|
|
803
|
+
if (!updateKeySet.has(k)) {
|
|
804
|
+
updateKeySet.add(k);
|
|
805
|
+
conditionalUpdateTags.push(tag);
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
};
|
|
809
|
+
cond.query.forEach(qi => {
|
|
810
|
+
let tags = qi.tags;
|
|
811
|
+
if (tags === undefined) {
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
814
|
+
if (tags.length !== 1) {
|
|
815
|
+
if (tags.length <= 1) {
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
let match = cond.after;
|
|
819
|
+
if (match !== undefined) {
|
|
820
|
+
tags.forEach(pushUpdate);
|
|
821
|
+
return;
|
|
822
|
+
} else {
|
|
823
|
+
return;
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
let tag = tags[0];
|
|
827
|
+
if (crossPartitionTagKeys.includes(tag.key)) {
|
|
828
|
+
return pushUpdate(tag);
|
|
829
|
+
}
|
|
830
|
+
let match$1 = cond.after;
|
|
831
|
+
if (match$1 !== undefined) {
|
|
832
|
+
if (isPartition(tag) || isCompositeQueryTag(tag)) {
|
|
833
|
+
return pushUpdate(tag);
|
|
834
|
+
} else {
|
|
835
|
+
let k = tag.key + `:` + tag.value;
|
|
836
|
+
if (!checkKeySet.has(k)) {
|
|
837
|
+
checkKeySet.add(k);
|
|
838
|
+
conditionCheckTags.push(tag);
|
|
839
|
+
return;
|
|
840
|
+
} else {
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
} else if (isPartition(tag)) {
|
|
845
|
+
return pushUpdate(tag);
|
|
846
|
+
} else {
|
|
847
|
+
return;
|
|
848
|
+
}
|
|
849
|
+
});
|
|
850
|
+
let match = cond.after;
|
|
851
|
+
if (match !== undefined) {
|
|
852
|
+
|
|
853
|
+
} else {
|
|
854
|
+
partitionTags.forEach(pushUpdate);
|
|
855
|
+
}
|
|
856
|
+
let bumpSeen = new Set();
|
|
857
|
+
conditionalUpdateTags.forEach(t => {
|
|
858
|
+
bumpSeen.add(t.key + `:` + t.value);
|
|
859
|
+
});
|
|
860
|
+
let bumpTags = [];
|
|
861
|
+
let match$1 = cond.after;
|
|
862
|
+
let candidateBumps = match$1 !== undefined ? partitionTags.concat(crossPartitionEventTags) : partitionTags.concat(compositeQueryTags.concat(crossPartitionEventTags));
|
|
863
|
+
candidateBumps.forEach(tag => {
|
|
864
|
+
let k = tag.key + `:` + tag.value;
|
|
865
|
+
if (!bumpSeen.has(k)) {
|
|
866
|
+
bumpSeen.add(k);
|
|
867
|
+
bumpTags.push(tag);
|
|
868
|
+
return;
|
|
869
|
+
}
|
|
870
|
+
});
|
|
871
|
+
let putItems = buildEventPuts(table, events, basePosition, partitionTag);
|
|
872
|
+
let updateItems = Stdlib_Array.filterMap(conditionalUpdateTags, tag => {
|
|
873
|
+
let producedTypes = producedTypesFor(tag);
|
|
874
|
+
if (producedTypes.length === 0) {
|
|
875
|
+
return;
|
|
876
|
+
} else {
|
|
877
|
+
return {
|
|
878
|
+
Update: buildConditionalFenceUpdate(table.name, tag, consumedTypesFor(tag), producedTypes, basePosition, cond.after)
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
});
|
|
882
|
+
let checkItems = Stdlib_Array.filterMap(conditionCheckTags, tag => {
|
|
883
|
+
let consumedTypes = consumedTypesFor(tag);
|
|
884
|
+
if (consumedTypes.length === 0) {
|
|
885
|
+
return;
|
|
886
|
+
} else {
|
|
887
|
+
return {
|
|
888
|
+
ConditionCheck: buildFenceConditionCheck(table.name, tag, consumedTypes, cond.after)
|
|
889
|
+
};
|
|
890
|
+
}
|
|
891
|
+
});
|
|
892
|
+
let bumpItems = Stdlib_Array.filterMap(bumpTags, tag => {
|
|
893
|
+
let producedTypes = producedTypesFor(tag);
|
|
894
|
+
if (producedTypes.length === 0) {
|
|
895
|
+
return;
|
|
896
|
+
} else {
|
|
897
|
+
return {
|
|
898
|
+
Update: buildUnconditionalFenceUpdate(table.name, tag, producedTypes, basePosition)
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
});
|
|
902
|
+
return putItems.concat(updateItems.concat(checkItems.concat(bumpItems)));
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
async function appendConditional(table, events, cond, partitionTag, crossPartitionTagKeysOpt) {
|
|
906
|
+
let crossPartitionTagKeys = crossPartitionTagKeysOpt !== undefined ? crossPartitionTagKeysOpt : [];
|
|
907
|
+
let queryTags = collectQueryTags(cond.query);
|
|
908
|
+
if (queryTags.length === 0) {
|
|
909
|
+
return {
|
|
910
|
+
TAG: "Error",
|
|
911
|
+
_0: "DCB append: tagless conditions are not supported on DynamoDB — every queryItem must have at least one tag"
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
let basePosition = generatePosition();
|
|
915
|
+
let transactItems = buildConditionalTransactItems(table, events, cond, basePosition, partitionTag, crossPartitionTagKeys);
|
|
916
|
+
let totalItems = transactItems.length;
|
|
917
|
+
if (totalItems > 100) {
|
|
918
|
+
return {
|
|
919
|
+
TAG: "Error",
|
|
920
|
+
_0: `DCB append: TransactWriteItems limit exceeded (` + totalItems.toString() + ` > ` + (100).toString() + `); reduce events or distinct tag values per command`
|
|
921
|
+
};
|
|
922
|
+
}
|
|
923
|
+
let input = {
|
|
924
|
+
TransactItems: transactItems
|
|
925
|
+
};
|
|
926
|
+
return await runTransactWrite(input, basePosition, "DCB append failed");
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
function append(table, partitionTag, $staropt$star) {
|
|
930
|
+
return async (events, condition) => {
|
|
931
|
+
let crossPartitionTagKeys = $staropt$star !== undefined ? $staropt$star : [];
|
|
932
|
+
if (condition !== undefined) {
|
|
933
|
+
return await appendConditional(table, events, condition, partitionTag, crossPartitionTagKeys);
|
|
934
|
+
} else {
|
|
935
|
+
return await appendUnconditional(table, events, partitionTag);
|
|
936
|
+
}
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
function queryByPartitionKeyStream(table, partitionKey, after, strongConsistencyOpt) {
|
|
941
|
+
let strongConsistency = strongConsistencyOpt !== undefined ? strongConsistencyOpt : false;
|
|
942
|
+
let baseParams = buildQueryByPartitionKeyInput(table, partitionKey, after, strongConsistency);
|
|
943
|
+
return Stream.paginateEffect(undefined, cursor => Effect$1.map(Effect$1.catchAll(Effect$1.retry(Effect.tryPromise(DynamoDb_Error$ReventlessAws.classify, () => {
|
|
944
|
+
let params;
|
|
945
|
+
if (cursor !== undefined) {
|
|
946
|
+
let newrecord = {...baseParams};
|
|
947
|
+
newrecord.ExclusiveStartKey = cursor;
|
|
948
|
+
params = newrecord;
|
|
949
|
+
} else {
|
|
950
|
+
params = baseParams;
|
|
951
|
+
}
|
|
952
|
+
return DynamoDb_DocumentClient$AwsSdk.QueryCommand.send(new LibDynamodb.QueryCommand(params));
|
|
953
|
+
}), DynamoDb_Error$ReventlessAws.retrySchedule), err => Effect$1.fail(DynamoDb_Error$ReventlessAws.message(err))), result => [
|
|
954
|
+
Stdlib_Option.getOr(result.Items, []),
|
|
955
|
+
Stdlib_Option.map(result.LastEvaluatedKey, key => key)
|
|
956
|
+
]));
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
function queryByCompositeTagsStream(table, tags, after) {
|
|
960
|
+
let composite = compositeTagKey(tags);
|
|
961
|
+
let expressionAttributeValues = Object.fromEntries([[
|
|
962
|
+
":composite",
|
|
963
|
+
composite
|
|
964
|
+
]]);
|
|
965
|
+
let match = after !== undefined ? (expressionAttributeValues[":after"] = after, [
|
|
966
|
+
"tag_composite = :composite AND #pos > :after",
|
|
967
|
+
Object.fromEntries([[
|
|
968
|
+
"#pos",
|
|
969
|
+
"position"
|
|
970
|
+
]])
|
|
971
|
+
]) : [
|
|
972
|
+
"tag_composite = :composite",
|
|
973
|
+
undefined
|
|
974
|
+
];
|
|
975
|
+
let baseParams_TableName = table.name;
|
|
976
|
+
let baseParams_ExpressionAttributeNames = match[1];
|
|
977
|
+
let baseParams_ExpressionAttributeValues = expressionAttributeValues;
|
|
978
|
+
let baseParams_IndexName = "tag_composite";
|
|
979
|
+
let baseParams_KeyConditionExpression = match[0];
|
|
980
|
+
let baseParams = {
|
|
981
|
+
TableName: baseParams_TableName,
|
|
982
|
+
ExpressionAttributeNames: baseParams_ExpressionAttributeNames,
|
|
983
|
+
ExpressionAttributeValues: baseParams_ExpressionAttributeValues,
|
|
984
|
+
IndexName: baseParams_IndexName,
|
|
985
|
+
KeyConditionExpression: baseParams_KeyConditionExpression
|
|
986
|
+
};
|
|
987
|
+
return Stream.paginateEffect(undefined, cursor => Effect$1.map(Effect$1.catchAll(Effect$1.retry(Effect.tryPromise(DynamoDb_Error$ReventlessAws.classify, () => {
|
|
988
|
+
let params;
|
|
989
|
+
if (cursor !== undefined) {
|
|
990
|
+
let newrecord = {...baseParams};
|
|
991
|
+
newrecord.ExclusiveStartKey = cursor;
|
|
992
|
+
params = newrecord;
|
|
993
|
+
} else {
|
|
994
|
+
params = baseParams;
|
|
995
|
+
}
|
|
996
|
+
return DynamoDb_DocumentClient$AwsSdk.QueryCommand.send(new LibDynamodb.QueryCommand(params));
|
|
997
|
+
}), DynamoDb_Error$ReventlessAws.retrySchedule), err => Effect$1.fail(DynamoDb_Error$ReventlessAws.message(err))), result => [
|
|
998
|
+
Stdlib_Option.getOr(result.Items, []),
|
|
999
|
+
Stdlib_Option.map(result.LastEvaluatedKey, key => key)
|
|
1000
|
+
]));
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
function scanWithFilterStream(table, eventTypes, after) {
|
|
1004
|
+
let filter = buildScanFilter(eventTypes);
|
|
1005
|
+
let baseParams_TableName = table.name;
|
|
1006
|
+
let baseParams_ExpressionAttributeNames = filter.expressionAttributeNames;
|
|
1007
|
+
let baseParams_ExpressionAttributeValues = filter.expressionAttributeValues;
|
|
1008
|
+
let baseParams_FilterExpression = filter.filterExpression;
|
|
1009
|
+
let baseParams = {
|
|
1010
|
+
TableName: baseParams_TableName,
|
|
1011
|
+
ExpressionAttributeNames: baseParams_ExpressionAttributeNames,
|
|
1012
|
+
ExpressionAttributeValues: baseParams_ExpressionAttributeValues,
|
|
1013
|
+
FilterExpression: baseParams_FilterExpression
|
|
1014
|
+
};
|
|
1015
|
+
let baseStream = Stream.paginateEffect(undefined, cursor => Effect$1.map(Effect$1.catchAll(Effect$1.retry(Effect.tryPromise(DynamoDb_Error$ReventlessAws.classify, () => {
|
|
1016
|
+
let params;
|
|
1017
|
+
if (cursor !== undefined) {
|
|
1018
|
+
let newrecord = {...baseParams};
|
|
1019
|
+
newrecord.ExclusiveStartKey = cursor;
|
|
1020
|
+
params = newrecord;
|
|
1021
|
+
} else {
|
|
1022
|
+
params = baseParams;
|
|
1023
|
+
}
|
|
1024
|
+
return DynamoDb_DocumentClient$AwsSdk.ScanCommand.send(new LibDynamodb.ScanCommand(params));
|
|
1025
|
+
}), DynamoDb_Error$ReventlessAws.retrySchedule), err => Effect$1.fail(DynamoDb_Error$ReventlessAws.message(err))), result => [
|
|
1026
|
+
Stdlib_Option.getOr(result.Items, []),
|
|
1027
|
+
Stdlib_Option.map(result.LastEvaluatedKey, key => key)
|
|
1028
|
+
]));
|
|
1029
|
+
if (after !== undefined) {
|
|
1030
|
+
return Stream$1.filter(baseStream, item => Stdlib_Option.mapOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(item), obj => obj["position"]), Stdlib_JSON.Decode.string), false, pos => Primitive_string.compare(pos, after) > 0));
|
|
1031
|
+
} else {
|
|
1032
|
+
return baseStream;
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
function executeQueryItemStream(table, queryItem, after, strongConsistencyOpt, crossPartitionTagKeysOpt) {
|
|
1037
|
+
let strongConsistency = strongConsistencyOpt !== undefined ? strongConsistencyOpt : false;
|
|
1038
|
+
let crossPartitionTagKeys = crossPartitionTagKeysOpt !== undefined ? crossPartitionTagKeysOpt : [];
|
|
1039
|
+
let tags = queryItem.tags;
|
|
1040
|
+
if (tags !== undefined) {
|
|
1041
|
+
if (tags.length !== 1) {
|
|
1042
|
+
if (tags.length > 1) {
|
|
1043
|
+
return queryByCompositeTagsStream(table, tags, after);
|
|
1044
|
+
}
|
|
1045
|
+
tags.length !== 0;
|
|
1046
|
+
} else {
|
|
1047
|
+
let tag = tags[0];
|
|
1048
|
+
if (crossPartitionTagKeys.includes(tag.key)) {
|
|
1049
|
+
return queryBySingleTagCrossPartitionStream(table, tag, after);
|
|
1050
|
+
} else {
|
|
1051
|
+
return queryByPartitionKeyStream(table, tag.key + `:` + tag.value, after, strongConsistency);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
let eventTypes = queryItem.eventTypes;
|
|
1056
|
+
if (eventTypes !== undefined) {
|
|
1057
|
+
return scanWithFilterStream(table, eventTypes, after);
|
|
1058
|
+
} else {
|
|
1059
|
+
return scanWithFilterStream(table, undefined, after);
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
function readStream(table, $staropt$star) {
|
|
1064
|
+
return (query, after, $staropt$star$1) => {
|
|
1065
|
+
let crossPartitionTagKeys = $staropt$star !== undefined ? $staropt$star : [];
|
|
1066
|
+
let strongConsistency = $staropt$star$1 !== undefined ? $staropt$star$1 : false;
|
|
1067
|
+
let streams = query.map(qi => executeQueryItemStream(table, qi, after, strongConsistency, crossPartitionTagKeys));
|
|
1068
|
+
let match = streams.length;
|
|
1069
|
+
if (match === 0) {
|
|
1070
|
+
return Stream$1.empty;
|
|
1071
|
+
}
|
|
1072
|
+
if (match === 1) {
|
|
1073
|
+
return Stream$1.map(streams[0], fromItem);
|
|
1074
|
+
}
|
|
1075
|
+
let hasScan = query.some(qi => qi.tags === undefined);
|
|
1076
|
+
if (hasScan) {
|
|
1077
|
+
return Stream$1.flatMap(Stream$1.fromEffect(Effect$1.map(Effect$1.all(streams.map(Stream.runCollect), {
|
|
1078
|
+
concurrency: 3
|
|
1079
|
+
}), results => {
|
|
1080
|
+
let allItems = results.flat().map(fromItem);
|
|
1081
|
+
let deduped = deduplicateByPosition(allItems);
|
|
1082
|
+
return deduped.toSorted((a, b) => Primitive_string.compare(a.position, b.position));
|
|
1083
|
+
})), events => Stream$1.fromIterable(events));
|
|
1084
|
+
} else {
|
|
1085
|
+
return dedupByPosition(mergeSortedEvents(streams.map(s => Stream$1.map(s, fromItem))));
|
|
1086
|
+
}
|
|
1087
|
+
};
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
let transactWriteItemsLimit = 100;
|
|
1091
|
+
|
|
1092
|
+
export {
|
|
1093
|
+
generatePosition,
|
|
1094
|
+
generatePositionForBatch,
|
|
1095
|
+
tagToAttributeName,
|
|
1096
|
+
compositeIndexName,
|
|
1097
|
+
indexKeepsFullProjection,
|
|
1098
|
+
compositeTagKey,
|
|
1099
|
+
derivePartitionKey,
|
|
1100
|
+
toItem,
|
|
1101
|
+
fromItem,
|
|
1102
|
+
queryByCompositeTags,
|
|
1103
|
+
buildScanFilter,
|
|
1104
|
+
scanWithFilter,
|
|
1105
|
+
buildQueryByPartitionKeyInput,
|
|
1106
|
+
queryByPartitionKey,
|
|
1107
|
+
resolveBaseItem,
|
|
1108
|
+
queryBySingleTagCrossPartitionStream,
|
|
1109
|
+
executeQueryItem,
|
|
1110
|
+
deduplicateByPosition,
|
|
1111
|
+
initSlot,
|
|
1112
|
+
findMinSlotIdx,
|
|
1113
|
+
dedupByPosition,
|
|
1114
|
+
mergeSortedEvents,
|
|
1115
|
+
read,
|
|
1116
|
+
fenceSortKey,
|
|
1117
|
+
fencePartitionKey,
|
|
1118
|
+
fenceKey,
|
|
1119
|
+
collectQueryTags,
|
|
1120
|
+
collectEventTags,
|
|
1121
|
+
fenceTypeAttr,
|
|
1122
|
+
dedupStrings,
|
|
1123
|
+
carriedTypesByTag,
|
|
1124
|
+
buildConditionalFenceUpdate,
|
|
1125
|
+
buildUnconditionalFenceUpdate,
|
|
1126
|
+
buildFenceConditionCheck,
|
|
1127
|
+
transactWriteItemsLimit,
|
|
1128
|
+
buildEventPuts,
|
|
1129
|
+
runTransactWrite,
|
|
1130
|
+
appendUnconditional,
|
|
1131
|
+
eventPartitionTags,
|
|
1132
|
+
collectEventPartitionTags,
|
|
1133
|
+
partitionTypesByTag,
|
|
1134
|
+
buildConditionalTransactItems,
|
|
1135
|
+
appendConditional,
|
|
1136
|
+
append,
|
|
1137
|
+
queryByPartitionKeyStream,
|
|
1138
|
+
queryByCompositeTagsStream,
|
|
1139
|
+
scanWithFilterStream,
|
|
1140
|
+
executeQueryItemStream,
|
|
1141
|
+
readStream,
|
|
1142
|
+
}
|
|
1143
|
+
/* S Not a pure module */
|