@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
@@ -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
- await StreamRoutedEntryPoint_Ops.groupBySource(event.records)
106
- ->Dict.toArray
107
- ->Array.map(async ((arn, subRecords)) => {
108
- StreamRoutedEntryPoint_Ops.logDebug("processing " ++ arn, {comp: "EventMapperRuntime"})
109
- let subEvent: PulumiAws.Lambda.CallbackFunction.event = {records: subRecords}
110
- await StreamRoutedEntryPoint_Ops.runEffect(
111
- streamHandler(subEvent, context),
112
- {
113
- correlationId: ?StreamRoutedEntryPoint_Ops.extractMetaField(
114
- subRecords,
115
- "correlationId",
116
- ),
117
- causationId: ?StreamRoutedEntryPoint_Ops.extractMetaField(subRecords, "causationId"),
118
- comp,
119
- timestamp: ?StreamRoutedEntryPoint_Ops.extractSentTimestamp(subRecords),
120
- retryCount: StreamRoutedEntryPoint_Ops.extractRetryCount(subRecords),
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->JSON.stringifyAny->Option.getOr(`""`)}`
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(`relayed ${count->Int.toString} event(s) for ${l.logName}`, {comp: "PgChangeFeedRelay"})
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) => Engine.scan(~readModelName, ~filterConfigs=[], ~limit=scanAllLimit),
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=?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 = %re("/[^.\-_a-zA-Z0-9]/g")
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
- subIdConfig: option<Reventless.ReadModel.subIdConfig<JSON.t>>,
33
- ): option<string> => subIdConfig->Option.map(c => c.subIdField)
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
- subIdField: ?subIdField,
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(~name, ~kind=ReventlessCore.ComponentType.Platform, ~role=Runtime, ~scope=Platform)
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 => lambda->Util.Lambda.toResource(~tags=tags->Pulumi.Output.fromInput))
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 {ReventlessCore.ResourceAttribution.plugin: plugin, platform} =
268
- ReventlessCore.ResourceAttribution.current.contents
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: ?ephemeralStorageMb->Option.map(mb =>
318
- ({size: mb->Pulumi.Input.make}: Lambda.Function.ephemeralStorage)->Pulumi.Input.make
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
- vpcConfig: ?vpcConfig,
323
- environment: ({Lambda.Function.variables: variables}: Lambda.Function.functionEnvironment)
324
- ->Pulumi.Input.make,
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 (modules->Array.length, obj->decodeString("runtimeKind"), obj->decodeString("component")) {
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->Array.length->Int.toString} cold-start extension(s) for ${config.runtimeKind}(${config.component})`,
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
- spec.sourceUrns
141
- ->Pulumi.Output.apply(urns => {
142
- let sourceUrn = urns->Array.getUnsafe(0)
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
- Pulumi.Output.all(handlerOutputs)
156
- ->Pulumi.Output.apply(handlers => {
157
- let json = `{"handlers":[${handlers->Array.join(",")}]}`
158
- Util_LambdaEnvBudget.check(~lambdaName="AllSideEffectHandlers", ~handlerConfigJson=json)
159
- json
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
- Pulumi.Output.all4((dcbTableName, queue.id, pgConnectionFragment, inboundFragment))
180
- ->Pulumi.Output.apply(((table, queueUrl, pgFragment, inbFragment)) => {
181
- let pluginNameJson = pluginName->JSON.stringifyAny->Option.getOr(`""`)
182
- let json = `{"dcbEventLogTableName":"${table}","queueUrl":"${queueUrl}","pluginName":${pluginNameJson}${pgFragment}${inbFragment}}`
183
- Util_LambdaEnvBudget.check(~lambdaName=name, ~handlerConfigJson=json)
184
- json
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
- PulumiAws.Lambda.Function.subnetIds: sel.subnetIds->Pulumi.Input.make,
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=?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 = ProjectionEntryPoint_Ops.makeQueryDbOps(
211
- ~queryDbTableName=entry.queryDbTableName,
212
- ~pgConnection=entry.pgConnection,
213
- ~stateTopicName=entry.stateTopicName,
214
- ~indexes=ProjectionEntryPoint_Ops.indexesOf(modules.config),
215
- ~subIdField=ProjectionEntryPoint_Ops.subIdFieldOf(modules.subIdConfig),
216
- )
217
- ->ProjectionEntryPoint_Ops.withUnionMemberTypes(~stateSchema=modules.stateSchema)
218
- ->ProjectionEntryPoint_Ops.withDisplayName(~stateSchema=modules.stateSchema)
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
- PulumiAws.Lambda.Function.subnetIds: sel.subnetIds->Pulumi.Input.make,
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=?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 = dcbEventLog->ReventlessCore.Component.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, ~opts={Pulumi.ComponentResource.parent: parent},
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
- Pulumi.Output.all2((info.queryDbTableName, sourceUrn))
427
- ->Pulumi.Output.apply(((tableName, urn)) => {
428
- let entry: handlerEntry = {
429
- specModule: info.specModulePath,
430
- projectionModule: info.projectionModulePath,
431
- queryDbTableName: tableName,
432
- sourceUrn: urn,
433
- stateTopicName: stateTopicNameFor(name),
434
- }
435
- entry
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: channel, eventTopics, resources: allQueryDbResources}],
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->Dict.keysToArray->Array.length->Int.toString} sliceInfos, grandParent=${grandParent.contents->Option.map(_ => "Some")->Option.getOr("None")}`,
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
- Pulumi.Output.all3((info.queryDbTableName, spec.sourceUrns, feedArnOutput))
508
- ->Pulumi.Output.apply(((tableName, urns, feedArn)) => {
509
- let entry: handlerEntry = {
510
- specModule: info.specModulePath,
511
- projectionModule: info.projectionModulePath,
512
- queryDbTableName: tableName,
513
- // No stream resource (Postgres) → dispatch on the feed queue ARN.
514
- sourceUrn: urns->Array.get(0)->Option.getOr(feedArn),
515
- stateTopicName: stateTopicNameFor(spec.componentName),
516
- }
517
- entry
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(