@reventlessdev/reventless-aws 3.0.0-alpha.207 → 3.0.0-alpha.209

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.
@@ -1,23 +1,20 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
3
  import * as S from "sury/src/S.res.mjs";
4
+ import * as Pervasives from "@rescript/runtime/lib/es6/Pervasives.js";
4
5
  import * as Aws from "@pulumi/aws";
5
6
  import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
6
7
  import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
7
8
  import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
8
- import * as Stdlib_Float from "@rescript/runtime/lib/es6/Stdlib_Float.js";
9
- import * as Stdlib_JsExn from "@rescript/runtime/lib/es6/Stdlib_JsExn.js";
10
9
  import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
11
10
  import * as Output$Pulumi from "@reventlessdev/rescript-pulumi-pulumi/src/Output.res.mjs";
12
11
  import * as Pulumi$Pulumi from "@reventlessdev/rescript-pulumi-pulumi/src/Pulumi.res.mjs";
13
12
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
14
13
  import * as Pulumi from "@pulumi/pulumi";
15
14
  import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
16
- import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
17
15
  import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
18
16
  import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
19
17
  import * as Plugin$ReventlessAws from "./components/Plugin.res.mjs";
20
- import * as LibDynamodb from "@aws-sdk/lib-dynamodb";
21
18
  import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
22
19
  import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
23
20
  import * as AdminApi$ReventlessCore from "@reventlessdev/reventless-core/src/admin/AdminApi.res.mjs";
@@ -32,7 +29,6 @@ import * as Plugin_Stack$ReventlessAws from "./plugin/stack/Plugin_Stack.res.mjs
32
29
  import * as UiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments.res.mjs";
33
30
  import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
34
31
  import * as ApiSchemaPush$ReventlessAws from "./adapter/Api/ApiSchemaPush.res.mjs";
35
- import * as Util_DynamoDb$ReventlessAws from "./util/Util_DynamoDb.res.mjs";
36
32
  import * as Platform_Casts$ReventlessAws from "./Platform_Casts.res.mjs";
37
33
  import * as Platform_Stack$ReventlessAws from "./Platform_Stack.res.mjs";
38
34
  import * as QueryDbBackend$ReventlessAws from "./adapter/QueryDb/QueryDbBackend.res.mjs";
@@ -42,7 +38,6 @@ import * as EventLogBackend$ReventlessAws from "./adapter/EventLog/EventLogBacke
42
38
  import * as Platform_Admin$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_Admin.res.mjs";
43
39
  import * as PluginBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginBehavior.res.mjs";
44
40
  import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
45
- import * as DynamoDb_DocumentClient$AwsSdk from "@reventlessdev/rescript-aws-sdk/src/DynamoDb_DocumentClient.res.mjs";
46
41
  import * as PgProjectionFeed$ReventlessAws from "./adapter/Postgres/PgProjectionFeed.res.mjs";
47
42
  import * as Util_LocalConfig$ReventlessAws from "./util/Util_LocalConfig.res.mjs";
48
43
  import * as IndexJs from "@pulumi/pulumi/runtime/index.js";
@@ -111,12 +106,6 @@ import * as SideEffectHandlerRuntime_Builder_Single$ReventlessAws from "./adapte
111
106
 
112
107
  let log = Logger$ReventlessCore.fromEnv();
113
108
 
114
- let n = Stdlib_Option.flatMap(process.env["DEPLOY_SCHEMA_SHRINK_THRESHOLD"], Stdlib_Float.fromString);
115
-
116
- let deploySchemaShrinkThreshold = n !== undefined ? (
117
- n > 0 && n < 1 ? n : 0.5
118
- ) : 0.5;
119
-
120
109
  let apiConfigRef = {
121
110
  contents: undefined
122
111
  };
@@ -485,38 +474,6 @@ function MakeWithConfig(Config) {
485
474
  let Api = {
486
475
  Make: Make$8
487
476
  };
488
- let deploySchemaHashPrefix = "deploy-schema-hash:";
489
- let readSchemaHash = async (tableName, apiId) => {
490
- let key = Object.fromEntries([[
491
- "id",
492
- deploySchemaHashPrefix + apiId
493
- ]]);
494
- try {
495
- let result = await DynamoDb_DocumentClient$AwsSdk.GetCommand.send(new LibDynamodb.GetCommand({
496
- TableName: tableName,
497
- Key: key
498
- }));
499
- return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result.Item, item => Stdlib_JSON.Decode.object(item)), d => d["hash"]), v => Stdlib_JSON.Decode.string(v));
500
- } catch (exn) {
501
- return;
502
- }
503
- };
504
- let writeSchemaHash = async (tableName, apiId, hash) => {
505
- let item = Object.fromEntries([
506
- [
507
- "id",
508
- deploySchemaHashPrefix + apiId
509
- ],
510
- [
511
- "hash",
512
- hash
513
- ]
514
- ]);
515
- await DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
516
- Item: item,
517
- TableName: tableName
518
- }));
519
- };
520
477
  let hooksApiRef = {
521
478
  contents: undefined
522
479
  };
@@ -591,226 +548,52 @@ function MakeWithConfig(Config) {
591
548
  let hooks_preResolversSchemaHook = (name, version, pluginFragment) => {
592
549
  log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
593
550
  let capturedDeployTarget = currentDeployTarget.contents;
594
- if (platformStackRef !== undefined) {
595
- let apiTargetName;
596
- apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
597
- let match = apiConfigRef.contents;
598
- let platformApi = match !== undefined ? match.platformApi : domainApi;
599
- let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
600
- let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
601
- ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
602
- return Output$Pulumi.flatMap(endpointOutput, endpoint => {
603
- let run = async () => {
604
- let at = new Date().toISOString();
605
- let variables = {
606
- id: "registry",
607
- pluginId: name,
608
- fragment: {
609
- encoded: pluginFragment.encoded,
610
- protocol: pluginFragment.protocol
611
- },
612
- apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
613
- at: at
614
- };
615
- log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
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);
618
- if (outcome === undefined) {
619
- return await waitForApiFragmentPush(endpoint, region, name, at);
620
- }
621
- let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
622
- switch (typename) {
623
- case "CommandAccepted" :
624
- let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
625
- if (eventCount > 0.0) {
626
- return await waitForApiFragmentPush(endpoint, region, name, at);
627
- } else {
628
- return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged — no push needed`);
629
- }
630
- case "CommandRejected" :
631
- let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
632
- return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
633
- default:
634
- return await waitForApiFragmentPush(endpoint, region, name, at);
635
- }
551
+ if (platformStackRef === undefined) {
552
+ return Pervasives.failwith("makePlatform(~plugins=[…]) is no longer supported on AWS — deploy the platform with deployPlatform and each plugin with deployPlugin (staged register + reactive push).");
553
+ }
554
+ let apiTargetName;
555
+ apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
556
+ let match = apiConfigRef.contents;
557
+ let platformApi = match !== undefined ? match.platformApi : domainApi;
558
+ let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
559
+ let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
560
+ ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
561
+ return Output$Pulumi.flatMap(endpointOutput, endpoint => {
562
+ let run = async () => {
563
+ let at = new Date().toISOString();
564
+ let variables = {
565
+ id: "registry",
566
+ pluginId: name,
567
+ fragment: {
568
+ encoded: pluginFragment.encoded,
569
+ protocol: pluginFragment.protocol
570
+ },
571
+ apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
572
+ at: at
636
573
  };
637
- return run();
638
- });
639
- }
640
- let match$1;
641
- if (capturedDeployTarget === "Domain") {
642
- match$1 = [
643
- "deploy-schema:",
644
- domainApi
645
- ];
646
- } else {
647
- let match$2 = apiConfigRef.contents;
648
- let api = match$2 !== undefined ? match$2.platformApi : domainApi;
649
- match$1 = [
650
- "deploy-schema-platform:",
651
- api
652
- ];
653
- }
654
- let targetApi = match$1[1];
655
- let schemaPrefix = match$1[0];
656
- let readStackRefString = (stackRef, key) => {
657
- let direct = stackRef.getOutput(key);
658
- let defaultOutput = stackRef.getOutput("default");
659
- return Pulumi.all([
660
- direct,
661
- defaultOutput
662
- ]).apply(param => {
663
- let name = Stdlib_Option.flatMap(param[0], v => Stdlib_JSON.Decode.string(v));
664
- if (name !== undefined) {
665
- return name;
666
- } else {
667
- return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(param[1], d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v));
668
- }
669
- });
670
- };
671
- let schemaPersistenceTableNameOutput;
672
- if (platformStackRef !== undefined) {
673
- let stackRef = Primitive_option.valFromOption(platformStackRef);
674
- schemaPersistenceTableNameOutput = Pulumi.all([
675
- readStackRefString(stackRef, "pluginSchemaPersistenceTableName"),
676
- readStackRefString(stackRef, "pluginRmTableName")
677
- ]).apply(param => {
678
- let dedicated = param[0];
679
- if (dedicated !== undefined) {
680
- return dedicated;
681
- } else {
682
- return param[1];
683
- }
684
- });
685
- } else {
686
- schemaPersistenceTableNameOutput = Pulumi.output(undefined);
687
- }
688
- return Output$Pulumi.flatMap(schemaPersistenceTableNameOutput, tableNameOpt => {
689
- let writeAndScanFragments = () => {
690
- if (tableNameOpt !== undefined) {
691
- let deployItem = Object.fromEntries([
692
- [
693
- "id",
694
- schemaPrefix + name
695
- ],
696
- [
697
- "fragment",
698
- pluginFragment.encoded
699
- ]
700
- ]);
701
- log.info("preResolversSchemaHook", undefined, `Writing deploy-schema entry for ` + name + ` to ` + tableNameOpt);
702
- let scanAllDeploySchemaItems = async () => {
703
- let allItems = [];
704
- let startKey;
705
- let more = true;
706
- while (more) {
707
- let result = await DynamoDb_DocumentClient$AwsSdk.ScanCommand.send(new LibDynamodb.ScanCommand({
708
- TableName: tableNameOpt,
709
- ExclusiveStartKey: startKey,
710
- ExpressionAttributeNames: Object.fromEntries([[
711
- "#id",
712
- "id"
713
- ]]),
714
- ExpressionAttributeValues: Object.fromEntries([[
715
- ":prefix",
716
- schemaPrefix
717
- ]]),
718
- FilterExpression: "begins_with(#id, :prefix)"
719
- }));
720
- Stdlib_Option.getOr(result.Items, []).forEach(item => {
721
- allItems.push(item);
722
- });
723
- let k = result.LastEvaluatedKey;
724
- if (k !== undefined) {
725
- startKey = k;
726
- } else {
727
- more = false;
728
- }
729
- };
730
- return allItems;
731
- };
732
- return Stdlib_Promise.$$catch(DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
733
- Item: deployItem,
734
- TableName: tableNameOpt
735
- })).then(param => {
736
- log.info("preResolversSchemaHook", undefined, `Scanning ` + tableNameOpt + ` for deploy-schema entries`);
737
- return scanAllDeploySchemaItems();
738
- }).then(items => {
739
- let fragments = Stdlib_Array.filterMap(items, item => {
740
- try {
741
- let obj = JSON.parse(JSON.stringify(item));
742
- let fragmentJson = Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(obj), d => d["fragment"]);
743
- if (fragmentJson === undefined) {
744
- return;
745
- }
746
- let encoded = Stdlib_JSON.Decode.string(fragmentJson);
747
- if (encoded !== undefined) {
748
- return {
749
- encoded: encoded,
750
- protocol: "graphql"
751
- };
752
- } else {
753
- return;
754
- }
755
- } catch (exn) {
756
- return;
757
- }
758
- });
759
- log.info("preResolversSchemaHook", undefined, `Found ` + fragments.length.toString() + ` deploy-schema entries`);
760
- return Promise.resolve(fragments);
761
- }), err => {
762
- let msg = Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_JsExn.fromException(err), Stdlib_JsExn.message), "unknown");
763
- log.info("preResolversSchemaHook", undefined, `DynamoDB write/scan failed (` + msg + `) — using current plugin only`);
764
- return Promise.resolve([pluginFragment]);
765
- });
574
+ log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
575
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
576
+ 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);
577
+ if (outcome === undefined) {
578
+ return await waitForApiFragmentPush(endpoint, region, name, at);
766
579
  }
767
- log.info("preResolversSchemaHook", undefined, "No pluginSchemaPersistenceTableName / pluginRmTableName — skipping fragment persistence");
768
- return Promise.resolve([pluginFragment]);
769
- };
770
- return Output$Pulumi.flatMap(targetApi, api => Output$Pulumi.flatMap(api.id, apiId => {
771
- let runSchemaPush = () => writeAndScanFragments().then(async allPluginFragments => {
772
- let baseFragment;
773
- baseFragment = capturedDeployTarget === "Domain" ? (
774
- Config.splitApi ? emptyBaseFragment : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", undefined)
775
- ) : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
776
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, allPluginFragments);
777
- let currentHash = AppSync_Adapter$ReventlessAws.sha256Hex(sdl);
778
- let storedHash = tableNameOpt !== undefined ? await readSchemaHash(tableNameOpt, apiId) : undefined;
779
- let client = AppSync_Adapter$ReventlessAws.getClient();
780
- let liveSdl = await AppSync_Adapter$ReventlessAws.getIntrospectionSdl(client, apiId);
781
- let countRoots = s => (GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Mutation") + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Query") | 0) + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Subscription") | 0;
782
- let missingFields = GraphQL_Stitcher$ReventlessCore.missingRootFields(sdl, liveSdl);
783
- let skipPush = storedHash !== undefined && storedHash === currentHash ? (
784
- liveSdl === "" ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema could not be introspected — forcing repair push (check appsync:GetIntrospectionSchema permission)`), false) : (
785
- missingFields.length !== 0 ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema is missing ` + missingFields.length.toString() + ` expected root field(s) (e.g. ` + missingFields.slice(0, 5).join(", ") + `) — forcing repair push`), false) : (log.info("preResolversSchemaHook", undefined, `SDL unchanged (hash ` + currentHash.slice(0, 12) + `…) and live schema is a superset of the expected root fields (` + countRoots(liveSdl).toString() + ` live); skipping push`), true)
786
- )
787
- ) : false;
788
- if (!skipPush) {
789
- if (GraphQL_Stitcher$ReventlessCore.isCatastrophicSchemaShrink(liveSdl, sdl, deploySchemaShrinkThreshold)) {
790
- return log.error("preResolversSchemaHook", undefined, `ABORTED schema push for ` + apiId + `: stitched SDL (` + countRoots(sdl).toString() + ` root field(s)) would catastrophically shrink the live schema (` + countRoots(liveSdl).toString() + ` root field(s), threshold ` + deploySchemaShrinkThreshold.toString() + `) — refusing to clobber resolvers (likely a stale concurrent-deploy scan)`);
580
+ let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
581
+ switch (typename) {
582
+ case "CommandAccepted" :
583
+ let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
584
+ if (eventCount > 0.0) {
585
+ return await waitForApiFragmentPush(endpoint, region, name, at);
791
586
  } else {
792
- log.info("preResolversSchemaHook", undefined, `Pushing schema to API ` + apiId + ` (` + allPluginFragments.length.toString() + ` plugin fragments, new hash: ` + currentHash.slice(0, 12) + `…)`);
793
- await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
794
- apiId: apiId,
795
- definition: sdl
796
- });
797
- log.info("preResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
798
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
799
- log.info("preResolversSchemaHook", undefined, "Schema is ACTIVE");
800
- if (tableNameOpt !== undefined) {
801
- return await writeSchemaHash(tableNameOpt, apiId, currentHash);
802
- } else {
803
- return;
804
- }
587
+ return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged no push needed`);
805
588
  }
806
- }
807
- });
808
- if (tableNameOpt !== undefined) {
809
- return AppSync_Adapter$ReventlessAws.withSchemaPushLock(tableNameOpt, apiId, undefined, undefined, runSchemaPush);
810
- } else {
811
- return runSchemaPush();
589
+ case "CommandRejected" :
590
+ let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
591
+ return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
592
+ default:
593
+ return await waitForApiFragmentPush(endpoint, region, name, at);
812
594
  }
813
- }));
595
+ };
596
+ return run();
814
597
  });
815
598
  };
816
599
  let hooks_preAdminResolversSchemaHook = adminBarrier => {
@@ -1207,38 +990,8 @@ function MakeWithConfig(Config) {
1207
990
  }
1208
991
  }
1209
992
  let domainApiId = Output$Pulumi.flatMap(domainApi, api => api.id);
1210
- let updateApiSchema = async queryEngine => {
1211
- let apiId = domainApiId.get();
1212
- let plugins = await queryEngine.scan("Plugins", [[
1213
- "status",
1214
- "Contains",
1215
- {
1216
- TAG: "String",
1217
- _0: "Connected"
1218
- }
1219
- ]], 1000);
1220
- let fragments = Stdlib_Array.filterMap(plugins, json => {
1221
- try {
1222
- let state = S.parseOrThrow(json, PluginsReadModelSpec$ReventlessCore.stateSchema);
1223
- let match = state.apiTarget;
1224
- if (match === "Platform") {
1225
- return;
1226
- } else {
1227
- return state.apiSchemaFragment;
1228
- }
1229
- } catch (exn) {
1230
- return;
1231
- }
1232
- });
1233
- let baseFragment = Config.splitApi ? emptyBaseFragment : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
1234
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, fragments);
1235
- return await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(AppSync_Adapter$ReventlessAws.getClient(), {
1236
- apiId: apiId,
1237
- definition: sdl
1238
- });
1239
- };
1240
993
  let PluginExtensionPoint = Plugin_ExtensionPoint_Builder$ReventlessAws.MakeWithConfig({
1241
- updateApiSchema: updateApiSchema,
994
+ updateApiSchema: undefined,
1242
995
  manageSubscriptions: undefined
1243
996
  });
1244
997
  let admin = Admin.construct(version, [PluginExtensionPoint], [
@@ -1250,14 +1003,15 @@ function MakeWithConfig(Config) {
1250
1003
  ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1251
1004
  let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
1252
1005
  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(""));
1006
+ let agg = admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name];
1007
+ let apiSchemaPushCmdTopicUrl = agg !== undefined ? Output$Pulumi.flatMap(agg.commandTopic, ct => {
1008
+ let r = ct.resources[0];
1009
+ if (r !== undefined) {
1010
+ return r.id;
1011
+ } else {
1012
+ return Pulumi.output("");
1013
+ }
1014
+ }) : Pulumi.output("");
1261
1015
  let apiSchemaPushEnv = Object.fromEntries([
1262
1016
  [
1263
1017
  "API_SCHEMA_PUSH_DOMAIN_API_ID",
@@ -1288,7 +1042,7 @@ function MakeWithConfig(Config) {
1288
1042
  AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
1289
1043
  Source: {
1290
1044
  name: ApiSchemaPush$ReventlessAws.Source.name,
1291
- Id: Id$Reventless.$$String,
1045
+ Id: ApiSchemaPush$ReventlessAws.Source.Id,
1292
1046
  eventSchema: ApiSchemaPush$ReventlessAws.Source.eventSchema
1293
1047
  },
1294
1048
  moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
@@ -1304,10 +1058,6 @@ function MakeWithConfig(Config) {
1304
1058
  } else {
1305
1059
  pluginReadModelTableName = undefined;
1306
1060
  }
1307
- let pluginSchemaPersistenceTable = Util_DynamoDb$ReventlessAws.makeTable([{
1308
- name: "id",
1309
- type: "S"
1310
- }], undefined, undefined, undefined, undefined, {}, "PluginSchemaPersistence");
1311
1061
  PluginExtensionPointRuntime_Builder$ReventlessAws.registerPluginExtensionPoint(pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined);
1312
1062
  let pluginEpEventTopicArn = Output$Pulumi.flatMap(admin.extensionPointsOutputs, eps => {
1313
1063
  let ep = eps.find(ep => ep.name === PluginExtensionPointSpec$ReventlessInfra.name);
@@ -1324,24 +1074,23 @@ function MakeWithConfig(Config) {
1324
1074
  return Pulumi.output("NOT_AVAILABLE");
1325
1075
  }
1326
1076
  });
1327
- let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
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);
1077
+ PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, Config.cloner, undefined);
1329
1078
  if (pluginReadModelTableName !== undefined) {
1330
1079
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
1331
1080
  Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, pluginReadModelTableName, {});
1332
1081
  }
1333
1082
  let rm = admin.stateViewSlicesOutputs["UiFragments"];
1334
1083
  if (rm !== undefined) {
1335
- let r$2 = rm.queryDb.resources[0];
1336
- if (r$2 !== undefined) {
1337
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1084
+ let r$1 = rm.queryDb.resources[0];
1085
+ if (r$1 !== undefined) {
1086
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
1338
1087
  }
1339
1088
  }
1340
1089
  let rm$1 = admin.readModelsOutputs["ApiFragments"];
1341
1090
  if (rm$1 !== undefined) {
1342
- let r$3 = rm$1.queryDb.resources[0];
1343
- if (r$3 !== undefined) {
1344
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$3.name, admin.adminSchemaPushed, {});
1091
+ let r$2 = rm$1.queryDb.resources[0];
1092
+ if (r$2 !== undefined) {
1093
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1345
1094
  }
1346
1095
  }
1347
1096
  if (Config.splitApi) {
@@ -1363,7 +1112,6 @@ function MakeWithConfig(Config) {
1363
1112
  if (pluginReadModelTableName !== undefined) {
1364
1113
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
1365
1114
  }
1366
- Pulumi$Pulumi.$$export("pluginSchemaPersistenceTableName", pluginSchemaPersistenceTable.name);
1367
1115
  Plugin_Helpers$ReventlessCore.exportPlatformOutputs(admin.extensionPointsOutputs, admin.aggregatesOutputs, admin.readModelsOutputs, admin.dcbEventLogOutputs, admin.stateChangeSlicesOutputs, admin.stateViewSlicesOutputs, admin.automationSlicesOutputs, admin.outboundTranslationSlicesOutputs, admin.inboundTranslationSlicesOutputs);
1368
1116
  let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL));
1369
1117
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
@@ -1926,38 +1674,6 @@ function Make($star) {
1926
1674
  let Api = {
1927
1675
  Make: Make$9
1928
1676
  };
1929
- let deploySchemaHashPrefix = "deploy-schema-hash:";
1930
- let readSchemaHash = async (tableName, apiId) => {
1931
- let key = Object.fromEntries([[
1932
- "id",
1933
- deploySchemaHashPrefix + apiId
1934
- ]]);
1935
- try {
1936
- let result = await DynamoDb_DocumentClient$AwsSdk.GetCommand.send(new LibDynamodb.GetCommand({
1937
- TableName: tableName,
1938
- Key: key
1939
- }));
1940
- return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result.Item, item => Stdlib_JSON.Decode.object(item)), d => d["hash"]), v => Stdlib_JSON.Decode.string(v));
1941
- } catch (exn) {
1942
- return;
1943
- }
1944
- };
1945
- let writeSchemaHash = async (tableName, apiId, hash) => {
1946
- let item = Object.fromEntries([
1947
- [
1948
- "id",
1949
- deploySchemaHashPrefix + apiId
1950
- ],
1951
- [
1952
- "hash",
1953
- hash
1954
- ]
1955
- ]);
1956
- await DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
1957
- Item: item,
1958
- TableName: tableName
1959
- }));
1960
- };
1961
1677
  let hooksApiRef = {
1962
1678
  contents: undefined
1963
1679
  };
@@ -2032,224 +1748,52 @@ function Make($star) {
2032
1748
  let hooks_preResolversSchemaHook = (name, version, pluginFragment) => {
2033
1749
  log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
2034
1750
  let capturedDeployTarget = currentDeployTarget.contents;
2035
- if (platformStackRef !== undefined) {
2036
- let apiTargetName;
2037
- apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
2038
- let match = apiConfigRef.contents;
2039
- let platformApi = match !== undefined ? match.platformApi : domainApi;
2040
- let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
2041
- let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
2042
- ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
2043
- return Output$Pulumi.flatMap(endpointOutput, endpoint => {
2044
- let run = async () => {
2045
- let at = new Date().toISOString();
2046
- let variables = {
2047
- id: "registry",
2048
- pluginId: name,
2049
- fragment: {
2050
- encoded: pluginFragment.encoded,
2051
- protocol: pluginFragment.protocol
2052
- },
2053
- apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
2054
- at: at
2055
- };
2056
- log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
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);
2059
- if (outcome === undefined) {
2060
- return await waitForApiFragmentPush(endpoint, region, name, at);
2061
- }
2062
- let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
2063
- switch (typename) {
2064
- case "CommandAccepted" :
2065
- let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
2066
- if (eventCount > 0.0) {
2067
- return await waitForApiFragmentPush(endpoint, region, name, at);
2068
- } else {
2069
- return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged — no push needed`);
2070
- }
2071
- case "CommandRejected" :
2072
- let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
2073
- return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
2074
- default:
2075
- return await waitForApiFragmentPush(endpoint, region, name, at);
2076
- }
1751
+ if (platformStackRef === undefined) {
1752
+ return Pervasives.failwith("makePlatform(~plugins=[…]) is no longer supported on AWS — deploy the platform with deployPlatform and each plugin with deployPlugin (staged register + reactive push).");
1753
+ }
1754
+ let apiTargetName;
1755
+ apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
1756
+ let match = apiConfigRef.contents;
1757
+ let platformApi = match !== undefined ? match.platformApi : domainApi;
1758
+ let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
1759
+ let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
1760
+ ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
1761
+ return Output$Pulumi.flatMap(endpointOutput, endpoint => {
1762
+ let run = async () => {
1763
+ let at = new Date().toISOString();
1764
+ let variables = {
1765
+ id: "registry",
1766
+ pluginId: name,
1767
+ fragment: {
1768
+ encoded: pluginFragment.encoded,
1769
+ protocol: pluginFragment.protocol
1770
+ },
1771
+ apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
1772
+ at: at
2077
1773
  };
2078
- return run();
2079
- });
2080
- }
2081
- let match$1;
2082
- if (capturedDeployTarget === "Domain") {
2083
- match$1 = [
2084
- "deploy-schema:",
2085
- domainApi
2086
- ];
2087
- } else {
2088
- let match$2 = apiConfigRef.contents;
2089
- let api = match$2 !== undefined ? match$2.platformApi : domainApi;
2090
- match$1 = [
2091
- "deploy-schema-platform:",
2092
- api
2093
- ];
2094
- }
2095
- let targetApi = match$1[1];
2096
- let schemaPrefix = match$1[0];
2097
- let readStackRefString = (stackRef, key) => {
2098
- let direct = stackRef.getOutput(key);
2099
- let defaultOutput = stackRef.getOutput("default");
2100
- return Pulumi.all([
2101
- direct,
2102
- defaultOutput
2103
- ]).apply(param => {
2104
- let name = Stdlib_Option.flatMap(param[0], v => Stdlib_JSON.Decode.string(v));
2105
- if (name !== undefined) {
2106
- return name;
2107
- } else {
2108
- return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(param[1], d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v));
2109
- }
2110
- });
2111
- };
2112
- let schemaPersistenceTableNameOutput;
2113
- if (platformStackRef !== undefined) {
2114
- let stackRef = Primitive_option.valFromOption(platformStackRef);
2115
- schemaPersistenceTableNameOutput = Pulumi.all([
2116
- readStackRefString(stackRef, "pluginSchemaPersistenceTableName"),
2117
- readStackRefString(stackRef, "pluginRmTableName")
2118
- ]).apply(param => {
2119
- let dedicated = param[0];
2120
- if (dedicated !== undefined) {
2121
- return dedicated;
2122
- } else {
2123
- return param[1];
2124
- }
2125
- });
2126
- } else {
2127
- schemaPersistenceTableNameOutput = Pulumi.output(undefined);
2128
- }
2129
- return Output$Pulumi.flatMap(schemaPersistenceTableNameOutput, tableNameOpt => {
2130
- let writeAndScanFragments = () => {
2131
- if (tableNameOpt !== undefined) {
2132
- let deployItem = Object.fromEntries([
2133
- [
2134
- "id",
2135
- schemaPrefix + name
2136
- ],
2137
- [
2138
- "fragment",
2139
- pluginFragment.encoded
2140
- ]
2141
- ]);
2142
- log.info("preResolversSchemaHook", undefined, `Writing deploy-schema entry for ` + name + ` to ` + tableNameOpt);
2143
- let scanAllDeploySchemaItems = async () => {
2144
- let allItems = [];
2145
- let startKey;
2146
- let more = true;
2147
- while (more) {
2148
- let result = await DynamoDb_DocumentClient$AwsSdk.ScanCommand.send(new LibDynamodb.ScanCommand({
2149
- TableName: tableNameOpt,
2150
- ExclusiveStartKey: startKey,
2151
- ExpressionAttributeNames: Object.fromEntries([[
2152
- "#id",
2153
- "id"
2154
- ]]),
2155
- ExpressionAttributeValues: Object.fromEntries([[
2156
- ":prefix",
2157
- schemaPrefix
2158
- ]]),
2159
- FilterExpression: "begins_with(#id, :prefix)"
2160
- }));
2161
- Stdlib_Option.getOr(result.Items, []).forEach(item => {
2162
- allItems.push(item);
2163
- });
2164
- let k = result.LastEvaluatedKey;
2165
- if (k !== undefined) {
2166
- startKey = k;
2167
- } else {
2168
- more = false;
2169
- }
2170
- };
2171
- return allItems;
2172
- };
2173
- return Stdlib_Promise.$$catch(DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
2174
- Item: deployItem,
2175
- TableName: tableNameOpt
2176
- })).then(param => {
2177
- log.info("preResolversSchemaHook", undefined, `Scanning ` + tableNameOpt + ` for deploy-schema entries`);
2178
- return scanAllDeploySchemaItems();
2179
- }).then(items => {
2180
- let fragments = Stdlib_Array.filterMap(items, item => {
2181
- try {
2182
- let obj = JSON.parse(JSON.stringify(item));
2183
- let fragmentJson = Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(obj), d => d["fragment"]);
2184
- if (fragmentJson === undefined) {
2185
- return;
2186
- }
2187
- let encoded = Stdlib_JSON.Decode.string(fragmentJson);
2188
- if (encoded !== undefined) {
2189
- return {
2190
- encoded: encoded,
2191
- protocol: "graphql"
2192
- };
2193
- } else {
2194
- return;
2195
- }
2196
- } catch (exn) {
2197
- return;
2198
- }
2199
- });
2200
- log.info("preResolversSchemaHook", undefined, `Found ` + fragments.length.toString() + ` deploy-schema entries`);
2201
- return Promise.resolve(fragments);
2202
- }), err => {
2203
- let msg = Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_JsExn.fromException(err), Stdlib_JsExn.message), "unknown");
2204
- log.info("preResolversSchemaHook", undefined, `DynamoDB write/scan failed (` + msg + `) — using current plugin only`);
2205
- return Promise.resolve([pluginFragment]);
2206
- });
1774
+ log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
1775
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
1776
+ 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);
1777
+ if (outcome === undefined) {
1778
+ return await waitForApiFragmentPush(endpoint, region, name, at);
2207
1779
  }
2208
- log.info("preResolversSchemaHook", undefined, "No pluginSchemaPersistenceTableName / pluginRmTableName — skipping fragment persistence");
2209
- return Promise.resolve([pluginFragment]);
2210
- };
2211
- return Output$Pulumi.flatMap(targetApi, api => Output$Pulumi.flatMap(api.id, apiId => {
2212
- let runSchemaPush = () => writeAndScanFragments().then(async allPluginFragments => {
2213
- let baseFragment;
2214
- baseFragment = capturedDeployTarget === "Domain" ? emptyBaseFragment : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(false), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
2215
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, allPluginFragments);
2216
- let currentHash = AppSync_Adapter$ReventlessAws.sha256Hex(sdl);
2217
- let storedHash = tableNameOpt !== undefined ? await readSchemaHash(tableNameOpt, apiId) : undefined;
2218
- let client = AppSync_Adapter$ReventlessAws.getClient();
2219
- let liveSdl = await AppSync_Adapter$ReventlessAws.getIntrospectionSdl(client, apiId);
2220
- let countRoots = s => (GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Mutation") + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Query") | 0) + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Subscription") | 0;
2221
- let missingFields = GraphQL_Stitcher$ReventlessCore.missingRootFields(sdl, liveSdl);
2222
- let skipPush = storedHash !== undefined && storedHash === currentHash ? (
2223
- liveSdl === "" ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema could not be introspected — forcing repair push (check appsync:GetIntrospectionSchema permission)`), false) : (
2224
- missingFields.length !== 0 ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema is missing ` + missingFields.length.toString() + ` expected root field(s) (e.g. ` + missingFields.slice(0, 5).join(", ") + `) — forcing repair push`), false) : (log.info("preResolversSchemaHook", undefined, `SDL unchanged (hash ` + currentHash.slice(0, 12) + `…) and live schema is a superset of the expected root fields (` + countRoots(liveSdl).toString() + ` live); skipping push`), true)
2225
- )
2226
- ) : false;
2227
- if (!skipPush) {
2228
- if (GraphQL_Stitcher$ReventlessCore.isCatastrophicSchemaShrink(liveSdl, sdl, deploySchemaShrinkThreshold)) {
2229
- return log.error("preResolversSchemaHook", undefined, `ABORTED schema push for ` + apiId + `: stitched SDL (` + countRoots(sdl).toString() + ` root field(s)) would catastrophically shrink the live schema (` + countRoots(liveSdl).toString() + ` root field(s), threshold ` + deploySchemaShrinkThreshold.toString() + `) — refusing to clobber resolvers (likely a stale concurrent-deploy scan)`);
1780
+ let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
1781
+ switch (typename) {
1782
+ case "CommandAccepted" :
1783
+ let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
1784
+ if (eventCount > 0.0) {
1785
+ return await waitForApiFragmentPush(endpoint, region, name, at);
2230
1786
  } else {
2231
- log.info("preResolversSchemaHook", undefined, `Pushing schema to API ` + apiId + ` (` + allPluginFragments.length.toString() + ` plugin fragments, new hash: ` + currentHash.slice(0, 12) + `…)`);
2232
- await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
2233
- apiId: apiId,
2234
- definition: sdl
2235
- });
2236
- log.info("preResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
2237
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
2238
- log.info("preResolversSchemaHook", undefined, "Schema is ACTIVE");
2239
- if (tableNameOpt !== undefined) {
2240
- return await writeSchemaHash(tableNameOpt, apiId, currentHash);
2241
- } else {
2242
- return;
2243
- }
1787
+ return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged no push needed`);
2244
1788
  }
2245
- }
2246
- });
2247
- if (tableNameOpt !== undefined) {
2248
- return AppSync_Adapter$ReventlessAws.withSchemaPushLock(tableNameOpt, apiId, undefined, undefined, runSchemaPush);
2249
- } else {
2250
- return runSchemaPush();
1789
+ case "CommandRejected" :
1790
+ let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
1791
+ return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
1792
+ default:
1793
+ return await waitForApiFragmentPush(endpoint, region, name, at);
2251
1794
  }
2252
- }));
1795
+ };
1796
+ return run();
2253
1797
  });
2254
1798
  };
2255
1799
  let hooks_preAdminResolversSchemaHook = adminBarrier => {
@@ -2628,37 +2172,8 @@ function Make($star) {
2628
2172
  };
2629
2173
  }
2630
2174
  let domainApiId = Output$Pulumi.flatMap(domainApi, api => api.id);
2631
- let updateApiSchema = async queryEngine => {
2632
- let apiId = domainApiId.get();
2633
- let plugins = await queryEngine.scan("Plugins", [[
2634
- "status",
2635
- "Contains",
2636
- {
2637
- TAG: "String",
2638
- _0: "Connected"
2639
- }
2640
- ]], 1000);
2641
- let fragments = Stdlib_Array.filterMap(plugins, json => {
2642
- try {
2643
- let state = S.parseOrThrow(json, PluginsReadModelSpec$ReventlessCore.stateSchema);
2644
- let match = state.apiTarget;
2645
- if (match === "Platform") {
2646
- return;
2647
- } else {
2648
- return state.apiSchemaFragment;
2649
- }
2650
- } catch (exn) {
2651
- return;
2652
- }
2653
- });
2654
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(emptyBaseFragment, fragments);
2655
- return await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(AppSync_Adapter$ReventlessAws.getClient(), {
2656
- apiId: apiId,
2657
- definition: sdl
2658
- });
2659
- };
2660
2175
  let PluginExtensionPoint = Plugin_ExtensionPoint_Builder$ReventlessAws.MakeWithConfig({
2661
- updateApiSchema: updateApiSchema,
2176
+ updateApiSchema: undefined,
2662
2177
  manageSubscriptions: undefined
2663
2178
  });
2664
2179
  let admin = Admin.construct(version, [PluginExtensionPoint], [
@@ -2670,14 +2185,15 @@ function Make($star) {
2670
2185
  ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2671
2186
  let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
2672
2187
  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(""));
2188
+ let agg = admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name];
2189
+ let apiSchemaPushCmdTopicUrl = agg !== undefined ? Output$Pulumi.flatMap(agg.commandTopic, ct => {
2190
+ let r = ct.resources[0];
2191
+ if (r !== undefined) {
2192
+ return r.id;
2193
+ } else {
2194
+ return Pulumi.output("");
2195
+ }
2196
+ }) : Pulumi.output("");
2681
2197
  let apiSchemaPushEnv = Object.fromEntries([
2682
2198
  [
2683
2199
  "API_SCHEMA_PUSH_DOMAIN_API_ID",
@@ -2708,7 +2224,7 @@ function Make($star) {
2708
2224
  AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
2709
2225
  Source: {
2710
2226
  name: ApiSchemaPush$ReventlessAws.Source.name,
2711
- Id: Id$Reventless.$$String,
2227
+ Id: ApiSchemaPush$ReventlessAws.Source.Id,
2712
2228
  eventSchema: ApiSchemaPush$ReventlessAws.Source.eventSchema
2713
2229
  },
2714
2230
  moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
@@ -2724,10 +2240,6 @@ function Make($star) {
2724
2240
  } else {
2725
2241
  pluginReadModelTableName = undefined;
2726
2242
  }
2727
- let pluginSchemaPersistenceTable = Util_DynamoDb$ReventlessAws.makeTable([{
2728
- name: "id",
2729
- type: "S"
2730
- }], undefined, undefined, undefined, undefined, {}, "PluginSchemaPersistence");
2731
2243
  PluginExtensionPointRuntime_Builder$ReventlessAws.registerPluginExtensionPoint(pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined);
2732
2244
  let pluginEpEventTopicArn = Output$Pulumi.flatMap(admin.extensionPointsOutputs, eps => {
2733
2245
  let ep = eps.find(ep => ep.name === PluginExtensionPointSpec$ReventlessInfra.name);
@@ -2744,24 +2256,23 @@ function Make($star) {
2744
2256
  return Pulumi.output("NOT_AVAILABLE");
2745
2257
  }
2746
2258
  });
2747
- let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
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);
2259
+ PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, false, undefined);
2749
2260
  if (pluginReadModelTableName !== undefined) {
2750
2261
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
2751
2262
  Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, pluginReadModelTableName, {});
2752
2263
  }
2753
2264
  let rm = admin.stateViewSlicesOutputs["UiFragments"];
2754
2265
  if (rm !== undefined) {
2755
- let r$2 = rm.queryDb.resources[0];
2756
- if (r$2 !== undefined) {
2757
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2266
+ let r$1 = rm.queryDb.resources[0];
2267
+ if (r$1 !== undefined) {
2268
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2758
2269
  }
2759
2270
  }
2760
2271
  let rm$1 = admin.readModelsOutputs["ApiFragments"];
2761
2272
  if (rm$1 !== undefined) {
2762
- let r$3 = rm$1.queryDb.resources[0];
2763
- if (r$3 !== undefined) {
2764
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$3.name, admin.adminSchemaPushed, {});
2273
+ let r$2 = rm$1.queryDb.resources[0];
2274
+ if (r$2 !== undefined) {
2275
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2765
2276
  }
2766
2277
  }
2767
2278
  Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
@@ -2777,7 +2288,6 @@ function Make($star) {
2777
2288
  if (pluginReadModelTableName !== undefined) {
2778
2289
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
2779
2290
  }
2780
- Pulumi$Pulumi.$$export("pluginSchemaPersistenceTableName", pluginSchemaPersistenceTable.name);
2781
2291
  Plugin_Helpers$ReventlessCore.exportPlatformOutputs(admin.extensionPointsOutputs, admin.aggregatesOutputs, admin.readModelsOutputs, admin.dcbEventLogOutputs, admin.stateChangeSlicesOutputs, admin.stateViewSlicesOutputs, admin.automationSlicesOutputs, admin.outboundTranslationSlicesOutputs, admin.inboundTranslationSlicesOutputs);
2782
2292
  let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL));
2783
2293
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
@@ -2995,7 +2505,6 @@ function Make($star) {
2995
2505
 
2996
2506
  export {
2997
2507
  log,
2998
- deploySchemaShrinkThreshold,
2999
2508
  apiConfigRef,
3000
2509
  getApiConfig,
3001
2510
  splitApiOutputsRef,