@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
|
@@ -128,21 +128,9 @@ let storedSpecs: array<storedSpec> = []
|
|
|
128
128
|
let grandParent = ref(None)
|
|
129
129
|
|
|
130
130
|
let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
131
|
-
ReventlessCore.Runtime.effectHandler<
|
|
132
|
-
EventCollectorChannel.callbackEvent,
|
|
133
|
-
context,
|
|
134
|
-
unit,
|
|
135
|
-
string,
|
|
136
|
-
>,
|
|
131
|
+
ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
|
|
137
132
|
ReventlessCore.EventCollector.component,
|
|
138
|
-
> = (
|
|
139
|
-
~handler as _,
|
|
140
|
-
~eventTopics,
|
|
141
|
-
~resources,
|
|
142
|
-
~memorySize=1024,
|
|
143
|
-
~timeout=30,
|
|
144
|
-
eventCollector,
|
|
145
|
-
) => {
|
|
133
|
+
> = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
|
|
146
134
|
let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
147
135
|
let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
|
|
148
136
|
let eventCollectorName = eventCollectorResource.name->Option.getOr("Unnamed")
|
|
@@ -268,24 +256,23 @@ let makeGeocoderGrant = (~runtime: ReventlessCore.Runtime.environment<runtimePar
|
|
|
268
256
|
if PluginRuntime_Builder.geocoderProvisioned() {
|
|
269
257
|
let customOpts =
|
|
270
258
|
opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
|
|
271
|
-
let policyJson =
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
})
|
|
259
|
+
let policyJson = PluginRuntime_Builder.geocoderPlaceIndex()->Pulumi.Output.apply(idx => {
|
|
260
|
+
open PulumiAws.PolicyDocument
|
|
261
|
+
PulumiAws.PolicyDocument.make(
|
|
262
|
+
~id="AllAutomationSlicesGeocode",
|
|
263
|
+
~statements=[
|
|
264
|
+
{
|
|
265
|
+
sid: "AllowGeocode",
|
|
266
|
+
effect: Allow,
|
|
267
|
+
actions: Action("geo:SearchPlaceIndexForText"),
|
|
268
|
+
// Account/region wildcarded, matching the Function URL handler's
|
|
269
|
+
// own policy: the index name is what identifies it, and the stack
|
|
270
|
+
// has no other account to reach.
|
|
271
|
+
resources: Resource(`arn:aws:geo:*:*:place-index/${idx}`),
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
)->PulumiAws.PolicyDocument.toJsonString
|
|
275
|
+
})
|
|
289
276
|
let _ = PulumiAws.IAM.RolePolicy.make(
|
|
290
277
|
~name="AllAutomationSlicesGeocode",
|
|
291
278
|
~args={
|
|
@@ -305,24 +292,23 @@ let makeMessagingGrant = (~runtime: ReventlessCore.Runtime.environment<runtimePa
|
|
|
305
292
|
if PluginRuntime_Builder.messagingProvisioned() {
|
|
306
293
|
let customOpts =
|
|
307
294
|
opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
|
|
308
|
-
let policyJson =
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
})
|
|
295
|
+
let policyJson = PluginRuntime_Builder.messagingSender()->Pulumi.Output.apply(sender => {
|
|
296
|
+
open PulumiAws.PolicyDocument
|
|
297
|
+
PulumiAws.PolicyDocument.make(
|
|
298
|
+
~id="AllAutomationSlicesSendEmail",
|
|
299
|
+
~statements=[
|
|
300
|
+
{
|
|
301
|
+
sid: "AllowSendEmail",
|
|
302
|
+
effect: Allow,
|
|
303
|
+
// SESv2's SendEmail authorizes against the v1 action name, and the
|
|
304
|
+
// resource is the identity the message is sent FROM — not the
|
|
305
|
+
// recipient, which is why one grant covers every destination.
|
|
306
|
+
actions: Action("ses:SendEmail"),
|
|
307
|
+
resources: Resource(`arn:aws:ses:*:*:identity/${sender}`),
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
)->PulumiAws.PolicyDocument.toJsonString
|
|
311
|
+
})
|
|
326
312
|
let _ = PulumiAws.IAM.RolePolicy.make(
|
|
327
313
|
~name="AllAutomationSlicesSendEmail",
|
|
328
314
|
~args={
|
|
@@ -374,12 +360,9 @@ let finish = () =>
|
|
|
374
360
|
let bodyPkg = Util_Bundle.extractPackageName(info.bodyModulePath)
|
|
375
361
|
packageDirs->Dict.set(bodyPkg, Util_Bundle.resolvePackageRoot(bodyPkg))
|
|
376
362
|
|
|
377
|
-
let specModule =
|
|
378
|
-
|
|
379
|
-
let
|
|
380
|
-
info.bodyModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
381
|
-
let callbackType =
|
|
382
|
-
info.callbackType->JSON.stringifyAny->Option.getOr(`""`)
|
|
363
|
+
let specModule = info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
364
|
+
let bodyModule = info.bodyModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
365
|
+
let callbackType = info.callbackType->JSON.stringifyAny->Option.getOr(`""`)
|
|
383
366
|
let contextFragment = switch info.context {
|
|
384
367
|
| Some(context) =>
|
|
385
368
|
context
|
|
@@ -389,12 +372,14 @@ let finish = () =>
|
|
|
389
372
|
| None => ""
|
|
390
373
|
}
|
|
391
374
|
|
|
392
|
-
let handlerJson =
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
375
|
+
let handlerJson = Pulumi.Output.all3((
|
|
376
|
+
info.queryDbTableName,
|
|
377
|
+
dcbQueueUrl,
|
|
378
|
+
spec.sourceUrns,
|
|
379
|
+
))->Pulumi.Output.apply(((tableName, queueUrl, urns)) => {
|
|
380
|
+
let sourceUrn = urns->Array.getUnsafe(0)
|
|
381
|
+
`{"specModule":${specModule},"bodyModule":${bodyModule},"callbackType":${callbackType},"queryDbTableName":"${tableName}","dcbQueueUrl":"${queueUrl}","sourceUrn":"${sourceUrn}"${contextFragment}}`
|
|
382
|
+
})
|
|
398
383
|
let _ = handlerOutputs->Array.push(handlerJson)
|
|
399
384
|
| None =>
|
|
400
385
|
log.warn(
|
|
@@ -405,8 +390,7 @@ let finish = () =>
|
|
|
405
390
|
})
|
|
406
391
|
|
|
407
392
|
let handlerConfigOutput =
|
|
408
|
-
Pulumi.Output.all(handlerOutputs)
|
|
409
|
-
->Pulumi.Output.apply(handlers =>
|
|
393
|
+
Pulumi.Output.all(handlerOutputs)->Pulumi.Output.apply(handlers =>
|
|
410
394
|
`{"handlers":[${handlers->Array.join(",")}]}`
|
|
411
395
|
)
|
|
412
396
|
|
|
@@ -448,10 +432,7 @@ let finish = () =>
|
|
|
448
432
|
~opts,
|
|
449
433
|
)
|
|
450
434
|
| None =>
|
|
451
|
-
log.warn(
|
|
452
|
-
~comp="AutomationSliceRuntime_Builder_Single",
|
|
453
|
-
`finish: grandParent not set`,
|
|
454
|
-
)
|
|
435
|
+
log.warn(~comp="AutomationSliceRuntime_Builder_Single", `finish: grandParent not set`)
|
|
455
436
|
}
|
|
456
437
|
}
|
|
457
438
|
finished := true
|
|
@@ -607,19 +588,21 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
|
|
|
607
588
|
// publishing to the DCB fallback, repeats the shared urn and queue URL
|
|
608
589
|
// exactly — so it emits neither and inherits both.
|
|
609
590
|
let hasOwnUrns =
|
|
610
|
-
!
|
|
611
|
-
let handlerJson =
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
}
|
|
591
|
+
!info.consumesDcbLog || info.sourceTopics->Dict.keysToArray->Array.length > 0
|
|
592
|
+
let handlerJson = Pulumi.Output.all3((
|
|
593
|
+
info.queryDbTableName,
|
|
594
|
+
commandQueueUrl,
|
|
595
|
+
sourceUrnsFor(info),
|
|
596
|
+
))->Pulumi.Output.apply(((tableName, queueUrl, urns)) => {
|
|
597
|
+
let urnsFragment = hasOwnUrns
|
|
598
|
+
? `,"u":${urns->Array.map(JSON.Encode.string)->JSON.Encode.array->JSON.stringify}`
|
|
599
|
+
: ""
|
|
600
|
+
let queueFragment = switch target {
|
|
601
|
+
| Some(_) => `,"k":"${queueUrl}","f":${commandQueueIsFifo ? "true" : "false"}`
|
|
602
|
+
| None => ""
|
|
603
|
+
}
|
|
604
|
+
`{"n":${nameJson},"q":"${tableName}"${urnsFragment}${queueFragment}}`
|
|
605
|
+
})
|
|
623
606
|
let _ = handlerOutputs->Array.push(handlerJson)
|
|
624
607
|
})
|
|
625
608
|
|
|
@@ -632,23 +615,23 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
|
|
|
632
615
|
}
|
|
633
616
|
|
|
634
617
|
// The defaults every non-overriding slice inherits, carried once.
|
|
635
|
-
let sharedOutput =
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
})
|
|
618
|
+
let sharedOutput = Pulumi.Output.all2((dcbQueueUrl, dcbSourceUrn))->Pulumi.Output.apply(((
|
|
619
|
+
queueUrl,
|
|
620
|
+
urn,
|
|
621
|
+
)) => {
|
|
622
|
+
let fifoJson = dcbQueueIsFifo.contents ? "true" : "false"
|
|
623
|
+
let urnJson = urn->JSON.stringifyAny->Option.getOr(`""`)
|
|
624
|
+
`"queueUrl":"${queueUrl}","commandQueueIsFifo":${fifoJson},"urns":[${urnJson}]`
|
|
625
|
+
})
|
|
644
626
|
|
|
645
|
-
let handlerConfigOutput =
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
627
|
+
let handlerConfigOutput = Pulumi.Output.all2((
|
|
628
|
+
sharedOutput,
|
|
629
|
+
Pulumi.Output.all(handlerOutputs),
|
|
630
|
+
))->Pulumi.Output.apply(((shared, handlers)) => {
|
|
631
|
+
let json = `{${shared},"handlers":[${handlers->Array.join(",")}]}`
|
|
632
|
+
Util_LambdaEnvBudget.check(~lambdaName="AllAutomationSlices", ~handlerConfigJson=json)
|
|
633
|
+
json
|
|
634
|
+
})
|
|
652
635
|
|
|
653
636
|
let envVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
654
637
|
envVars->Dict.set("HANDLER_CONFIG", handlerConfigOutput->Pulumi.Output.asInput)
|
|
@@ -76,8 +76,7 @@ let splitRecords = (
|
|
|
76
76
|
let dynamoDbRecords =
|
|
77
77
|
records->Array.filter(record =>
|
|
78
78
|
record.eventSource == "aws:dynamodb" &&
|
|
79
|
-
(record.eventSourceARN == referencesStreamArn ||
|
|
80
|
-
record.eventSourceARN == countsStreamArn)
|
|
79
|
+
(record.eventSourceARN == referencesStreamArn || record.eventSourceARN == countsStreamArn)
|
|
81
80
|
)
|
|
82
81
|
|
|
83
82
|
let (referenceRecords, countRecords) =
|
|
@@ -134,11 +133,7 @@ let makeHandler = (
|
|
|
134
133
|
let countsStreamArn = config.countsStreamArn->Option.getOr("")
|
|
135
134
|
|
|
136
135
|
async (event: PulumiAws.DynamoDb.Stream.event, _context: PulumiAws.Lambda.context) => {
|
|
137
|
-
let (references, counts) = splitRecords(
|
|
138
|
-
~referencesStreamArn,
|
|
139
|
-
~countsStreamArn,
|
|
140
|
-
event.records,
|
|
141
|
-
)
|
|
136
|
+
let (references, counts) = splitRecords(~referencesStreamArn, ~countsStreamArn, event.records)
|
|
142
137
|
await Callback.counterHandler(~references, ~counts)
|
|
143
138
|
""
|
|
144
139
|
}
|
|
@@ -176,7 +176,9 @@ type sliceCallback = {
|
|
|
176
176
|
>,
|
|
177
177
|
) => Effect.t<array<result<string, string>>, string, unit>,
|
|
178
178
|
}
|
|
179
|
-
@module(
|
|
179
|
+
@module(
|
|
180
|
+
"@reventlessdev/reventless-core/src/components/StateChangeSlice/StateChangeSlice_Callback.res.mjs"
|
|
181
|
+
)
|
|
180
182
|
external makeSliceCallback: specModule => behaviorModule => sliceCallback = "Make"
|
|
181
183
|
|
|
182
184
|
// Builds the per-slice JSON-command handler: decode each topic item's JSON
|
|
@@ -192,9 +194,11 @@ let buildSliceHandler = (
|
|
|
192
194
|
) => {
|
|
193
195
|
let callback = makeSliceCallback(spec)(behavior)
|
|
194
196
|
let commandSchema = spec->specCommandSchemaTyped
|
|
195
|
-
(
|
|
196
|
-
|
|
197
|
-
|
|
197
|
+
(jsonStream: Stream.t<ReventlessInfra.CommandTopic.topicItem<JSON.t>, string, unit>): Effect.t<
|
|
198
|
+
array<result<string, string>>,
|
|
199
|
+
string,
|
|
200
|
+
unit,
|
|
201
|
+
> => {
|
|
198
202
|
let decodedStream =
|
|
199
203
|
jsonStream
|
|
200
204
|
->Stream.mapEffect(topicItem =>
|
|
@@ -240,7 +244,9 @@ type inboundCallback = {
|
|
|
240
244
|
) => promise<ReventlessInfra.InboundTranslationSlice.receiveResult>,
|
|
241
245
|
auditLog: dict<ReventlessCore.InboundTranslationSlice_Callback.auditRow>,
|
|
242
246
|
}
|
|
243
|
-
@module(
|
|
247
|
+
@module(
|
|
248
|
+
"@reventlessdev/reventless-core/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res.mjs"
|
|
249
|
+
)
|
|
244
250
|
external makeInboundCallback: specModule => translationModule => inboundCallback = "Make"
|
|
245
251
|
|
|
246
252
|
// Builds the inbound receive handler: run the slice's `receive` (which validates
|
|
@@ -263,9 +269,10 @@ let buildInboundReceiver = (
|
|
|
263
269
|
let id = result->ReventlessCore.InboundTranslationSlice_Callback.requestIdOf
|
|
264
270
|
switch callback.auditLog->ReventlessCore.InboundTranslationSlice_Callback.takeAuditRow(id) {
|
|
265
271
|
| Some(row) =>
|
|
266
|
-
let json =
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
let json =
|
|
273
|
+
row->Reventless.Util_Sury.toJson(
|
|
274
|
+
ReventlessCore.InboundTranslationSlice_Callback.auditRowSchema,
|
|
275
|
+
)
|
|
269
276
|
// A failed audit write must not fail the mutation (the command was
|
|
270
277
|
// already published), but it must not vanish either. `save` RESOLVES
|
|
271
278
|
// with `Error(_)` on a storage failure (it does not throw), so the
|
|
@@ -278,8 +285,7 @@ let buildInboundReceiver = (
|
|
|
278
285
|
| Error(err) =>
|
|
279
286
|
ReventlessCore.EffectLogger.logError(
|
|
280
287
|
~comp="InboundTranslationSlice.audit",
|
|
281
|
-
`failed to persist audit row ${id}: ${err
|
|
282
|
-
->ReventlessCore.QueryDb.storageErrorToString}`,
|
|
288
|
+
`failed to persist audit row ${id}: ${err->ReventlessCore.QueryDb.storageErrorToString}`,
|
|
283
289
|
)->Effect.runSync
|
|
284
290
|
}
|
|
285
291
|
} catch {
|
|
@@ -58,7 +58,6 @@ external scanByTableName: (
|
|
|
58
58
|
int,
|
|
59
59
|
) => promise<array<JSON.t>> = "scanByTableName"
|
|
60
60
|
|
|
61
|
-
|
|
62
61
|
let exnMessage = (exn: exn): string =>
|
|
63
62
|
exn->JsExn.fromException->Option.flatMap(JsExn.message)->Option.getOr("unknown error")
|
|
64
63
|
|
|
@@ -124,7 +123,11 @@ type queueUrlNames = {
|
|
|
124
123
|
let strOf = (obj: dict<JSON.t>, key: string): option<string> =>
|
|
125
124
|
obj->Dict.get(key)->Option.flatMap(JSON.Decode.string)
|
|
126
125
|
let strArrOf = (obj: dict<JSON.t>, key: string): array<string> =>
|
|
127
|
-
obj
|
|
126
|
+
obj
|
|
127
|
+
->Dict.get(key)
|
|
128
|
+
->Option.flatMap(JSON.Decode.array)
|
|
129
|
+
->Option.getOr([])
|
|
130
|
+
->Array.filterMap(JSON.Decode.string)
|
|
128
131
|
let strDictOf = (obj: dict<JSON.t>, key: string): dict<string> =>
|
|
129
132
|
obj
|
|
130
133
|
->Dict.get(key)
|
|
@@ -221,7 +224,9 @@ let parseHandlerConfig = (rawJson: string): handlerConfig => {
|
|
|
221
224
|
->Dict.fromArray
|
|
222
225
|
{
|
|
223
226
|
queueUrl: obj->strOf("queueUrl")->Option.getOr(""),
|
|
224
|
-
pluginExtensionPointCmdTopicUrl: obj
|
|
227
|
+
pluginExtensionPointCmdTopicUrl: obj
|
|
228
|
+
->strOf("pluginExtensionPointCmdTopicUrl")
|
|
229
|
+
->Option.getOr(""),
|
|
225
230
|
eventTopicArn: obj->strOf("eventTopicArn")->Option.getOr(""),
|
|
226
231
|
pluginReadModelTableName: obj->strOf("pluginReadModelTableName")->Option.getOr(""),
|
|
227
232
|
appSyncApiId: obj->strOf("appSyncApiId")->Option.getOr(""),
|
|
@@ -279,11 +284,13 @@ let projectPluginRow = (row: JSON.t): option<pluginProjection> =>
|
|
|
279
284
|
->Option.flatMap(eo =>
|
|
280
285
|
eo
|
|
281
286
|
->strOf("extensionPointName")
|
|
282
|
-
->Option.map(
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
+
->Option.map(
|
|
288
|
+
(extensionPointName): Reventless.Plugin.extensionDefinition => {
|
|
289
|
+
name: eo->strOf("name")->Option.getOr(""),
|
|
290
|
+
extensionPointName,
|
|
291
|
+
dcbSources: eo->strArrOf("dcbSources"),
|
|
292
|
+
},
|
|
293
|
+
)
|
|
287
294
|
)
|
|
288
295
|
)
|
|
289
296
|
let extensionPoints =
|
|
@@ -440,7 +447,8 @@ let makeManageSubscriptions = (tableName: string): option<
|
|
|
440
447
|
for j in 0 to peers->Array.length - 1 {
|
|
441
448
|
let peer = peers->Array.getUnsafe(j)
|
|
442
449
|
switch peer.extensions->Array.find(e => e.extensionPointName == ep.name) {
|
|
443
|
-
| Some(_) =>
|
|
450
|
+
| Some(_) =>
|
|
451
|
+
await op(peer.eventCollector, ep.eventTopic, `${ep.name} -> ${peer.id}`)
|
|
444
452
|
| None => ()
|
|
445
453
|
}
|
|
446
454
|
}
|
|
@@ -495,10 +503,9 @@ let makeManageSubscriptions = (tableName: string): option<
|
|
|
495
503
|
|
|
496
504
|
// The definition-typed view the admin EP functor expects
|
|
497
505
|
// (PluginExtensionPoint_Plugin.Make's `manageSubscriptions` hook).
|
|
498
|
-
let manageForDefinition = (
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
manage->Option.map(m => (d, a) => m(projectionOfDefinition(d), a))
|
|
506
|
+
let manageForDefinition = (manage: option<(pluginProjection, action) => promise<unit>>): option<
|
|
507
|
+
(Reventless.Plugin.pluginDefinition, action) => promise<unit>,
|
|
508
|
+
> => manage->Option.map(m => (d, a) => m(projectionOfDefinition(d), a))
|
|
502
509
|
|
|
503
510
|
// Cold-start reconciliation — scan the Plugin RM for every Connected plugin and
|
|
504
511
|
// rerun manageSubscriptions(p, #connect) for each. Idempotent at the SNS level;
|
|
@@ -546,7 +553,7 @@ let runtimeOps: ReventlessCore.PluginRuntimeOperations.operations = {
|
|
|
546
553
|
messagePublish: {sendMessageToChannel: Util_PluginMessage_Runtime.sendMessage},
|
|
547
554
|
}
|
|
548
555
|
|
|
549
|
-
let invalidNameChars =
|
|
556
|
+
let invalidNameChars = /[^.\-_a-zA-Z0-9]/g
|
|
550
557
|
let resourceNaming: ReventlessInfra.ResourceNaming.operations = {
|
|
551
558
|
validateName: n => n->String.replaceRegExp(invalidNameChars, "_"),
|
|
552
559
|
urnName: arn =>
|
|
@@ -610,7 +617,9 @@ let makePublishJsons = (queueUrl: string): ReventlessCore.CommandTopic.publishJs
|
|
|
610
617
|
|
|
611
618
|
// aggregateName → publishJsons, resolving each queue URL via the env-var name
|
|
612
619
|
// carried in HANDLER_CONFIG.publishToAggregates.
|
|
613
|
-
let buildPublishToAggregates = (map: dict<string>): dict<
|
|
620
|
+
let buildPublishToAggregates = (map: dict<string>): dict<
|
|
621
|
+
ReventlessCore.CommandTopic.publishJsons,
|
|
622
|
+
> =>
|
|
614
623
|
map
|
|
615
624
|
->Dict.toArray
|
|
616
625
|
->Array.map(((aggName, envVarName)) => (
|
|
@@ -14,33 +14,13 @@ type readModelInfo = {
|
|
|
14
14
|
|
|
15
15
|
let readModelInfos: dict<readModelInfo> = Dict.make()
|
|
16
16
|
|
|
17
|
-
let registerReadModel = (
|
|
18
|
-
|
|
19
|
-
~specModulePath,
|
|
20
|
-
~mappingsModulePath,
|
|
21
|
-
~queryDbTableName,
|
|
22
|
-
) =>
|
|
23
|
-
readModelInfos->Dict.set(
|
|
24
|
-
readModelName,
|
|
25
|
-
{specModulePath, mappingsModulePath, queryDbTableName},
|
|
26
|
-
)
|
|
17
|
+
let registerReadModel = (~readModelName, ~specModulePath, ~mappingsModulePath, ~queryDbTableName) =>
|
|
18
|
+
readModelInfos->Dict.set(readModelName, {specModulePath, mappingsModulePath, queryDbTableName})
|
|
27
19
|
|
|
28
20
|
let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
29
|
-
ReventlessCore.Runtime.effectHandler<
|
|
30
|
-
EventCollectorChannel.callbackEvent,
|
|
31
|
-
context,
|
|
32
|
-
unit,
|
|
33
|
-
string,
|
|
34
|
-
>,
|
|
21
|
+
ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
|
|
35
22
|
ReventlessCore.EventCollector.component,
|
|
36
|
-
> = (
|
|
37
|
-
~handler as _,
|
|
38
|
-
~eventTopics,
|
|
39
|
-
~resources,
|
|
40
|
-
~memorySize=1024,
|
|
41
|
-
~timeout=30,
|
|
42
|
-
eventCollector,
|
|
43
|
-
) => {
|
|
23
|
+
> = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
|
|
44
24
|
let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
45
25
|
let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
|
|
46
26
|
let eventCollectorName = eventCollectorResource.name->Option.getOr("Unnamed")
|
|
@@ -56,28 +36,28 @@ let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
|
56
36
|
->Array.map(({urn}) => urn)
|
|
57
37
|
->Pulumi.Output.all
|
|
58
38
|
|
|
59
|
-
let name =
|
|
60
|
-
ReventlessCore.
|
|
61
|
-
|
|
39
|
+
let name =
|
|
40
|
+
eventCollectorResource.name->ReventlessCore.ComponentType.nameOpt(
|
|
41
|
+
ReventlessCore.EventCollector.componentType,
|
|
42
|
+
)
|
|
62
43
|
let opts = {Pulumi.ComponentResource.parent: eventCollectorResource}
|
|
63
44
|
|
|
64
45
|
// Build HANDLER_CONFIG with single handler
|
|
65
|
-
let specModule =
|
|
66
|
-
|
|
67
|
-
let mappingsModule =
|
|
68
|
-
info.mappingsModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
46
|
+
let specModule = info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
47
|
+
let mappingsModule = info.mappingsModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
69
48
|
|
|
70
49
|
// Same deploy-time log attribution as the shared-runtime builder: the
|
|
71
50
|
// entry point annotates every invocation with these, and the `comp` string
|
|
72
51
|
// must match the ReScript dispatch boundary's `EventCollector(<name>)`.
|
|
73
52
|
let attribution = Util_LogAttribution.fragments(~comp=`EventCollector(${eventCollectorName})`)
|
|
74
53
|
|
|
75
|
-
let handlerConfigOutput =
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
54
|
+
let handlerConfigOutput = Pulumi.Output.all2((
|
|
55
|
+
info.queryDbTableName,
|
|
56
|
+
sourceUrns,
|
|
57
|
+
))->Pulumi.Output.apply(((tableName, urns)) => {
|
|
58
|
+
let sourceUrn = urns->Array.getUnsafe(0)
|
|
59
|
+
`{"handlers":[{"specModule":${specModule},"mappingsModule":${mappingsModule},"queryDbTableName":"${tableName}","sourceUrn":"${sourceUrn}"${attribution}}]}`
|
|
60
|
+
})
|
|
81
61
|
|
|
82
62
|
let envVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
83
63
|
envVars->Dict.set("HANDLER_CONFIG", handlerConfigOutput->Pulumi.Output.asInput)
|
|
@@ -66,21 +66,9 @@ let storedSpecs: array<storedSpec> = []
|
|
|
66
66
|
let grandParent = ref(None)
|
|
67
67
|
|
|
68
68
|
let forEventCollector: ReventlessCore.Runtime.forEventCollector<
|
|
69
|
-
ReventlessCore.Runtime.effectHandler<
|
|
70
|
-
EventCollectorChannel.callbackEvent,
|
|
71
|
-
context,
|
|
72
|
-
unit,
|
|
73
|
-
string,
|
|
74
|
-
>,
|
|
69
|
+
ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
|
|
75
70
|
ReventlessCore.EventCollector.component,
|
|
76
|
-
> = (
|
|
77
|
-
~handler as _,
|
|
78
|
-
~eventTopics,
|
|
79
|
-
~resources,
|
|
80
|
-
~memorySize=1024,
|
|
81
|
-
~timeout=30,
|
|
82
|
-
eventCollector,
|
|
83
|
-
) => {
|
|
71
|
+
> = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
|
|
84
72
|
let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
|
|
85
73
|
let channel = eventCollector->ReventlessCore.EventCollector_Adapter.channel
|
|
86
74
|
let eventCollectorName = eventCollectorResource.name->Option.getOr("Unnamed")
|
|
@@ -163,8 +151,7 @@ let finish = () =>
|
|
|
163
151
|
// entry (per read model — admin-exempt ones stay DynamoDB in the same
|
|
164
152
|
// Lambda). The Lambda itself goes in-VPC when any handler is pg-backed.
|
|
165
153
|
let qdbSelection = QueryDbBackend.get()
|
|
166
|
-
let anyPgBacked =
|
|
167
|
-
readModelInfos->Dict.valuesToArray->Array.some(info => info.pgBacked)
|
|
154
|
+
let anyPgBacked = readModelInfos->Dict.valuesToArray->Array.some(info => info.pgBacked)
|
|
168
155
|
let pgConnectionFragment = switch (qdbSelection, anyPgBacked) {
|
|
169
156
|
| (Some(sel), true) =>
|
|
170
157
|
sel.connectionConfig->Pulumi.Output.apply(cc =>
|
|
@@ -193,14 +180,10 @@ let finish = () =>
|
|
|
193
180
|
packageDirs->Dict.set(specPkg, Util_Bundle.resolvePackageRoot(specPkg))
|
|
194
181
|
packageDirs->Dict.set(mappingsPkg, Util_Bundle.resolvePackageRoot(mappingsPkg))
|
|
195
182
|
|
|
196
|
-
let specModule =
|
|
197
|
-
|
|
198
|
-
let mappingsModule =
|
|
199
|
-
info.mappingsModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
183
|
+
let specModule = info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
184
|
+
let mappingsModule = info.mappingsModulePath->JSON.stringifyAny->Option.getOr(`""`)
|
|
200
185
|
|
|
201
|
-
let handlerPgFragment = info.pgBacked
|
|
202
|
-
? pgConnectionFragment
|
|
203
|
-
: Pulumi.Output.make("")
|
|
186
|
+
let handlerPgFragment = info.pgBacked ? pgConnectionFragment : Pulumi.Output.make("")
|
|
204
187
|
// B3.3: a subscription-enabled Postgres read model publishes live
|
|
205
188
|
// updates from the projection Lambda — bake its AppSync Events channel
|
|
206
189
|
// root (the plural LIST field name, same source as the DynamoDB
|
|
@@ -227,19 +210,17 @@ let finish = () =>
|
|
|
227
210
|
let attribution = Util_LogAttribution.fragments(
|
|
228
211
|
~comp=`EventCollector(${spec.eventCollectorName})`,
|
|
229
212
|
)
|
|
230
|
-
let handlerJson =
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
`{"specModule":${specModule},"mappingsModule":${mappingsModule},"queryDbTableName":"${tableName}","sourceUrn":"${sourceUrn}"${attribution}${pgFragment}${stateTopicFragment}}`
|
|
242
|
-
})
|
|
213
|
+
let handlerJson = Pulumi.Output.all4((
|
|
214
|
+
info.queryDbTableName,
|
|
215
|
+
spec.sourceUrns,
|
|
216
|
+
feedArnOutput,
|
|
217
|
+
handlerPgFragment,
|
|
218
|
+
))->Pulumi.Output.apply(((tableName, urns, feedArn, pgFragment)) => {
|
|
219
|
+
// No stream resource (Postgres-backed source) → dispatch on the
|
|
220
|
+
// feed queue's ARN instead of a stream URN.
|
|
221
|
+
let sourceUrn = urns->Array.get(0)->Option.getOr(feedArn)
|
|
222
|
+
`{"specModule":${specModule},"mappingsModule":${mappingsModule},"queryDbTableName":"${tableName}","sourceUrn":"${sourceUrn}"${attribution}${pgFragment}${stateTopicFragment}}`
|
|
223
|
+
})
|
|
243
224
|
let _ = handlerOutputs->Array.push(handlerJson)
|
|
244
225
|
| None =>
|
|
245
226
|
log.warn(
|
|
@@ -249,13 +230,13 @@ let finish = () =>
|
|
|
249
230
|
}
|
|
250
231
|
})
|
|
251
232
|
|
|
252
|
-
let handlerConfigOutput =
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
233
|
+
let handlerConfigOutput = Pulumi.Output.all(
|
|
234
|
+
handlerOutputs,
|
|
235
|
+
)->Pulumi.Output.apply(handlers => {
|
|
236
|
+
let json = `{"handlers":[${handlers->Array.join(",")}]}`
|
|
237
|
+
Util_LambdaEnvBudget.check(~lambdaName="AllReadModels", ~handlerConfigJson=json)
|
|
238
|
+
json
|
|
239
|
+
})
|
|
259
240
|
|
|
260
241
|
let envVars: dict<Pulumi.Input.t<string>> = Dict.make()
|
|
261
242
|
envVars->Dict.set("HANDLER_CONFIG", handlerConfigOutput->Pulumi.Output.asInput)
|
|
@@ -267,7 +248,7 @@ let finish = () =>
|
|
|
267
248
|
readModelInfos
|
|
268
249
|
->Dict.keysToArray
|
|
269
250
|
->Array.some(rmName =>
|
|
270
|
-
|
|
251
|
+
readModelInfos->Dict.get(rmName)->Option.mapOr(false, i => i.pgBacked) &&
|
|
271
252
|
QueryDbBackend.postgresStreamRegistry->Set.has(rmName)
|
|
272
253
|
)
|
|
273
254
|
let pgStreamConfig = anyPgStream ? eventsApiConfig.contents : None
|
|
@@ -287,14 +268,10 @@ let finish = () =>
|
|
|
287
268
|
| (Some(sel), true) =>
|
|
288
269
|
Some(
|
|
289
270
|
sel.securityGroupId
|
|
290
|
-
->Pulumi.Output.apply(sgId =>
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
securityGroupIds: [sgId->Pulumi.Input.make]->Pulumi.Input.make,
|
|
295
|
-
}: PulumiAws.Lambda.Function.vpcConfig
|
|
296
|
-
)
|
|
297
|
-
)
|
|
271
|
+
->Pulumi.Output.apply((sgId): PulumiAws.Lambda.Function.vpcConfig => {
|
|
272
|
+
PulumiAws.Lambda.Function.subnetIds: sel.subnetIds->Pulumi.Input.make,
|
|
273
|
+
securityGroupIds: [sgId->Pulumi.Input.make]->Pulumi.Input.make,
|
|
274
|
+
})
|
|
298
275
|
->Pulumi.Output.asInput,
|
|
299
276
|
)
|
|
300
277
|
| _ => None
|
|
@@ -309,7 +286,7 @@ let finish = () =>
|
|
|
309
286
|
~envVars,
|
|
310
287
|
~memorySize=maxMemorySize,
|
|
311
288
|
~timeout=maxTimeout,
|
|
312
|
-
~vpcConfig
|
|
289
|
+
~vpcConfig?,
|
|
313
290
|
~opts,
|
|
314
291
|
)
|
|
315
292
|
|
|
@@ -392,10 +369,7 @@ let finish = () =>
|
|
|
392
369
|
| None => ()
|
|
393
370
|
}
|
|
394
371
|
| None =>
|
|
395
|
-
log.warn(
|
|
396
|
-
~comp="EventCollectorRuntime_Builder_Single",
|
|
397
|
-
`finish: grandParent not set`,
|
|
398
|
-
)
|
|
372
|
+
log.warn(~comp="EventCollectorRuntime_Builder_Single", `finish: grandParent not set`)
|
|
399
373
|
}
|
|
400
374
|
}
|
|
401
375
|
finished := true
|