@reventlessdev/reventless-aws 3.0.0-alpha.261 → 3.0.0-alpha.262

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,13 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 3.0.0-alpha.262 (2026-08-03)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **aws:** key the shared automation channel's DCB topic by convention ([fe473d5](https://github.com/ReventlessDev/reventless-core/commit/fe473d561343f39bc1d05a2afaa902459142bbd0))
11
+
12
+
6
13
  # 3.0.0-alpha.261 (2026-08-03)
7
14
 
8
15
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-aws",
3
- "version": "3.0.0-alpha.261",
3
+ "version": "3.0.0-alpha.262",
4
4
  "description": "AWS adapters for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "dependencies": {
@@ -13,15 +13,15 @@
13
13
  "uuid": "^13.0.0",
14
14
  "@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.3",
15
15
  "@reventlessdev/rescript-jest": "1.0.0-alpha.10",
16
- "@reventlessdev/rescript-effect": "0.1.0-alpha.32",
17
- "@reventlessdev/rescript-node": "2.0.0-alpha.1",
18
16
  "@reventlessdev/rescript-pulumi-aws": "2.4.0-alpha.65",
19
- "@reventlessdev/rescript-uuid": "2.0.0-alpha.0",
17
+ "@reventlessdev/rescript-node": "2.0.0-alpha.1",
18
+ "@reventlessdev/rescript-effect": "0.1.0-alpha.32",
20
19
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.18",
21
- "@reventlessdev/reventless-interop": "3.0.0-alpha.30",
22
- "@reventlessdev/reventless-postgres": "3.0.0-alpha.71",
23
20
  "@reventlessdev/reventless-core": "3.0.0-alpha.207",
24
21
  "@reventlessdev/reventless-infra": "3.0.0-alpha.124",
22
+ "@reventlessdev/reventless-interop": "3.0.0-alpha.30",
23
+ "@reventlessdev/reventless-postgres": "3.0.0-alpha.71",
24
+ "@reventlessdev/rescript-uuid": "2.0.0-alpha.0",
25
25
  "@reventlessdev/reventless-spec": "3.0.0-alpha.99"
26
26
  },
27
27
  "devDependencies": {
@@ -292,8 +292,18 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
292
292
  // into its own event-source mapping, and the entry point routes an
293
293
  // incoming record to the handlers registered for its stream, so a slice
294
294
  // only ever sees the sources it asked for.
295
+ //
296
+ // Keyed `<plugin>DcbEventLog`, the convention `Dcb_Builder` uses when it
297
+ // puts the log into `allEventTopics`. That matters because a slice naming
298
+ // the log explicitly (every DCB-sourced AutomationSlice does) contributes
299
+ // it back under that key: a different key here would leave the same topic
300
+ // in the dict twice, and since an event-source mapping is named after the
301
+ // *topic resource* rather than the key, both would render as
302
+ // `<plugin>DcbEventLog2AllAutomationSlices` and the deploy would fail on a
303
+ // duplicate URN.
304
+ let dcbTopicKey = dcbResource.name->Option.getOr("") ++ "DcbEventLog"
295
305
  let eventTopics: ReventlessCore.EventTopic.allOutputs = Dict.fromArray([
296
- ("DcbEventLog", dcbOutputs.eventTopic),
306
+ (dcbTopicKey, dcbOutputs.eventTopic),
297
307
  ])
298
308
  bundledInfos->Dict.forEach(info =>
299
309
  info.sourceTopics->Dict.forEachWithKey((topic, key) => eventTopics->Dict.set(key, topic))
@@ -326,7 +336,18 @@ let finishWithDcbEventLog = (dcbEventLog: ReventlessCore.DcbEventLog.component)
326
336
  ->Array.forEach(topic =>
327
337
  topic.resources->Array.forEach(resource => urns->Array.push(resource.urn)->ignore)
328
338
  )
329
- urns->Pulumi.Output.all
339
+ // Deduped after resolution, because the same stream can be reached two
340
+ // ways — `consumesDcbLog` and an explicit source naming the DCB log.
341
+ // The entry point registers the handler once per URN, so a repeat would
342
+ // run the slice twice for every event: no error, no log, just doubled
343
+ // work and doubled commands.
344
+ urns
345
+ ->Pulumi.Output.all
346
+ ->Pulumi.Output.apply(resolved =>
347
+ resolved->Array.reduce([], (acc, urn) =>
348
+ acc->Array.includes(urn) ? acc : acc->Array.concat([urn])
349
+ )
350
+ )
330
351
  }
331
352
 
332
353
  let dcbQueueUrl = switch dcbQueueUrlRef.contents {
@@ -161,8 +161,9 @@ function finishWithDcbEventLog(dcbEventLog) {
161
161
  parent: opts_parent
162
162
  };
163
163
  let dcbOutputs = Component$ReventlessCore.outputs(dcbEventLog);
164
+ let dcbTopicKey = Stdlib_Option.getOr(dcbResource.__name, "") + "DcbEventLog";
164
165
  let eventTopics = Object.fromEntries([[
165
- "DcbEventLog",
166
+ dcbTopicKey,
166
167
  dcbOutputs.eventTopic
167
168
  ]]);
168
169
  Stdlib_Dict.forEach(bundledInfos, info => Stdlib_Dict.forEachWithKey(info.sourceTopics, (topic, key) => {
@@ -181,7 +182,13 @@ function finishWithDcbEventLog(dcbEventLog) {
181
182
  urns.push(resource.urn);
182
183
  });
183
184
  });
184
- return Pulumi.all(urns);
185
+ return Pulumi.all(urns).apply(resolved => Stdlib_Array.reduce(resolved, [], (acc, urn) => {
186
+ if (acc.includes(urn)) {
187
+ return acc;
188
+ } else {
189
+ return acc.concat([urn]);
190
+ }
191
+ }));
185
192
  };
186
193
  let url = dcbQueueUrlRef.contents;
187
194
  let dcbQueueUrl = url !== undefined ? url : Pulumi.output("NOT_AVAILABLE");