@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.
- package/CHANGELOG.md +15 -0
- package/package.json +7 -7
- package/src/Platform.res +34 -475
- package/src/Platform.res.mjs +119 -610
- package/src/adapter/Api/ApiSchemaPush.res +24 -8
- package/src/adapter/Api/ApiSchemaPush.res.mjs +27 -1
- package/src/adapter/Runtime/AdminEventCollectorEntryPoint.mjs +7 -382
- package/src/adapter/Runtime/ApiSchemaPush_Runtime.mjs +8 -1
- package/src/components/Api/AppSync_Adapter.res +0 -91
- package/src/components/Api/AppSync_Adapter.res.mjs +0 -84
- package/src/plugin/runtime/PluginRuntime_Builder.res +0 -139
- package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +4 -80
- package/tests/ApiSchemaPushTest.res +8 -0
- package/tests/ApiSchemaPushTest.res.mjs +4 -0
- package/tests/MCP_LambdaTest.res +6 -4
- package/tests/MCP_LambdaTest.res.mjs +2 -2
package/src/Platform.res.mjs
CHANGED
|
@@ -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
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
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
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
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
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
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("
|
|
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
|
-
|
|
809
|
-
|
|
810
|
-
|
|
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:
|
|
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
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
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
|
|
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
|
-
|
|
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$
|
|
1336
|
-
if (r$
|
|
1337
|
-
Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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$
|
|
1343
|
-
if (r$
|
|
1344
|
-
Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
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
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
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
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
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("
|
|
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
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
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:
|
|
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
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
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
|
|
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
|
-
|
|
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$
|
|
2756
|
-
if (r$
|
|
2757
|
-
Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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$
|
|
2763
|
-
if (r$
|
|
2764
|
-
Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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,
|