@reventlessdev/reventless-aws 3.0.0-alpha.200 → 3.0.0-alpha.202

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.
@@ -31,7 +31,7 @@ import * as Api_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/
31
31
  import * as Plugin_Stack$ReventlessAws from "./plugin/stack/Plugin_Stack.res.mjs";
32
32
  import * as UiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments.res.mjs";
33
33
  import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
34
- import * as ApiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/StateViewSlice/ApiFragments.res.mjs";
34
+ import * as ApiSchemaPush$ReventlessAws from "./adapter/Api/ApiSchemaPush.res.mjs";
35
35
  import * as Util_DynamoDb$ReventlessAws from "./util/Util_DynamoDb.res.mjs";
36
36
  import * as Platform_Casts$ReventlessAws from "./Platform_Casts.res.mjs";
37
37
  import * as Platform_Stack$ReventlessAws from "./Platform_Stack.res.mjs";
@@ -57,7 +57,6 @@ import * as StateTopic_AppSync$ReventlessAws from "./adapter/StateTopic/StateTop
57
57
  import * as UiFragmentRegistry$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry.res.mjs";
58
58
  import * as Util_AppSync_Caller$ReventlessAws from "./util/Util_AppSync_Caller.res.mjs";
59
59
  import * as Util_ResourceNaming$ReventlessAws from "./util/Util_ResourceNaming.res.mjs";
60
- import * as ApiFragmentRegistry$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/StateChangeSlice/ApiFragmentRegistry.res.mjs";
61
60
  import * as ClonerRunner_Fargate$ReventlessAws from "./plugin/cloner/ClonerRunner_Fargate.res.mjs";
62
61
  import * as QueryEngine_DynamoDb$ReventlessAws from "./adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs";
63
62
  import * as PluginRuntime_Builder$ReventlessAws from "./plugin/runtime/PluginRuntime_Builder.res.mjs";
@@ -65,26 +64,29 @@ import * as PluginsReadModelSpec$ReventlessCore from "@reventlessdev/reventless-
65
64
  import * as ExtensionPoint_Builder$ReventlessAws from "./components/ExtensionPoint_Builder.res.mjs";
66
65
  import * as StateViewSlice_Builder$ReventlessAws from "./components/StateViewSlice_Builder.res.mjs";
67
66
  import * as Task_Builder_PerBucket$ReventlessAws from "./components/Task_Builder_PerBucket.res.mjs";
67
+ import * as ApiFragmentsProjection$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentsProjection.res.mjs";
68
68
  import * as AutomationSlice_Builder$ReventlessAws from "./components/AutomationSlice_Builder.res.mjs";
69
69
  import * as EventTopicPublisher_SNS$ReventlessAws from "./adapter/EventTopic/EventTopicPublisher_SNS.res.mjs";
70
70
  import * as ExtensionPointMapping$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/ExtensionPointMapping.res.mjs";
71
71
  import * as PgQueryResolver_Builder$ReventlessAws from "./adapter/QueryDb/PgQueryResolver_Builder.res.mjs";
72
72
  import * as UiFragments_Projection$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments_Projection.res.mjs";
73
73
  import * as Aggregate_Builder_Single$ReventlessAws from "./components/Aggregate_Builder_Single.res.mjs";
74
- import * as ApiFragments_Projection$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/StateViewSlice/ApiFragments_Projection.res.mjs";
74
+ import * as ApiFragmentRegistrySpec$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentRegistrySpec.res.mjs";
75
75
  import * as ReadModel_Builder_Single$ReventlessAws from "./components/ReadModel_Builder_Single.res.mjs";
76
+ import * as SideEffectHandler_Single$ReventlessAws from "./components/SideEffectHandler_Single.res.mjs";
76
77
  import * as StateChangeSlice_Builder$ReventlessAws from "./components/StateChangeSlice_Builder.res.mjs";
77
78
  import * as ApiFragmentDeregistration$ReventlessAws from "./adapter/Api/ApiFragmentDeregistration.res.mjs";
78
79
  import * as EventCollectorChannel_SQS$ReventlessAws from "./adapter/EventCollector/EventCollectorChannel_SQS.res.mjs";
79
80
  import * as PgChangeFeedRelay_Builder$ReventlessAws from "./adapter/Postgres/PgChangeFeedRelay_Builder.res.mjs";
80
81
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "./adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
82
+ import * as ApiFragmentsReadModelSpec$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentsReadModelSpec.res.mjs";
81
83
  import * as PluginExtensionPointSpec$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/PluginExtensionPointSpec.res.mjs";
82
84
  import * as Platform_UIFragments_Lambda$ReventlessAws from "./adapter/Api/Platform_UIFragments_Lambda.res.mjs";
85
+ import * as ApiFragmentRegistryBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentRegistryBehavior.res.mjs";
83
86
  import * as CommandTopicChannel_SQS_Sync$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs";
84
87
  import * as EventLogSubscription_AppSync$ReventlessAws from "./adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs";
85
88
  import * as Platform_ApiFragments_Lambda$ReventlessAws from "./adapter/Api/Platform_ApiFragments_Lambda.res.mjs";
86
89
  import * as UiFragmentRegistry_Behavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry_Behavior.res.mjs";
87
- import * as ApiFragmentRegistry_Behavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/StateChangeSlice/ApiFragmentRegistry_Behavior.res.mjs";
88
90
  import * as CommandTopicChannel_SQS_Async$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs";
89
91
  import * as Plugin_ExtensionPoint_Builder$ReventlessAws from "./plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs";
90
92
  import * as QueryDbStorage_DynamoDbStream$ReventlessAws from "./adapter/QueryDb/QueryDbStorage_DynamoDbStream.res.mjs";
@@ -104,6 +106,7 @@ import * as Platform_ComponentDefinitions_Lambda$ReventlessAws from "./adapter/A
104
106
  import * as StateViewSliceRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs";
105
107
  import * as AggregateRuntime_Builder_Single_Async$ReventlessAws from "./adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs";
106
108
  import * as AutomationSliceRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs";
109
+ import * as SideEffectHandlerRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs";
107
110
 
108
111
  let log = Logger$ReventlessCore.fromEnv();
109
112
 
@@ -154,7 +157,7 @@ function MakeWithConfig(Config) {
154
157
  });
155
158
  QueryDbBackend$ReventlessAws.exempt(PluginsReadModelSpec$ReventlessCore.name);
156
159
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
157
- QueryDbBackend$ReventlessAws.exempt(ApiFragments$ReventlessCore.name);
160
+ QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
158
161
  });
159
162
  let currentDeployTarget = {
160
163
  contents: "Domain"
@@ -459,36 +462,6 @@ function MakeWithConfig(Config) {
459
462
  project: UiFragments_Projection$ReventlessCore.project,
460
463
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
461
464
  });
462
- let Spec$1 = {
463
- name: ApiFragmentRegistry$ReventlessCore.name,
464
- moduleUrl: ApiFragmentRegistry$ReventlessCore.moduleUrl,
465
- Id: Id$Reventless.$$String,
466
- consumedEventSchema: ApiFragmentRegistry$ReventlessCore.consumedEventSchema,
467
- errorSchema: ApiFragmentRegistry$ReventlessCore.errorSchema,
468
- eventSchema: ApiFragmentRegistry$ReventlessCore.eventSchema,
469
- commandSchema: ApiFragmentRegistry$ReventlessCore.commandSchema,
470
- commandAuthorization: ApiFragmentRegistry$ReventlessCore.commandAuthorization,
471
- readConsistency: ApiFragmentRegistry$ReventlessCore.readConsistency
472
- };
473
- let ApiFragmentRegistrySlice = StateChangeSlice_Builder$ReventlessAws.Make(Spec$1)({
474
- initialState: undefined,
475
- evolve: ApiFragmentRegistry_Behavior$ReventlessCore.evolve,
476
- decide: ApiFragmentRegistry_Behavior$ReventlessCore.decide,
477
- moduleUrl: ApiFragmentRegistry_Behavior$ReventlessCore.moduleUrl
478
- });
479
- let ApiFragmentsViewSlice = Make$7({
480
- name: ApiFragments$ReventlessCore.name,
481
- moduleUrl: ApiFragments$ReventlessCore.moduleUrl,
482
- stateSchema: ApiFragments$ReventlessCore.stateSchema,
483
- consumedEventSchema: ApiFragments$ReventlessCore.consumedEventSchema,
484
- config: ApiFragments$ReventlessCore.config,
485
- subIdConfig: undefined,
486
- authorization: ApiFragments$ReventlessCore.authorization,
487
- visibility: ApiFragments$ReventlessCore.visibility
488
- })({
489
- project: ApiFragments_Projection$ReventlessCore.project,
490
- moduleUrl: ApiFragments_Projection$ReventlessCore.moduleUrl
491
- });
492
465
  let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
493
466
  types: [],
494
467
  mutations: [],
@@ -629,7 +602,7 @@ function MakeWithConfig(Config) {
629
602
  let run = async () => {
630
603
  let at = new Date().toISOString();
631
604
  let variables = {
632
- id: name,
605
+ id: "registry",
633
606
  pluginId: name,
634
607
  fragment: {
635
608
  encoded: pluginFragment.encoded,
@@ -639,8 +612,8 @@ function MakeWithConfig(Config) {
639
612
  at: at
640
613
  };
641
614
  log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
642
- let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
643
- let outcome = Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result, Stdlib_JSON.Decode.object), d => d["Platform_RegisterApiFragment"]), Stdlib_JSON.Decode.object);
615
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
616
+ let outcome = Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result, Stdlib_JSON.Decode.object), d => d["Platform_ApiFragmentRegistry_RegisterApiFragment"]), Stdlib_JSON.Decode.object);
644
617
  if (outcome === undefined) {
645
618
  return await waitForApiFragmentPush(endpoint, region, name, at);
646
619
  }
@@ -987,6 +960,40 @@ function MakeWithConfig(Config) {
987
960
  authorization: PluginsReadModelSpec$ReventlessCore.authorization,
988
961
  visibility: PluginsReadModelSpec$ReventlessCore.visibility
989
962
  })(PluginReadModelMappings);
963
+ let ApiFragmentRegistryAggregate = Aggregate_Builder_Single$ReventlessAws.Make({
964
+ Id: Id$Reventless.$$String,
965
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
966
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema,
967
+ errorSchema: ApiFragmentRegistrySpec$ReventlessCore.errorSchema,
968
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema,
969
+ moduleUrl: ApiFragmentRegistrySpec$ReventlessCore.moduleUrl,
970
+ commandAuthorization: ApiFragmentRegistrySpec$ReventlessCore.commandAuthorization
971
+ })({
972
+ initialState: ApiFragmentRegistryBehavior$ReventlessCore.initialState,
973
+ evolve: ApiFragmentRegistryBehavior$ReventlessCore.evolve,
974
+ decide: ApiFragmentRegistryBehavior$ReventlessCore.decide,
975
+ snapshot: undefined,
976
+ moduleUrl: ApiFragmentRegistryBehavior$ReventlessCore.moduleUrl
977
+ })(NoEventMappings$ReventlessInfra.Make({
978
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
979
+ Id: Id$Reventless.$$String,
980
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema
981
+ }));
982
+ let ApiFragmentsReadModelMappings = {
983
+ moduleUrl: ApiFragmentsProjection$ReventlessCore.moduleUrl,
984
+ mappings: ApiFragmentsProjection$ReventlessCore.mappings
985
+ };
986
+ let ApiFragmentsReadModel = ReadModel_Builder_Single_Stream$ReventlessAws.Make({
987
+ Id: Id$Reventless.$$String,
988
+ name: ApiFragmentsReadModelSpec$ReventlessCore.name,
989
+ moduleUrl: ApiFragmentsReadModelSpec$ReventlessCore.moduleUrl,
990
+ stateSchema: ApiFragmentsReadModelSpec$ReventlessCore.stateSchema,
991
+ config: ApiFragmentsReadModelSpec$ReventlessCore.config,
992
+ subIdConfig: undefined,
993
+ authorization: ApiFragmentsReadModelSpec$ReventlessCore.authorization,
994
+ visibility: ApiFragmentsReadModelSpec$ReventlessCore.visibility
995
+ })(ApiFragmentsReadModelMappings);
996
+ let AdminApiSchemaPushHandler = SideEffectHandler_Single$ReventlessAws.Make({});
990
997
  let makeScheduler = () => {
991
998
  let component = Scheduler$ReventlessAws.make(undefined);
992
999
  let outputs = Component$ReventlessCore.outputs(component);
@@ -1118,13 +1125,13 @@ function MakeWithConfig(Config) {
1118
1125
  };
1119
1126
  }
1120
1127
  }
1121
- let admin = Admin.construct(version, [], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
1122
- UiFragmentRegistrySlice,
1123
- ApiFragmentRegistrySlice
1128
+ let admin = Admin.construct(version, [], [
1129
+ PluginAggregate,
1130
+ ApiFragmentRegistryAggregate
1124
1131
  ], [
1125
- UiFragmentsViewSlice,
1126
- ApiFragmentsViewSlice
1127
- ], [], [], []);
1132
+ PluginReadModel,
1133
+ ApiFragmentsReadModel
1134
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1128
1135
  let pluginRm = admin.readModelsOutputs["Plugins"];
1129
1136
  if (pluginRm !== undefined) {
1130
1137
  let r = pluginRm.queryDb.resources[0];
@@ -1140,7 +1147,7 @@ function MakeWithConfig(Config) {
1140
1147
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
1141
1148
  }
1142
1149
  }
1143
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
1150
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
1144
1151
  if (rm$1 !== undefined) {
1145
1152
  let r$2 = rm$1.queryDb.resources[0];
1146
1153
  if (r$2 !== undefined) {
@@ -1233,13 +1240,61 @@ function MakeWithConfig(Config) {
1233
1240
  updateApiSchema: updateApiSchema,
1234
1241
  manageSubscriptions: undefined
1235
1242
  });
1236
- let admin = Admin.construct(version, [PluginExtensionPoint], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
1237
- UiFragmentRegistrySlice,
1238
- ApiFragmentRegistrySlice
1243
+ let admin = Admin.construct(version, [PluginExtensionPoint], [
1244
+ PluginAggregate,
1245
+ ApiFragmentRegistryAggregate
1239
1246
  ], [
1240
- UiFragmentsViewSlice,
1241
- ApiFragmentsViewSlice
1242
- ], [], [], []);
1247
+ PluginReadModel,
1248
+ ApiFragmentsReadModel
1249
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1250
+ let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
1251
+ let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
1252
+ let apiSchemaPushCmdTopicUrl = Stdlib_Option.getOr(Stdlib_Option.map(admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name], agg => Output$Pulumi.flatMap(agg.commandTopic, ct => {
1253
+ let r = ct.resources[0];
1254
+ if (r !== undefined) {
1255
+ return r.id;
1256
+ } else {
1257
+ return Pulumi.output("");
1258
+ }
1259
+ })), Pulumi.output(""));
1260
+ let apiSchemaPushEnv = Object.fromEntries([
1261
+ [
1262
+ "API_SCHEMA_PUSH_DOMAIN_API_ID",
1263
+ domainApiId
1264
+ ],
1265
+ [
1266
+ "API_SCHEMA_PUSH_PLATFORM_API_ID",
1267
+ Output$Pulumi.flatMap(platformApi, api => api.id)
1268
+ ],
1269
+ [
1270
+ "API_SCHEMA_PUSH_SPLIT_API",
1271
+ Pulumi.output(Config.splitApi ? "true" : "false")
1272
+ ],
1273
+ [
1274
+ "API_SCHEMA_PUSH_CLONER",
1275
+ Pulumi.output(Config.cloner ? "true" : "false")
1276
+ ],
1277
+ [
1278
+ "API_SCHEMA_PUSH_CMD_TOPIC_URL",
1279
+ apiSchemaPushCmdTopicUrl
1280
+ ]
1281
+ ]);
1282
+ let apiSchemaPushQueryEngine = QueryEngine_DynamoDb$ReventlessAws.make({});
1283
+ Pulumi.all([
1284
+ scheduler,
1285
+ apiSchemaPushQueryEngine
1286
+ ]).apply(param => {
1287
+ AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
1288
+ Source: {
1289
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
1290
+ Id: Id$Reventless.$$String,
1291
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema
1292
+ },
1293
+ moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
1294
+ execute: ApiSchemaPush$ReventlessAws.execute
1295
+ }], apiSchemaPushEventTopics, apiSchemaPushCmdTopics, [ApiFragmentRegistrySpec$ReventlessCore.name], param[1], param[0], Util_ResourceNaming$ReventlessAws.operations, undefined, undefined, apiSchemaPushEnv, {});
1296
+ apiSchemaPushCmdTopics.apply(param => SideEffectHandlerRuntime_Builder_Single$ReventlessAws.finish());
1297
+ });
1243
1298
  let pluginRm = admin.readModelsOutputs["Plugins"];
1244
1299
  let pluginReadModelTableName;
1245
1300
  if (pluginRm !== undefined) {
@@ -1268,7 +1323,7 @@ function MakeWithConfig(Config) {
1268
1323
  return Pulumi.output("NOT_AVAILABLE");
1269
1324
  }
1270
1325
  });
1271
- let r$1 = Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
1326
+ let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
1272
1327
  PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, pluginSchemaPersistenceTable.name, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, Config.cloner, Output$Pulumi.flatMap(platformApi, api => api.id), r$1 !== undefined ? r$1.name : undefined, AutomationSliceRuntime_Builder_Single$ReventlessAws.getDcbQueueUrl(), Config.splitApi, undefined);
1273
1328
  if (pluginReadModelTableName !== undefined) {
1274
1329
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
@@ -1281,7 +1336,7 @@ function MakeWithConfig(Config) {
1281
1336
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1282
1337
  }
1283
1338
  }
1284
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
1339
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
1285
1340
  if (rm$1 !== undefined) {
1286
1341
  let r$3 = rm$1.queryDb.resources[0];
1287
1342
  if (r$3 !== undefined) {
@@ -1544,7 +1599,7 @@ function Make($star) {
1544
1599
  });
1545
1600
  QueryDbBackend$ReventlessAws.exempt(PluginsReadModelSpec$ReventlessCore.name);
1546
1601
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
1547
- QueryDbBackend$ReventlessAws.exempt(ApiFragments$ReventlessCore.name);
1602
+ QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
1548
1603
  });
1549
1604
  let currentDeployTarget = {
1550
1605
  contents: "Domain"
@@ -1849,36 +1904,6 @@ function Make($star) {
1849
1904
  project: UiFragments_Projection$ReventlessCore.project,
1850
1905
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
1851
1906
  });
1852
- let Spec$1 = {
1853
- name: ApiFragmentRegistry$ReventlessCore.name,
1854
- moduleUrl: ApiFragmentRegistry$ReventlessCore.moduleUrl,
1855
- Id: Id$Reventless.$$String,
1856
- consumedEventSchema: ApiFragmentRegistry$ReventlessCore.consumedEventSchema,
1857
- errorSchema: ApiFragmentRegistry$ReventlessCore.errorSchema,
1858
- eventSchema: ApiFragmentRegistry$ReventlessCore.eventSchema,
1859
- commandSchema: ApiFragmentRegistry$ReventlessCore.commandSchema,
1860
- commandAuthorization: ApiFragmentRegistry$ReventlessCore.commandAuthorization,
1861
- readConsistency: ApiFragmentRegistry$ReventlessCore.readConsistency
1862
- };
1863
- let ApiFragmentRegistrySlice = StateChangeSlice_Builder$ReventlessAws.Make(Spec$1)({
1864
- initialState: undefined,
1865
- evolve: ApiFragmentRegistry_Behavior$ReventlessCore.evolve,
1866
- decide: ApiFragmentRegistry_Behavior$ReventlessCore.decide,
1867
- moduleUrl: ApiFragmentRegistry_Behavior$ReventlessCore.moduleUrl
1868
- });
1869
- let ApiFragmentsViewSlice = Make$8({
1870
- name: ApiFragments$ReventlessCore.name,
1871
- moduleUrl: ApiFragments$ReventlessCore.moduleUrl,
1872
- stateSchema: ApiFragments$ReventlessCore.stateSchema,
1873
- consumedEventSchema: ApiFragments$ReventlessCore.consumedEventSchema,
1874
- config: ApiFragments$ReventlessCore.config,
1875
- subIdConfig: undefined,
1876
- authorization: ApiFragments$ReventlessCore.authorization,
1877
- visibility: ApiFragments$ReventlessCore.visibility
1878
- })({
1879
- project: ApiFragments_Projection$ReventlessCore.project,
1880
- moduleUrl: ApiFragments_Projection$ReventlessCore.moduleUrl
1881
- });
1882
1907
  let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1883
1908
  types: [],
1884
1909
  mutations: [],
@@ -2018,7 +2043,7 @@ function Make($star) {
2018
2043
  let run = async () => {
2019
2044
  let at = new Date().toISOString();
2020
2045
  let variables = {
2021
- id: name,
2046
+ id: "registry",
2022
2047
  pluginId: name,
2023
2048
  fragment: {
2024
2049
  encoded: pluginFragment.encoded,
@@ -2028,8 +2053,8 @@ function Make($star) {
2028
2053
  at: at
2029
2054
  };
2030
2055
  log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
2031
- let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
2032
- let outcome = Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result, Stdlib_JSON.Decode.object), d => d["Platform_RegisterApiFragment"]), Stdlib_JSON.Decode.object);
2056
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
2057
+ let outcome = Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result, Stdlib_JSON.Decode.object), d => d["Platform_ApiFragmentRegistry_RegisterApiFragment"]), Stdlib_JSON.Decode.object);
2033
2058
  if (outcome === undefined) {
2034
2059
  return await waitForApiFragmentPush(endpoint, region, name, at);
2035
2060
  }
@@ -2372,6 +2397,40 @@ function Make($star) {
2372
2397
  authorization: PluginsReadModelSpec$ReventlessCore.authorization,
2373
2398
  visibility: PluginsReadModelSpec$ReventlessCore.visibility
2374
2399
  })(PluginReadModelMappings);
2400
+ let ApiFragmentRegistryAggregate = Aggregate_Builder_Single$ReventlessAws.Make({
2401
+ Id: Id$Reventless.$$String,
2402
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
2403
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema,
2404
+ errorSchema: ApiFragmentRegistrySpec$ReventlessCore.errorSchema,
2405
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema,
2406
+ moduleUrl: ApiFragmentRegistrySpec$ReventlessCore.moduleUrl,
2407
+ commandAuthorization: ApiFragmentRegistrySpec$ReventlessCore.commandAuthorization
2408
+ })({
2409
+ initialState: ApiFragmentRegistryBehavior$ReventlessCore.initialState,
2410
+ evolve: ApiFragmentRegistryBehavior$ReventlessCore.evolve,
2411
+ decide: ApiFragmentRegistryBehavior$ReventlessCore.decide,
2412
+ snapshot: undefined,
2413
+ moduleUrl: ApiFragmentRegistryBehavior$ReventlessCore.moduleUrl
2414
+ })(NoEventMappings$ReventlessInfra.Make({
2415
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
2416
+ Id: Id$Reventless.$$String,
2417
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema
2418
+ }));
2419
+ let ApiFragmentsReadModelMappings = {
2420
+ moduleUrl: ApiFragmentsProjection$ReventlessCore.moduleUrl,
2421
+ mappings: ApiFragmentsProjection$ReventlessCore.mappings
2422
+ };
2423
+ let ApiFragmentsReadModel = ReadModel_Builder_Single_Stream$ReventlessAws.Make({
2424
+ Id: Id$Reventless.$$String,
2425
+ name: ApiFragmentsReadModelSpec$ReventlessCore.name,
2426
+ moduleUrl: ApiFragmentsReadModelSpec$ReventlessCore.moduleUrl,
2427
+ stateSchema: ApiFragmentsReadModelSpec$ReventlessCore.stateSchema,
2428
+ config: ApiFragmentsReadModelSpec$ReventlessCore.config,
2429
+ subIdConfig: undefined,
2430
+ authorization: ApiFragmentsReadModelSpec$ReventlessCore.authorization,
2431
+ visibility: ApiFragmentsReadModelSpec$ReventlessCore.visibility
2432
+ })(ApiFragmentsReadModelMappings);
2433
+ let AdminApiSchemaPushHandler = SideEffectHandler_Single$ReventlessAws.Make({});
2375
2434
  let makeScheduler = () => {
2376
2435
  let component = Scheduler$ReventlessAws.make(undefined);
2377
2436
  let outputs = Component$ReventlessCore.outputs(component);
@@ -2498,13 +2557,13 @@ function Make($star) {
2498
2557
  platformApiRole: platformApiRole
2499
2558
  };
2500
2559
  }
2501
- let admin = Admin.construct(version, [], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
2502
- UiFragmentRegistrySlice,
2503
- ApiFragmentRegistrySlice
2560
+ let admin = Admin.construct(version, [], [
2561
+ PluginAggregate,
2562
+ ApiFragmentRegistryAggregate
2504
2563
  ], [
2505
- UiFragmentsViewSlice,
2506
- ApiFragmentsViewSlice
2507
- ], [], [], []);
2564
+ PluginReadModel,
2565
+ ApiFragmentsReadModel
2566
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2508
2567
  let pluginRm = admin.readModelsOutputs["Plugins"];
2509
2568
  if (pluginRm !== undefined) {
2510
2569
  let r = pluginRm.queryDb.resources[0];
@@ -2520,7 +2579,7 @@ function Make($star) {
2520
2579
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2521
2580
  }
2522
2581
  }
2523
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
2582
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
2524
2583
  if (rm$1 !== undefined) {
2525
2584
  let r$2 = rm$1.queryDb.resources[0];
2526
2585
  if (r$2 !== undefined) {
@@ -2601,13 +2660,61 @@ function Make($star) {
2601
2660
  updateApiSchema: updateApiSchema,
2602
2661
  manageSubscriptions: undefined
2603
2662
  });
2604
- let admin = Admin.construct(version, [PluginExtensionPoint], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
2605
- UiFragmentRegistrySlice,
2606
- ApiFragmentRegistrySlice
2663
+ let admin = Admin.construct(version, [PluginExtensionPoint], [
2664
+ PluginAggregate,
2665
+ ApiFragmentRegistryAggregate
2607
2666
  ], [
2608
- UiFragmentsViewSlice,
2609
- ApiFragmentsViewSlice
2610
- ], [], [], []);
2667
+ PluginReadModel,
2668
+ ApiFragmentsReadModel
2669
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2670
+ let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
2671
+ let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
2672
+ let apiSchemaPushCmdTopicUrl = Stdlib_Option.getOr(Stdlib_Option.map(admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name], agg => Output$Pulumi.flatMap(agg.commandTopic, ct => {
2673
+ let r = ct.resources[0];
2674
+ if (r !== undefined) {
2675
+ return r.id;
2676
+ } else {
2677
+ return Pulumi.output("");
2678
+ }
2679
+ })), Pulumi.output(""));
2680
+ let apiSchemaPushEnv = Object.fromEntries([
2681
+ [
2682
+ "API_SCHEMA_PUSH_DOMAIN_API_ID",
2683
+ domainApiId
2684
+ ],
2685
+ [
2686
+ "API_SCHEMA_PUSH_PLATFORM_API_ID",
2687
+ Output$Pulumi.flatMap(platformApi, api => api.id)
2688
+ ],
2689
+ [
2690
+ "API_SCHEMA_PUSH_SPLIT_API",
2691
+ Pulumi.output("true")
2692
+ ],
2693
+ [
2694
+ "API_SCHEMA_PUSH_CLONER",
2695
+ Pulumi.output("false")
2696
+ ],
2697
+ [
2698
+ "API_SCHEMA_PUSH_CMD_TOPIC_URL",
2699
+ apiSchemaPushCmdTopicUrl
2700
+ ]
2701
+ ]);
2702
+ let apiSchemaPushQueryEngine = QueryEngine_DynamoDb$ReventlessAws.make({});
2703
+ Pulumi.all([
2704
+ scheduler,
2705
+ apiSchemaPushQueryEngine
2706
+ ]).apply(param => {
2707
+ AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
2708
+ Source: {
2709
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
2710
+ Id: Id$Reventless.$$String,
2711
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema
2712
+ },
2713
+ moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
2714
+ execute: ApiSchemaPush$ReventlessAws.execute
2715
+ }], apiSchemaPushEventTopics, apiSchemaPushCmdTopics, [ApiFragmentRegistrySpec$ReventlessCore.name], param[1], param[0], Util_ResourceNaming$ReventlessAws.operations, undefined, undefined, apiSchemaPushEnv, {});
2716
+ apiSchemaPushCmdTopics.apply(param => SideEffectHandlerRuntime_Builder_Single$ReventlessAws.finish());
2717
+ });
2611
2718
  let pluginRm = admin.readModelsOutputs["Plugins"];
2612
2719
  let pluginReadModelTableName;
2613
2720
  if (pluginRm !== undefined) {
@@ -2636,7 +2743,7 @@ function Make($star) {
2636
2743
  return Pulumi.output("NOT_AVAILABLE");
2637
2744
  }
2638
2745
  });
2639
- let r$1 = Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
2746
+ let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
2640
2747
  PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, pluginSchemaPersistenceTable.name, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, false, Output$Pulumi.flatMap(platformApi, api => api.id), r$1 !== undefined ? r$1.name : undefined, AutomationSliceRuntime_Builder_Single$ReventlessAws.getDcbQueueUrl(), true, undefined);
2641
2748
  if (pluginReadModelTableName !== undefined) {
2642
2749
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
@@ -2649,7 +2756,7 @@ function Make($star) {
2649
2756
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2650
2757
  }
2651
2758
  }
2652
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
2759
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
2653
2760
  if (rm$1 !== undefined) {
2654
2761
  let r$3 = rm$1.queryDb.resources[0];
2655
2762
  if (r$3 !== undefined) {
@@ -44,7 +44,7 @@ let decodeId = (id: string): option<providerInputs> =>
44
44
  let sendDeregister: (JSON.t, string, string) => promise<unit> = %raw(`
45
45
  async function (variables, endpoint, region) {
46
46
  const mod = await import("@reventlessdev/reventless-aws/src/util/Util_AppSync_Caller.res.mjs");
47
- await mod.sendMutation(endpoint, region, "Platform_DeregisterApiFragment", "{ __typename }", variables);
47
+ await mod.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_DeregisterApiFragment", "{ __typename }", variables);
48
48
  }
49
49
  `)
50
50
 
@@ -75,9 +75,10 @@ let delete_ = async (id: string, props: providerInputs): unit => {
75
75
  }
76
76
  let variables =
77
77
  Dict.fromArray([
78
- // Platform_DeregisterApiFragment(id: ID!, pluginId: ID!) — id is the
79
- // generator-prepended arg (unused server-side); pass the pluginId for both.
80
- ("id", JSON.Encode.string(carrier.pluginId)),
78
+ // Platform_ApiFragmentRegistry_DeregisterApiFragment(id: ID!, pluginId: ID!) — the
79
+ // registry is a SINGLETON aggregate, so `id` is the fixed constant; `pluginId`
80
+ // (payload) names the plugin whose fragment is removed.
81
+ ("id", JSON.Encode.string("registry")),
81
82
  ("pluginId", JSON.Encode.string(carrier.pluginId)),
82
83
  ])->JSON.Encode.object
83
84
  // Best-effort: on a full teardown the platform API may already be gone, and a
@@ -27,7 +27,7 @@ function decodeId(id) {
27
27
 
28
28
  let sendDeregister = (async function (variables, endpoint, region) {
29
29
  const mod = await import("@reventlessdev/reventless-aws/src/util/Util_AppSync_Caller.res.mjs");
30
- await mod.sendMutation(endpoint, region, "Platform_DeregisterApiFragment", "{ __typename }", variables);
30
+ await mod.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_DeregisterApiFragment", "{ __typename }", variables);
31
31
  });
32
32
 
33
33
  let errMessage = ((e) => (e && e.message) ? String(e.message) : String(e));
@@ -59,7 +59,7 @@ async function delete_(id, props) {
59
59
  let variables = Object.fromEntries([
60
60
  [
61
61
  "id",
62
- carrier.pluginId
62
+ "registry"
63
63
  ],
64
64
  [
65
65
  "pluginId",
@@ -0,0 +1,54 @@
1
+ // ApiSchemaPush — the admin reactive schema-push SideEffect
2
+ // (docs/plans/event-sourced-fragment-registries.md § Reactive writer design).
3
+ //
4
+ // Source = the ApiFragmentRegistry singleton aggregate. On every ApiSchemaComputed
5
+ // { snapshot } (emitted by the aggregate behaviour alongside each ApiFragment* fact,
6
+ // carrying the WHOLE consistent per-plugin fragment set), this hands the snapshot to
7
+ // the runtime-pure push engine (ApiSchemaPush_Runtime.mjs), which stitches one
8
+ // AWS-decorated schema per target API, pushes each behind the shrink guard, and writes
9
+ // the outcome back via RecordApiFragmentPush.
10
+ //
11
+ // The generic SideEffect.T context (`queryEngine`) is unused: this bespoke platform
12
+ // side effect self-acquires its config (API ids, split flag, command-topic URL) from
13
+ // Lambda env injected by the admin SideEffectHandler (~extraEnvVars). The push module
14
+ // is loaded via dynamic import so no @aws-sdk / provider code is statically captured
15
+ // beyond what the SideEffectHandler Lambda already bundles (runtime-purity — see
16
+ // reference_pulumi_leaks_into_lambda_runtime_graph).
17
+ module Source = ReventlessCore.ApiFragmentRegistrySpec
18
+
19
+ let moduleUrl: string = %raw(`import.meta.url`)
20
+
21
+ type jsEntry = {pluginId: string, encoded: string, protocol: string, apiTarget: string}
22
+
23
+ let pushApiSchema: array<jsEntry> => promise<unit> = %raw(`
24
+ async function (snapshot) {
25
+ const mod = await import("@reventlessdev/reventless-aws/src/adapter/Runtime/ApiSchemaPush_Runtime.mjs");
26
+ await mod.pushApiSchema(snapshot);
27
+ }
28
+ `)
29
+
30
+ let execute = async (
31
+ _id: Source.Id.t,
32
+ _meta: Reventless.Message.meta,
33
+ event: Source.event,
34
+ _queryEngine: Reventless.QueryEngine.operations,
35
+ ) =>
36
+ switch event {
37
+ | ApiSchemaComputed({snapshot}) =>
38
+ let jsSnapshot = snapshot->Array.map((e: Source.fragmentSnapshotEntry) => {
39
+ pluginId: e.pluginId,
40
+ encoded: e.encoded,
41
+ protocol: e.protocol,
42
+ apiTarget: switch e.apiTarget {
43
+ | Reventless.Plugin.Domain => "Domain"
44
+ | Reventless.Plugin.Platform => "Platform"
45
+ },
46
+ })
47
+ await pushApiSchema(jsSnapshot)
48
+ // Fact events are handled via the ApiSchemaComputed echo (which carries the
49
+ // consistent snapshot); the write-back and lifecycle facts are no-ops here.
50
+ | ApiFragmentRegistered(_)
51
+ | ApiFragmentUpdated(_)
52
+ | ApiFragmentDeregistered(_)
53
+ | ApiFragmentPushRecorded(_) => ()
54
+ }
@@ -0,0 +1,37 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ let moduleUrl = import.meta.url;
5
+
6
+ let pushApiSchema = (async function (snapshot) {
7
+ const mod = await import("@reventlessdev/reventless-aws/src/adapter/Runtime/ApiSchemaPush_Runtime.mjs");
8
+ await mod.pushApiSchema(snapshot);
9
+ });
10
+
11
+ async function execute(_id, _meta, event, _queryEngine) {
12
+ if (event.TAG !== "ApiSchemaComputed") {
13
+ return;
14
+ }
15
+ let jsSnapshot = event.snapshot.map(e => {
16
+ let match = e.apiTarget;
17
+ let tmp;
18
+ tmp = match === "Domain" ? "Domain" : "Platform";
19
+ return {
20
+ pluginId: e.pluginId,
21
+ encoded: e.encoded,
22
+ protocol: e.protocol,
23
+ apiTarget: tmp
24
+ };
25
+ });
26
+ return await pushApiSchema(jsSnapshot);
27
+ }
28
+
29
+ let Source;
30
+
31
+ export {
32
+ Source,
33
+ moduleUrl,
34
+ pushApiSchema,
35
+ execute,
36
+ }
37
+ /* moduleUrl Not a pure module */