@reventlessdev/reventless-aws 3.0.0-alpha.201 → 3.0.0-alpha.203

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";
@@ -99,11 +101,13 @@ import * as CommandGeneratorResolvers_AppSync$ReventlessAws from "./adapter/Comm
99
101
  import * as EventTopicPublisher_DynamoDbStream$ReventlessAws from "./adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs";
100
102
  import * as InboundTranslationResolvers_AppSync$ReventlessAws from "./adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res.mjs";
101
103
  import * as PluginExtensionPointRuntime_Builder$ReventlessAws from "./plugin/runtime/PluginExtensionPointRuntime_Builder.res.mjs";
104
+ import * as ReadModel_Builder_NoResolver_Stream$ReventlessAws from "./components/ReadModel_Builder_NoResolver_Stream.res.mjs";
102
105
  import * as EventCollectorRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs";
103
106
  import * as Platform_ComponentDefinitions_Lambda$ReventlessAws from "./adapter/Api/Platform_ComponentDefinitions_Lambda.res.mjs";
104
107
  import * as StateViewSliceRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs";
105
108
  import * as AggregateRuntime_Builder_Single_Async$ReventlessAws from "./adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs";
106
109
  import * as AutomationSliceRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs";
110
+ import * as SideEffectHandlerRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs";
107
111
 
108
112
  let log = Logger$ReventlessCore.fromEnv();
109
113
 
@@ -154,7 +158,7 @@ function MakeWithConfig(Config) {
154
158
  });
155
159
  QueryDbBackend$ReventlessAws.exempt(PluginsReadModelSpec$ReventlessCore.name);
156
160
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
157
- QueryDbBackend$ReventlessAws.exempt(ApiFragments$ReventlessCore.name);
161
+ QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
158
162
  });
159
163
  let currentDeployTarget = {
160
164
  contents: "Domain"
@@ -459,36 +463,6 @@ function MakeWithConfig(Config) {
459
463
  project: UiFragments_Projection$ReventlessCore.project,
460
464
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
461
465
  });
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
466
  let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
493
467
  types: [],
494
468
  mutations: [],
@@ -629,7 +603,7 @@ function MakeWithConfig(Config) {
629
603
  let run = async () => {
630
604
  let at = new Date().toISOString();
631
605
  let variables = {
632
- id: name,
606
+ id: "registry",
633
607
  pluginId: name,
634
608
  fragment: {
635
609
  encoded: pluginFragment.encoded,
@@ -639,8 +613,8 @@ function MakeWithConfig(Config) {
639
613
  at: at
640
614
  };
641
615
  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);
616
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
617
+ 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
618
  if (outcome === undefined) {
645
619
  return await waitForApiFragmentPush(endpoint, region, name, at);
646
620
  }
@@ -987,6 +961,40 @@ function MakeWithConfig(Config) {
987
961
  authorization: PluginsReadModelSpec$ReventlessCore.authorization,
988
962
  visibility: PluginsReadModelSpec$ReventlessCore.visibility
989
963
  })(PluginReadModelMappings);
964
+ let ApiFragmentRegistryAggregate = Aggregate_Builder_Single$ReventlessAws.Make({
965
+ Id: Id$Reventless.$$String,
966
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
967
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema,
968
+ errorSchema: ApiFragmentRegistrySpec$ReventlessCore.errorSchema,
969
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema,
970
+ moduleUrl: ApiFragmentRegistrySpec$ReventlessCore.moduleUrl,
971
+ commandAuthorization: ApiFragmentRegistrySpec$ReventlessCore.commandAuthorization
972
+ })({
973
+ initialState: ApiFragmentRegistryBehavior$ReventlessCore.initialState,
974
+ evolve: ApiFragmentRegistryBehavior$ReventlessCore.evolve,
975
+ decide: ApiFragmentRegistryBehavior$ReventlessCore.decide,
976
+ snapshot: undefined,
977
+ moduleUrl: ApiFragmentRegistryBehavior$ReventlessCore.moduleUrl
978
+ })(NoEventMappings$ReventlessInfra.Make({
979
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
980
+ Id: Id$Reventless.$$String,
981
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema
982
+ }));
983
+ let ApiFragmentsReadModelMappings = {
984
+ moduleUrl: ApiFragmentsProjection$ReventlessCore.moduleUrl,
985
+ mappings: ApiFragmentsProjection$ReventlessCore.mappings
986
+ };
987
+ let ApiFragmentsReadModel = ReadModel_Builder_NoResolver_Stream$ReventlessAws.Make({
988
+ Id: Id$Reventless.$$String,
989
+ name: ApiFragmentsReadModelSpec$ReventlessCore.name,
990
+ moduleUrl: ApiFragmentsReadModelSpec$ReventlessCore.moduleUrl,
991
+ stateSchema: ApiFragmentsReadModelSpec$ReventlessCore.stateSchema,
992
+ config: ApiFragmentsReadModelSpec$ReventlessCore.config,
993
+ subIdConfig: undefined,
994
+ authorization: ApiFragmentsReadModelSpec$ReventlessCore.authorization,
995
+ visibility: ApiFragmentsReadModelSpec$ReventlessCore.visibility
996
+ })(ApiFragmentsReadModelMappings);
997
+ let AdminApiSchemaPushHandler = SideEffectHandler_Single$ReventlessAws.Make({});
990
998
  let makeScheduler = () => {
991
999
  let component = Scheduler$ReventlessAws.make(undefined);
992
1000
  let outputs = Component$ReventlessCore.outputs(component);
@@ -1118,13 +1126,13 @@ function MakeWithConfig(Config) {
1118
1126
  };
1119
1127
  }
1120
1128
  }
1121
- let admin = Admin.construct(version, [], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
1122
- UiFragmentRegistrySlice,
1123
- ApiFragmentRegistrySlice
1129
+ let admin = Admin.construct(version, [], [
1130
+ PluginAggregate,
1131
+ ApiFragmentRegistryAggregate
1124
1132
  ], [
1125
- UiFragmentsViewSlice,
1126
- ApiFragmentsViewSlice
1127
- ], [], [], []);
1133
+ PluginReadModel,
1134
+ ApiFragmentsReadModel
1135
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1128
1136
  let pluginRm = admin.readModelsOutputs["Plugins"];
1129
1137
  if (pluginRm !== undefined) {
1130
1138
  let r = pluginRm.queryDb.resources[0];
@@ -1140,7 +1148,7 @@ function MakeWithConfig(Config) {
1140
1148
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
1141
1149
  }
1142
1150
  }
1143
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
1151
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
1144
1152
  if (rm$1 !== undefined) {
1145
1153
  let r$2 = rm$1.queryDb.resources[0];
1146
1154
  if (r$2 !== undefined) {
@@ -1233,13 +1241,61 @@ function MakeWithConfig(Config) {
1233
1241
  updateApiSchema: updateApiSchema,
1234
1242
  manageSubscriptions: undefined
1235
1243
  });
1236
- let admin = Admin.construct(version, [PluginExtensionPoint], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
1237
- UiFragmentRegistrySlice,
1238
- ApiFragmentRegistrySlice
1244
+ let admin = Admin.construct(version, [PluginExtensionPoint], [
1245
+ PluginAggregate,
1246
+ ApiFragmentRegistryAggregate
1239
1247
  ], [
1240
- UiFragmentsViewSlice,
1241
- ApiFragmentsViewSlice
1242
- ], [], [], []);
1248
+ PluginReadModel,
1249
+ ApiFragmentsReadModel
1250
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1251
+ let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
1252
+ let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
1253
+ let apiSchemaPushCmdTopicUrl = Stdlib_Option.getOr(Stdlib_Option.map(admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name], agg => Output$Pulumi.flatMap(agg.commandTopic, ct => {
1254
+ let r = ct.resources[0];
1255
+ if (r !== undefined) {
1256
+ return r.id;
1257
+ } else {
1258
+ return Pulumi.output("");
1259
+ }
1260
+ })), Pulumi.output(""));
1261
+ let apiSchemaPushEnv = Object.fromEntries([
1262
+ [
1263
+ "API_SCHEMA_PUSH_DOMAIN_API_ID",
1264
+ domainApiId
1265
+ ],
1266
+ [
1267
+ "API_SCHEMA_PUSH_PLATFORM_API_ID",
1268
+ Output$Pulumi.flatMap(platformApi, api => api.id)
1269
+ ],
1270
+ [
1271
+ "API_SCHEMA_PUSH_SPLIT_API",
1272
+ Pulumi.output(Config.splitApi ? "true" : "false")
1273
+ ],
1274
+ [
1275
+ "API_SCHEMA_PUSH_CLONER",
1276
+ Pulumi.output(Config.cloner ? "true" : "false")
1277
+ ],
1278
+ [
1279
+ "API_SCHEMA_PUSH_CMD_TOPIC_URL",
1280
+ apiSchemaPushCmdTopicUrl
1281
+ ]
1282
+ ]);
1283
+ let apiSchemaPushQueryEngine = QueryEngine_DynamoDb$ReventlessAws.make({});
1284
+ Pulumi.all([
1285
+ scheduler,
1286
+ apiSchemaPushQueryEngine
1287
+ ]).apply(param => {
1288
+ AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
1289
+ Source: {
1290
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
1291
+ Id: Id$Reventless.$$String,
1292
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema
1293
+ },
1294
+ moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
1295
+ execute: ApiSchemaPush$ReventlessAws.execute
1296
+ }], apiSchemaPushEventTopics, apiSchemaPushCmdTopics, [ApiFragmentRegistrySpec$ReventlessCore.name], param[1], param[0], Util_ResourceNaming$ReventlessAws.operations, undefined, undefined, apiSchemaPushEnv, {});
1297
+ apiSchemaPushCmdTopics.apply(param => SideEffectHandlerRuntime_Builder_Single$ReventlessAws.finish());
1298
+ });
1243
1299
  let pluginRm = admin.readModelsOutputs["Plugins"];
1244
1300
  let pluginReadModelTableName;
1245
1301
  if (pluginRm !== undefined) {
@@ -1268,7 +1324,7 @@ function MakeWithConfig(Config) {
1268
1324
  return Pulumi.output("NOT_AVAILABLE");
1269
1325
  }
1270
1326
  });
1271
- let r$1 = Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
1327
+ let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
1272
1328
  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
1329
  if (pluginReadModelTableName !== undefined) {
1274
1330
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
@@ -1281,7 +1337,7 @@ function MakeWithConfig(Config) {
1281
1337
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1282
1338
  }
1283
1339
  }
1284
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
1340
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
1285
1341
  if (rm$1 !== undefined) {
1286
1342
  let r$3 = rm$1.queryDb.resources[0];
1287
1343
  if (r$3 !== undefined) {
@@ -1544,7 +1600,7 @@ function Make($star) {
1544
1600
  });
1545
1601
  QueryDbBackend$ReventlessAws.exempt(PluginsReadModelSpec$ReventlessCore.name);
1546
1602
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
1547
- QueryDbBackend$ReventlessAws.exempt(ApiFragments$ReventlessCore.name);
1603
+ QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
1548
1604
  });
1549
1605
  let currentDeployTarget = {
1550
1606
  contents: "Domain"
@@ -1849,36 +1905,6 @@ function Make($star) {
1849
1905
  project: UiFragments_Projection$ReventlessCore.project,
1850
1906
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
1851
1907
  });
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
1908
  let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1883
1909
  types: [],
1884
1910
  mutations: [],
@@ -2018,7 +2044,7 @@ function Make($star) {
2018
2044
  let run = async () => {
2019
2045
  let at = new Date().toISOString();
2020
2046
  let variables = {
2021
- id: name,
2047
+ id: "registry",
2022
2048
  pluginId: name,
2023
2049
  fragment: {
2024
2050
  encoded: pluginFragment.encoded,
@@ -2028,8 +2054,8 @@ function Make($star) {
2028
2054
  at: at
2029
2055
  };
2030
2056
  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);
2057
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
2058
+ 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
2059
  if (outcome === undefined) {
2034
2060
  return await waitForApiFragmentPush(endpoint, region, name, at);
2035
2061
  }
@@ -2372,6 +2398,40 @@ function Make($star) {
2372
2398
  authorization: PluginsReadModelSpec$ReventlessCore.authorization,
2373
2399
  visibility: PluginsReadModelSpec$ReventlessCore.visibility
2374
2400
  })(PluginReadModelMappings);
2401
+ let ApiFragmentRegistryAggregate = Aggregate_Builder_Single$ReventlessAws.Make({
2402
+ Id: Id$Reventless.$$String,
2403
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
2404
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema,
2405
+ errorSchema: ApiFragmentRegistrySpec$ReventlessCore.errorSchema,
2406
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema,
2407
+ moduleUrl: ApiFragmentRegistrySpec$ReventlessCore.moduleUrl,
2408
+ commandAuthorization: ApiFragmentRegistrySpec$ReventlessCore.commandAuthorization
2409
+ })({
2410
+ initialState: ApiFragmentRegistryBehavior$ReventlessCore.initialState,
2411
+ evolve: ApiFragmentRegistryBehavior$ReventlessCore.evolve,
2412
+ decide: ApiFragmentRegistryBehavior$ReventlessCore.decide,
2413
+ snapshot: undefined,
2414
+ moduleUrl: ApiFragmentRegistryBehavior$ReventlessCore.moduleUrl
2415
+ })(NoEventMappings$ReventlessInfra.Make({
2416
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
2417
+ Id: Id$Reventless.$$String,
2418
+ commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema
2419
+ }));
2420
+ let ApiFragmentsReadModelMappings = {
2421
+ moduleUrl: ApiFragmentsProjection$ReventlessCore.moduleUrl,
2422
+ mappings: ApiFragmentsProjection$ReventlessCore.mappings
2423
+ };
2424
+ let ApiFragmentsReadModel = ReadModel_Builder_NoResolver_Stream$ReventlessAws.Make({
2425
+ Id: Id$Reventless.$$String,
2426
+ name: ApiFragmentsReadModelSpec$ReventlessCore.name,
2427
+ moduleUrl: ApiFragmentsReadModelSpec$ReventlessCore.moduleUrl,
2428
+ stateSchema: ApiFragmentsReadModelSpec$ReventlessCore.stateSchema,
2429
+ config: ApiFragmentsReadModelSpec$ReventlessCore.config,
2430
+ subIdConfig: undefined,
2431
+ authorization: ApiFragmentsReadModelSpec$ReventlessCore.authorization,
2432
+ visibility: ApiFragmentsReadModelSpec$ReventlessCore.visibility
2433
+ })(ApiFragmentsReadModelMappings);
2434
+ let AdminApiSchemaPushHandler = SideEffectHandler_Single$ReventlessAws.Make({});
2375
2435
  let makeScheduler = () => {
2376
2436
  let component = Scheduler$ReventlessAws.make(undefined);
2377
2437
  let outputs = Component$ReventlessCore.outputs(component);
@@ -2498,13 +2558,13 @@ function Make($star) {
2498
2558
  platformApiRole: platformApiRole
2499
2559
  };
2500
2560
  }
2501
- let admin = Admin.construct(version, [], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
2502
- UiFragmentRegistrySlice,
2503
- ApiFragmentRegistrySlice
2561
+ let admin = Admin.construct(version, [], [
2562
+ PluginAggregate,
2563
+ ApiFragmentRegistryAggregate
2504
2564
  ], [
2505
- UiFragmentsViewSlice,
2506
- ApiFragmentsViewSlice
2507
- ], [], [], []);
2565
+ PluginReadModel,
2566
+ ApiFragmentsReadModel
2567
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2508
2568
  let pluginRm = admin.readModelsOutputs["Plugins"];
2509
2569
  if (pluginRm !== undefined) {
2510
2570
  let r = pluginRm.queryDb.resources[0];
@@ -2520,7 +2580,7 @@ function Make($star) {
2520
2580
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2521
2581
  }
2522
2582
  }
2523
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
2583
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
2524
2584
  if (rm$1 !== undefined) {
2525
2585
  let r$2 = rm$1.queryDb.resources[0];
2526
2586
  if (r$2 !== undefined) {
@@ -2601,13 +2661,61 @@ function Make($star) {
2601
2661
  updateApiSchema: updateApiSchema,
2602
2662
  manageSubscriptions: undefined
2603
2663
  });
2604
- let admin = Admin.construct(version, [PluginExtensionPoint], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [
2605
- UiFragmentRegistrySlice,
2606
- ApiFragmentRegistrySlice
2664
+ let admin = Admin.construct(version, [PluginExtensionPoint], [
2665
+ PluginAggregate,
2666
+ ApiFragmentRegistryAggregate
2607
2667
  ], [
2608
- UiFragmentsViewSlice,
2609
- ApiFragmentsViewSlice
2610
- ], [], [], []);
2668
+ PluginReadModel,
2669
+ ApiFragmentsReadModel
2670
+ ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2671
+ let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
2672
+ let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
2673
+ let apiSchemaPushCmdTopicUrl = Stdlib_Option.getOr(Stdlib_Option.map(admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name], agg => Output$Pulumi.flatMap(agg.commandTopic, ct => {
2674
+ let r = ct.resources[0];
2675
+ if (r !== undefined) {
2676
+ return r.id;
2677
+ } else {
2678
+ return Pulumi.output("");
2679
+ }
2680
+ })), Pulumi.output(""));
2681
+ let apiSchemaPushEnv = Object.fromEntries([
2682
+ [
2683
+ "API_SCHEMA_PUSH_DOMAIN_API_ID",
2684
+ domainApiId
2685
+ ],
2686
+ [
2687
+ "API_SCHEMA_PUSH_PLATFORM_API_ID",
2688
+ Output$Pulumi.flatMap(platformApi, api => api.id)
2689
+ ],
2690
+ [
2691
+ "API_SCHEMA_PUSH_SPLIT_API",
2692
+ Pulumi.output("true")
2693
+ ],
2694
+ [
2695
+ "API_SCHEMA_PUSH_CLONER",
2696
+ Pulumi.output("false")
2697
+ ],
2698
+ [
2699
+ "API_SCHEMA_PUSH_CMD_TOPIC_URL",
2700
+ apiSchemaPushCmdTopicUrl
2701
+ ]
2702
+ ]);
2703
+ let apiSchemaPushQueryEngine = QueryEngine_DynamoDb$ReventlessAws.make({});
2704
+ Pulumi.all([
2705
+ scheduler,
2706
+ apiSchemaPushQueryEngine
2707
+ ]).apply(param => {
2708
+ AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
2709
+ Source: {
2710
+ name: ApiFragmentRegistrySpec$ReventlessCore.name,
2711
+ Id: Id$Reventless.$$String,
2712
+ eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema
2713
+ },
2714
+ moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
2715
+ execute: ApiSchemaPush$ReventlessAws.execute
2716
+ }], apiSchemaPushEventTopics, apiSchemaPushCmdTopics, [ApiFragmentRegistrySpec$ReventlessCore.name], param[1], param[0], Util_ResourceNaming$ReventlessAws.operations, undefined, undefined, apiSchemaPushEnv, {});
2717
+ apiSchemaPushCmdTopics.apply(param => SideEffectHandlerRuntime_Builder_Single$ReventlessAws.finish());
2718
+ });
2611
2719
  let pluginRm = admin.readModelsOutputs["Plugins"];
2612
2720
  let pluginReadModelTableName;
2613
2721
  if (pluginRm !== undefined) {
@@ -2636,7 +2744,7 @@ function Make($star) {
2636
2744
  return Pulumi.output("NOT_AVAILABLE");
2637
2745
  }
2638
2746
  });
2639
- let r$1 = Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
2747
+ let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
2640
2748
  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
2749
  if (pluginReadModelTableName !== undefined) {
2642
2750
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
@@ -2649,7 +2757,7 @@ function Make($star) {
2649
2757
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2650
2758
  }
2651
2759
  }
2652
- let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
2760
+ let rm$1 = admin.readModelsOutputs["ApiFragments"];
2653
2761
  if (rm$1 !== undefined) {
2654
2762
  let r$3 = rm$1.queryDb.resources[0];
2655
2763
  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 */