@reventlessdev/reventless-aws 3.0.0-alpha.343 → 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.
Files changed (234) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/package.json +11 -11
  3. package/scripts/ProvisionIdentity.res +8 -3
  4. package/src/Platform.res +327 -328
  5. package/src/Platform.res.mjs +4 -2
  6. package/src/Platform_Casts.res +13 -4
  7. package/src/adapter/Api/AppSyncEventsSigner_Ops.res +8 -4
  8. package/src/adapter/Api/AppSync_EventsApi.res +12 -14
  9. package/src/adapter/Api/AppSync_Resolver_Native.res +3 -4
  10. package/src/adapter/Api/AppSync_Resolver_Retrying.res +78 -70
  11. package/src/adapter/Api/AppSync_SourceApiAssociation_Retrying.res +11 -8
  12. package/src/adapter/Api/Platform_AdminScan_Ops.res +15 -14
  13. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +10 -2
  14. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res +40 -50
  15. package/src/adapter/Api/Platform_UIFragments_Lambda.res +39 -32
  16. package/src/adapter/Api/Platform_UIFragments_Lambda_Ops.res +5 -2
  17. package/src/adapter/Auth/Auth_ActiveRolePoolAttachment.res +0 -1
  18. package/src/adapter/Auth/Auth_ActiveRoleStore.res +1 -2
  19. package/src/adapter/Auth/Auth_ActiveRoleStore_Schema.res +1 -4
  20. package/src/adapter/Auth/Auth_ActiveRoleTrigger_Ops.res +5 -2
  21. package/src/adapter/Auth/Auth_Cognito.res +3 -9
  22. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res +1 -4
  23. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res +3 -1
  24. package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res +1 -4
  25. package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res +7 -4
  26. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res +6 -1
  27. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res +7 -4
  28. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res +24 -18
  29. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res +9 -4
  30. package/src/adapter/CommandTopic/CommandTopicRegistry.res +1 -4
  31. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res +15 -15
  32. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res +9 -5
  33. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +179 -213
  34. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +5 -5
  35. package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res +6 -2
  36. package/src/adapter/EventCollector/EventCollectorChannel_SQS.res +14 -7
  37. package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res +14 -7
  38. package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res +6 -3
  39. package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res +6 -1
  40. package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res +13 -17
  41. package/src/adapter/EventLog/EventLogStorage_Postgres.res +7 -4
  42. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res +12 -7
  43. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync_Ops.res +4 -2
  44. package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res +3 -2
  45. package/src/adapter/EventTopic/EventTopicPublisher_SNS.res +20 -12
  46. package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res +21 -9
  47. package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res +5 -3
  48. package/src/adapter/Geocoder/Geocoder_AwsLocation_Resolver.res +6 -3
  49. package/src/adapter/Mcp/MCP_Lambda.res +31 -46
  50. package/src/adapter/Messaging/Messaging_Ses_Backend.res +11 -7
  51. package/src/adapter/Messaging/Messaging_Ses_Backend.res.mjs +2 -4
  52. package/src/adapter/Monitoring/Monitoring_CloudWatch.res +16 -16
  53. package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res +5 -10
  54. package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res +4 -2
  55. package/src/adapter/Postgres/PgConnection.res +6 -5
  56. package/src/adapter/Postgres/PgMigration_Builder.res +4 -8
  57. package/src/adapter/Postgres/PgRuntime.res +4 -7
  58. package/src/adapter/QueryDb/PgQueryResolver_Builder.res +9 -11
  59. package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +22 -21
  60. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +114 -111
  61. package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res +1 -7
  62. package/src/adapter/QueryDb/QueryDbStorage.res +4 -2
  63. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res +23 -24
  64. package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res +8 -2
  65. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res +71 -73
  66. package/src/adapter/QueryDb/QueryDbStorage_Postgres.res +5 -2
  67. package/src/adapter/QueryDb/QueryInterceptor_Provisioning.res +1 -4
  68. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +8 -2
  69. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +73 -81
  70. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +72 -78
  71. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +44 -67
  72. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +44 -67
  73. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +53 -82
  74. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +47 -77
  75. package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res +18 -11
  76. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +80 -97
  77. package/src/adapter/Runtime/CounterEntryPoint_Ops.res +2 -7
  78. package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res +16 -10
  79. package/src/adapter/Runtime/EventCollectorEntryPoint_Ops.res +24 -15
  80. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +17 -37
  81. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +31 -57
  82. package/src/adapter/Runtime/EventMapperEntryPoint_Ops.res +18 -24
  83. package/src/adapter/Runtime/ExtensionPointEntryPoint_Ops.res +1 -5
  84. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +4 -3
  85. package/src/adapter/Runtime/HeartbeatEntryPoint.res +0 -1
  86. package/src/adapter/Runtime/PgChangeFeedRelayEntryPoint.res +4 -2
  87. package/src/adapter/Runtime/PgMigrationEntryPoint.res +0 -1
  88. package/src/adapter/Runtime/PgQueryResolverEntryPoint_Ops.res +3 -2
  89. package/src/adapter/Runtime/PluginExtensionPointEntryPoint.res +1 -2
  90. package/src/adapter/Runtime/ProjectionEntryPoint_Ops.res +4 -5
  91. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +22 -10
  92. package/src/adapter/Runtime/RuntimeExtensionEntryPoint_Ops.res +8 -2
  93. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +14 -31
  94. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +16 -17
  95. package/src/adapter/Runtime/StateViewSliceEntryPoint_Ops.res +10 -9
  96. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +46 -52
  97. package/src/adapter/Runtime/StreamRoutedEntryPoint_Ops.res +36 -41
  98. package/src/adapter/Runtime/TaskBucketEntryPoint_Ops.res +31 -37
  99. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +6 -7
  100. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res +4 -6
  101. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res +2 -6
  102. package/src/adapter/StateTopic/StateTopic_AppSync.res +21 -16
  103. package/src/adapter/StateTopic/StateTopic_AppSync_Ops.res +36 -32
  104. package/src/adapter/Task/TaskBucket_S3.res +6 -1
  105. package/src/adapter/Upload/Upload_Claim_S3.res +17 -20
  106. package/src/adapter/Upload/Upload_Claim_S3_Ops.res +5 -2
  107. package/src/adapter/Upload/Upload_Presign_S3.res +51 -49
  108. package/src/capability/Capability_Geocoding_AwsLocation.res +4 -1
  109. package/src/capability/Capability_Messaging.res +4 -5
  110. package/src/capability/Capability_Messaging_Ses.res +3 -1
  111. package/src/capability/Capability_ObjectStore_S3.res +1 -7
  112. package/src/components/Api/AppSync_Adapter.res +28 -41
  113. package/src/components/Api/AppSync_SdlDecorate.res +38 -30
  114. package/src/components/AutomationSlice_Builder.res +6 -4
  115. package/src/components/ExtensionPoint_Builder.res +9 -10
  116. package/src/components/InboundTranslationSlice_Builder.res +7 -8
  117. package/src/components/OutboundTranslationSlice_Builder.res +14 -8
  118. package/src/components/OutboundTranslationSlice_Builder.res.mjs +1 -1
  119. package/src/components/SideEffectHandler_Single.res +4 -4
  120. package/src/components/StateViewSlice_Builder.res +6 -4
  121. package/src/components/StateViewSlice_Builder_Stream.res +6 -4
  122. package/src/components/Task_Builder_PerBucket.res +10 -11
  123. package/src/plugin/cloner/ClonerRunner_Fargate.res +3 -10
  124. package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res +1 -4
  125. package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res +5 -5
  126. package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +19 -21
  127. package/src/plugin/runtime/PluginRuntime_Builder.res +167 -188
  128. package/src/plugin/runtime/Util_PluginMessage_Runtime.res +6 -5
  129. package/src/plugin/stack/Plugin_Stack.res +104 -103
  130. package/src/util/Util_AlarmSpec.res +2 -1
  131. package/src/util/Util_AppSync.res +8 -2
  132. package/src/util/Util_AppSync_Caller.res +15 -14
  133. package/src/util/Util_Bundle.res +144 -67
  134. package/src/util/Util_Bundle.res.mjs +64 -13
  135. package/src/util/Util_CognitoGroupUser_Runtime.res +32 -34
  136. package/src/util/Util_Cognito_Runtime.res +11 -7
  137. package/src/util/Util_DeadLetterQueue.res +12 -2
  138. package/src/util/Util_DynamoDb.res +5 -3
  139. package/src/util/Util_DynamoDbStream.res +7 -3
  140. package/src/util/Util_DynamoDbStream_Runtime.res +1 -2
  141. package/src/util/Util_DynamoDb_Runtime.res +23 -41
  142. package/src/util/Util_HostUiDomain.res +6 -1
  143. package/src/util/Util_Kinesis_Runtime.res +10 -11
  144. package/src/util/Util_Lambda.res +12 -5
  145. package/src/util/Util_LambdaEnvBudget.res +5 -5
  146. package/src/util/Util_LambdaLogging.res +1 -2
  147. package/src/util/Util_LogGroup_Adopting.res +1 -4
  148. package/src/util/Util_ResourceNaming.res +1 -2
  149. package/src/util/Util_SNS.res +8 -3
  150. package/src/util/Util_SNS_FIFO.res +1 -1
  151. package/src/util/Util_SNS_Runtime.res +11 -10
  152. package/src/util/Util_SQS.res +4 -2
  153. package/src/util/Util_SQS_FIFO.res +5 -2
  154. package/src/util/Util_SQS_Runtime.res +37 -36
  155. package/src/util/Util_ShellConfig.res +3 -2
  156. package/src/util/Util_StaticBundle.res +1 -3
  157. package/src/util/Util_StoreLayout.res +4 -1
  158. package/tests/AWS_TagsTest.res +16 -5
  159. package/tests/AppSyncEventsSigner_OpsTest.res +11 -2
  160. package/tests/AppSync_AdapterTest.res +203 -224
  161. package/tests/AppSync_Resolver_RetryingTest.res +64 -44
  162. package/tests/AppSync_RetirementNarrowingTest.res +59 -46
  163. package/tests/AppSync_SdlDecorateTest.res +22 -20
  164. package/tests/AppSync_SourceApiAssociation_RetryingTest.res +40 -22
  165. package/tests/Auth_ActiveRolePoolAttachmentTest.res +114 -107
  166. package/tests/Auth_ActiveRoleStoreTest.res +12 -9
  167. package/tests/Auth_ActiveRoleStore_SchemaTest.res +2 -1
  168. package/tests/Auth_ActiveRoleTrigger_OpsTest.res +20 -16
  169. package/tests/Auth_CognitoTest.res +31 -46
  170. package/tests/AutomationSliceEntryPoint_OpsTest.res +69 -67
  171. package/tests/BakeConvergenceTest.res +22 -25
  172. package/tests/Capability_MessagingTest.res +28 -12
  173. package/tests/CommandTopicQueuePolicyTest.res +1 -2
  174. package/tests/CounterEntryPoint_OpsTest.res +3 -7
  175. package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res +306 -210
  176. package/tests/EventCollectorConnectLambdaPreviewTest.res +14 -7
  177. package/tests/EventCollectorEntryPoint_OpsTest.res +12 -4
  178. package/tests/EventCollectorPluginDefinitionAssetTest.res +18 -11
  179. package/tests/EventCollectorReadyGateTest.res +5 -4
  180. package/tests/EventLogStorage_DynamoDb_RuntimeTest.res +1 -2
  181. package/tests/EventMapperEntryPoint_OpsTest.res +1 -3
  182. package/tests/ExtensionPointEntryPoint_OpsTest.res +1 -4
  183. package/tests/HandlerFactoryDispatchTest.res +97 -70
  184. package/tests/MCP_LambdaTest.res +16 -27
  185. package/tests/PgChangeFeedRelay_IntegrationTest.res +123 -93
  186. package/tests/PgChangeFeedRelay_RuntimeTest.res +13 -10
  187. package/tests/PgMigrationEntryPoint_IntegrationTest.res +0 -1
  188. package/tests/PgPipeline_IntegrationTest.res +80 -66
  189. package/tests/PgQueryDbUnion_IntegrationTest.res +1 -2
  190. package/tests/PgQueryResolverEntryPoint_OpsTest.res +2 -6
  191. package/tests/PgQueryResolver_LambdaTest.res +41 -24
  192. package/tests/Platform_AdminScan_OpsTest.res +4 -1
  193. package/tests/Platform_ComponentDefinitions_Lambda_OpsTest.res +137 -129
  194. package/tests/ProjectionEntryPoint_DisplayNameTest.res +7 -3
  195. package/tests/ProjectionEntryPoint_UnionStampTest.res +3 -2
  196. package/tests/ProvisionIdentityTest.res +2 -6
  197. package/tests/QueryDbOwnerIndexTableTest.res +6 -4
  198. package/tests/QueryDbResolvers_AppSyncTest.res +23 -16
  199. package/tests/QueryInterceptor_LambdaTest.res +11 -13
  200. package/tests/ReadModelEntryPoint_OpsTest.res +43 -41
  201. package/tests/RuntimeExtensionEntryPoint_OpsTest.res +4 -3
  202. package/tests/SideEffectEntryPoint_OpsTest.res +23 -18
  203. package/tests/StateChangeDescriptorParityTest.res +28 -26
  204. package/tests/StateTopicKeySchemaTest.res +18 -15
  205. package/tests/StateViewSliceEntryPoint_OpsTest.res +55 -44
  206. package/tests/TaskBucketEntryPoint_OpsTest.res +13 -13
  207. package/tests/Upload_ClaimTest.res +3 -3
  208. package/tests/Util_AwsErrorTest.res +4 -7
  209. package/tests/Util_BundleDependencyClosureTest.res +41 -3
  210. package/tests/Util_BundleDependencyClosureTest.res.mjs +11 -0
  211. package/tests/Util_BundleEsmLoaderTest.res +3 -3
  212. package/tests/Util_BundleResolveTest.res +4 -6
  213. package/tests/Util_BundleRuntimeExtensionTest.res +17 -18
  214. package/tests/Util_DcbMetricsTest.res +6 -6
  215. package/tests/Util_DynamoDbStreamTest.res +4 -5
  216. package/tests/Util_DynamoDbTest.res +3 -2
  217. package/tests/Util_LambdaEnvBudgetTest.res +22 -18
  218. package/tests/Util_LambdaLoggingTest.res +9 -8
  219. package/tests/Util_LogGroup_AdoptingTest.res +10 -5
  220. package/tests/Util_LogRetentionTest.res +6 -2
  221. package/tests/Util_OwnerScopeEnvTest.res +10 -8
  222. package/tests/Util_SQS_RuntimeTest.res +5 -7
  223. package/tests/Util_ShellConfigTest.res +7 -17
  224. package/tests/Util_StaticBundleTest.res +3 -8
  225. package/tests/Util_StoreLayoutTest.res +17 -12
  226. package/tests/integration/AggregateEntryPoint_IntegrationTest.res +1 -4
  227. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +15 -15
  228. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +296 -232
  229. package/tests/integration/DcbIntegrationHarness.res +8 -8
  230. package/tests/integration/EpCompositeSlice.res +16 -8
  231. package/tests/integration/QueryDbUnion_DynamoDb_IntegrationTest.res +8 -10
  232. package/tests/integration/StateViewSliceEntryPoint_IntegrationTest.res +10 -10
  233. package/tests/integration/SvsTestSlice_Projection.res +1 -3
  234. 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
- PluginRuntime_Builder.geocoderPlaceIndex()->Pulumi.Output.apply(idx => {
273
- open PulumiAws.PolicyDocument
274
- PulumiAws.PolicyDocument.make(
275
- ~id="AllAutomationSlicesGeocode",
276
- ~statements=[
277
- {
278
- sid: "AllowGeocode",
279
- effect: Allow,
280
- actions: Action("geo:SearchPlaceIndexForText"),
281
- // Account/region wildcarded, matching the Function URL handler's
282
- // own policy: the index name is what identifies it, and the stack
283
- // has no other account to reach.
284
- resources: Resource(`arn:aws:geo:*:*:place-index/${idx}`),
285
- },
286
- ],
287
- )->PulumiAws.PolicyDocument.toJsonString
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
- PluginRuntime_Builder.messagingSender()->Pulumi.Output.apply(sender => {
310
- open PulumiAws.PolicyDocument
311
- PulumiAws.PolicyDocument.make(
312
- ~id="AllAutomationSlicesSendEmail",
313
- ~statements=[
314
- {
315
- sid: "AllowSendEmail",
316
- effect: Allow,
317
- // SESv2's SendEmail authorizes against the v1 action name, and the
318
- // resource is the identity the message is sent FROM — not the
319
- // recipient, which is why one grant covers every destination.
320
- actions: Action("ses:SendEmail"),
321
- resources: Resource(`arn:aws:ses:*:*:identity/${sender}`),
322
- },
323
- ],
324
- )->PulumiAws.PolicyDocument.toJsonString
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
- info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
379
- let bodyModule =
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
- Pulumi.Output.all3((info.queryDbTableName, dcbQueueUrl, spec.sourceUrns))
394
- ->Pulumi.Output.apply(((tableName, queueUrl, urns)) => {
395
- let sourceUrn = urns->Array.getUnsafe(0)
396
- `{"specModule":${specModule},"bodyModule":${bodyModule},"callbackType":${callbackType},"queryDbTableName":"${tableName}","dcbQueueUrl":"${queueUrl}","sourceUrn":"${sourceUrn}"${contextFragment}}`
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
- !(info.consumesDcbLog) || info.sourceTopics->Dict.keysToArray->Array.length > 0
611
- let handlerJson =
612
- Pulumi.Output.all3((info.queryDbTableName, commandQueueUrl, sourceUrnsFor(info)))
613
- ->Pulumi.Output.apply(((tableName, queueUrl, urns)) => {
614
- let urnsFragment = hasOwnUrns
615
- ? `,"u":${urns->Array.map(JSON.Encode.string)->JSON.Encode.array->JSON.stringify}`
616
- : ""
617
- let queueFragment = switch target {
618
- | Some(_) => `,"k":"${queueUrl}","f":${commandQueueIsFifo ? "true" : "false"}`
619
- | None => ""
620
- }
621
- `{"n":${nameJson},"q":"${tableName}"${urnsFragment}${queueFragment}}`
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
- Pulumi.Output.all2((dcbQueueUrl, dcbSourceUrn))->Pulumi.Output.apply(((
637
- queueUrl,
638
- urn,
639
- )) => {
640
- let fifoJson = dcbQueueIsFifo.contents ? "true" : "false"
641
- let urnJson = urn->JSON.stringifyAny->Option.getOr(`""`)
642
- `"queueUrl":"${queueUrl}","commandQueueIsFifo":${fifoJson},"urns":[${urnJson}]`
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
- Pulumi.Output.all2((sharedOutput, Pulumi.Output.all(handlerOutputs)))
647
- ->Pulumi.Output.apply(((shared, handlers)) => {
648
- let json = `{${shared},"handlers":[${handlers->Array.join(",")}]}`
649
- Util_LambdaEnvBudget.check(~lambdaName="AllAutomationSlices", ~handlerConfigJson=json)
650
- json
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("@reventlessdev/reventless-core/src/components/StateChangeSlice/StateChangeSlice_Callback.res.mjs")
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
- jsonStream: Stream.t<ReventlessInfra.CommandTopic.topicItem<JSON.t>, string, unit>,
197
- ): Effect.t<array<result<string, string>>, string, unit> => {
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("@reventlessdev/reventless-core/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res.mjs")
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 = row->Reventless.Util_Sury.toJson(
267
- ReventlessCore.InboundTranslationSlice_Callback.auditRowSchema,
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->Dict.get(key)->Option.flatMap(JSON.Decode.array)->Option.getOr([])->Array.filterMap(JSON.Decode.string)
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->strOf("pluginExtensionPointCmdTopicUrl")->Option.getOr(""),
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((extensionPointName): Reventless.Plugin.extensionDefinition => {
283
- name: eo->strOf("name")->Option.getOr(""),
284
- extensionPointName,
285
- dcbSources: eo->strArrOf("dcbSources"),
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(_) => await op(peer.eventCollector, ep.eventTopic, `${ep.name} -> ${peer.id}`)
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
- manage: option<(pluginProjection, action) => promise<unit>>,
500
- ): option<(Reventless.Plugin.pluginDefinition, action) => promise<unit>> =>
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 = %re("/[^.\-_a-zA-Z0-9]/g")
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<ReventlessCore.CommandTopic.publishJsons> =>
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
- ~readModelName,
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 = eventCollectorResource.name->ReventlessCore.ComponentType.nameOpt(
60
- ReventlessCore.EventCollector.componentType,
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
- info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
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
- Pulumi.Output.all2((info.queryDbTableName, sourceUrns))
77
- ->Pulumi.Output.apply(((tableName, urns)) => {
78
- let sourceUrn = urns->Array.getUnsafe(0)
79
- `{"handlers":[{"specModule":${specModule},"mappingsModule":${mappingsModule},"queryDbTableName":"${tableName}","sourceUrn":"${sourceUrn}"${attribution}}]}`
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
- info.specModulePath->JSON.stringifyAny->Option.getOr(`""`)
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
- Pulumi.Output.all4((
232
- info.queryDbTableName,
233
- spec.sourceUrns,
234
- feedArnOutput,
235
- handlerPgFragment,
236
- ))
237
- ->Pulumi.Output.apply(((tableName, urns, feedArn, pgFragment)) => {
238
- // No stream resource (Postgres-backed source) → dispatch on the
239
- // feed queue's ARN instead of a stream URN.
240
- let sourceUrn = urns->Array.get(0)->Option.getOr(feedArn)
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
- Pulumi.Output.all(handlerOutputs)
254
- ->Pulumi.Output.apply(handlers => {
255
- let json = `{"handlers":[${handlers->Array.join(",")}]}`
256
- Util_LambdaEnvBudget.check(~lambdaName="AllReadModels", ~handlerConfigJson=json)
257
- json
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
- (readModelInfos->Dict.get(rmName)->Option.mapOr(false, i => i.pgBacked)) &&
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
- PulumiAws.Lambda.Function.subnetIds: sel.subnetIds->Pulumi.Input.make,
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=?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