@reventlessdev/reventless-aws 3.0.0-alpha.344 → 3.0.0-alpha.345
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 +8 -0
- package/package.json +11 -11
- package/scripts/ProvisionIdentity.res +8 -3
- package/src/Platform.res +327 -328
- package/src/Platform.res.mjs +4 -2
- package/src/Platform_Casts.res +13 -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/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 +18 -11
- 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 +28 -41
- package/src/components/Api/AppSync_SdlDecorate.res +38 -30
- 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 +203 -224
- 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/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/ProvisionIdentityTest.res +2 -6
- 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 +10 -8
- 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
|
@@ -95,32 +95,26 @@ let makeStreamHandler = (
|
|
|
95
95
|
// mapper Lambda serves a single target: every source group runs the same
|
|
96
96
|
// handler, attributed `EventMapper(<Target>)`.
|
|
97
97
|
|
|
98
|
-
let makeHandler = (
|
|
99
|
-
buildPromise: promise<(StreamRoutedEntryPoint_Ops.streamHandler, string)>,
|
|
100
|
-
) =>
|
|
98
|
+
let makeHandler = (buildPromise: promise<(StreamRoutedEntryPoint_Ops.streamHandler, string)>) =>
|
|
101
99
|
async (event: PulumiAws.Lambda.CallbackFunction.event, context: PulumiAws.Lambda.context) => {
|
|
102
100
|
StreamRoutedEntryPoint_Ops.setRequestId(context.awsRequestId)
|
|
103
101
|
let (streamHandler, comp) = await buildPromise
|
|
104
|
-
let _ =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
},
|
|
122
|
-
)
|
|
123
|
-
})
|
|
124
|
-
->Promise.all
|
|
102
|
+
let _ = await StreamRoutedEntryPoint_Ops.groupBySource(event.records)
|
|
103
|
+
->Dict.toArray
|
|
104
|
+
->Array.map(async ((arn, subRecords)) => {
|
|
105
|
+
StreamRoutedEntryPoint_Ops.logDebug("processing " ++ arn, {comp: "EventMapperRuntime"})
|
|
106
|
+
let subEvent: PulumiAws.Lambda.CallbackFunction.event = {records: subRecords}
|
|
107
|
+
await StreamRoutedEntryPoint_Ops.runEffect(
|
|
108
|
+
streamHandler(subEvent, context),
|
|
109
|
+
{
|
|
110
|
+
correlationId: ?StreamRoutedEntryPoint_Ops.extractMetaField(subRecords, "correlationId"),
|
|
111
|
+
causationId: ?StreamRoutedEntryPoint_Ops.extractMetaField(subRecords, "causationId"),
|
|
112
|
+
comp,
|
|
113
|
+
timestamp: ?StreamRoutedEntryPoint_Ops.extractSentTimestamp(subRecords),
|
|
114
|
+
retryCount: StreamRoutedEntryPoint_Ops.extractRetryCount(subRecords),
|
|
115
|
+
},
|
|
116
|
+
)
|
|
117
|
+
})
|
|
118
|
+
->Promise.all
|
|
125
119
|
""
|
|
126
120
|
}
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// records fix the shapes; scheduler/queryEngine still throw by design (not
|
|
17
17
|
// available in the bundled handler).
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
// ── Shim bindings (HandlerFactoryHelpers.mjs), typed for SQS records ────────
|
|
21
20
|
@module("./HandlerFactoryHelpers.mjs")
|
|
22
21
|
external setRequestId: string => unit = "setRequestId"
|
|
@@ -106,10 +105,7 @@ let makeCallbackSpec = (config: handlerConfig): callbackSpec => {
|
|
|
106
105
|
|
|
107
106
|
type built = {
|
|
108
107
|
comp: string,
|
|
109
|
-
sqsHandler: (
|
|
110
|
-
PulumiAws.SQS.Queue.event,
|
|
111
|
-
PulumiAws.Lambda.context,
|
|
112
|
-
) => Effect.t<unit, string, unit>,
|
|
108
|
+
sqsHandler: (PulumiAws.SQS.Queue.event, PulumiAws.Lambda.context) => Effect.t<unit, string, unit>,
|
|
113
109
|
}
|
|
114
110
|
|
|
115
111
|
let makeBuilt = (
|
|
@@ -45,13 +45,14 @@ let forCommandTopic = (
|
|
|
45
45
|
publishToAggregatesEnvVars
|
|
46
46
|
->Dict.toArray
|
|
47
47
|
->Array.map(((aggName, envVar)) =>
|
|
48
|
-
`${aggName->JSON.stringifyAny->Option.getOr(`""`)}: ${envVar
|
|
48
|
+
`${aggName->JSON.stringifyAny->Option.getOr(`""`)}: ${envVar
|
|
49
|
+
->JSON.stringifyAny
|
|
50
|
+
->Option.getOr(`""`)}`
|
|
49
51
|
)
|
|
50
52
|
->Array.join(",")
|
|
51
53
|
|
|
52
54
|
let handlerConfigJson =
|
|
53
|
-
queue.id
|
|
54
|
-
->Pulumi.Output.apply(queueUrl =>
|
|
55
|
+
queue.id->Pulumi.Output.apply(queueUrl =>
|
|
55
56
|
`{"specModule":${specModule},"mappingsModule":${mappingsModule},"queueUrl":"${queueUrl}","publishToAggregates":{${publishToAggregatesJson}}}`
|
|
56
57
|
)
|
|
57
58
|
envVars->Dict.set("HANDLER_CONFIG", handlerConfigJson->Pulumi.Output.asInput)
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
// Pulumi value reaches this module's import graph (deploy-time wiring lives in
|
|
8
8
|
// PluginRuntime_Builder.forPluginHeartbeat).
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
// === Initialize eagerly at module load (Lambda cold start) ===
|
|
12
11
|
|
|
13
12
|
let epQueueUrl = NodeProcess.env->Dict.get("EP_QUEUE_URL")->Option.getOr("")
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
// "kind"?: "classic", // absent → DCB
|
|
24
24
|
// "partitionTag"?: <derivedPartitionTag> } ] } // DCB only
|
|
25
25
|
|
|
26
|
-
|
|
27
26
|
// Structured JSON logging shared by every deployed entry point (HandlerFactoryHelpers).
|
|
28
27
|
type logExtra = {comp?: string}
|
|
29
28
|
@module("./HandlerFactoryHelpers.mjs") @scope("log")
|
|
@@ -78,7 +77,10 @@ let relayLog = async (l: relayLogConfig): unit => {
|
|
|
78
77
|
~sendBatch,
|
|
79
78
|
)
|
|
80
79
|
}
|
|
81
|
-
logDebug(
|
|
80
|
+
logDebug(
|
|
81
|
+
`relayed ${count->Int.toString} event(s) for ${l.logName}`,
|
|
82
|
+
{comp: "PgChangeFeedRelay"},
|
|
83
|
+
)
|
|
82
84
|
} catch {
|
|
83
85
|
| exn =>
|
|
84
86
|
let msg = exn->JsExn.fromException->Option.flatMap(JsExn.message)->Option.getOr("unknown error")
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
// HANDLER_CONFIG shape:
|
|
19
19
|
// { "pgConnection": { host, port, database, username, secretArn } }
|
|
20
20
|
|
|
21
|
-
|
|
22
21
|
// Structured JSON logging shared by every deployed entry point (HandlerFactoryHelpers).
|
|
23
22
|
type logExtra = {comp?: string}
|
|
24
23
|
@module("./HandlerFactoryHelpers.mjs") @scope("log")
|
|
@@ -106,7 +106,8 @@ let makePushdowns = (
|
|
|
106
106
|
byIds: Engine.byIds,
|
|
107
107
|
listPage: Engine.listPage,
|
|
108
108
|
itemsPage: Engine.itemsPage,
|
|
109
|
-
scanAll: (~readModelName) =>
|
|
109
|
+
scanAll: (~readModelName) =>
|
|
110
|
+
Engine.scan(~readModelName, ~filterConfigs=[], ~limit=scanAllLimit),
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
|
|
@@ -138,7 +139,7 @@ let registerBinding = (
|
|
|
138
139
|
pgConnection,
|
|
139
140
|
~name=entry.readModelName,
|
|
140
141
|
~indexes,
|
|
141
|
-
~subIdField
|
|
142
|
+
~subIdField?,
|
|
142
143
|
),
|
|
143
144
|
pushdowns,
|
|
144
145
|
indexes,
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
// binds the Id module at the ReScript level, mirroring ExtensionPoint_Builder.
|
|
11
11
|
// Runtime-pure: no Pulumi value reaches this module's import graph.
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
// ── Shim bindings (HandlerFactoryHelpers.mjs) ───────────────────────────────
|
|
15
14
|
// The structured-log + Effect dispatch boundary shared by every deployed entry
|
|
16
15
|
// point (single place where invocations get their log annotations and
|
|
@@ -160,7 +159,7 @@ let commandTopicResources: array<ReventlessInfra.Adapter.resolvedResource> = {
|
|
|
160
159
|
]
|
|
161
160
|
}
|
|
162
161
|
|
|
163
|
-
let invalidNameChars =
|
|
162
|
+
let invalidNameChars = /[^.\-_a-zA-Z0-9]/g
|
|
164
163
|
let resourceNaming: ReventlessInfra.ResourceNaming.operations = {
|
|
165
164
|
validateName: n => n->String.replaceRegExp(invalidNameChars, "_"),
|
|
166
165
|
urnName: arn =>
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// Runtime-pure: no `open PulumiAws` values — Pulumi appears in type positions
|
|
17
17
|
// only (erased).
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
// ── Runtime-loaded spec-module reads (typed at the seam) ────────────────────
|
|
21
20
|
// The shells read `config` / `subIdConfig` off dynamically imported spec
|
|
22
21
|
// modules; these are the shapes those reads are typed against. `indexes` is
|
|
@@ -28,9 +27,9 @@ type specConfig = {indexes?: array<Reventless.ReadModel.indexConfig>}
|
|
|
28
27
|
let indexesOf = (config: option<specConfig>): array<Reventless.ReadModel.indexConfig> =>
|
|
29
28
|
config->Option.flatMap(c => c.indexes)->Option.getOr([])
|
|
30
29
|
|
|
31
|
-
let subIdFieldOf = (
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
let subIdFieldOf = (subIdConfig: option<Reventless.ReadModel.subIdConfig<JSON.t>>): option<
|
|
31
|
+
string,
|
|
32
|
+
> => subIdConfig->Option.map(c => c.subIdField)
|
|
34
33
|
|
|
35
34
|
// ── QueryDb operations (DynamoDB / Postgres backend branch) ─────────────────
|
|
36
35
|
// `pgConnection`, when present, selects the Postgres QueryDb runtime for the
|
|
@@ -143,7 +142,7 @@ let makeQueryDbOps = (
|
|
|
143
142
|
endpoint: ?(NodeProcess.env->Dict.get("APPSYNC_ENDPOINT")),
|
|
144
143
|
region: ?(NodeProcess.env->Dict.get("AWS_REGION")),
|
|
145
144
|
topicName: ?stateTopicName,
|
|
146
|
-
|
|
145
|
+
?subIdField,
|
|
147
146
|
})
|
|
148
147
|
| None => QueryDbEntryPoint_Ops.makeDynamoQueryDbOps(~tableName=queryDbTableName)
|
|
149
148
|
}
|
|
@@ -48,7 +48,12 @@ let make: ReventlessCore.Runtime.environmentMaker<'event, context, 'result, part
|
|
|
48
48
|
|
|
49
49
|
// The environmentMaker signature carries no component kind, so callers cannot
|
|
50
50
|
// pass one through; attributed to the Platform rather than to an invented kind.
|
|
51
|
-
let tags = AWS.Tags.make(
|
|
51
|
+
let tags = AWS.Tags.make(
|
|
52
|
+
~name,
|
|
53
|
+
~kind=ReventlessCore.ComponentType.Platform,
|
|
54
|
+
~role=Runtime,
|
|
55
|
+
~scope=Platform,
|
|
56
|
+
)
|
|
52
57
|
|
|
53
58
|
let lambdaRole = IAM.Role.makeWithDefaultPolicy(
|
|
54
59
|
~name,
|
|
@@ -85,7 +90,9 @@ let make: ReventlessCore.Runtime.environmentMaker<'event, context, 'result, part
|
|
|
85
90
|
parts: {lambda: lambdaAsFunction, lambdaRole},
|
|
86
91
|
resources: [
|
|
87
92
|
lambdaAsFunction
|
|
88
|
-
->Pulumi.Output.apply(lambda =>
|
|
93
|
+
->Pulumi.Output.apply(lambda =>
|
|
94
|
+
lambda->Util.Lambda.toResource(~tags=tags->Pulumi.Output.fromInput)
|
|
95
|
+
)
|
|
89
96
|
->ReventlessCore.Adapter.outputToResource,
|
|
90
97
|
Util_IAM_Role.toResource(lambdaRole),
|
|
91
98
|
],
|
|
@@ -264,8 +271,10 @@ let makeFromCodeAsset: (
|
|
|
264
271
|
// UpdateFunctionConfiguration limit. Absent entirely when nothing is
|
|
265
272
|
// registered — an extension-free deployment gets the env it always had.
|
|
266
273
|
if !ReventlessCore.RuntimeExtension.isEmpty() {
|
|
267
|
-
let {
|
|
268
|
-
ReventlessCore.ResourceAttribution.
|
|
274
|
+
let {
|
|
275
|
+
ReventlessCore.ResourceAttribution.plugin: plugin,
|
|
276
|
+
platform,
|
|
277
|
+
} = ReventlessCore.ResourceAttribution.current.contents
|
|
269
278
|
let orNull = o => o->Option.mapOr(JSON.Null, s => JSON.String(s))
|
|
270
279
|
let config = JSON.Object(
|
|
271
280
|
Dict.fromArray([
|
|
@@ -313,15 +322,18 @@ let makeFromCodeAsset: (
|
|
|
313
322
|
role: lambdaRole.arn->Pulumi.Output.asInput,
|
|
314
323
|
memorySize: memorySize->Pulumi.Input.make,
|
|
315
324
|
timeout: timeout->Pulumi.Input.make,
|
|
316
|
-
reservedConcurrentExecutions: ?reservedConcurrency->Option.map(Pulumi.Input.make),
|
|
317
|
-
ephemeralStorage: ?
|
|
318
|
-
(
|
|
325
|
+
reservedConcurrentExecutions: ?(reservedConcurrency->Option.map(Pulumi.Input.make)),
|
|
326
|
+
ephemeralStorage: ?(
|
|
327
|
+
ephemeralStorageMb->Option.map(mb =>
|
|
328
|
+
({size: mb->Pulumi.Input.make}: Lambda.Function.ephemeralStorage)->Pulumi.Input.make
|
|
329
|
+
)
|
|
319
330
|
),
|
|
320
331
|
layers,
|
|
321
332
|
tags,
|
|
322
|
-
|
|
323
|
-
environment: (
|
|
324
|
-
|
|
333
|
+
?vpcConfig,
|
|
334
|
+
environment: (
|
|
335
|
+
{Lambda.Function.variables: variables}: Lambda.Function.functionEnvironment
|
|
336
|
+
)->Pulumi.Input.make,
|
|
325
337
|
// Points the function at the group above and, by reading its name output,
|
|
326
338
|
// orders the function after it.
|
|
327
339
|
loggingConfig: ?Util_LambdaLogging.loggingConfigFor(logGroup),
|
|
@@ -59,7 +59,11 @@ let parseConfig = (raw: option<string>): option<config> =>
|
|
|
59
59
|
->Option.flatMap(JSON.Decode.array)
|
|
60
60
|
->Option.getOr([])
|
|
61
61
|
->Array.filterMap(JSON.Decode.string)
|
|
62
|
-
switch (
|
|
62
|
+
switch (
|
|
63
|
+
modules->Array.length,
|
|
64
|
+
obj->decodeString("runtimeKind"),
|
|
65
|
+
obj->decodeString("component"),
|
|
66
|
+
) {
|
|
63
67
|
| (0, _, _) => None
|
|
64
68
|
| (_, Some(runtimeKind), Some(component)) =>
|
|
65
69
|
Some({
|
|
@@ -100,7 +104,9 @@ let fire = (config: config, hooks: array<ReventlessCore.RuntimeExtension.coldSta
|
|
|
100
104
|
| Some(runtimeKind) =>
|
|
101
105
|
log.debug(
|
|
102
106
|
~comp="RuntimeExtension",
|
|
103
|
-
`firing ${hooks
|
|
107
|
+
`firing ${hooks
|
|
108
|
+
->Array.length
|
|
109
|
+
->Int.toString} cold-start extension(s) for ${config.runtimeKind}(${config.component})`,
|
|
104
110
|
)
|
|
105
111
|
ReventlessCore.RuntimeExtension.notifyColdStartHooks(
|
|
106
112
|
~hooks,
|
|
@@ -41,21 +41,9 @@ let storedSpecs: array<storedSpec> = []
|
|
|
41
41
|
let grandParent = ref(None)
|
|
42
42
|
|
|
43
43
|
let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
44
|
-
ReventlessCore.Runtime.effectHandler<
|
|
45
|
-
EventCollectorChannel.callbackEvent,
|
|
46
|
-
context,
|
|
47
|
-
unit,
|
|
48
|
-
string,
|
|
49
|
-
>,
|
|
44
|
+
ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
|
|
50
45
|
ReventlessCore.EventCollector.component,
|
|
51
|
-
> = (
|
|
52
|
-
~handler as _,
|
|
53
|
-
~eventTopics,
|
|
54
|
-
~resources,
|
|
55
|
-
~memorySize=1024,
|
|
56
|
-
~timeout=30,
|
|
57
|
-
eventCollector,
|
|
58
|
-
) => {
|
|
46
|
+
> = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
|
|
59
47
|
let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
60
48
|
let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
|
|
61
49
|
let eventCollectorName = eventCollectorResource.name->Option.getOr("Unnamed")
|
|
@@ -136,12 +124,10 @@ let finish = () =>
|
|
|
136
124
|
let attribution = Util_LogAttribution.fragments(
|
|
137
125
|
~comp=`SideEffectHandler(${spec.componentName})`,
|
|
138
126
|
)
|
|
139
|
-
let handlerJson =
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
`{"sideEffectModules":[${modulesJson}],"sourceUrn":"${sourceUrn}"${attribution}}`
|
|
144
|
-
})
|
|
127
|
+
let handlerJson = spec.sourceUrns->Pulumi.Output.apply(urns => {
|
|
128
|
+
let sourceUrn = urns->Array.getUnsafe(0)
|
|
129
|
+
`{"sideEffectModules":[${modulesJson}],"sourceUrn":"${sourceUrn}"${attribution}}`
|
|
130
|
+
})
|
|
145
131
|
let _ = handlerOutputs->Array.push(handlerJson)
|
|
146
132
|
| None =>
|
|
147
133
|
log.warn(
|
|
@@ -151,13 +137,13 @@ let finish = () =>
|
|
|
151
137
|
}
|
|
152
138
|
})
|
|
153
139
|
|
|
154
|
-
let handlerConfigOutput =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
140
|
+
let handlerConfigOutput = Pulumi.Output.all(
|
|
141
|
+
handlerOutputs,
|
|
142
|
+
)->Pulumi.Output.apply(handlers => {
|
|
143
|
+
let json = `{"handlers":[${handlers->Array.join(",")}]}`
|
|
144
|
+
Util_LambdaEnvBudget.check(~lambdaName="AllSideEffectHandlers", ~handlerConfigJson=json)
|
|
145
|
+
json
|
|
146
|
+
})
|
|
161
147
|
|
|
162
148
|
let envVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
163
149
|
envVars->Dict.set("HANDLER_CONFIG", handlerConfigOutput->Pulumi.Output.asInput)
|
|
@@ -225,10 +211,7 @@ let finish = () =>
|
|
|
225
211
|
~opts,
|
|
226
212
|
)
|
|
227
213
|
| None =>
|
|
228
|
-
log.warn(
|
|
229
|
-
~comp="SideEffectHandlerRuntime_Builder_Single",
|
|
230
|
-
`finish: grandParent not set`,
|
|
231
|
-
)
|
|
214
|
+
log.warn(~comp="SideEffectHandlerRuntime_Builder_Single", `finish: grandParent not set`)
|
|
232
215
|
}
|
|
233
216
|
}
|
|
234
217
|
finished := true
|
|
@@ -175,14 +175,17 @@ let forDcbCommandTopic = (
|
|
|
175
175
|
})
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
let handlerConfigJson =
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
178
|
+
let handlerConfigJson = Pulumi.Output.all4((
|
|
179
|
+
dcbTableName,
|
|
180
|
+
queue.id,
|
|
181
|
+
pgConnectionFragment,
|
|
182
|
+
inboundFragment,
|
|
183
|
+
))->Pulumi.Output.apply(((table, queueUrl, pgFragment, inbFragment)) => {
|
|
184
|
+
let pluginNameJson = pluginName->JSON.stringifyAny->Option.getOr(`""`)
|
|
185
|
+
let json = `{"dcbEventLogTableName":"${table}","queueUrl":"${queueUrl}","pluginName":${pluginNameJson}${pgFragment}${inbFragment}}`
|
|
186
|
+
Util_LambdaEnvBudget.check(~lambdaName=name, ~handlerConfigJson=json)
|
|
187
|
+
json
|
|
188
|
+
})
|
|
186
189
|
envVars->Dict.set("HANDLER_CONFIG", handlerConfigJson->Pulumi.Output.asInput)
|
|
187
190
|
|
|
188
191
|
// Build code asset
|
|
@@ -235,14 +238,10 @@ let forDcbCommandTopic = (
|
|
|
235
238
|
| Some(sel) =>
|
|
236
239
|
Some(
|
|
237
240
|
sel.securityGroupId
|
|
238
|
-
->Pulumi.Output.apply(sgId =>
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
securityGroupIds: [sgId->Pulumi.Input.make]->Pulumi.Input.make,
|
|
243
|
-
}: PulumiAws.Lambda.Function.vpcConfig
|
|
244
|
-
)
|
|
245
|
-
)
|
|
241
|
+
->Pulumi.Output.apply((sgId): PulumiAws.Lambda.Function.vpcConfig => {
|
|
242
|
+
PulumiAws.Lambda.Function.subnetIds: sel.subnetIds->Pulumi.Input.make,
|
|
243
|
+
securityGroupIds: [sgId->Pulumi.Input.make]->Pulumi.Input.make,
|
|
244
|
+
})
|
|
246
245
|
->Pulumi.Output.asInput,
|
|
247
246
|
)
|
|
248
247
|
| None => None
|
|
@@ -260,7 +259,7 @@ let forDcbCommandTopic = (
|
|
|
260
259
|
~reservedConcurrency=?cfg.reservedConcurrency,
|
|
261
260
|
~ephemeralStorageMb=?cfg.ephemeralStorageMb,
|
|
262
261
|
~logRetentionDays=?cfg.logRetentionDays,
|
|
263
|
-
~vpcConfig
|
|
262
|
+
~vpcConfig?,
|
|
264
263
|
// This is the StateChangeSlice command handler — provision the DCB
|
|
265
264
|
// retry/conflict metric filters (takes effect when logRetentionDays is set).
|
|
266
265
|
~dcbMetrics=true,
|
|
@@ -207,15 +207,16 @@ let makeRegisteredHandler = (
|
|
|
207
207
|
entry: handlerEntry,
|
|
208
208
|
modules: sliceModules<'event>,
|
|
209
209
|
): StreamRoutedEntryPoint_Ops.registeredHandler => {
|
|
210
|
-
let queryDbOps =
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
210
|
+
let queryDbOps =
|
|
211
|
+
ProjectionEntryPoint_Ops.makeQueryDbOps(
|
|
212
|
+
~queryDbTableName=entry.queryDbTableName,
|
|
213
|
+
~pgConnection=entry.pgConnection,
|
|
214
|
+
~stateTopicName=entry.stateTopicName,
|
|
215
|
+
~indexes=ProjectionEntryPoint_Ops.indexesOf(modules.config),
|
|
216
|
+
~subIdField=ProjectionEntryPoint_Ops.subIdFieldOf(modules.subIdConfig),
|
|
217
|
+
)
|
|
218
|
+
->ProjectionEntryPoint_Ops.withUnionMemberTypes(~stateSchema=modules.stateSchema)
|
|
219
|
+
->ProjectionEntryPoint_Ops.withDisplayName(~stateSchema=modules.stateSchema)
|
|
219
220
|
{
|
|
220
221
|
handler: StreamRoutedEntryPoint_Ops.toStreamHandler(
|
|
221
222
|
makeJsonEventsHandler(
|
|
@@ -93,21 +93,9 @@ let storedSpecs: array<storedSpec> = []
|
|
|
93
93
|
let grandParent = ref(None)
|
|
94
94
|
|
|
95
95
|
let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
96
|
-
ReventlessCore.Runtime.effectHandler<
|
|
97
|
-
EventCollectorChannel.callbackEvent,
|
|
98
|
-
context,
|
|
99
|
-
unit,
|
|
100
|
-
string,
|
|
101
|
-
>,
|
|
96
|
+
ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
|
|
102
97
|
ReventlessCore.EventCollector.component,
|
|
103
|
-
> = (
|
|
104
|
-
~handler as _,
|
|
105
|
-
~eventTopics,
|
|
106
|
-
~resources,
|
|
107
|
-
~memorySize=1024,
|
|
108
|
-
~timeout=30,
|
|
109
|
-
eventCollector,
|
|
110
|
-
) => {
|
|
98
|
+
> = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
|
|
111
99
|
let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
112
100
|
let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
|
|
113
101
|
let eventCollectorName = eventCollectorResource.name->Option.getOr("Unnamed")
|
|
@@ -263,14 +251,10 @@ let buildLambda = (
|
|
|
263
251
|
| Some(sel) =>
|
|
264
252
|
Some(
|
|
265
253
|
sel.securityGroupId
|
|
266
|
-
->Pulumi.Output.apply(sgId =>
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
securityGroupIds: [sgId->Pulumi.Input.make]->Pulumi.Input.make,
|
|
271
|
-
}: PulumiAws.Lambda.Function.vpcConfig
|
|
272
|
-
)
|
|
273
|
-
)
|
|
254
|
+
->Pulumi.Output.apply((sgId): PulumiAws.Lambda.Function.vpcConfig => {
|
|
255
|
+
PulumiAws.Lambda.Function.subnetIds: sel.subnetIds->Pulumi.Input.make,
|
|
256
|
+
securityGroupIds: [sgId->Pulumi.Input.make]->Pulumi.Input.make,
|
|
257
|
+
})
|
|
274
258
|
->Pulumi.Output.asInput,
|
|
275
259
|
)
|
|
276
260
|
| None => None
|
|
@@ -285,7 +269,7 @@ let buildLambda = (
|
|
|
285
269
|
~envVars,
|
|
286
270
|
~memorySize,
|
|
287
271
|
~timeout,
|
|
288
|
-
~vpcConfig
|
|
272
|
+
~vpcConfig?,
|
|
289
273
|
~opts,
|
|
290
274
|
)
|
|
291
275
|
|
|
@@ -375,14 +359,16 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
|
|
|
375
359
|
let dcbResource = dcbEventLog->ReventlessCore.Component.toPulumiResource
|
|
376
360
|
switch dcbResource.parent {
|
|
377
361
|
| Some(parent) =>
|
|
378
|
-
let dcbOutputs: ReventlessCore.DcbEventLog.outputs =
|
|
362
|
+
let dcbOutputs: ReventlessCore.DcbEventLog.outputs =
|
|
363
|
+
dcbEventLog->ReventlessCore.Component.outputs
|
|
379
364
|
let eventTopics: ReventlessCore.EventTopic.allOutputs = Dict.fromArray([
|
|
380
365
|
("DcbEventLog", dcbOutputs.eventTopic),
|
|
381
366
|
])
|
|
382
367
|
let channel = EventCollectorChannel.make(
|
|
383
368
|
~name="AllStateViewSlices",
|
|
384
369
|
~eventTopics,
|
|
385
|
-
~owner=None,
|
|
370
|
+
~owner=None,
|
|
371
|
+
~opts={Pulumi.ComponentResource.parent: parent},
|
|
386
372
|
)
|
|
387
373
|
|
|
388
374
|
// B3.0: a Postgres-backed DCB log has no stream resource — provision the
|
|
@@ -422,18 +408,19 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
|
|
|
422
408
|
| None => feedArnOutput
|
|
423
409
|
}
|
|
424
410
|
|
|
425
|
-
let handlerJson =
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
411
|
+
let handlerJson = Pulumi.Output.all2((
|
|
412
|
+
info.queryDbTableName,
|
|
413
|
+
sourceUrn,
|
|
414
|
+
))->Pulumi.Output.apply(((tableName, urn)) => {
|
|
415
|
+
let entry: handlerEntry = {
|
|
416
|
+
specModule: info.specModulePath,
|
|
417
|
+
projectionModule: info.projectionModulePath,
|
|
418
|
+
queryDbTableName: tableName,
|
|
419
|
+
sourceUrn: urn,
|
|
420
|
+
stateTopicName: stateTopicNameFor(name),
|
|
421
|
+
}
|
|
422
|
+
entry
|
|
423
|
+
})
|
|
437
424
|
let _ = handlerOutputs->Array.push(handlerJson)
|
|
438
425
|
})
|
|
439
426
|
|
|
@@ -445,7 +432,7 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
|
|
|
445
432
|
~parent,
|
|
446
433
|
~handlerOutputs,
|
|
447
434
|
~packageDirs,
|
|
448
|
-
~channelSpecs=[{channel
|
|
435
|
+
~channelSpecs=[{channel, eventTopics, resources: allQueryDbResources}],
|
|
449
436
|
~feedQueue,
|
|
450
437
|
~pgStreamConfig=anyPgStream ? eventsApiConfig.contents : None,
|
|
451
438
|
)
|
|
@@ -463,7 +450,12 @@ let finish = () =>
|
|
|
463
450
|
if !finished.contents {
|
|
464
451
|
log.info(
|
|
465
452
|
~comp="StateViewSliceRuntime_Builder_Single",
|
|
466
|
-
`finish: ${storedSpecs->Array.length->Int.toString} storedSpecs, ${sliceInfos
|
|
453
|
+
`finish: ${storedSpecs->Array.length->Int.toString} storedSpecs, ${sliceInfos
|
|
454
|
+
->Dict.keysToArray
|
|
455
|
+
->Array.length
|
|
456
|
+
->Int.toString} sliceInfos, grandParent=${grandParent.contents
|
|
457
|
+
->Option.map(_ => "Some")
|
|
458
|
+
->Option.getOr("None")}`,
|
|
467
459
|
)
|
|
468
460
|
if storedSpecs->Array.length > 0 {
|
|
469
461
|
let (maxMemorySize, maxTimeout) = storedSpecs->Array.reduce((0, 0), (
|
|
@@ -503,19 +495,21 @@ let finish = () =>
|
|
|
503
495
|
let projectionPkg = Util_Bundle.extractPackageName(info.projectionModulePath)
|
|
504
496
|
packageDirs->Dict.set(projectionPkg, Util_Bundle.resolvePackageRoot(projectionPkg))
|
|
505
497
|
|
|
506
|
-
let handlerJson =
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
}
|
|
498
|
+
let handlerJson = Pulumi.Output.all3((
|
|
499
|
+
info.queryDbTableName,
|
|
500
|
+
spec.sourceUrns,
|
|
501
|
+
feedArnOutput,
|
|
502
|
+
))->Pulumi.Output.apply(((tableName, urns, feedArn)) => {
|
|
503
|
+
let entry: handlerEntry = {
|
|
504
|
+
specModule: info.specModulePath,
|
|
505
|
+
projectionModule: info.projectionModulePath,
|
|
506
|
+
queryDbTableName: tableName,
|
|
507
|
+
// No stream resource (Postgres) → dispatch on the feed queue ARN.
|
|
508
|
+
sourceUrn: urns->Array.get(0)->Option.getOr(feedArn),
|
|
509
|
+
stateTopicName: stateTopicNameFor(spec.componentName),
|
|
510
|
+
}
|
|
511
|
+
entry
|
|
512
|
+
})
|
|
519
513
|
let _ = handlerOutputs->Array.push(handlerJson)
|
|
520
514
|
| None =>
|
|
521
515
|
log.warn(
|