@reventlessdev/reventless-aws 3.0.0-alpha.175 → 3.0.0-alpha.177

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 (76) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/package.json +10 -10
  3. package/src/Platform.res +127 -31
  4. package/src/Platform.res.mjs +226 -44
  5. package/src/adapter/DcbEventLog/DcbBackend.res +2 -2
  6. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +4 -1
  7. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs +1 -1
  8. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res +14 -4
  9. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res.mjs +19 -14
  10. package/src/adapter/EventLog/EventLogBackend.res +82 -0
  11. package/src/adapter/EventLog/EventLogBackend.res.mjs +53 -0
  12. package/src/adapter/EventLog/EventLogStorage.res +15 -0
  13. package/src/adapter/EventLog/EventLogStorage.res.mjs +20 -1
  14. package/src/adapter/EventLog/EventLogStorage_Postgres.res +37 -0
  15. package/src/adapter/EventLog/EventLogStorage_Postgres.res.mjs +21 -0
  16. package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res +26 -11
  17. package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res.mjs +15 -6
  18. package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res +54 -0
  19. package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res.mjs +23 -0
  20. package/src/adapter/Postgres/PgProjectionFeed.res +100 -0
  21. package/src/adapter/Postgres/PgProjectionFeed.res.mjs +54 -0
  22. package/src/adapter/QueryDb/PgQueryResolver_Builder.res +281 -0
  23. package/src/adapter/QueryDb/PgQueryResolver_Builder.res.mjs +189 -0
  24. package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +335 -0
  25. package/src/adapter/QueryDb/PgQueryResolver_Lambda.res.mjs +252 -0
  26. package/src/adapter/QueryDb/QueryDbBackend.res +52 -0
  27. package/src/adapter/QueryDb/QueryDbBackend.res.mjs +44 -0
  28. package/src/adapter/QueryDb/QueryDbResolvers.res +49 -0
  29. package/src/adapter/QueryDb/QueryDbResolvers.res.mjs +20 -1
  30. package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res +264 -0
  31. package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res.mjs +164 -0
  32. package/src/adapter/QueryDb/QueryDbStorage.res +44 -0
  33. package/src/adapter/QueryDb/QueryDbStorage.res.mjs +34 -1
  34. package/src/adapter/QueryDb/QueryDbStorage_Postgres.res +47 -0
  35. package/src/adapter/QueryDb/QueryDbStorage_Postgres.res.mjs +21 -0
  36. package/src/adapter/QueryDb/QueryDbStorage_Postgres_Runtime.res +19 -0
  37. package/src/adapter/QueryDb/QueryDbStorage_Postgres_Runtime.res.mjs +15 -0
  38. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +12 -1
  39. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs +2 -1
  40. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +83 -3
  41. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +46 -3
  42. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +83 -3
  43. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +48 -3
  44. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +130 -5
  45. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +66 -6
  46. package/src/adapter/Runtime/PgChangeFeedRelayEntryPoint.mjs +15 -10
  47. package/src/adapter/Runtime/PgQueryResolverEntryPoint.mjs +88 -0
  48. package/src/adapter/Runtime/ReadModelEntryPoint.mjs +32 -15
  49. package/src/adapter/Runtime/StateViewSliceEntryPoint.mjs +26 -12
  50. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +138 -8
  51. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs +76 -11
  52. package/src/components/Aggregate_Builder_Single.res +12 -5
  53. package/src/components/Aggregate_Builder_Single.res.mjs +12 -6
  54. package/src/components/Aggregate_Builder_Single_Async.res +12 -5
  55. package/src/components/Aggregate_Builder_Single_Async.res.mjs +12 -6
  56. package/src/components/ReadModel_Builder_NoResolver.res.mjs +1 -1
  57. package/src/components/ReadModel_Builder_NoResolver_Stream.res +13 -4
  58. package/src/components/ReadModel_Builder_NoResolver_Stream.res.mjs +14 -9
  59. package/src/components/ReadModel_Builder_Single.res +14 -5
  60. package/src/components/ReadModel_Builder_Single.res.mjs +15 -12
  61. package/src/components/ReadModel_Builder_Single_Stream.res +14 -5
  62. package/src/components/ReadModel_Builder_Single_Stream.res.mjs +15 -12
  63. package/src/components/StateViewSlice_Builder.res +10 -4
  64. package/src/components/StateViewSlice_Builder.res.mjs +8 -10
  65. package/src/components/StateViewSlice_Builder_Stream.res +10 -4
  66. package/src/components/StateViewSlice_Builder_Stream.res.mjs +8 -10
  67. package/src/plugin/runtime/PluginRuntime_Builder.res +12 -0
  68. package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +4 -0
  69. package/tests/EventCollectorChannelStreamRuntimeTest.res +55 -0
  70. package/tests/EventCollectorChannelStreamRuntimeTest.res.mjs +78 -0
  71. package/tests/PgChangeFeedRelay_IntegrationTest.res +115 -4
  72. package/tests/PgChangeFeedRelay_IntegrationTest.res.mjs +84 -0
  73. package/tests/PgPipeline_IntegrationTest.res +208 -0
  74. package/tests/PgPipeline_IntegrationTest.res.mjs +260 -0
  75. package/tests/PgQueryResolver_LambdaTest.res +308 -0
  76. package/tests/PgQueryResolver_LambdaTest.res.mjs +392 -0
@@ -1,14 +1,21 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Aws from "@pulumi/aws";
3
4
  import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
4
5
  import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
5
6
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
7
  import * as Pulumi from "@pulumi/pulumi";
7
8
  import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
8
9
  import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
10
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
9
11
  import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
10
12
  import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
13
+ import * as DcbBackend$ReventlessAws from "../DcbEventLog/DcbBackend.res.mjs";
14
+ import * as PolicyDocument$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/IAM/PolicyDocument.res.mjs";
11
15
  import * as Util_Bundle$ReventlessAws from "../../util/Util_Bundle.res.mjs";
16
+ import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
17
+ import * as QueryDbBackend$ReventlessAws from "../QueryDb/QueryDbBackend.res.mjs";
18
+ import * as PgProjectionFeed$ReventlessAws from "../Postgres/PgProjectionFeed.res.mjs";
12
19
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "./RuntimeEnvironment_Lambda.res.mjs";
13
20
  import * as EventCollectorChannel_DynamoDbStream$ReventlessAws from "../EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs";
14
21
 
@@ -81,14 +88,45 @@ let finished = {
81
88
  contents: false
82
89
  };
83
90
 
84
- function buildLambda(parent, handlerOutputs, packageDirs, channelSpecs, memorySizeOpt, timeoutOpt) {
91
+ function buildLambda(parent, handlerOutputs, packageDirs, channelSpecs, feedQueueOpt, memorySizeOpt, timeoutOpt) {
92
+ let feedQueue = feedQueueOpt !== undefined ? Primitive_option.valFromOption(feedQueueOpt) : undefined;
85
93
  let memorySize = memorySizeOpt !== undefined ? memorySizeOpt : 1024;
86
94
  let timeout = timeoutOpt !== undefined ? timeoutOpt : 30;
87
95
  let opts_parent = parent;
88
96
  let opts = {
89
97
  parent: opts_parent
90
98
  };
91
- let handlerConfigOutput = Pulumi.all(handlerOutputs).apply(handlers => {
99
+ let qdbSelection = QueryDbBackend$ReventlessAws.get();
100
+ let pgConnectionFragment = qdbSelection !== undefined ? qdbSelection.connectionConfig.apply(cc => {
101
+ let pgConnectionJson = JSON.stringify(Object.fromEntries([
102
+ [
103
+ "host",
104
+ cc.host
105
+ ],
106
+ [
107
+ "port",
108
+ cc.port
109
+ ],
110
+ [
111
+ "database",
112
+ cc.database
113
+ ],
114
+ [
115
+ "username",
116
+ cc.username
117
+ ],
118
+ [
119
+ "secretArn",
120
+ cc.secretArn
121
+ ]
122
+ ]));
123
+ return `,"pgConnection":` + pgConnectionJson;
124
+ }) : Pulumi.output("");
125
+ let handlerConfigOutput = Pulumi.all([
126
+ Pulumi.all(handlerOutputs),
127
+ pgConnectionFragment
128
+ ]).apply(param => {
129
+ let handlers = param[0];
92
130
  let paths = [];
93
131
  handlers.forEach(h => {
94
132
  paths.push(h.specModule);
@@ -110,15 +148,33 @@ function buildLambda(parent, handlerOutputs, packageDirs, channelSpecs, memorySi
110
148
  }).join(",");
111
149
  let baseJson = Stdlib_Option.getOr(JSON.stringify(base), `""`);
112
150
  let urnJson = Stdlib_Option.getOr(JSON.stringify(sharedUrn), `""`);
113
- return `{"v":2,"base":` + baseJson + `,"sourceUrn":` + urnJson + `,"handlers":[` + entries + `]}`;
151
+ return `{"v":2,"base":` + baseJson + `,"sourceUrn":` + urnJson + `,"handlers":[` + entries + `]` + param[1] + `}`;
114
152
  });
115
153
  let envVars = {};
116
154
  envVars["HANDLER_CONFIG"] = handlerConfigOutput;
117
155
  packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws");
118
156
  packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-core");
119
157
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/StateViewSliceEntryPoint.mjs", packageDirs, undefined);
120
- let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset("AllStateViewSlices", match.code, match.sourceCodeHash, envVars, memorySize, timeout, undefined, undefined, undefined, undefined, undefined, opts);
158
+ let vpcConfig = qdbSelection !== undefined ? qdbSelection.securityGroupId.apply(sgId => ({
159
+ subnetIds: qdbSelection.subnetIds,
160
+ securityGroupIds: [sgId]
161
+ })) : undefined;
162
+ let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset("AllStateViewSlices", match.code, match.sourceCodeHash, envVars, memorySize, timeout, undefined, undefined, undefined, undefined, vpcConfig, opts);
163
+ if (qdbSelection !== undefined) {
164
+ qdbSelection.connectionConfig.apply(cc => new (Aws.iam.RolePolicy)("AllStateViewSlices-pgSecret", {
165
+ policy: PolicyDocument$PulumiAws.toJsonString(PolicyDocument$PulumiAws.make(undefined, "AllStateViewSlices-pgSecretPolicy", [{
166
+ Sid: "AllowGetPgSecret",
167
+ Effect: "Allow",
168
+ Action: "secretsmanager:GetSecretValue",
169
+ Resource: cc.secretArn
170
+ }])),
171
+ role: runtime.parts.lambdaRole.id
172
+ }));
173
+ }
121
174
  EventCollectorChannel_DynamoDbStream$ReventlessAws.connect("AllStateViewSlices", channelSpecs, runtime, opts);
175
+ if (feedQueue !== undefined) {
176
+ return PgProjectionFeed$ReventlessAws.connect("AllStateViewSlicesFeed", feedQueue, runtime.parts.lambda, runtime.parts.lambdaRole, Util_Pulumi$ReventlessCore.ComponentResourceOptions.toCustomResourceOptions(opts));
177
+ }
122
178
  }
123
179
 
124
180
  function finishWithDcbEventLog(dcbEventLog) {
@@ -138,6 +194,10 @@ function finishWithDcbEventLog(dcbEventLog) {
138
194
  let channel = EventCollectorChannel_DynamoDbStream$ReventlessAws.make("AllStateViewSlices", eventTopics, {
139
195
  parent: parent
140
196
  });
197
+ let feedQueue = DcbBackend$ReventlessAws.isPostgres() ? PgProjectionFeed$ReventlessAws.makeQueue("AllStateViewSlicesFeed", "aws-svs-feed", false, true, {
198
+ parent: parent
199
+ }) : undefined;
200
+ let feedArnOutput = feedQueue !== undefined ? feedQueue.arn : Pulumi.output("");
141
201
  let handlerOutputs = [];
142
202
  let packageDirs = {};
143
203
  let allQueryDbResources = [];
@@ -150,11 +210,11 @@ function finishWithDcbEventLog(dcbEventLog) {
150
210
  let projectionPkg = Util_Bundle$ReventlessAws.extractPackageName(info.projectionModulePath);
151
211
  packageDirs[projectionPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(projectionPkg);
152
212
  let etResources = dcbOutputs.eventTopic.resources;
153
- let sourceUrn = etResources[0];
154
- let sourceUrn$1 = sourceUrn.urn;
213
+ let resource = etResources[0];
214
+ let sourceUrn = resource !== undefined ? resource.urn : feedArnOutput;
155
215
  let handlerJson = Pulumi.all([
156
216
  info.queryDbTableName,
157
- sourceUrn$1
217
+ sourceUrn
158
218
  ]).apply(param => ({
159
219
  specModule: info.specModulePath,
160
220
  projectionModule: info.projectionModulePath,
@@ -167,7 +227,7 @@ function finishWithDcbEventLog(dcbEventLog) {
167
227
  channel: channel,
168
228
  eventTopics: eventTopics,
169
229
  resources: allQueryDbResources
170
- }], undefined, undefined);
230
+ }], Primitive_option.some(feedQueue), undefined, undefined);
171
231
  } else {
172
232
  log.warn("StateViewSliceRuntime_Builder_Single", undefined, "finishWithDcbEventLog: DCB EventLog has no parent");
173
233
  }
@@ -192,6 +252,10 @@ function finish() {
192
252
  if (parent !== undefined) {
193
253
  let handlerOutputs = [];
194
254
  let packageDirs = {};
255
+ let feedQueue = DcbBackend$ReventlessAws.isPostgres() ? PgProjectionFeed$ReventlessAws.makeQueue("AllStateViewSlicesFeed", "aws-svs-feed", false, true, {
256
+ parent: parent
257
+ }) : undefined;
258
+ let feedArnOutput = feedQueue !== undefined ? feedQueue.arn : Pulumi.output("");
195
259
  storedSpecs.forEach(spec => {
196
260
  let info = sliceInfos[spec.componentName];
197
261
  if (info === undefined) {
@@ -203,16 +267,17 @@ function finish() {
203
267
  packageDirs[projectionPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(projectionPkg);
204
268
  let handlerJson = Pulumi.all([
205
269
  info.queryDbTableName,
206
- spec.sourceUrns
270
+ spec.sourceUrns,
271
+ feedArnOutput
207
272
  ]).apply(param => ({
208
273
  specModule: info.specModulePath,
209
274
  projectionModule: info.projectionModulePath,
210
275
  queryDbTableName: param[0],
211
- sourceUrn: param[1][0]
276
+ sourceUrn: Stdlib_Option.getOr(param[1][0], param[2])
212
277
  }));
213
278
  handlerOutputs.push(handlerJson);
214
279
  });
215
- buildLambda(parent, handlerOutputs, packageDirs, storedSpecs.map(param => param.channelSpec), match[0], match[1]);
280
+ buildLambda(parent, handlerOutputs, packageDirs, storedSpecs.map(param => param.channelSpec), Primitive_option.some(feedQueue), match[0], match[1]);
216
281
  } else {
217
282
  log.warn("StateViewSliceRuntime_Builder_Single", undefined, `finish: grandParent not set`);
218
283
  }
@@ -21,7 +21,7 @@ module Make = (
21
21
  RuntimeEnvironment,
22
22
  CommandGeneratorResolvers,
23
23
  CommandTopicChannel,
24
- EventLogStorage.DynamoDbStream,
24
+ EventLogStorage.Selectable,
25
25
  EventTopicPublisher.DynamoDbStream,
26
26
  EventCollectorChannel,
27
27
  AggregateRuntimeBuilder,
@@ -38,10 +38,17 @@ module Make = (
38
38
  let aggregate = Inner.make(~api, ~opts?)
39
39
 
40
40
  // Extract the event log table name from the aggregate's outputs.
41
- // EventLog.outputs.resources[0] is the DynamoDB table resource.
42
- let eventLogOutputs = (aggregate->Inner.outputs).eventLog
43
- let tableResource = eventLogOutputs.resources->Array.getUnsafe(0)
44
- let eventLogTableName = tableResource.name
41
+ // EventLog.outputs.resources[0] is the DynamoDB table resource. On the
42
+ // Postgres backend there is no table (resources is empty) — the stable
43
+ // `event_log.log_name` (`<Aggregate>EventLog`) stands in for it, both here
44
+ // and in the entry point's Postgres branch.
45
+ let eventLogTableName = if EventLogBackend.isPostgres() {
46
+ Pulumi.Output.make(Spec.name ++ "EventLog")
47
+ } else {
48
+ let eventLogOutputs = (aggregate->Inner.outputs).eventLog
49
+ let tableResource = eventLogOutputs.resources->Array.getUnsafe(0)
50
+ tableResource.name
51
+ }
45
52
 
46
53
  AggregateRuntimeBuilder.registerAggregate(
47
54
  ~aggregateName=Spec.name,
@@ -1,11 +1,13 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Pulumi from "@pulumi/pulumi";
3
4
  import * as Util_Bundle$ReventlessAws from "../util/Util_Bundle.res.mjs";
5
+ import * as EventLogBackend$ReventlessAws from "../adapter/EventLog/EventLogBackend.res.mjs";
6
+ import * as EventLogStorage$ReventlessAws from "../adapter/EventLog/EventLogStorage.res.mjs";
4
7
  import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
5
8
  import * as Aggregate_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/Aggregate/Aggregate_Builder.res.mjs";
6
9
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "../adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
7
10
  import * as CommandTopicChannel_SQS_Sync$ReventlessAws from "../adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs";
8
- import * as EventLogStorage_DynamoDbStream$ReventlessAws from "../adapter/EventLog/EventLogStorage_DynamoDbStream.res.mjs";
9
11
  import * as AggregateRuntime_Builder_Single$ReventlessAws from "../adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs";
10
12
  import * as CommandGeneratorResolvers_AppSync$ReventlessAws from "../adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res.mjs";
11
13
  import * as EventTopicPublisher_DynamoDbStream$ReventlessAws from "../adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs";
@@ -24,7 +26,7 @@ function Make(Spec) {
24
26
  asEffectHandler: prim => prim
25
27
  })(CommandGeneratorResolvers_AppSync$ReventlessAws)({
26
28
  make: CommandTopicChannel_SQS_Sync$ReventlessAws.make
27
- })(EventLogStorage_DynamoDbStream$ReventlessAws)(EventTopicPublisher_DynamoDbStream$ReventlessAws)({
29
+ })(EventLogStorage$ReventlessAws.Selectable)(EventTopicPublisher_DynamoDbStream$ReventlessAws)({
28
30
  make: EventCollectorChannel_DynamoDbStream$ReventlessAws.make,
29
31
  connect: EventCollectorChannel_DynamoDbStream$ReventlessAws.connect
30
32
  })({
@@ -42,9 +44,13 @@ function Make(Spec) {
42
44
  })(Plugin_Helpers$ReventlessCore.NoopHooksConfig);
43
45
  let make = (api, opts) => {
44
46
  let aggregate = Inner.make(api, opts);
45
- let eventLogOutputs = Inner.outputs(aggregate).eventLog;
46
- let tableResource = eventLogOutputs.resources[0];
47
- let eventLogTableName = tableResource.name;
47
+ let eventLogTableName;
48
+ if (EventLogBackend$ReventlessAws.isPostgres()) {
49
+ eventLogTableName = Pulumi.output(Spec.name + "EventLog");
50
+ } else {
51
+ let eventLogOutputs = Inner.outputs(aggregate).eventLog;
52
+ eventLogTableName = eventLogOutputs.resources[0].name;
53
+ }
48
54
  AggregateRuntime_Builder_Single$ReventlessAws.registerAggregate(Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Behavior.moduleUrl), eventLogTableName);
49
55
  return aggregate;
50
56
  };
@@ -77,4 +83,4 @@ export {
77
83
  AggregateRuntimeBuilder,
78
84
  Make,
79
85
  }
80
- /* Util_Bundle-ReventlessAws Not a pure module */
86
+ /* @pulumi/pulumi Not a pure module */
@@ -21,7 +21,7 @@ module Make = (
21
21
  RuntimeEnvironment,
22
22
  CommandGeneratorResolvers,
23
23
  CommandTopicChannel,
24
- EventLogStorage.DynamoDbStream,
24
+ EventLogStorage.Selectable,
25
25
  EventTopicPublisher.DynamoDbStream,
26
26
  EventCollectorChannel,
27
27
  AggregateRuntimeBuilder,
@@ -38,10 +38,17 @@ module Make = (
38
38
  let aggregate = Inner.make(~api, ~opts?)
39
39
 
40
40
  // Extract the event log table name from the aggregate's outputs.
41
- // EventLog.outputs.resources[0] is the DynamoDB table resource.
42
- let eventLogOutputs = (aggregate->Inner.outputs).eventLog
43
- let tableResource = eventLogOutputs.resources->Array.getUnsafe(0)
44
- let eventLogTableName = tableResource.name
41
+ // EventLog.outputs.resources[0] is the DynamoDB table resource. On the
42
+ // Postgres backend there is no table (resources is empty) — the stable
43
+ // `event_log.log_name` (`<Aggregate>EventLog`) stands in for it, both here
44
+ // and in the entry point's Postgres branch.
45
+ let eventLogTableName = if EventLogBackend.isPostgres() {
46
+ Pulumi.Output.make(Spec.name ++ "EventLog")
47
+ } else {
48
+ let eventLogOutputs = (aggregate->Inner.outputs).eventLog
49
+ let tableResource = eventLogOutputs.resources->Array.getUnsafe(0)
50
+ tableResource.name
51
+ }
45
52
 
46
53
  AggregateRuntimeBuilder.registerAggregate(
47
54
  ~aggregateName=Spec.name,
@@ -1,11 +1,13 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Pulumi from "@pulumi/pulumi";
3
4
  import * as Util_Bundle$ReventlessAws from "../util/Util_Bundle.res.mjs";
5
+ import * as EventLogBackend$ReventlessAws from "../adapter/EventLog/EventLogBackend.res.mjs";
6
+ import * as EventLogStorage$ReventlessAws from "../adapter/EventLog/EventLogStorage.res.mjs";
4
7
  import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
5
8
  import * as Aggregate_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/Aggregate/Aggregate_Builder.res.mjs";
6
9
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "../adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
7
10
  import * as CommandTopicChannel_SQS_Async$ReventlessAws from "../adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs";
8
- import * as EventLogStorage_DynamoDbStream$ReventlessAws from "../adapter/EventLog/EventLogStorage_DynamoDbStream.res.mjs";
9
11
  import * as CommandGeneratorResolvers_AppSync$ReventlessAws from "../adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res.mjs";
10
12
  import * as EventTopicPublisher_DynamoDbStream$ReventlessAws from "../adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs";
11
13
  import * as EventCollectorChannel_DynamoDbStream$ReventlessAws from "../adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs";
@@ -24,7 +26,7 @@ function Make(Spec) {
24
26
  asEffectHandler: prim => prim
25
27
  })(CommandGeneratorResolvers_AppSync$ReventlessAws)({
26
28
  make: CommandTopicChannel_SQS_Async$ReventlessAws.make
27
- })(EventLogStorage_DynamoDbStream$ReventlessAws)(EventTopicPublisher_DynamoDbStream$ReventlessAws)({
29
+ })(EventLogStorage$ReventlessAws.Selectable)(EventTopicPublisher_DynamoDbStream$ReventlessAws)({
28
30
  make: EventCollectorChannel_DynamoDbStream$ReventlessAws.make,
29
31
  connect: EventCollectorChannel_DynamoDbStream$ReventlessAws.connect
30
32
  })({
@@ -42,9 +44,13 @@ function Make(Spec) {
42
44
  })(Plugin_Helpers$ReventlessCore.NoopHooksConfig);
43
45
  let make = (api, opts) => {
44
46
  let aggregate = Inner.make(api, opts);
45
- let eventLogOutputs = Inner.outputs(aggregate).eventLog;
46
- let tableResource = eventLogOutputs.resources[0];
47
- let eventLogTableName = tableResource.name;
47
+ let eventLogTableName;
48
+ if (EventLogBackend$ReventlessAws.isPostgres()) {
49
+ eventLogTableName = Pulumi.output(Spec.name + "EventLog");
50
+ } else {
51
+ let eventLogOutputs = Inner.outputs(aggregate).eventLog;
52
+ eventLogTableName = eventLogOutputs.resources[0].name;
53
+ }
48
54
  AggregateRuntime_Builder_Single_Async$ReventlessAws.registerAggregate(Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Behavior.moduleUrl), eventLogTableName);
49
55
  return aggregate;
50
56
  };
@@ -77,4 +83,4 @@ export {
77
83
  AggregateRuntimeBuilder,
78
84
  Make,
79
85
  }
80
- /* Util_Bundle-ReventlessAws Not a pure module */
86
+ /* @pulumi/pulumi Not a pure module */
@@ -34,7 +34,7 @@ function Make(Spec) {
34
34
  let queryDbOutputs = Inner.outputs(readModel).queryDb;
35
35
  let tableResource = queryDbOutputs.resources[0];
36
36
  let queryDbTableName = tableResource.name;
37
- EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName);
37
+ EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName, undefined);
38
38
  return readModel;
39
39
  };
40
40
  let finish = () => EventCollectorRuntime_Builder_Single$ReventlessAws.finish();
@@ -24,7 +24,7 @@ module Make = (
24
24
  Spec,
25
25
  Mappings,
26
26
  RuntimeEnvironment,
27
- QueryDbStorage_DynamoDbStream,
27
+ QueryDbStorage.SelectableStream,
28
28
  QueryDbResolvers_AppSync_NoOp,
29
29
  EventCollectorChannel,
30
30
  EventCollectorRuntimeBuilder,
@@ -39,15 +39,24 @@ module Make = (
39
39
  let make = (~api, ~apiRole, ~allEventTopics, ~opts=?): component => {
40
40
  let readModel = Inner.make(~api, ~apiRole, ~allEventTopics, ~opts?)
41
41
 
42
- let queryDbOutputs = (readModel->Inner.outputs).queryDb
43
- let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
44
- let queryDbTableName = tableResource.name
42
+ // On the Postgres backend there is no DynamoDB table (resources is empty)
43
+ // the read-model spec name is the stable `qdb_<name>` discriminator, both
44
+ // here and in the entry point's Postgres branch.
45
+ let pgBacked = QueryDbBackend.isPostgresFor(Spec.name)
46
+ let queryDbTableName = if pgBacked {
47
+ Pulumi.Output.make(Spec.name)
48
+ } else {
49
+ let queryDbOutputs = (readModel->Inner.outputs).queryDb
50
+ let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
51
+ tableResource.name
52
+ }
45
53
 
46
54
  EventCollectorRuntimeBuilder.registerReadModel(
47
55
  ~readModelName=Spec.name,
48
56
  ~specModulePath=Util_Bundle.getModuleSpecifier(Spec.moduleUrl),
49
57
  ~mappingsModulePath=Util_Bundle.getModuleSpecifier(Mappings.moduleUrl),
50
58
  ~queryDbTableName,
59
+ ~pgBacked,
51
60
  )
52
61
 
53
62
  readModel
@@ -1,10 +1,12 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Pulumi from "@pulumi/pulumi";
3
4
  import * as Util_Bundle$ReventlessAws from "../util/Util_Bundle.res.mjs";
5
+ import * as QueryDbBackend$ReventlessAws from "../adapter/QueryDb/QueryDbBackend.res.mjs";
6
+ import * as QueryDbStorage$ReventlessAws from "../adapter/QueryDb/QueryDbStorage.res.mjs";
4
7
  import * as ReadModel_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/ReadModel/ReadModel_Builder.res.mjs";
5
8
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "../adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
6
9
  import * as QueryDbResolvers_AppSync_NoOp$ReventlessAws from "../adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res.mjs";
7
- import * as QueryDbStorage_DynamoDbStream$ReventlessAws from "../adapter/QueryDb/QueryDbStorage_DynamoDbStream.res.mjs";
8
10
  import * as EventCollectorChannel_DynamoDbStream$ReventlessAws from "../adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs";
9
11
  import * as EventCollectorRuntime_Builder_Single$ReventlessAws from "../adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs";
10
12
 
@@ -16,9 +18,7 @@ function Make(Spec) {
16
18
  extractCorrelationId: RuntimeEnvironment_Lambda$ReventlessAws.extractCorrelationId,
17
19
  asEventHandler: prim => prim,
18
20
  asEffectHandler: prim => prim
19
- })({
20
- make: QueryDbStorage_DynamoDbStream$ReventlessAws.make
21
- })(QueryDbResolvers_AppSync_NoOp$ReventlessAws)({
21
+ })(QueryDbStorage$ReventlessAws.SelectableStream)(QueryDbResolvers_AppSync_NoOp$ReventlessAws)({
22
22
  make: EventCollectorChannel_DynamoDbStream$ReventlessAws.make,
23
23
  connect: EventCollectorChannel_DynamoDbStream$ReventlessAws.connect
24
24
  })({
@@ -31,10 +31,15 @@ function Make(Spec) {
31
31
  });
32
32
  let make = (api, apiRole, allEventTopics, opts) => {
33
33
  let readModel = Inner.make(api, apiRole, allEventTopics, opts);
34
- let queryDbOutputs = Inner.outputs(readModel).queryDb;
35
- let tableResource = queryDbOutputs.resources[0];
36
- let queryDbTableName = tableResource.name;
37
- EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName);
34
+ let pgBacked = QueryDbBackend$ReventlessAws.isPostgresFor(Inner.Spec.name);
35
+ let queryDbTableName;
36
+ if (pgBacked) {
37
+ queryDbTableName = Pulumi.output(Inner.Spec.name);
38
+ } else {
39
+ let queryDbOutputs = Inner.outputs(readModel).queryDb;
40
+ queryDbTableName = queryDbOutputs.resources[0].name;
41
+ }
42
+ EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName, pgBacked);
38
43
  return readModel;
39
44
  };
40
45
  let finish = () => EventCollectorRuntime_Builder_Single$ReventlessAws.finish();
@@ -62,4 +67,4 @@ export {
62
67
  EventCollectorRuntimeBuilder,
63
68
  Make,
64
69
  }
65
- /* Util_Bundle-ReventlessAws Not a pure module */
70
+ /* @pulumi/pulumi Not a pure module */
@@ -16,8 +16,8 @@ module Make = (
16
16
  Spec,
17
17
  Mappings,
18
18
  RuntimeEnvironment,
19
- QueryDbStorage.DynamoDb,
20
- QueryDbResolvers.AppSync,
19
+ QueryDbStorage.Selectable,
20
+ QueryDbResolvers.Selectable,
21
21
  EventCollectorChannel,
22
22
  EventCollectorRuntimeBuilder,
23
23
  )
@@ -31,15 +31,24 @@ module Make = (
31
31
  let make = (~api, ~apiRole, ~allEventTopics, ~opts=?): component => {
32
32
  let readModel = Inner.make(~api, ~apiRole, ~allEventTopics, ~opts?)
33
33
 
34
- let queryDbOutputs = (readModel->Inner.outputs).queryDb
35
- let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
36
- let queryDbTableName = tableResource.name
34
+ // On the Postgres backend there is no DynamoDB table (resources is empty)
35
+ // the read-model spec name is the stable `qdb_<name>` discriminator, both
36
+ // here and in the entry point's Postgres branch.
37
+ let pgBacked = QueryDbBackend.isPostgresFor(Spec.name)
38
+ let queryDbTableName = if pgBacked {
39
+ Pulumi.Output.make(Spec.name)
40
+ } else {
41
+ let queryDbOutputs = (readModel->Inner.outputs).queryDb
42
+ let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
43
+ tableResource.name
44
+ }
37
45
 
38
46
  EventCollectorRuntimeBuilder.registerReadModel(
39
47
  ~readModelName=Spec.name,
40
48
  ~specModulePath=Util_Bundle.getModuleSpecifier(Spec.moduleUrl),
41
49
  ~mappingsModulePath=Util_Bundle.getModuleSpecifier(Mappings.moduleUrl),
42
50
  ~queryDbTableName,
51
+ ~pgBacked,
43
52
  )
44
53
 
45
54
  readModel
@@ -1,9 +1,11 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Pulumi from "@pulumi/pulumi";
3
4
  import * as Util_Bundle$ReventlessAws from "../util/Util_Bundle.res.mjs";
5
+ import * as QueryDbBackend$ReventlessAws from "../adapter/QueryDb/QueryDbBackend.res.mjs";
6
+ import * as QueryDbStorage$ReventlessAws from "../adapter/QueryDb/QueryDbStorage.res.mjs";
7
+ import * as QueryDbResolvers$ReventlessAws from "../adapter/QueryDb/QueryDbResolvers.res.mjs";
4
8
  import * as ReadModel_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/ReadModel/ReadModel_Builder.res.mjs";
5
- import * as QueryDbStorage_DynamoDb$ReventlessAws from "../adapter/QueryDb/QueryDbStorage_DynamoDb.res.mjs";
6
- import * as QueryDbResolvers_AppSync$ReventlessAws from "../adapter/QueryDb/QueryDbResolvers_AppSync.res.mjs";
7
9
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "../adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
8
10
  import * as EventCollectorChannel_DynamoDbStream$ReventlessAws from "../adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs";
9
11
  import * as EventCollectorRuntime_Builder_Single$ReventlessAws from "../adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs";
@@ -16,11 +18,7 @@ function Make(Spec) {
16
18
  extractCorrelationId: RuntimeEnvironment_Lambda$ReventlessAws.extractCorrelationId,
17
19
  asEventHandler: prim => prim,
18
20
  asEffectHandler: prim => prim
19
- })({
20
- make: QueryDbStorage_DynamoDb$ReventlessAws.make
21
- })({
22
- make: QueryDbResolvers_AppSync$ReventlessAws.make
23
- })({
21
+ })(QueryDbStorage$ReventlessAws.Selectable)(QueryDbResolvers$ReventlessAws.Selectable)({
24
22
  make: EventCollectorChannel_DynamoDbStream$ReventlessAws.make,
25
23
  connect: EventCollectorChannel_DynamoDbStream$ReventlessAws.connect
26
24
  })({
@@ -33,10 +31,15 @@ function Make(Spec) {
33
31
  });
34
32
  let make = (api, apiRole, allEventTopics, opts) => {
35
33
  let readModel = Inner.make(api, apiRole, allEventTopics, opts);
36
- let queryDbOutputs = Inner.outputs(readModel).queryDb;
37
- let tableResource = queryDbOutputs.resources[0];
38
- let queryDbTableName = tableResource.name;
39
- EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName);
34
+ let pgBacked = QueryDbBackend$ReventlessAws.isPostgresFor(Inner.Spec.name);
35
+ let queryDbTableName;
36
+ if (pgBacked) {
37
+ queryDbTableName = Pulumi.output(Inner.Spec.name);
38
+ } else {
39
+ let queryDbOutputs = Inner.outputs(readModel).queryDb;
40
+ queryDbTableName = queryDbOutputs.resources[0].name;
41
+ }
42
+ EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName, pgBacked);
40
43
  return readModel;
41
44
  };
42
45
  let finish = () => EventCollectorRuntime_Builder_Single$ReventlessAws.finish();
@@ -64,4 +67,4 @@ export {
64
67
  EventCollectorRuntimeBuilder,
65
68
  Make,
66
69
  }
67
- /* Util_Bundle-ReventlessAws Not a pure module */
70
+ /* @pulumi/pulumi Not a pure module */
@@ -24,8 +24,8 @@ module Make = (
24
24
  Spec,
25
25
  Mappings,
26
26
  RuntimeEnvironment,
27
- QueryDbStorage_DynamoDbStream,
28
- QueryDbResolvers.AppSync,
27
+ QueryDbStorage.SelectableStream,
28
+ QueryDbResolvers.Selectable,
29
29
  EventCollectorChannel,
30
30
  EventCollectorRuntimeBuilder,
31
31
  )
@@ -39,15 +39,24 @@ module Make = (
39
39
  let make = (~api, ~apiRole, ~allEventTopics, ~opts=?): component => {
40
40
  let readModel = Inner.make(~api, ~apiRole, ~allEventTopics, ~opts?)
41
41
 
42
- let queryDbOutputs = (readModel->Inner.outputs).queryDb
43
- let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
44
- let queryDbTableName = tableResource.name
42
+ // On the Postgres backend there is no DynamoDB table (resources is empty)
43
+ // the read-model spec name is the stable `qdb_<name>` discriminator, both
44
+ // here and in the entry point's Postgres branch.
45
+ let pgBacked = QueryDbBackend.isPostgresFor(Spec.name)
46
+ let queryDbTableName = if pgBacked {
47
+ Pulumi.Output.make(Spec.name)
48
+ } else {
49
+ let queryDbOutputs = (readModel->Inner.outputs).queryDb
50
+ let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
51
+ tableResource.name
52
+ }
45
53
 
46
54
  EventCollectorRuntimeBuilder.registerReadModel(
47
55
  ~readModelName=Spec.name,
48
56
  ~specModulePath=Util_Bundle.getModuleSpecifier(Spec.moduleUrl),
49
57
  ~mappingsModulePath=Util_Bundle.getModuleSpecifier(Mappings.moduleUrl),
50
58
  ~queryDbTableName,
59
+ ~pgBacked,
51
60
  )
52
61
 
53
62
  readModel
@@ -1,10 +1,12 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Pulumi from "@pulumi/pulumi";
3
4
  import * as Util_Bundle$ReventlessAws from "../util/Util_Bundle.res.mjs";
5
+ import * as QueryDbBackend$ReventlessAws from "../adapter/QueryDb/QueryDbBackend.res.mjs";
6
+ import * as QueryDbStorage$ReventlessAws from "../adapter/QueryDb/QueryDbStorage.res.mjs";
7
+ import * as QueryDbResolvers$ReventlessAws from "../adapter/QueryDb/QueryDbResolvers.res.mjs";
4
8
  import * as ReadModel_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/ReadModel/ReadModel_Builder.res.mjs";
5
- import * as QueryDbResolvers_AppSync$ReventlessAws from "../adapter/QueryDb/QueryDbResolvers_AppSync.res.mjs";
6
9
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "../adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
7
- import * as QueryDbStorage_DynamoDbStream$ReventlessAws from "../adapter/QueryDb/QueryDbStorage_DynamoDbStream.res.mjs";
8
10
  import * as EventCollectorChannel_DynamoDbStream$ReventlessAws from "../adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs";
9
11
  import * as EventCollectorRuntime_Builder_Single$ReventlessAws from "../adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs";
10
12
 
@@ -16,11 +18,7 @@ function Make(Spec) {
16
18
  extractCorrelationId: RuntimeEnvironment_Lambda$ReventlessAws.extractCorrelationId,
17
19
  asEventHandler: prim => prim,
18
20
  asEffectHandler: prim => prim
19
- })({
20
- make: QueryDbStorage_DynamoDbStream$ReventlessAws.make
21
- })({
22
- make: QueryDbResolvers_AppSync$ReventlessAws.make
23
- })({
21
+ })(QueryDbStorage$ReventlessAws.SelectableStream)(QueryDbResolvers$ReventlessAws.Selectable)({
24
22
  make: EventCollectorChannel_DynamoDbStream$ReventlessAws.make,
25
23
  connect: EventCollectorChannel_DynamoDbStream$ReventlessAws.connect
26
24
  })({
@@ -33,10 +31,15 @@ function Make(Spec) {
33
31
  });
34
32
  let make = (api, apiRole, allEventTopics, opts) => {
35
33
  let readModel = Inner.make(api, apiRole, allEventTopics, opts);
36
- let queryDbOutputs = Inner.outputs(readModel).queryDb;
37
- let tableResource = queryDbOutputs.resources[0];
38
- let queryDbTableName = tableResource.name;
39
- EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName);
34
+ let pgBacked = QueryDbBackend$ReventlessAws.isPostgresFor(Inner.Spec.name);
35
+ let queryDbTableName;
36
+ if (pgBacked) {
37
+ queryDbTableName = Pulumi.output(Inner.Spec.name);
38
+ } else {
39
+ let queryDbOutputs = Inner.outputs(readModel).queryDb;
40
+ queryDbTableName = queryDbOutputs.resources[0].name;
41
+ }
42
+ EventCollectorRuntime_Builder_Single$ReventlessAws.registerReadModel(Inner.Spec.name, Util_Bundle$ReventlessAws.getModuleSpecifier(Inner.Spec.moduleUrl), Util_Bundle$ReventlessAws.getModuleSpecifier(Mappings.moduleUrl), queryDbTableName, pgBacked);
40
43
  return readModel;
41
44
  };
42
45
  let finish = () => EventCollectorRuntime_Builder_Single$ReventlessAws.finish();
@@ -64,4 +67,4 @@ export {
64
67
  EventCollectorRuntimeBuilder,
65
68
  Make,
66
69
  }
67
- /* Util_Bundle-ReventlessAws Not a pure module */
70
+ /* @pulumi/pulumi Not a pure module */
@@ -11,8 +11,8 @@ module Make = (Api: {
11
11
  }) => {
12
12
  module Inner = ReventlessCore.StateViewSlice_Builder.Make(
13
13
  RuntimeEnvironment,
14
- QueryDbStorage.DynamoDb,
15
- QueryDbResolvers.AppSync,
14
+ QueryDbStorage.Selectable,
15
+ QueryDbResolvers.Selectable,
16
16
  EventCollectorChannel,
17
17
  EventCollectorRuntimeBuilder,
18
18
  Api,
@@ -32,12 +32,18 @@ module Make = (Api: {
32
32
  let make = (~dcbEventLog, ~opts=?): component => {
33
33
  let sv = InnerMake.make(~dcbEventLog, ~opts?)
34
34
  let queryDbOutputs = (sv->ReventlessCore.Component.outputs).queryDb
35
- let tableResource = queryDbOutputs.resources->Array.getUnsafe(0)
35
+ // On the Postgres backend there is no DynamoDB table (resources is
36
+ // empty) — the slice spec name is the stable `qdb_<name>` discriminator.
37
+ let queryDbTableName = if QueryDbBackend.isPostgresFor(Spec.name) {
38
+ Pulumi.Output.make(Spec.name)
39
+ } else {
40
+ (queryDbOutputs.resources->Array.getUnsafe(0)).name
41
+ }
36
42
  EventCollectorRuntimeBuilder.registerStateViewSlice(
37
43
  ~name=Spec.name,
38
44
  ~specModulePath=Util_Bundle.getModuleSpecifier(Spec.moduleUrl),
39
45
  ~projectionModulePath=Util_Bundle.getModuleSpecifier(Projection.moduleUrl),
40
- ~queryDbTableName=tableResource.name,
46
+ ~queryDbTableName,
41
47
  ~queryDbResources=queryDbOutputs.resources,
42
48
  )
43
49
  sv