@reventlessdev/reventless-aws 3.0.0-alpha.344 → 3.0.0-alpha.346
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 +36 -0
- package/package.json +15 -12
- package/run-provision-accounts.mjs +3 -0
- package/run-provision-admin.mjs +3 -0
- package/scripts/ProvisionAccounts.res +325 -0
- package/scripts/ProvisionAccounts.res.mjs +337 -0
- package/scripts/ProvisionAdmin.res +275 -0
- package/scripts/ProvisionAdmin.res.mjs +289 -0
- package/scripts/ProvisionCognito.res +149 -0
- package/scripts/ProvisionCognito.res.mjs +98 -0
- package/scripts/ProvisionIdentity.res +84 -14
- package/scripts/ProvisionIdentity.res.mjs +72 -7
- package/scripts/ProvisionProvider.res +104 -0
- package/scripts/ProvisionProvider.res.mjs +123 -0
- package/src/Platform.res +358 -329
- package/src/Platform.res.mjs +24 -12
- package/src/Platform_Casts.res +13 -4
- package/src/Platform_Stack.res +119 -9
- package/src/Platform_Stack.res.mjs +42 -4
- package/src/adapter/Api/AppSyncEventsSigner_Ops.res +8 -4
- package/src/adapter/Api/AppSync_EventsApi.res +12 -14
- package/src/adapter/Api/AppSync_Resolver_Native.res +3 -4
- package/src/adapter/Api/AppSync_Resolver_Retrying.res +78 -70
- package/src/adapter/Api/AppSync_SourceApiAssociation_Retrying.res +11 -8
- package/src/adapter/Api/Platform_AdminScan_Ops.res +15 -14
- package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +10 -2
- package/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res +40 -50
- package/src/adapter/Api/Platform_UIFragments_Lambda.res +39 -32
- package/src/adapter/Api/Platform_UIFragments_Lambda_Ops.res +5 -2
- package/src/adapter/Auth/Auth_ActiveRolePoolAttachment.res +0 -1
- package/src/adapter/Auth/Auth_ActiveRoleStore.res +1 -2
- package/src/adapter/Auth/Auth_ActiveRoleStore_Schema.res +1 -4
- package/src/adapter/Auth/Auth_ActiveRoleTrigger_Ops.res +5 -2
- package/src/adapter/Auth/Auth_Cognito.res +3 -9
- package/src/adapter/Auth/Auth_LoginIdentifier.res +66 -0
- package/src/adapter/Auth/Auth_LoginIdentifier.res.mjs +70 -0
- package/src/adapter/Auth/Auth_SignUpMode.res +78 -0
- package/src/adapter/Auth/Auth_SignUpMode.res.mjs +56 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res +1 -4
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res +3 -1
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res +1 -4
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res +7 -4
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res +6 -1
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res +7 -4
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res +24 -18
- package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res +9 -4
- package/src/adapter/CommandTopic/CommandTopicRegistry.res +1 -4
- package/src/adapter/Counter/CounterHandler_DynamoDbStream.res +15 -15
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res +9 -5
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +179 -213
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +5 -5
- package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res +6 -2
- package/src/adapter/EventCollector/EventCollectorChannel_SQS.res +14 -7
- package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res +14 -7
- package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res +6 -3
- package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res +6 -1
- package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res +13 -17
- package/src/adapter/EventLog/EventLogStorage_Postgres.res +7 -4
- package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res +12 -7
- package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync_Ops.res +4 -2
- package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res +3 -2
- package/src/adapter/EventTopic/EventTopicPublisher_SNS.res +20 -12
- package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res +21 -9
- package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res +5 -3
- package/src/adapter/Geocoder/Geocoder_AwsLocation_Resolver.res +6 -3
- package/src/adapter/Mcp/MCP_Lambda.res +31 -46
- package/src/adapter/Messaging/Messaging_Ses_Backend.res +11 -7
- package/src/adapter/Messaging/Messaging_Ses_Backend.res.mjs +2 -4
- package/src/adapter/Monitoring/Monitoring_CloudWatch.res +16 -16
- package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res +5 -10
- package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res +4 -2
- package/src/adapter/Postgres/PgConnection.res +6 -5
- package/src/adapter/Postgres/PgMigration_Builder.res +4 -8
- package/src/adapter/Postgres/PgRuntime.res +4 -7
- package/src/adapter/QueryDb/PgQueryResolver_Builder.res +9 -11
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +22 -21
- package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +114 -111
- package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res +1 -7
- package/src/adapter/QueryDb/QueryDbStorage.res +4 -2
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res +23 -24
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res +8 -2
- package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res +71 -73
- package/src/adapter/QueryDb/QueryDbStorage_Postgres.res +5 -2
- package/src/adapter/QueryDb/QueryInterceptor_Provisioning.res +1 -4
- package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +8 -2
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +73 -81
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +72 -78
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +44 -67
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +44 -67
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +53 -82
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +47 -77
- package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res +23 -11
- package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res.mjs +5 -1
- package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +80 -97
- package/src/adapter/Runtime/CounterEntryPoint_Ops.res +2 -7
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res +16 -10
- package/src/adapter/Runtime/EventCollectorEntryPoint_Ops.res +24 -15
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +17 -37
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +31 -57
- package/src/adapter/Runtime/EventMapperEntryPoint_Ops.res +18 -24
- package/src/adapter/Runtime/ExtensionPointEntryPoint_Ops.res +1 -5
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +4 -3
- package/src/adapter/Runtime/HeartbeatEntryPoint.res +0 -1
- package/src/adapter/Runtime/PgChangeFeedRelayEntryPoint.res +4 -2
- package/src/adapter/Runtime/PgMigrationEntryPoint.res +0 -1
- package/src/adapter/Runtime/PgQueryResolverEntryPoint_Ops.res +3 -2
- package/src/adapter/Runtime/PluginExtensionPointEntryPoint.res +1 -2
- package/src/adapter/Runtime/ProjectionEntryPoint_Ops.res +4 -5
- package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +22 -10
- package/src/adapter/Runtime/RuntimeExtensionEntryPoint_Ops.res +8 -2
- package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +14 -31
- package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +16 -17
- package/src/adapter/Runtime/StateViewSliceEntryPoint_Ops.res +10 -9
- package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +46 -52
- package/src/adapter/Runtime/StreamRoutedEntryPoint_Ops.res +36 -41
- package/src/adapter/Runtime/TaskBucketEntryPoint_Ops.res +31 -37
- package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +6 -7
- package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res +4 -6
- package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res +2 -6
- package/src/adapter/StateTopic/StateTopic_AppSync.res +21 -16
- package/src/adapter/StateTopic/StateTopic_AppSync_Ops.res +36 -32
- package/src/adapter/Task/TaskBucket_S3.res +6 -1
- package/src/adapter/Upload/Upload_Claim_S3.res +17 -20
- package/src/adapter/Upload/Upload_Claim_S3_Ops.res +5 -2
- package/src/adapter/Upload/Upload_Presign_S3.res +51 -49
- package/src/capability/Capability_Geocoding_AwsLocation.res +4 -1
- package/src/capability/Capability_Messaging.res +4 -5
- package/src/capability/Capability_Messaging_Ses.res +3 -1
- package/src/capability/Capability_ObjectStore_S3.res +1 -7
- package/src/components/Api/AppSync_Adapter.res +80 -109
- package/src/components/Api/AppSync_Adapter.res.mjs +26 -60
- package/src/components/Api/AppSync_SdlDecorate.res +118 -31
- package/src/components/Api/AppSync_SdlDecorate.res.mjs +45 -0
- package/src/components/AutomationSlice_Builder.res +6 -4
- package/src/components/ExtensionPoint_Builder.res +9 -10
- package/src/components/InboundTranslationSlice_Builder.res +7 -8
- package/src/components/OutboundTranslationSlice_Builder.res +14 -8
- package/src/components/OutboundTranslationSlice_Builder.res.mjs +1 -1
- package/src/components/SideEffectHandler_Single.res +4 -4
- package/src/components/StateViewSlice_Builder.res +6 -4
- package/src/components/StateViewSlice_Builder_Stream.res +6 -4
- package/src/components/Task_Builder_PerBucket.res +10 -11
- package/src/plugin/cloner/ClonerRunner_Fargate.res +3 -10
- package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res +1 -4
- package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res +5 -5
- package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +19 -21
- package/src/plugin/runtime/PluginRuntime_Builder.res +167 -188
- package/src/plugin/runtime/Util_PluginMessage_Runtime.res +6 -5
- package/src/plugin/stack/Plugin_Stack.res +104 -103
- package/src/util/Util_AlarmSpec.res +2 -1
- package/src/util/Util_AppSync.res +8 -2
- package/src/util/Util_AppSync_Caller.res +15 -14
- package/src/util/Util_Bundle.res +46 -42
- package/src/util/Util_CognitoGroupUser_Runtime.res +32 -34
- package/src/util/Util_Cognito_Runtime.res +11 -7
- package/src/util/Util_DeadLetterQueue.res +12 -2
- package/src/util/Util_DynamoDb.res +5 -3
- package/src/util/Util_DynamoDbStream.res +7 -3
- package/src/util/Util_DynamoDbStream_Runtime.res +1 -2
- package/src/util/Util_DynamoDb_Runtime.res +23 -41
- package/src/util/Util_HostUiDomain.res +6 -1
- package/src/util/Util_Kinesis_Runtime.res +10 -11
- package/src/util/Util_Lambda.res +12 -5
- package/src/util/Util_LambdaEnvBudget.res +5 -5
- package/src/util/Util_LambdaLogging.res +1 -2
- package/src/util/Util_LogGroup_Adopting.res +1 -4
- package/src/util/Util_ResourceNaming.res +1 -2
- package/src/util/Util_SNS.res +8 -3
- package/src/util/Util_SNS_FIFO.res +1 -1
- package/src/util/Util_SNS_Runtime.res +11 -10
- package/src/util/Util_SQS.res +4 -2
- package/src/util/Util_SQS_FIFO.res +5 -2
- package/src/util/Util_SQS_Runtime.res +37 -36
- package/src/util/Util_ShellConfig.res +3 -2
- package/src/util/Util_StaticBundle.res +1 -3
- package/src/util/Util_StoreLayout.res +4 -1
- package/tests/AWS_TagsTest.res +16 -5
- package/tests/AppSyncEventsSigner_OpsTest.res +11 -2
- package/tests/AppSync_AdapterTest.res +286 -224
- package/tests/AppSync_AdapterTest.res.mjs +69 -0
- package/tests/AppSync_Resolver_RetryingTest.res +64 -44
- package/tests/AppSync_RetirementNarrowingTest.res +59 -46
- package/tests/AppSync_SdlDecorateTest.res +22 -20
- package/tests/AppSync_SourceApiAssociation_RetryingTest.res +40 -22
- package/tests/Auth_ActiveRolePoolAttachmentTest.res +114 -107
- package/tests/Auth_ActiveRoleStoreTest.res +12 -9
- package/tests/Auth_ActiveRoleStore_SchemaTest.res +2 -1
- package/tests/Auth_ActiveRoleTrigger_OpsTest.res +20 -16
- package/tests/Auth_CognitoTest.res +31 -46
- package/tests/Auth_LoginIdentifierTest.res +51 -0
- package/tests/Auth_LoginIdentifierTest.res.mjs +51 -0
- package/tests/Auth_SignUpModeTest.res +56 -0
- package/tests/Auth_SignUpModeTest.res.mjs +53 -0
- package/tests/AutomationSliceEntryPoint_OpsTest.res +69 -67
- package/tests/BakeConvergenceTest.res +22 -25
- package/tests/Capability_MessagingTest.res +28 -12
- package/tests/CommandTopicQueuePolicyTest.res +1 -2
- package/tests/CounterEntryPoint_OpsTest.res +3 -7
- package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res +306 -210
- package/tests/EventCollectorConnectLambdaPreviewTest.res +14 -7
- package/tests/EventCollectorEntryPoint_OpsTest.res +12 -4
- package/tests/EventCollectorPluginDefinitionAssetTest.res +18 -11
- package/tests/EventCollectorReadyGateTest.res +5 -4
- package/tests/EventLogStorage_DynamoDb_RuntimeTest.res +1 -2
- package/tests/EventMapperEntryPoint_OpsTest.res +1 -3
- package/tests/ExtensionPointEntryPoint_OpsTest.res +1 -4
- package/tests/HandlerFactoryDispatchTest.res +97 -70
- package/tests/MCP_LambdaTest.res +16 -27
- package/tests/PgChangeFeedRelay_IntegrationTest.res +123 -93
- package/tests/PgChangeFeedRelay_RuntimeTest.res +13 -10
- package/tests/PgMigrationEntryPoint_IntegrationTest.res +0 -1
- package/tests/PgPipeline_IntegrationTest.res +80 -66
- package/tests/PgQueryDbUnion_IntegrationTest.res +1 -2
- package/tests/PgQueryResolverEntryPoint_OpsTest.res +2 -6
- package/tests/PgQueryResolver_LambdaTest.res +41 -24
- package/tests/Platform_AdminScan_OpsTest.res +4 -1
- package/tests/Platform_ComponentDefinitions_Lambda_OpsTest.res +137 -129
- package/tests/ProjectionEntryPoint_DisplayNameTest.res +7 -3
- package/tests/ProjectionEntryPoint_UnionStampTest.res +3 -2
- package/tests/ProvisionAccountsTest.res +142 -0
- package/tests/ProvisionAccountsTest.res.mjs +153 -0
- package/tests/ProvisionAdminTest.res +55 -0
- package/tests/ProvisionAdminTest.res.mjs +66 -0
- package/tests/ProvisionIdentityTest.res +91 -9
- package/tests/ProvisionIdentityTest.res.mjs +66 -1
- package/tests/QueryDbOwnerIndexTableTest.res +6 -4
- package/tests/QueryDbResolvers_AppSyncTest.res +23 -16
- package/tests/QueryInterceptor_LambdaTest.res +11 -13
- package/tests/ReadModelEntryPoint_OpsTest.res +43 -41
- package/tests/RuntimeExtensionEntryPoint_OpsTest.res +4 -3
- package/tests/SideEffectEntryPoint_OpsTest.res +23 -18
- package/tests/StateChangeDescriptorParityTest.res +28 -26
- package/tests/StateTopicKeySchemaTest.res +18 -15
- package/tests/StateViewSliceEntryPoint_OpsTest.res +55 -44
- package/tests/TaskBucketEntryPoint_OpsTest.res +13 -13
- package/tests/Upload_ClaimTest.res +3 -3
- package/tests/Util_AwsErrorTest.res +4 -7
- package/tests/Util_BundleDependencyClosureTest.res +15 -3
- package/tests/Util_BundleEsmLoaderTest.res +3 -3
- package/tests/Util_BundleResolveTest.res +4 -6
- package/tests/Util_BundleRuntimeExtensionTest.res +17 -18
- package/tests/Util_DcbMetricsTest.res +6 -6
- package/tests/Util_DynamoDbStreamTest.res +4 -5
- package/tests/Util_DynamoDbTest.res +3 -2
- package/tests/Util_LambdaEnvBudgetTest.res +22 -18
- package/tests/Util_LambdaLoggingTest.res +9 -8
- package/tests/Util_LogGroup_AdoptingTest.res +10 -5
- package/tests/Util_LogRetentionTest.res +6 -2
- package/tests/Util_OwnerScopeEnvTest.res +35 -8
- package/tests/Util_OwnerScopeEnvTest.res.mjs +13 -0
- package/tests/Util_SQS_RuntimeTest.res +5 -7
- package/tests/Util_ShellConfigTest.res +7 -17
- package/tests/Util_StaticBundleTest.res +3 -8
- package/tests/Util_StoreLayoutTest.res +17 -12
- package/tests/integration/AggregateEntryPoint_IntegrationTest.res +1 -4
- package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +15 -15
- package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +296 -232
- package/tests/integration/DcbIntegrationHarness.res +8 -8
- package/tests/integration/EpCompositeSlice.res +16 -8
- package/tests/integration/QueryDbUnion_DynamoDb_IntegrationTest.res +8 -10
- package/tests/integration/StateViewSliceEntryPoint_IntegrationTest.res +10 -10
- package/tests/integration/SvsTestSlice_Projection.res +1 -3
- package/tests/util/Util_AlarmSpecTest.res +62 -49
|
@@ -14,10 +14,16 @@ let make: ReventlessCore.QueryDb_Adapter.storageMaker<api, role> = (
|
|
|
14
14
|
~ttl=?,
|
|
15
15
|
~api,
|
|
16
16
|
~apiRole,
|
|
17
|
-
~owner,
|
|
17
|
+
~owner,
|
|
18
|
+
~opts,
|
|
18
19
|
) => {
|
|
19
20
|
streamRegistry->Set.add(name)
|
|
20
|
-
let tags = AWS.Tags.make(
|
|
21
|
+
let tags = AWS.Tags.make(
|
|
22
|
+
~name,
|
|
23
|
+
~kind=ReventlessCore.QueryDb.componentType,
|
|
24
|
+
~role=QueryDb,
|
|
25
|
+
~owner?,
|
|
26
|
+
)
|
|
21
27
|
let table = Util_DynamoDbStream.makeTable(
|
|
22
28
|
name,
|
|
23
29
|
~attributes=attributes(subIdField, indexes),
|
|
@@ -14,21 +14,16 @@ let loadStream = table =>
|
|
|
14
14
|
expressionAttributeValues: [(":id", id->JSON.Encode.string)]->Dict.fromArray,
|
|
15
15
|
}
|
|
16
16
|
Stream.paginateEffect((None: option<dict<JSON.t>>), cursor =>
|
|
17
|
-
Effect.tryPromise(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
QueryCommand.send(params->QueryCommand.make)
|
|
25
|
-
},
|
|
26
|
-
)
|
|
17
|
+
Effect.tryPromise(~catch=DynamoDb_Error.classify, () => {
|
|
18
|
+
let params = switch cursor {
|
|
19
|
+
| None => baseParams
|
|
20
|
+
| Some(key) => {...baseParams, exclusiveStartKey: key}
|
|
21
|
+
}
|
|
22
|
+
QueryCommand.send(params->QueryCommand.make)
|
|
23
|
+
})
|
|
27
24
|
->Effect.retry(DynamoDb_Error.retrySchedule)
|
|
28
25
|
->Effect.catchAll(err =>
|
|
29
|
-
Effect.fail(
|
|
30
|
-
ReventlessInfra.QueryDb.NotLoadedFromStorage(DynamoDb_Error.message(err)),
|
|
31
|
-
)
|
|
26
|
+
Effect.fail(ReventlessInfra.QueryDb.NotLoadedFromStorage(DynamoDb_Error.message(err)))
|
|
32
27
|
)
|
|
33
28
|
->Effect.map(result => (
|
|
34
29
|
result.items
|
|
@@ -51,8 +46,7 @@ let load = table =>
|
|
|
51
46
|
ReventlessCore.EffectLogger.logError(
|
|
52
47
|
~comp=__MODULE__,
|
|
53
48
|
`load: Couldn't load state for ${id} from ${tableName}: ${msg}`,
|
|
54
|
-
)
|
|
55
|
-
->Effect.map(_ => Error(err))
|
|
49
|
+
)->Effect.map(_ => Error(err))
|
|
56
50
|
})
|
|
57
51
|
->Effect.runPromise
|
|
58
52
|
|
|
@@ -63,18 +57,20 @@ let save = table =>
|
|
|
63
57
|
|
|
64
58
|
let effect = switch saveMode {
|
|
65
59
|
| Init =>
|
|
66
|
-
table
|
|
60
|
+
table
|
|
61
|
+
->putIfNotExistsWithRetries(~idKey=table.hashKey, ~sortKey=?table.rangeKey, id, json)
|
|
67
62
|
->Effect.flatMap(result =>
|
|
68
63
|
switch result {
|
|
69
64
|
| Ok() =>
|
|
70
|
-
ReventlessCore.EffectLogger.logInfo(
|
|
71
|
-
|
|
65
|
+
ReventlessCore.EffectLogger.logInfo(
|
|
66
|
+
~comp=__MODULE__,
|
|
67
|
+
`save: saved Init state to ${tableName}: id=${id}`,
|
|
68
|
+
)->Effect.map(_ => Ok())
|
|
72
69
|
| Error(errorMsg) =>
|
|
73
70
|
ReventlessCore.EffectLogger.logError(
|
|
74
71
|
~comp=__MODULE__,
|
|
75
72
|
`save: Couldn't save Init state to ${tableName}, id=${id}: ${errorMsg}`,
|
|
76
|
-
)
|
|
77
|
-
->Effect.map(_ => Error(ReventlessInfra.QueryDb.NotSavedToStorage(errorMsg)))
|
|
73
|
+
)->Effect.map(_ => Error(ReventlessInfra.QueryDb.NotSavedToStorage(errorMsg)))
|
|
78
74
|
}
|
|
79
75
|
)
|
|
80
76
|
| Any
|
|
@@ -84,14 +80,15 @@ let save = table =>
|
|
|
84
80
|
->Effect.flatMap(result =>
|
|
85
81
|
switch result {
|
|
86
82
|
| Ok() =>
|
|
87
|
-
ReventlessCore.EffectLogger.logInfo(
|
|
88
|
-
|
|
83
|
+
ReventlessCore.EffectLogger.logInfo(
|
|
84
|
+
~comp=__MODULE__,
|
|
85
|
+
`save: saved state to ${tableName}: id=${id}`,
|
|
86
|
+
)->Effect.map(_ => Ok())
|
|
89
87
|
| Error(errorMsg) =>
|
|
90
88
|
ReventlessCore.EffectLogger.logError(
|
|
91
89
|
~comp=__MODULE__,
|
|
92
90
|
`save: Couldn't save state to ${tableName}, id=${id}: ${errorMsg}`,
|
|
93
|
-
)
|
|
94
|
-
->Effect.map(_ => Error(ReventlessInfra.QueryDb.NotSavedToStorage(errorMsg)))
|
|
91
|
+
)->Effect.map(_ => Error(ReventlessInfra.QueryDb.NotSavedToStorage(errorMsg)))
|
|
95
92
|
}
|
|
96
93
|
)
|
|
97
94
|
}
|
|
@@ -111,38 +108,34 @@ let writeMultiple = (writeRequests, op, ids, table) => {
|
|
|
111
108
|
let size = writeRequests->Array.length
|
|
112
109
|
let batches = (size->Int.toFloat /. BatchWriteCommand.maxBatchSize->Int.toFloat)->Math.Int.ceil
|
|
113
110
|
|
|
114
|
-
let logSplitEffect =
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
`writeBatch: splitting up batch of size ${size->Int.toString} into ${batches->Int.toString} batches`,
|
|
119
|
-
)
|
|
120
|
-
} else {
|
|
121
|
-
Effect.succeed()
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
let batchEffects =
|
|
125
|
-
Array.fromInitializer(~length=batches, batchNr =>
|
|
126
|
-
writeRequests
|
|
127
|
-
->sliceBatch(batchNr)
|
|
128
|
-
->toTable(tableName)
|
|
129
|
-
->batchWriteWithRetries
|
|
130
|
-
->Effect.map(result => {
|
|
131
|
-
let batchIds = ids->sliceBatch(batchNr)
|
|
132
|
-
let batchCount = batchIds->Array.length->Int.toString
|
|
133
|
-
let batchIdsStr = batchIds->Array.joinUnsafe(", ")
|
|
134
|
-
switch result {
|
|
135
|
-
| Ok() => None
|
|
136
|
-
| Error(error) =>
|
|
137
|
-
Some(`Batch ${batchNr->Int.toString}: ${batchCount} ids:${batchIdsStr}: ${error}`)
|
|
138
|
-
}
|
|
139
|
-
})
|
|
111
|
+
let logSplitEffect = if batches > 1 {
|
|
112
|
+
ReventlessCore.EffectLogger.logInfo(
|
|
113
|
+
~comp=__MODULE__,
|
|
114
|
+
`writeBatch: splitting up batch of size ${size->Int.toString} into ${batches->Int.toString} batches`,
|
|
140
115
|
)
|
|
116
|
+
} else {
|
|
117
|
+
Effect.succeed()
|
|
118
|
+
}
|
|
141
119
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
120
|
+
let batchEffects = Array.fromInitializer(~length=batches, batchNr =>
|
|
121
|
+
writeRequests
|
|
122
|
+
->sliceBatch(batchNr)
|
|
123
|
+
->toTable(tableName)
|
|
124
|
+
->batchWriteWithRetries
|
|
125
|
+
->Effect.map(result => {
|
|
126
|
+
let batchIds = ids->sliceBatch(batchNr)
|
|
127
|
+
let batchCount = batchIds->Array.length->Int.toString
|
|
128
|
+
let batchIdsStr = batchIds->Array.joinUnsafe(", ")
|
|
129
|
+
switch result {
|
|
130
|
+
| Ok() => None
|
|
131
|
+
| Error(error) =>
|
|
132
|
+
Some(`Batch ${batchNr->Int.toString}: ${batchCount} ids:${batchIdsStr}: ${error}`)
|
|
133
|
+
}
|
|
134
|
+
})
|
|
145
135
|
)
|
|
136
|
+
|
|
137
|
+
logSplitEffect
|
|
138
|
+
->Effect.flatMap(_ => Effect.all(batchEffects, {"concurrency": "unbounded"}))
|
|
146
139
|
->Effect.map(results => results->Array.filterMap(x => x))
|
|
147
140
|
->Effect.flatMap(errors =>
|
|
148
141
|
switch errors {
|
|
@@ -150,20 +143,21 @@ let writeMultiple = (writeRequests, op, ids, table) => {
|
|
|
150
143
|
ReventlessCore.EffectLogger.logInfo(
|
|
151
144
|
~comp=__MODULE__,
|
|
152
145
|
`writeBatch: ${op} ${count} states: ${tableName}, ids:${allIdsStr}`,
|
|
153
|
-
)
|
|
154
|
-
->Effect.map(_ => Ok())
|
|
146
|
+
)->Effect.map(_ => Ok())
|
|
155
147
|
| errors =>
|
|
156
148
|
let errorsStr = errors->Array.joinUnsafe("; ")
|
|
157
149
|
let errorMsg = `writeBatch: Couldn't save states to ${tableName}: ${errorsStr}`
|
|
158
|
-
ReventlessCore.EffectLogger.logError(~comp=__MODULE__, errorMsg)
|
|
159
|
-
|
|
150
|
+
ReventlessCore.EffectLogger.logError(~comp=__MODULE__, errorMsg)->Effect.map(_ => Error(
|
|
151
|
+
ReventlessInfra.QueryDb.BatchNotFullyWrittenToStorage(errorMsg),
|
|
152
|
+
))
|
|
160
153
|
}
|
|
161
154
|
)
|
|
162
155
|
->Effect.catchAll(err => {
|
|
163
156
|
let msg = DynamoDb_Error.message(err)
|
|
164
157
|
let errorMsg = `writeBatch: Couldn't save states to ${tableName}, ${count} ids:${allIdsStr}: ${msg}`
|
|
165
|
-
ReventlessCore.EffectLogger.logError(~comp=__MODULE__, errorMsg)
|
|
166
|
-
|
|
158
|
+
ReventlessCore.EffectLogger.logError(~comp=__MODULE__, errorMsg)->Effect.map(_ => Error(
|
|
159
|
+
ReventlessInfra.QueryDb.BatchNotFullyWrittenToStorage(errorMsg),
|
|
160
|
+
))
|
|
167
161
|
})
|
|
168
162
|
->Effect.runPromise
|
|
169
163
|
}
|
|
@@ -199,8 +193,9 @@ let count = table =>
|
|
|
199
193
|
key: [("id", id->JSON.Encode.string)]->Dict.fromArray,
|
|
200
194
|
updateExpression: "ADD #fieldName :inc",
|
|
201
195
|
expressionAttributeNames: [("#fieldName", fieldName)]->Dict.fromArray,
|
|
202
|
-
expressionAttributeValues: [
|
|
203
|
-
|
|
196
|
+
expressionAttributeValues: [
|
|
197
|
+
(":inc", inc->Int.toFloat->JSON.Encode.float),
|
|
198
|
+
]->Dict.fromArray,
|
|
204
199
|
returnValues: #UPDATED_NEW,
|
|
205
200
|
})->UpdateCommand.send,
|
|
206
201
|
)
|
|
@@ -212,15 +207,16 @@ let count = table =>
|
|
|
212
207
|
ReventlessCore.EffectLogger.logError(
|
|
213
208
|
~comp=__MODULE__,
|
|
214
209
|
`count: Invalid updateOutput in count on ${tableName}`,
|
|
215
|
-
)
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
)
|
|
210
|
+
)->Effect.map(_ => Error(
|
|
211
|
+
ReventlessInfra.QueryDb.NotCountedOnStorage("Invalid updateOutput in count"),
|
|
212
|
+
))
|
|
219
213
|
}
|
|
220
214
|
)
|
|
221
215
|
->Effect.catchAll(errorMsg =>
|
|
222
|
-
ReventlessCore.EffectLogger.logError(
|
|
223
|
-
|
|
216
|
+
ReventlessCore.EffectLogger.logError(
|
|
217
|
+
~comp=__MODULE__,
|
|
218
|
+
`count: Couldn't count on ${tableName}: ${errorMsg}`,
|
|
219
|
+
)->Effect.map(_ => Error(ReventlessInfra.QueryDb.NotCountedOnStorage(errorMsg)))
|
|
224
220
|
)
|
|
225
221
|
->Effect.runPromise
|
|
226
222
|
}
|
|
@@ -235,15 +231,17 @@ let delete = table =>
|
|
|
235
231
|
| Ok() =>
|
|
236
232
|
ReventlessCore.EffectLogger.logInfo(
|
|
237
233
|
~comp=__MODULE__,
|
|
238
|
-
`delete: deleted state from ${tableName}: id=${id}, sort=${sort
|
|
239
|
-
|
|
240
|
-
|
|
234
|
+
`delete: deleted state from ${tableName}: id=${id}, sort=${sort
|
|
235
|
+
->JSON.stringifyAny
|
|
236
|
+
->Option.getOr("None")}`,
|
|
237
|
+
)->Effect.map(_ => Ok())
|
|
241
238
|
| Error(errorMsg) =>
|
|
242
239
|
ReventlessCore.EffectLogger.logError(
|
|
243
240
|
~comp=__MODULE__,
|
|
244
|
-
`delete: Couldn't delete state from ${tableName}, id=${id}, sort=${sort
|
|
245
|
-
|
|
246
|
-
|
|
241
|
+
`delete: Couldn't delete state from ${tableName}, id=${id}, sort=${sort
|
|
242
|
+
->JSON.stringifyAny
|
|
243
|
+
->Option.getOr("None")}: ${errorMsg}`,
|
|
244
|
+
)->Effect.map(_ => Error(ReventlessInfra.QueryDb.NotDeletedFromStorage(errorMsg)))
|
|
247
245
|
}
|
|
248
246
|
)
|
|
249
247
|
->Effect.runPromise
|
|
@@ -24,7 +24,8 @@ let make: ReventlessCore.QueryDb_Adapter.storageMaker<api, role> = (
|
|
|
24
24
|
~ttl as _=?,
|
|
25
25
|
~api as _,
|
|
26
26
|
~apiRole as _,
|
|
27
|
-
~owner as _,
|
|
27
|
+
~owner as _,
|
|
28
|
+
~opts as _,
|
|
28
29
|
) => {
|
|
29
30
|
let operations = switch QueryDbBackend.get() {
|
|
30
31
|
| Some({connectionConfig}) =>
|
|
@@ -33,7 +34,9 @@ let make: ReventlessCore.QueryDb_Adapter.storageMaker<api, role> = (
|
|
|
33
34
|
)
|
|
34
35
|
| None =>
|
|
35
36
|
// Selectable only routes here when a selection is set; guard defensively.
|
|
36
|
-
JsError.throwWithMessage(
|
|
37
|
+
JsError.throwWithMessage(
|
|
38
|
+
"QueryDbStorage_Postgres.make called without a QueryDbBackend selection",
|
|
39
|
+
)
|
|
37
40
|
}
|
|
38
41
|
{
|
|
39
42
|
ReventlessCore.QueryDb_Adapter.resources: [],
|
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
compose: that path bundles registered runtime extensions into the archive and
|
|
29
29
|
writes `RUNTIME_EXTENSIONS`, so an extension registering its interceptor in
|
|
30
30
|
`onColdStart` reaches this runtime without a second registration. */
|
|
31
|
-
|
|
32
31
|
open PulumiAws
|
|
33
32
|
|
|
34
33
|
// Memoised on the api handle itself — see the module docstring for why identity
|
|
@@ -46,9 +45,7 @@ let nameFor = () => {
|
|
|
46
45
|
let owner = ReventlessCore.ResourceAttribution.current.contents.plugin->Option.getOr("Platform")
|
|
47
46
|
let used = namesUsed->Dict.get(owner)->Option.getOr(0)
|
|
48
47
|
namesUsed->Dict.set(owner, used + 1)
|
|
49
|
-
used == 0
|
|
50
|
-
? owner ++ "QueryInterceptor"
|
|
51
|
-
: owner ++ "QueryInterceptor" ++ (used + 1)->Int.toString
|
|
48
|
+
used == 0 ? owner ++ "QueryInterceptor" : owner ++ "QueryInterceptor" ++ (used + 1)->Int.toString
|
|
52
49
|
}
|
|
53
50
|
|
|
54
51
|
let buildInterceptor = (~api: Types.AppSync.api, ~opts) => {
|
|
@@ -109,7 +109,10 @@ let queryByTableName = (
|
|
|
109
109
|
->Effect.map(items => items->Array.map(js => js->JSON.stringify->JSON.parseOrThrow))
|
|
110
110
|
->Effect.catchAll(err => {
|
|
111
111
|
let msg = DynamoDb_Error.message(err)
|
|
112
|
-
ReventlessCore.EffectLogger.logError(
|
|
112
|
+
ReventlessCore.EffectLogger.logError(
|
|
113
|
+
~comp=__MODULE__,
|
|
114
|
+
"queryByTableName: " ++ msg,
|
|
115
|
+
)->Effect.map(_ => [])
|
|
113
116
|
})
|
|
114
117
|
)
|
|
115
118
|
->Effect.runPromise
|
|
@@ -145,7 +148,10 @@ let scanByTableName = (~tableName, ~filterConfigs, ~limit) => {
|
|
|
145
148
|
->Effect.map(items => items->Array.map(js => js->JSON.stringify->JSON.parseOrThrow))
|
|
146
149
|
->Effect.catchAll(err => {
|
|
147
150
|
let msg = DynamoDb_Error.message(err)
|
|
148
|
-
ReventlessCore.EffectLogger.logError(
|
|
151
|
+
ReventlessCore.EffectLogger.logError(
|
|
152
|
+
~comp=__MODULE__,
|
|
153
|
+
"scanByTableName: " ++ msg,
|
|
154
|
+
)->Effect.map(_ => [])
|
|
149
155
|
})
|
|
150
156
|
)
|
|
151
157
|
->Effect.runPromise
|
|
@@ -75,44 +75,30 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
|
|
|
75
75
|
ReventlessCore.CommandGenerator.effectEventHandler<context>,
|
|
76
76
|
runtimeParts,
|
|
77
77
|
ReventlessCore.CommandGenerator.component,
|
|
78
|
-
> = (
|
|
79
|
-
~handler as _,
|
|
80
|
-
~connect,
|
|
81
|
-
~memorySize=1024,
|
|
82
|
-
~timeout=30,
|
|
83
|
-
commandGenerator,
|
|
84
|
-
) => {
|
|
78
|
+
> = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandGenerator) => {
|
|
85
79
|
let resource = commandGenerator->ReventlessCore.Component.toPulumiResource
|
|
86
80
|
switch resource.parent {
|
|
87
81
|
| Some(aggregateResource) =>
|
|
88
82
|
let aggregateName = aggregateResource.name->Option.getOr("Unnamed")
|
|
89
83
|
let spec = getStoredSpec(aggregateName, aggregateResource)
|
|
90
|
-
storedSpecs->Dict.set(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
storedSpecs->Dict.set(
|
|
85
|
+
aggregateName,
|
|
86
|
+
{
|
|
87
|
+
...spec,
|
|
88
|
+
commandGeneratorConnects: spec.commandGeneratorConnects->Array.concat([connect]),
|
|
89
|
+
commandGeneratorMemorySize: Math.Int.max(spec.commandGeneratorMemorySize, memorySize),
|
|
90
|
+
commandGeneratorTimeout: Math.Int.max(spec.commandGeneratorTimeout, timeout),
|
|
91
|
+
},
|
|
92
|
+
)
|
|
96
93
|
| None => ()
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
96
|
|
|
100
97
|
let forCommandTopic: ReventlessCore.Runtime.forComponent<
|
|
101
|
-
ReventlessCore.Runtime.effectHandler<
|
|
102
|
-
CommandTopicChannel.callbackEvent,
|
|
103
|
-
context,
|
|
104
|
-
unit,
|
|
105
|
-
string,
|
|
106
|
-
>,
|
|
98
|
+
ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
|
|
107
99
|
runtimeParts,
|
|
108
100
|
ReventlessCore.CommandTopic.component<'op>,
|
|
109
|
-
> = (
|
|
110
|
-
~handler as _,
|
|
111
|
-
~connect,
|
|
112
|
-
~memorySize=1024,
|
|
113
|
-
~timeout=30,
|
|
114
|
-
commandTopic,
|
|
115
|
-
) => {
|
|
101
|
+
> = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
|
|
116
102
|
let commandTopicResource = commandTopic->ReventlessCore.Component.toPulumiResource
|
|
117
103
|
switch commandTopicResource.parent {
|
|
118
104
|
| Some(aggregateResource) =>
|
|
@@ -122,50 +108,42 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
|
|
|
122
108
|
let queue = channelParts.queue
|
|
123
109
|
|
|
124
110
|
let spec = getStoredSpec(aggregateName, aggregateResource)
|
|
125
|
-
storedSpecs->Dict.set(
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
111
|
+
storedSpecs->Dict.set(
|
|
112
|
+
aggregateName,
|
|
113
|
+
{
|
|
114
|
+
...spec,
|
|
115
|
+
queueUrl: queue.id,
|
|
116
|
+
queueArn: queue.arn,
|
|
117
|
+
commandTopicConnects: spec.commandTopicConnects->Array.concat([connect]),
|
|
118
|
+
commandTopicMemorySize: Math.Int.max(spec.commandTopicMemorySize, memorySize),
|
|
119
|
+
commandTopicTimeout: Math.Int.max(spec.commandTopicTimeout, timeout),
|
|
120
|
+
},
|
|
121
|
+
)
|
|
133
122
|
| None =>
|
|
134
123
|
let name = commandTopicResource.name->Option.getOr("Unnamed")
|
|
135
|
-
JsError.throwWithMessage(
|
|
136
|
-
`forCommandTopic(micro): commandTopic ${name} has no Aggregate parent`,
|
|
137
|
-
)
|
|
124
|
+
JsError.throwWithMessage(`forCommandTopic(micro): commandTopic ${name} has no Aggregate parent`)
|
|
138
125
|
}
|
|
139
126
|
}
|
|
140
127
|
|
|
141
128
|
let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
142
|
-
ReventlessCore.Runtime.effectHandler<
|
|
143
|
-
EventCollectorChannel.callbackEvent,
|
|
144
|
-
context,
|
|
145
|
-
unit,
|
|
146
|
-
string,
|
|
147
|
-
>,
|
|
129
|
+
ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
|
|
148
130
|
ReventlessCore.EventCollector.component,
|
|
149
|
-
> = (
|
|
150
|
-
~handler as _,
|
|
151
|
-
~eventTopics,
|
|
152
|
-
~resources,
|
|
153
|
-
~memorySize=2048,
|
|
154
|
-
~timeout=180,
|
|
155
|
-
eventCollector,
|
|
156
|
-
) => {
|
|
131
|
+
> = (~handler as _, ~eventTopics, ~resources, ~memorySize=2048, ~timeout=180, eventCollector) => {
|
|
157
132
|
let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
158
133
|
let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
|
|
159
134
|
switch eventCollectorResource.parent->Option.flatMap(parent => parent.parent) {
|
|
160
135
|
| Some(aggregateResource) =>
|
|
161
136
|
let aggregateName = aggregateResource.name->Option.getOr("Unnamed")
|
|
162
137
|
let spec = getStoredSpec(aggregateName, aggregateResource)
|
|
163
|
-
storedSpecs->Dict.set(
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
138
|
+
storedSpecs->Dict.set(
|
|
139
|
+
aggregateName,
|
|
140
|
+
{
|
|
141
|
+
...spec,
|
|
142
|
+
eventCollectorChannelSpec: Some({channel, eventTopics, resources}),
|
|
143
|
+
eventCollectorMemorySize: Math.Int.max(spec.eventCollectorMemorySize, memorySize),
|
|
144
|
+
eventCollectorTimeout: Math.Int.max(spec.eventCollectorTimeout, timeout),
|
|
145
|
+
},
|
|
146
|
+
)
|
|
169
147
|
| None =>
|
|
170
148
|
let name = eventCollectorResource.name->Option.getOr("Unnamed")
|
|
171
149
|
JsError.throwWithMessage(
|
|
@@ -198,13 +176,11 @@ let finish = () =>
|
|
|
198
176
|
packageDirs->Dict.set(specPkg, Util_Bundle.resolvePackageRoot(specPkg))
|
|
199
177
|
packageDirs->Dict.set(behaviorPkg, Util_Bundle.resolvePackageRoot(behaviorPkg))
|
|
200
178
|
|
|
201
|
-
let specModule =
|
|
202
|
-
|
|
203
|
-
let behaviorModule =
|
|
204
|
-
info.behaviorModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
179
|
+
let specModule = info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
180
|
+
let behaviorModule = info.behaviorModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
205
181
|
|
|
206
182
|
// --- CommandTopic Lambda ---
|
|
207
|
-
// `plugin` cannot be resolved inside the Lambda — LogPrefix's registry is a
|
|
183
|
+
// `plugin` cannot be resolved inside the Lambda — LogPrefix's registry is a
|
|
208
184
|
// deploy-time structure, and the Lambda-name fallback yields nothing for a
|
|
209
185
|
// shared or per-aggregate command handler. Resolve it here; the shell still
|
|
210
186
|
// derives `comp` itself from the spec name.
|
|
@@ -212,15 +188,24 @@ let finish = () =>
|
|
|
212
188
|
~comp=`AggregateRuntime(${spec.aggregateName})`,
|
|
213
189
|
)
|
|
214
190
|
let cmdTopicHandlerConfigOutput =
|
|
215
|
-
Pulumi.Output.all3((
|
|
216
|
-
|
|
191
|
+
Pulumi.Output.all3((
|
|
192
|
+
info.eventLogTableName,
|
|
193
|
+
spec.queueUrl,
|
|
194
|
+
spec.queueArn,
|
|
195
|
+
))->Pulumi.Output.apply(((table, queueUrl, queueArn)) =>
|
|
217
196
|
`{"handlers":[{"specModule":${specModule},"behaviorModule":${behaviorModule},"eventLogTable":"${table}","queueUrl":"${queueUrl}","queueArn":"${queueArn}"${pluginFragment}}]}`
|
|
218
197
|
)
|
|
219
198
|
|
|
220
199
|
let cmdTopicEnvVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
221
|
-
cmdTopicEnvVars->Dict.set(
|
|
200
|
+
cmdTopicEnvVars->Dict.set(
|
|
201
|
+
"HANDLER_CONFIG",
|
|
202
|
+
cmdTopicHandlerConfigOutput->Pulumi.Output.asInput,
|
|
203
|
+
)
|
|
222
204
|
|
|
223
|
-
let {
|
|
205
|
+
let {
|
|
206
|
+
code: cmdTopicCode,
|
|
207
|
+
sourceCodeHash: cmdTopicSourceCodeHash,
|
|
208
|
+
} = Util_Bundle.buildCodeArchive(
|
|
224
209
|
~entryPointModule="@reventlessdev/reventless-aws/src/adapter/Runtime/AggregateEntryPoint.mjs",
|
|
225
210
|
~packageDirs,
|
|
226
211
|
)
|
|
@@ -242,7 +227,7 @@ let finish = () =>
|
|
|
242
227
|
|
|
243
228
|
// --- CommandGenerator Lambda ---
|
|
244
229
|
if spec.commandGeneratorConnects->Array.length > 0 {
|
|
245
|
-
// `plugin` cannot be resolved inside the Lambda — LogPrefix's registry is a
|
|
230
|
+
// `plugin` cannot be resolved inside the Lambda — LogPrefix's registry is a
|
|
246
231
|
// deploy-time structure, and the Lambda-name fallback yields nothing for a
|
|
247
232
|
// shared or per-aggregate command handler. Resolve it here; the shell still
|
|
248
233
|
// derives `comp` itself from the spec name.
|
|
@@ -250,15 +235,24 @@ let finish = () =>
|
|
|
250
235
|
~comp=`AggregateRuntime(${spec.aggregateName})`,
|
|
251
236
|
)
|
|
252
237
|
let cmdGenHandlerConfigOutput =
|
|
253
|
-
Pulumi.Output.all3((
|
|
254
|
-
|
|
238
|
+
Pulumi.Output.all3((
|
|
239
|
+
info.eventLogTableName,
|
|
240
|
+
spec.queueUrl,
|
|
241
|
+
spec.queueArn,
|
|
242
|
+
))->Pulumi.Output.apply(((table, queueUrl, queueArn)) =>
|
|
255
243
|
`{"handlers":[{"specModule":${specModule},"behaviorModule":${behaviorModule},"eventLogTable":"${table}","queueUrl":"${queueUrl}","queueArn":"${queueArn}"${pluginFragment}}]}`
|
|
256
244
|
)
|
|
257
245
|
|
|
258
246
|
let cmdGenEnvVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
259
|
-
cmdGenEnvVars->Dict.set(
|
|
247
|
+
cmdGenEnvVars->Dict.set(
|
|
248
|
+
"HANDLER_CONFIG",
|
|
249
|
+
cmdGenHandlerConfigOutput->Pulumi.Output.asInput,
|
|
250
|
+
)
|
|
260
251
|
|
|
261
|
-
let {
|
|
252
|
+
let {
|
|
253
|
+
code: cmdGenCode,
|
|
254
|
+
sourceCodeHash: cmdGenSourceCodeHash,
|
|
255
|
+
} = Util_Bundle.buildCodeArchive(
|
|
262
256
|
~entryPointModule="@reventlessdev/reventless-aws/src/adapter/Runtime/AggregateEntryPoint.mjs",
|
|
263
257
|
~packageDirs,
|
|
264
258
|
)
|
|
@@ -276,9 +270,7 @@ let finish = () =>
|
|
|
276
270
|
~opts=aggregateOpts,
|
|
277
271
|
)
|
|
278
272
|
|
|
279
|
-
spec.commandGeneratorConnects->Array.forEach(connect =>
|
|
280
|
-
connect(~runtime=cmdGenRuntime)
|
|
281
|
-
)
|
|
273
|
+
spec.commandGeneratorConnects->Array.forEach(connect => connect(~runtime=cmdGenRuntime))
|
|
282
274
|
}
|
|
283
275
|
|
|
284
276
|
// --- EventMapper Lambda ---
|
|
@@ -286,14 +278,11 @@ let finish = () =>
|
|
|
286
278
|
| (Some(channelSpec), Some(mappingsModulePath)) =>
|
|
287
279
|
let evtMapperEnvVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
288
280
|
|
|
289
|
-
let targetSpecModule =
|
|
290
|
-
|
|
291
|
-
let mappingsModuleJson =
|
|
292
|
-
mappingsModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
281
|
+
let targetSpecModule = info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
282
|
+
let mappingsModuleJson = mappingsModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
293
283
|
|
|
294
284
|
let handlerConfigJson =
|
|
295
|
-
spec.queueUrl
|
|
296
|
-
->Pulumi.Output.apply(queueUrl =>
|
|
285
|
+
spec.queueUrl->Pulumi.Output.apply(queueUrl =>
|
|
297
286
|
`{"targetSpecModule":${targetSpecModule},"mappingsModule":${mappingsModuleJson},"queueUrl":"${queueUrl}"}`
|
|
298
287
|
)
|
|
299
288
|
evtMapperEnvVars->Dict.set("HANDLER_CONFIG", handlerConfigJson->Pulumi.Output.asInput)
|
|
@@ -304,7 +293,10 @@ let finish = () =>
|
|
|
304
293
|
evtMapperPackageDirs->Dict.set(specPkg, Util_Bundle.resolvePackageRoot(specPkg))
|
|
305
294
|
evtMapperPackageDirs->Dict.set(mappingsPkg, Util_Bundle.resolvePackageRoot(mappingsPkg))
|
|
306
295
|
|
|
307
|
-
let {
|
|
296
|
+
let {
|
|
297
|
+
code: evtMapperCode,
|
|
298
|
+
sourceCodeHash: evtMapperSourceCodeHash,
|
|
299
|
+
} = Util_Bundle.buildCodeArchive(
|
|
308
300
|
~entryPointModule="@reventlessdev/reventless-aws/src/adapter/Runtime/EventMapperEntryPoint.mjs",
|
|
309
301
|
~packageDirs=evtMapperPackageDirs,
|
|
310
302
|
)
|