@fjall/components-infrastructure 0.75.2 → 0.76.0
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/dist/lib/app.d.ts +32 -8
- package/dist/lib/app.js +58 -11
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
- package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
- package/dist/lib/config/aws/cloudTrail.js +2 -2
- package/dist/lib/config/aws/disasterRecovery.js +1 -1
- package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
- package/dist/lib/config/aws/ecrDefaultImage.js +2 -2
- package/dist/lib/config/aws/identityCenter.d.ts +3 -3
- package/dist/lib/config/aws/identityCenter.js +1 -1
- package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
- package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
- package/dist/lib/config/aws/ipam.js +2 -4
- package/dist/lib/config/aws/organisation.d.ts +3 -3
- package/dist/lib/config/aws/organisation.js +1 -1
- package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
- package/dist/lib/config/aws/organisationsAccess.js +1 -1
- package/dist/lib/config/monitoring.d.ts +18 -0
- package/dist/lib/config/monitoring.js +22 -0
- package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
- package/dist/lib/patterns/aws/buildkite.js +1 -1
- package/dist/lib/patterns/aws/compute.d.ts +8 -8
- package/dist/lib/patterns/aws/compute.js +5 -5
- package/dist/lib/patterns/aws/database.d.ts +191 -24
- package/dist/lib/patterns/aws/database.js +201 -42
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
- package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
- package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
- package/dist/lib/patterns/aws/managedAccount.js +1 -1
- package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
- package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
- package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
- package/dist/lib/patterns/aws/managedPlatform.js +2 -4
- package/dist/lib/patterns/aws/storage.d.ts +4 -55
- package/dist/lib/patterns/aws/storage.js +3 -103
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
- package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
- package/dist/lib/resources/aws/backup/backupVault.js +1 -1
- package/dist/lib/resources/aws/base/awsStack.js +1 -1
- package/dist/lib/resources/aws/compute/ec2.d.ts +3 -3
- package/dist/lib/resources/aws/compute/ec2.js +1 -1
- package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
- package/dist/lib/resources/aws/compute/ecs.js +63 -19
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +3 -7
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
- package/dist/lib/resources/aws/compute/ecsSpot.js +3 -11
- package/dist/lib/resources/aws/compute/lambda.d.ts +4 -4
- package/dist/lib/resources/aws/compute/lambda.js +1 -1
- package/dist/lib/resources/aws/database/database.d.ts +2 -2
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
- package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
- package/dist/lib/resources/aws/database/index.d.ts +0 -1
- package/dist/lib/resources/aws/database/index.js +1 -2
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +22 -6
- package/dist/lib/resources/aws/database/rdsAurora.js +212 -84
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +39 -6
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +34 -5
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +16 -10
- package/dist/lib/resources/aws/database/rdsInstance.js +126 -63
- package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
- package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
- package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
- package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
- package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/policy.js +1 -1
- package/dist/lib/resources/aws/iam/role.d.ts +1 -1
- package/dist/lib/resources/aws/iam/role.js +1 -1
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
- package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
- package/dist/lib/resources/aws/index.d.ts +1 -0
- package/dist/lib/resources/aws/index.js +2 -1
- package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
- package/dist/lib/resources/aws/logging/logGroup.js +1 -1
- package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
- package/dist/lib/resources/aws/monitoring/index.js +18 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
- package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipam.js +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
- package/dist/lib/resources/aws/networking/vpc.d.ts +3 -3
- package/dist/lib/resources/aws/networking/vpc.js +1 -1
- package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +2 -2
- package/dist/lib/resources/aws/networking/vpcEndpoint.js +1 -1
- package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
- package/dist/lib/resources/aws/secrets/alias.js +1 -1
- package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
- package/dist/lib/resources/aws/secrets/parameter.js +1 -1
- package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
- package/dist/lib/resources/aws/secrets/secret.js +19 -2
- package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
- package/dist/lib/resources/aws/storage/ecr.js +1 -1
- package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
- package/dist/lib/resources/aws/storage/s3.js +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
- package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.d.ts +3 -3
- package/dist/lib/resources/aws/utilities/customResource.js +1 -1
- package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
- package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
- package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
- package/dist/lib/utils/getAsync.d.ts +1 -1
- package/dist/lib/utils/getAsync.js +1 -1
- package/dist/lib/utils/getConfig.d.ts +2 -2
- package/dist/lib/utils/getConfig.js +3 -3
- package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
- package/dist/lib/utils/standardTagsAspect.js +6 -5
- package/dist/lib/utils/tagResource.d.ts +1 -1
- package/dist/lib/utils/tagResource.js +1 -1
- package/package.json +3 -3
- package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
- package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
- package/dist/lib/__tests__/patterns/compute.test.js +0 -137
- package/dist/lib/__tests__/simple.test.d.ts +0 -0
- package/dist/lib/__tests__/simple.test.js +0 -12
- package/dist/lib/patterns/aws/basicApp.d.ts +0 -0
- package/dist/lib/patterns/aws/basicApp.js +0 -150
- package/dist/lib/patterns/aws/freeTierApp.d.ts +0 -44
- package/dist/lib/patterns/aws/freeTierApp.js +0 -83
- package/dist/lib/patterns/aws/spotInstanceApp.d.ts +0 -45
- package/dist/lib/patterns/aws/spotInstanceApp.js +0 -85
- package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseFreeTier.js +0 -29
- package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +0 -37
- package/dist/lib/resources/aws/database/rdsFreeTier.js +0 -84
- package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
- package/dist/lib/resources/aws/organisations/account.js +0 -220
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
- package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
- package/dist/lib/resources/aws/organisations/index.js +0 -22
- package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
- package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
- package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
- package/dist/lib/resources/aws/organisations/organisation.js +0 -263
- package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
- package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
- package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
- package/dist/lib/resources/aws/organisations/policy.js +0 -93
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
- package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
- package/dist/lib/resources/aws/organisations/types.js +0 -36
- package/dist/lib/utils/directTagging.d.ts +0 -31
- package/dist/lib/utils/directTagging.js +0 -86
- package/dist/lib/utils/fjallConstruct.d.ts +0 -8
- package/dist/lib/utils/fjallConstruct.js +0 -18
- package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
- package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
- package/dist/lib/utils/tagContext.d.ts +0 -28
- package/dist/lib/utils/tagContext.js +0 -53
- package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
- package/dist/lib/utils/tagSynthesizer.js +0 -55
|
@@ -2,130 +2,237 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RdsAurora = void 0;
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
5
6
|
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
6
7
|
const aws_rds_1 = require("aws-cdk-lib/aws-rds");
|
|
7
8
|
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
|
8
9
|
const constructs_1 = require("constructs");
|
|
9
10
|
const iam_1 = require("../iam");
|
|
10
11
|
const secrets_1 = require("../secrets");
|
|
12
|
+
const database_1 = require("../../../patterns/aws/database");
|
|
11
13
|
class RdsAurora extends constructs_1.Construct {
|
|
12
14
|
constructor(scope, id, props) {
|
|
13
15
|
super(scope, id);
|
|
14
|
-
this.port = props.port
|
|
15
|
-
//
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
this.port = props.port ?? 35255;
|
|
17
|
+
// PostgreSQL fallback for direct usage - ensure engine and engineConfig match
|
|
18
|
+
this.engineConfig = props.engineConfig ?? {
|
|
19
|
+
defaultUsername: "postgres",
|
|
20
|
+
sslParameters: { "rds.force_ssl": "1" },
|
|
21
|
+
rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
|
|
22
|
+
};
|
|
23
|
+
const piEnabled = props.performanceInsights !== undefined &&
|
|
24
|
+
props.performanceInsights !== false;
|
|
25
|
+
const piConfig = piEnabled
|
|
26
|
+
? props.performanceInsights
|
|
27
|
+
: undefined;
|
|
28
|
+
const username = props.credentials?.username ?? this.engineConfig.defaultUsername;
|
|
29
|
+
// Global secondary clusters import replicated secret instead of creating new
|
|
30
|
+
if (props.isGlobalSecondary) {
|
|
31
|
+
this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
|
|
32
|
+
secretName: `${props.databaseName}Credentials`,
|
|
33
|
+
importExisting: true
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
|
|
38
|
+
secretName: `${props.databaseName}Credentials`,
|
|
39
|
+
generateSecretString: {
|
|
40
|
+
secretStringTemplate: JSON.stringify({ username }),
|
|
41
|
+
excludePunctuation: true,
|
|
42
|
+
includeSpace: false,
|
|
43
|
+
generateStringKey: "password"
|
|
44
|
+
},
|
|
45
|
+
replicaRegions: props.secretReplicaRegions
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const storageEncryptionKey = (0, database_1.isAwsManagedKey)(props.encryption?.storageKey)
|
|
49
|
+
? undefined // CDK will use aws/rds default key
|
|
50
|
+
: (props.encryption?.storageKey ??
|
|
51
|
+
new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${props.databaseName}/encryptionKey` }).key);
|
|
52
|
+
const performanceInsightsKey = piEnabled && !(0, database_1.isAwsManagedKey)(piConfig?.encryptionKey)
|
|
53
|
+
? (piConfig?.encryptionKey ??
|
|
54
|
+
new secrets_1.CustomerManagedKey(this, `${props.databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${props.databaseName}/InsightsKey` }).key)
|
|
55
|
+
: undefined;
|
|
56
|
+
const clusterSecurityGroup = new iam_1.SecurityGroup(this, `${id}SecurityGroup`, {
|
|
57
|
+
vpc: props.vpc,
|
|
58
|
+
description: `Security group for Aurora cluster ${props.databaseName}`
|
|
33
59
|
});
|
|
34
|
-
|
|
35
|
-
|
|
60
|
+
clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(this.port));
|
|
61
|
+
this.connections = new aws_ec2_1.Connections({
|
|
62
|
+
securityGroups: [clusterSecurityGroup],
|
|
63
|
+
defaultPort: aws_ec2_1.Port.tcp(this.port)
|
|
36
64
|
});
|
|
37
|
-
const
|
|
38
|
-
|
|
65
|
+
const writerConfig = props.writer ?? {};
|
|
66
|
+
const writerPI = writerConfig.enablePerformanceInsights ?? piEnabled;
|
|
67
|
+
const writerIdentifier = writerConfig.identifierSuffix ?? "primary-writer";
|
|
68
|
+
const performanceInsightsRetention = piEnabled
|
|
69
|
+
? this.getPerformanceInsightRetention(piConfig?.retentionPeriod)
|
|
70
|
+
: undefined;
|
|
71
|
+
const writer = aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}Writer`, {
|
|
72
|
+
enablePerformanceInsights: writerPI,
|
|
73
|
+
performanceInsightEncryptionKey: writerPI
|
|
74
|
+
? performanceInsightsKey
|
|
75
|
+
: undefined,
|
|
76
|
+
performanceInsightRetention: writerPI
|
|
77
|
+
? performanceInsightsRetention
|
|
78
|
+
: undefined,
|
|
79
|
+
instanceIdentifier: `${props.databaseName}-${writerIdentifier}`,
|
|
80
|
+
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
|
|
81
|
+
...(writerConfig.availabilityZone && {
|
|
82
|
+
availabilityZone: writerConfig.availabilityZone
|
|
83
|
+
})
|
|
39
84
|
});
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
85
|
+
const readers = this.buildReaders(props, piEnabled, performanceInsightsKey, performanceInsightsRetention);
|
|
86
|
+
const engine = props.engine ||
|
|
87
|
+
aws_rds_1.DatabaseClusterEngine.auroraPostgres({
|
|
88
|
+
version: aws_rds_1.AuroraPostgresEngineVersion.of("16.6", "16")
|
|
89
|
+
});
|
|
90
|
+
const parameterGroup = new aws_rds_1.ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
|
|
91
|
+
engine,
|
|
92
|
+
description: `Parameter group for ${props.databaseName} with security defaults`,
|
|
93
|
+
parameters: this.engineConfig.sslParameters
|
|
43
94
|
});
|
|
44
|
-
|
|
45
|
-
clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(5432));
|
|
46
|
-
this.connections = clusterSecurityGroup.connections;
|
|
47
|
-
// Database Cluster
|
|
48
|
-
const databaseCluster = new aws_rds_1.DatabaseCluster(this, `${id}Database`, {
|
|
95
|
+
const dbClusterProps = {
|
|
49
96
|
vpc: props.vpc,
|
|
50
|
-
vpcSubnets: {
|
|
51
|
-
subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
52
|
-
},
|
|
97
|
+
vpcSubnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS },
|
|
53
98
|
securityGroups: [clusterSecurityGroup],
|
|
54
|
-
engine
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
version: aws_rds_1.AuroraPostgresEngineVersion.VER_15_6
|
|
58
|
-
}),
|
|
59
|
-
backup: props.backup || {
|
|
60
|
-
retention: aws_cdk_lib_1.Duration.days(14)
|
|
61
|
-
},
|
|
99
|
+
engine,
|
|
100
|
+
parameterGroup,
|
|
101
|
+
backup: { retention: aws_cdk_lib_1.Duration.days(props.backupRetention ?? 14) },
|
|
62
102
|
storageEncrypted: true,
|
|
63
|
-
storageEncryptionKey
|
|
103
|
+
...(storageEncryptionKey && { storageEncryptionKey }),
|
|
64
104
|
clusterIdentifier: props.clusterIdentifier?.toLowerCase() ||
|
|
65
105
|
`${props.databaseName?.toLowerCase()}-cluster`,
|
|
66
|
-
credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret),
|
|
67
|
-
defaultDatabaseName: props.databaseName || `${id.replace("Rds", "")}`,
|
|
68
106
|
monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
|
|
69
107
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30",
|
|
70
|
-
port:
|
|
108
|
+
port: this.port,
|
|
71
109
|
removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
110
|
+
deletionProtection: true,
|
|
111
|
+
iamAuthentication: true,
|
|
112
|
+
writer,
|
|
113
|
+
readers
|
|
114
|
+
};
|
|
115
|
+
if (!props.isGlobalSecondary) {
|
|
116
|
+
dbClusterProps.credentials = aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret);
|
|
117
|
+
dbClusterProps.defaultDatabaseName =
|
|
118
|
+
props.databaseName || `${id.replace("Rds", "")}`;
|
|
119
|
+
}
|
|
120
|
+
this.databaseCluster = new aws_rds_1.DatabaseCluster(this, `${id}Database`, dbClusterProps);
|
|
121
|
+
this.cfnCluster = this.databaseCluster.node.defaultChild;
|
|
122
|
+
// Global secondary clusters can't specify these properties
|
|
123
|
+
if (props.isGlobalSecondary && this.cfnCluster) {
|
|
124
|
+
this.cfnCluster.masterUsername = undefined;
|
|
125
|
+
this.cfnCluster.masterUserPassword = undefined;
|
|
126
|
+
this.cfnCluster.databaseName = undefined;
|
|
127
|
+
}
|
|
128
|
+
// Auto-disable deletion protection during stack destroy
|
|
129
|
+
new custom_resources_1.AwsCustomResource(this, `${props.databaseName}DisableProtection`, {
|
|
130
|
+
onDelete: {
|
|
131
|
+
service: "RDS",
|
|
132
|
+
action: "modifyDBCluster",
|
|
133
|
+
parameters: {
|
|
134
|
+
DBClusterIdentifier: this.databaseCluster.clusterIdentifier,
|
|
135
|
+
DeletionProtection: false,
|
|
136
|
+
ApplyImmediately: true
|
|
137
|
+
},
|
|
138
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of(`${this.databaseCluster.clusterIdentifier}-disable-protection`)
|
|
139
|
+
},
|
|
140
|
+
policy: custom_resources_1.AwsCustomResourcePolicy.fromSdkCalls({
|
|
141
|
+
resources: custom_resources_1.AwsCustomResourcePolicy.ANY_RESOURCE
|
|
142
|
+
})
|
|
143
|
+
});
|
|
144
|
+
const proxyEnabled = props.proxy !== undefined && props.proxy !== false;
|
|
145
|
+
if (proxyEnabled) {
|
|
146
|
+
this.addProxy(props, clusterSecurityGroup);
|
|
147
|
+
}
|
|
148
|
+
// Secret rotation enabled by default (opt-out with secretRotation: false)
|
|
149
|
+
if (!props.isGlobalSecondary) {
|
|
150
|
+
const secretRotationDisabled = props.credentials?.secretRotation === false;
|
|
151
|
+
if (!secretRotationDisabled) {
|
|
152
|
+
this.addSecretRotation(props);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
buildReaders(props, defaultPIEnabled, piKey, piRetention) {
|
|
157
|
+
if (props.readers === false) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
let readerConfigs;
|
|
161
|
+
if (props.readers?.instances) {
|
|
162
|
+
readerConfigs = props.readers.instances;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const count = props.readers?.count ?? 1;
|
|
166
|
+
readerConfigs = Array.from({ length: count }, (_, i) => ({
|
|
167
|
+
scaleWithWriter: i === 0
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
const defaultPI = props.readers && "defaultEnablePerformanceInsights" in props.readers
|
|
171
|
+
? (props.readers.defaultEnablePerformanceInsights ?? defaultPIEnabled)
|
|
172
|
+
: defaultPIEnabled;
|
|
173
|
+
return readerConfigs.map((config, index) => {
|
|
174
|
+
const enablePI = config.enablePerformanceInsights ?? defaultPI;
|
|
175
|
+
const identifier = config.identifierSuffix ?? `reader-${index + 1}`;
|
|
176
|
+
return aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}Reader${index + 1}`, {
|
|
177
|
+
scaleWithWriter: config.scaleWithWriter ?? index === 0,
|
|
178
|
+
enablePerformanceInsights: enablePI,
|
|
179
|
+
performanceInsightEncryptionKey: enablePI ? piKey : undefined,
|
|
180
|
+
performanceInsightRetention: enablePI ? piRetention : undefined,
|
|
181
|
+
instanceIdentifier: `${props.databaseName}-${identifier}`,
|
|
182
|
+
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
|
|
183
|
+
...(config.availabilityZone && {
|
|
184
|
+
availabilityZone: config.availabilityZone
|
|
94
185
|
})
|
|
95
|
-
|
|
186
|
+
});
|
|
96
187
|
});
|
|
97
|
-
|
|
98
|
-
|
|
188
|
+
}
|
|
189
|
+
addProxy(props, securityGroup) {
|
|
190
|
+
const proxyConfig = props.proxy;
|
|
191
|
+
const vpcSubnets = proxyConfig.vpcSubnets ?? {
|
|
192
|
+
subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
193
|
+
};
|
|
99
194
|
this.databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
|
|
100
|
-
proxyTarget: aws_rds_1.ProxyTarget.fromCluster(databaseCluster),
|
|
195
|
+
proxyTarget: aws_rds_1.ProxyTarget.fromCluster(this.databaseCluster),
|
|
101
196
|
secrets: [this.databaseCredentials.secret],
|
|
102
|
-
securityGroups: [
|
|
197
|
+
securityGroups: [securityGroup],
|
|
103
198
|
vpc: props.vpc,
|
|
104
|
-
vpcSubnets
|
|
105
|
-
|
|
106
|
-
|
|
199
|
+
vpcSubnets,
|
|
200
|
+
requireTLS: proxyConfig.requireTLS ?? true,
|
|
201
|
+
borrowTimeout: proxyConfig.connectionBorrowTimeout
|
|
202
|
+
? aws_cdk_lib_1.Duration.seconds(proxyConfig.connectionBorrowTimeout)
|
|
203
|
+
: aws_cdk_lib_1.Duration.seconds(120),
|
|
204
|
+
maxConnectionsPercent: proxyConfig.maxConnections,
|
|
205
|
+
maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
|
|
107
206
|
});
|
|
108
207
|
new aws_cdk_lib_1.CfnOutput(this, `${props.databaseName}ProxyEndpointOutput`, {
|
|
109
208
|
key: `${props.databaseName}ProxyEndpoint`,
|
|
110
209
|
exportName: `${props.databaseName}ProxyEndpoint`,
|
|
111
210
|
value: this.databaseProxy.endpoint
|
|
112
211
|
});
|
|
113
|
-
|
|
212
|
+
}
|
|
213
|
+
addSecretRotation(props) {
|
|
214
|
+
const rotationConfig = props.credentials?.secretRotation;
|
|
215
|
+
const rotationPeriod = (typeof rotationConfig === "object" &&
|
|
216
|
+
rotationConfig?.automaticallyAfter) ||
|
|
217
|
+
aws_cdk_lib_1.Duration.days(30);
|
|
114
218
|
const masterSecret = new secrets_1.Secret(this, `${props.databaseName}MasterSecret`, {
|
|
115
219
|
secretName: `${props.databaseName}MasterSecret`
|
|
116
220
|
});
|
|
117
221
|
new aws_secretsmanager_1.SecretRotation(this, `${props.databaseName}SecretRotation`, {
|
|
118
|
-
application: new aws_secretsmanager_1.SecretRotationApplication(
|
|
119
|
-
isMultiUser: true
|
|
120
|
-
}),
|
|
222
|
+
application: new aws_secretsmanager_1.SecretRotationApplication(this.engineConfig.rotationAppName, "1.1.367", { isMultiUser: true }),
|
|
121
223
|
secret: this.databaseCredentials.secret,
|
|
122
224
|
masterSecret: masterSecret.secret,
|
|
123
|
-
target: databaseCluster,
|
|
124
|
-
vpc: databaseCluster.vpc
|
|
225
|
+
target: this.databaseCluster,
|
|
226
|
+
vpc: this.databaseCluster.vpc,
|
|
227
|
+
automaticallyAfter: rotationPeriod
|
|
125
228
|
});
|
|
126
229
|
}
|
|
127
230
|
getHostEndpoint() {
|
|
128
|
-
|
|
231
|
+
// Return proxy endpoint if available, otherwise cluster endpoint
|
|
232
|
+
if (this.databaseProxy) {
|
|
233
|
+
return this.databaseProxy.endpoint;
|
|
234
|
+
}
|
|
235
|
+
return this.databaseCluster.clusterEndpoint.hostname;
|
|
129
236
|
}
|
|
130
237
|
getHostPort() {
|
|
131
238
|
return String(this.port);
|
|
@@ -136,6 +243,27 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
136
243
|
getCfnCluster() {
|
|
137
244
|
return this.cfnCluster;
|
|
138
245
|
}
|
|
246
|
+
getDatabaseCluster() {
|
|
247
|
+
return this.databaseCluster;
|
|
248
|
+
}
|
|
249
|
+
getPerformanceInsightRetention(days) {
|
|
250
|
+
switch (days) {
|
|
251
|
+
case 7:
|
|
252
|
+
return aws_rds_1.PerformanceInsightRetention.DEFAULT;
|
|
253
|
+
case 31:
|
|
254
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
|
|
255
|
+
case 93:
|
|
256
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_3;
|
|
257
|
+
case 186:
|
|
258
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_6;
|
|
259
|
+
case 372:
|
|
260
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_12;
|
|
261
|
+
case 731:
|
|
262
|
+
return aws_rds_1.PerformanceInsightRetention.LONG_TERM;
|
|
263
|
+
default:
|
|
264
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
139
267
|
}
|
|
140
268
|
exports.RdsAurora = RdsAurora;
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFNNkI7QUFDN0IsaURBWTZCO0FBQzdCLHVFQUd3QztBQUN4QywyQ0FBdUM7QUFDdkMsZ0NBQXVDO0FBQ3ZDLHdDQUF3RDtBQWdCeEQsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFVdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUUvQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksZ0JBQU0sQ0FDbkMsSUFBSSxFQUNKLEdBQUcsS0FBSyxDQUFDLFlBQVksYUFBYSxFQUNsQztZQUNFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLGFBQWE7WUFDOUMsb0JBQW9CLEVBQUU7Z0JBQ3BCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25DLFFBQVEsRUFBRSxVQUFVO2lCQUNyQixDQUFDO2dCQUNGLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixpQkFBaUIsRUFBRSxVQUFVO2FBQzlCO1NBQ0YsQ0FDRixDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLElBQUksNEJBQWtCLENBQzFDLElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxZQUFZLHNCQUFzQixFQUMzQztZQUNFLFNBQVMsRUFBRSxXQUFXLEtBQUssQ0FBQyxZQUFZLGdCQUFnQjtTQUN6RCxDQUNGLENBQUM7UUFFRixNQUFNLHdCQUF3QixHQUFHLElBQUksNEJB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UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBN0xELDhCQTZMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICBJQ29ubmVjdGFibGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQmFja3VwUHJvcHMsXG4gIENhQ2VydGlmaWNhdGUsXG4gIENsdXN0ZXJJbnN0YW5jZSxcbiAgQ3JlZGVudGlhbHMsXG4gIERhdGFiYXNlQ2x1c3RlcixcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIElDbHVzdGVyRW5naW5lLFxuICBQcm94eVRhcmdldFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIGJhY2t1cD86IEJhY2t1cFByb3BzO1xuICBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICB3cml0ZXI/OiBDbHVzdGVySW5zdGFuY2U7XG4gIHJlYWRlcnM/OiBDbHVzdGVySW5zdGFuY2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBwb3J0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5OiBEYXRhYmFzZVByb3h5O1xuICBwcml2YXRlIGRhdGFiYXNlQ3JlZGVudGlhbHM6IFNlY3JldDtcbiAgLy8gRXhwb3NlIHRoZSB1bmRlcmx5aW5nIEwxIERCQ2x1c3RlciBzbyBvdGhlciBjb25zdHJ1Y3RzIGNhbiByZWZlcmVuY2UgaXRcbiAgcHJpdmF0ZSBjZm5DbHVzdGVyPzogQ2ZuREJDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnBvcnQgPSBwcm9wcy5wb3J0IHx8IDU0MzI7XG5cbiAgICAvLyBEYXRhYmFzZSBDcmVkZW50aWFsc1xuICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgIHtcbiAgICAgICAgc2VjcmV0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdXNlcm5hbWU6IFwicG9zdGdyZXNcIlxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBDdXN0b21lciBNYW5hZ2VkIEtleXNcbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBwcmltYXJ5UmVhZGVySW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9QcmltYXJ5UmVhZGVySW5zaWdodHNLZXlgXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2Vjb25kYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9TZWNvbmRhcnlSZWFkZXJJbnNpZ2h0c0tleWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcHJpbWFyeVdyaXRlclBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICB7XG4gICAgICAgIGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L1ByaW1hcnlXcml0ZXJJbnNpZ2h0c0tleWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgY2x1c3RlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIHRoYXQgYWxsb3dzIGluYm91bmQgYWNjZXNzIHRvIHRoZSBwb3N0Z3JlcyBjbHVzdGVyIGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICAvL1RPRE86IFJlbW92ZSB0aGlzIGxpbmUsIHRoYXQgYWxsb3dzIHRoZSBwcm94eSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4gUmVwbGFjZSB3aXRoIHNlcGVyYXRlZCBzZWN1cml0eSBncm91cHNcbiAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShjbHVzdGVyU2VjdXJpdHlHcm91cCwgUG9ydC50Y3AoNTQzMikpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGNsdXN0ZXJTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zO1xuXG4gICAgLy8gRGF0YWJhc2UgQ2x1c3RlclxuICAgIGNvbnN0IGRhdGFiYXNlQ2x1c3RlciA9IG5ldyBEYXRhYmFzZUNsdXN0ZXIodGhpcywgYCR7aWR9RGF0YWJhc2VgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBlbmdpbmU6XG4gICAgICAgIHByb3BzLmVuZ2luZSB8fFxuICAgICAgICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhUG9zdGdyZXMoe1xuICAgICAgICAgIC8vVE9ETzogRG8gd2UgdXBkYXRlIHRoZXNlIHdoZW4gd2UgcmVsZWFzZSBhIG5ldyB2ZXJzaW9uPyBPciB0cnkgdG8ga2VlcCB0aGVtIGNvbnN0YW50bHkgdXBkYXRlZD9cbiAgICAgICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE1XzZcbiAgICAgICAgfSksXG4gICAgICBiYWNrdXA6IHByb3BzLmJhY2t1cCB8fCB7XG4gICAgICAgIHJldGVudGlvbjogRHVyYXRpb24uZGF5cygxNClcbiAgICAgIH0sXG4gICAgICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICAgICAgc3RvcmFnZUVuY3J5cHRpb25LZXk6IGVuY3J5cHRpb25LZXkua2V5LFxuICAgICAgY2x1c3RlcklkZW50aWZpZXI6XG4gICAgICAgIHByb3BzLmNsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZT8udG9Mb3dlckNhc2UoKX0tY2x1c3RlcmAsXG4gICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMuZnJvbVNlY3JldCh0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KSxcbiAgICAgIGRlZmF1bHREYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6XG4gICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCB8fCA1NDMyLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5TTkFQU0hPVCxcbiAgICAgIHdyaXRlcjpcbiAgICAgICAgcHJvcHMud3JpdGVyIHx8XG4gICAgICAgIENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVdyaXRlcmAsIHtcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6XG4gICAgICAgICAgICBwcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktd3JpdGVyYCxcbiAgICAgICAgICAvL1RPRE86IERvIHdlIHVwZGF0ZSB0aGVzZSB3aGVuIHdlIHJlbGVhc2UgYSBuZXcgdmVyc2lvbj8gT3IgdHJ5IHRvIGtlZXAgdGhlbSBjb25zdGFudGx5IHVwZGF0ZWQ/XG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KSxcbiAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMgfHwgW1xuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVyYCwge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHByaW1hcnlSZWFkZXJJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktcmVhZGVyYCxcbiAgICAgICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxXG4gICAgICAgIH0pLFxuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNvbmRhcnlSZWFkZXJgLCB7XG4gICAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBmYWxzZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5LmtleSxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX0tc2Vjb25kYXJ5LXJlYWRlcmAsXG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZSB0aGUgTDEgREJDbHVzdGVyIChDZm4pIGZvciBleHRlcm5hbCByZWZlcmVuY2VcbiAgICB0aGlzLmNmbkNsdXN0ZXIgPSBkYXRhYmFzZUNsdXN0ZXIubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuREJDbHVzdGVyO1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIoZGF0YWJhc2VDbHVzdGVyKSxcbiAgICAgICAgc2VjcmV0czogW3RoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRPdXRwdXRgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIHZhbHVlOiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnRcbiAgICB9KTtcblxuICAgIC8vIFJvdGF0ZSB0aGUgU2VjcmV0IGV2ZXJ5IDMwIGRheXNcbiAgICBjb25zdCBtYXN0ZXJTZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgLCB7XG4gICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YFxuICAgIH0pO1xuXG4gICAgbmV3IFNlY3JldFJvdGF0aW9uKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNyZXRSb3RhdGlvbmAsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiBuZXcgU2VjcmV0Um90YXRpb25BcHBsaWNhdGlvbihcbiAgICAgICAgXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiLFxuICAgICAgICBcIjEuMS4zNjdcIixcbiAgICAgICAge1xuICAgICAgICAgIGlzTXVsdGlVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBzZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICBtYXN0ZXJTZWNyZXQ6IG1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IGRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIHZwYzogZGF0YWJhc2VDbHVzdGVyLnZwY1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludDtcbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0Q2ZuQ2x1c3RlcigpOiBDZm5EQkNsdXN0ZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNmbkNsdXN0ZXI7XG4gIH1cbn1cbiJdfQ==
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUNqRSxtRUFJc0M7QUFDdEMsaURBTTZCO0FBQzdCLGlEQWM2QjtBQUM3Qix1RUFHd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLGdDQUF1QztBQUN2Qyx3Q0FBd0Q7QUFDeEQsNkRBVXdDO0FBdUJ4QyxNQUFhLFNBQVUsU0FBUSxzQkFBUztJQVV0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWU7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO1FBRWhDLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUk7WUFDeEMsZUFBZSxFQUFFLFVBQVU7WUFDM0IsYUFBYSxFQUFFLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUN2QyxlQUFlLEVBQUUsOENBQThDO1NBQ2hFLENBQUM7UUFFRixNQUFNLFNBQVMsR0FDYixLQUFLLENBQUMsbUJBQW1CLEtBQUssU0FBUztZQUN2QyxLQUFLLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLFNBQVM7WUFDeEIsQ0FBQyxDQUFFLEtBQUssQ0FBQyxtQkFBaUQ7WUFDMUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO1FBRW5FLDZFQUE2RTtRQUM3RSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxtQkFB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QUFPLHFDQUEyQixDQUFDLE9BQU8sQ0FBQztZQUM3QyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxxQ0FBMkIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxFQUFFO2dCQUNMLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1lBQzlDLEtBQUssR0FBRztnQkFDTixPQUFPLHFDQUEyQixDQUFDLFFBQVEsQ0FBQztZQUM5QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxxQ0FBMkIsQ0FBQyxTQUFTLENBQUM7WUFDL0MsS0FBSyxHQUFHO2dCQUNOLE9BQU8scUNBQTJCLENBQUMsU0FBUyxDQUFDO1lBQy9DO2dCQUNFLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE1V0QsOEJBNFdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQXdzQ3VzdG9tUmVzb3VyY2UsXG4gIEF3c0N1c3RvbVJlc291cmNlUG9saWN5LFxuICBQaHlzaWNhbFJlc291cmNlSWRcbn0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICB0eXBlIElDb25uZWN0YWJsZSxcbiAgdHlwZSBJVnBjLFxuICBQb3J0LFxuICBTdWJuZXRUeXBlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIENhQ2VydGlmaWNhdGUsXG4gIENsdXN0ZXJJbnN0YW5jZSxcbiAgQ3JlZGVudGlhbHMsXG4gIERhdGFiYXNlQ2x1c3RlcixcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICB0eXBlIENmbkRCQ2x1c3RlcixcbiAgRGF0YWJhc2VQcm94eSxcbiAgdHlwZSBJQ2x1c3RlckVuZ2luZSxcbiAgdHlwZSBJQ2x1c3Rlckluc3RhbmNlLFxuICBQYXJhbWV0ZXJHcm91cCxcbiAgUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLFxuICBQcm94eVRhcmdldFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlckNvbmZpZyxcbiAgdHlwZSBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnLFxuICBpc0F3c01hbmFnZWRLZXlcbn0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9kYXRhYmFzZVwiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIGVuZ2luZUNvbmZpZz86IEVuZ2luZUNvbmZpZztcbiAgY2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBTa2lwcyBzZWNyZXQgcm90YXRpb24gZm9yIHNlY29uZGFyeSBjbHVzdGVycyBpbiBnbG9iYWwgZGF0YWJhc2UgKi9cbiAgaXNHbG9iYWxTZWNvbmRhcnk/OiBib29sZWFuO1xuICBzZWNyZXRSZXBsaWNhUmVnaW9ucz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbmdpbmVDb25maWc6IEVuZ2luZUNvbmZpZztcbiAgcHJpdmF0ZSBkYXRhYmFzZUNsdXN0ZXI6IERhdGFiYXNlQ2x1c3RlcjtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5PzogRGF0YWJhc2VQcm94eTtcbiAgcHJpdmF0ZSBkYXRhYmFzZUNyZWRlbnRpYWxzOiBTZWNyZXQ7XG4gIHByaXZhdGUgY2ZuQ2x1c3Rlcj86IENmbkRCQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wb3J0ID0gcHJvcHMucG9ydCA/PyAzNTI1NTtcblxuICAgIC8vIFBvc3RncmVTUUwgZmFsbGJhY2sgZm9yIGRpcmVjdCB1c2FnZSAtIGVuc3VyZSBlbmdpbmUgYW5kIGVuZ2luZUNvbmZpZyBtYXRjaFxuICAgIHRoaXMuZW5naW5lQ29uZmlnID0gcHJvcHMuZW5naW5lQ29uZmlnID8/IHtcbiAgICAgIGRlZmF1bHRVc2VybmFtZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG4gICAgfTtcblxuICAgIGNvbnN0IHBpRW5hYmxlZCA9XG4gICAgICBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHBpQ29uZmlnID0gcGlFbmFibGVkXG4gICAgICA/IChwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzIGFzIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHVzZXJuYW1lID1cbiAgICAgIHByb3BzLmNyZWRlbnRpYWxzPy51c2VybmFtZSA/PyB0aGlzLmVuZ2luZUNvbmZpZy5kZWZhdWx0VXNlcm5hbWU7XG5cbiAgICAvLyBHbG9iYWwgc2Vjb25kYXJ5IGNsdXN0ZXJzIGltcG9ydCByZXBsaWNhdGVkIHNlY3JldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIG5ld1xuICAgIGlmIChwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzID0gbmV3IFNlY3JldChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAge1xuICAgICAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgICAgaW1wb3J0RXhpc3Rpbmc6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzID0gbmV3IFNlY3JldChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAge1xuICAgICAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lIH0pLFxuICAgICAgICAgICAgZXhjbHVkZVB1bmN0dWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcGxpY2FSZWdpb25zOiBwcm9wcy5zZWNyZXRSZXBsaWNhUmVnaW9uc1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JhZ2VFbmNyeXB0aW9uS2V5ID0gaXNBd3NNYW5hZ2VkS2V5KHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXkpXG4gICAgICA/IHVuZGVmaW5lZCAvLyBDREsgd2lsbCB1c2UgYXdzL3JkcyBkZWZhdWx0IGtleVxuICAgICAgOiAocHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleSA/P1xuICAgICAgICBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNsdXN0ZXJFbmNyeXB0aW9uS2V5YCxcbiAgICAgICAgICB7IGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L2VuY3J5cHRpb25LZXlgIH1cbiAgICAgICAgKS5rZXkpO1xuXG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c0tleSA9XG4gICAgICBwaUVuYWJsZWQgJiYgIWlzQXdzTWFuYWdlZEtleShwaUNvbmZpZz8uZW5jcnlwdGlvbktleSlcbiAgICAgICAgPyAocGlDb25maWc/LmVuY3J5cHRpb25LZXkgPz9cbiAgICAgICAgICBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QZXJmb3JtYW5jZUluc2lnaHRzS2V5YCxcbiAgICAgICAgICAgIHsgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vSW5zaWdodHNLZXlgIH1cbiAgICAgICAgICApLmtleSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjbHVzdGVyU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIGAke2lkfVNlY3VyaXR5R3JvdXBgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgU2VjdXJpdHkgZ3JvdXAgZm9yIEF1cm9yYSBjbHVzdGVyICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICB9KTtcblxuICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgY2x1c3RlclNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpXG4gICAgKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AodGhpcy5wb3J0KVxuICAgIH0pO1xuXG4gICAgY29uc3Qgd3JpdGVyQ29uZmlnID0gcHJvcHMud3JpdGVyID8/IHt9O1xuICAgIGNvbnN0IHdyaXRlclBJID0gd3JpdGVyQ29uZmlnLmVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHMgPz8gcGlFbmFibGVkO1xuICAgIGNvbnN0IHdyaXRlcklkZW50aWZpZXIgPSB3cml0ZXJDb25maWcuaWRlbnRpZmllclN1ZmZpeCA/PyBcInByaW1hcnktd3JpdGVyXCI7XG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbiA9IHBpRW5hYmxlZFxuICAgICAgPyB0aGlzLmdldFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbihwaUNvbmZpZz8ucmV0ZW50aW9uUGVyaW9kKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB3cml0ZXIgPSBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Xcml0ZXJgLCB7XG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB3cml0ZXJQSSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHdyaXRlclBJXG4gICAgICAgID8gcGVyZm9ybWFuY2VJbnNpZ2h0c0tleVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogd3JpdGVyUElcbiAgICAgICAgPyBwZXJmb3JtYW5jZUluc2lnaHRzUmV0ZW50aW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LSR7d3JpdGVySWRlbnRpZmllcn1gLFxuICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMSxcbiAgICAgIC4uLih3cml0ZXJDb25maWcuYXZhaWxhYmlsaXR5Wm9uZSAmJiB7XG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHdyaXRlckNvbmZpZy5hdmFpbGFiaWxpdHlab25lXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVhZGVycyA9IHRoaXMuYnVpbGRSZWFkZXJzKFxuICAgICAgcHJvcHMsXG4gICAgICBwaUVuYWJsZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzS2V5LFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblxuICAgICk7XG5cbiAgICBjb25zdCBlbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lIHx8XG4gICAgICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhUG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YoXCIxNi42XCIsIFwiMTZcIilcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgUGFyYW1ldGVyR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBhcmFtZXRlckdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgZW5naW5lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFBhcmFtZXRlciBncm91cCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IHdpdGggc2VjdXJpdHkgZGVmYXVsdHNgLFxuICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLmVuZ2luZUNvbmZpZy5zc2xQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGRiQ2x1c3RlclByb3BzOiBhbnkgPSB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH0sXG4gICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSxcbiAgICAgIGVuZ2luZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgYmFja3VwOiB7IHJldGVudGlvbjogRHVyYXRpb24uZGF5cyhwcm9wcy5iYWNrdXBSZXRlbnRpb24gPz8gMTQpIH0sXG4gICAgICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICAgICAgLi4uKHN0b3JhZ2VFbmNyeXB0aW9uS2V5ICYmIHsgc3RvcmFnZUVuY3J5cHRpb25LZXkgfSksXG4gICAgICBjbHVzdGVySWRlbnRpZmllcjpcbiAgICAgICAgcHJvcHMuY2x1c3RlcklkZW50aWZpZXI/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lPy50b0xvd2VyQ2FzZSgpfS1jbHVzdGVyYCxcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsIHx8IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzpcbiAgICAgICAgcHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3cgfHwgXCJTYXQ6MTI6MzAtU2F0OjIwOjMwXCIsXG4gICAgICBwb3J0OiB0aGlzLnBvcnQsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlNOQVBTSE9ULFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlLFxuICAgICAgaWFtQXV0aGVudGljYXRpb246IHRydWUsXG4gICAgICB3cml0ZXIsXG4gICAgICByZWFkZXJzXG4gICAgfTtcblxuICAgIGlmICghcHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIGRiQ2x1c3RlclByb3BzLmNyZWRlbnRpYWxzID0gQ3JlZGVudGlhbHMuZnJvbVNlY3JldChcbiAgICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldFxuICAgICAgKTtcbiAgICAgIGRiQ2x1c3RlclByb3BzLmRlZmF1bHREYXRhYmFzZU5hbWUgPVxuICAgICAgICBwcm9wcy5kYXRhYmFzZU5hbWUgfHwgYCR7aWQucmVwbGFjZShcIlJkc1wiLCBcIlwiKX1gO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YWJhc2VDbHVzdGVyID0gbmV3IERhdGFiYXNlQ2x1c3RlcihcbiAgICAgIHRoaXMsXG4gICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICBkYkNsdXN0ZXJQcm9wc1xuICAgICk7XG5cbiAgICB0aGlzLmNmbkNsdXN0ZXIgPSB0aGlzLmRhdGFiYXNlQ2x1c3Rlci5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5EQkNsdXN0ZXI7XG5cbiAgICAvLyBHbG9iYWwgc2Vjb25kYXJ5IGNsdXN0ZXJzIGNhbid0IHNwZWNpZnkgdGhlc2UgcHJvcGVydGllc1xuICAgIGlmIChwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSAmJiB0aGlzLmNmbkNsdXN0ZXIpIHtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5tYXN0ZXJVc2VybmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5tYXN0ZXJVc2VyUGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNmbkNsdXN0ZXIuZGF0YWJhc2VOYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEF1dG8tZGlzYWJsZSBkZWxldGlvbiBwcm90ZWN0aW9uIGR1cmluZyBzdGFjayBkZXN0cm95XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EaXNhYmxlUHJvdGVjdGlvbmAsIHtcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiUkRTXCIsXG4gICAgICAgIGFjdGlvbjogXCJtb2RpZnlEQkNsdXN0ZXJcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIERCQ2x1c3RlcklkZW50aWZpZXI6IHRoaXMuZGF0YWJhc2VDbHVzdGVyLmNsdXN0ZXJJZGVudGlmaWVyLFxuICAgICAgICAgIERlbGV0aW9uUHJvdGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgQXBwbHlJbW1lZGlhdGVseTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IFBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgJHt0aGlzLmRhdGFiYXNlQ2x1c3Rlci5jbHVzdGVySWRlbnRpZmllcn0tZGlzYWJsZS1wcm90ZWN0aW9uYFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgcG9saWN5OiBBd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IEF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3h5RW5hYmxlZCA9IHByb3BzLnByb3h5ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMucHJveHkgIT09IGZhbHNlO1xuICAgIGlmIChwcm94eUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkUHJveHkocHJvcHMsIGNsdXN0ZXJTZWN1cml0eUdyb3VwKTtcbiAgICB9XG5cbiAgICAvLyBTZWNyZXQgcm90YXRpb24gZW5hYmxlZCBieSBkZWZhdWx0IChvcHQtb3V0IHdpdGggc2VjcmV0Um90YXRpb246IGZhbHNlKVxuICAgIGlmICghcHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIGNvbnN0IHNlY3JldFJvdGF0aW9uRGlzYWJsZWQgPVxuICAgICAgICBwcm9wcy5jcmVkZW50aWFscz8uc2VjcmV0Um90YXRpb24gPT09IGZhbHNlO1xuICAgICAgaWYgKCFzZWNyZXRSb3RhdGlvbkRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYWRkU2VjcmV0Um90YXRpb24ocHJvcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZWFkZXJzKFxuICAgIHByb3BzOiBSZHNQcm9wcyxcbiAgICBkZWZhdWx0UElFbmFibGVkOiBib29sZWFuLFxuICAgIHBpS2V5PzogYW55LFxuICAgIHBpUmV0ZW50aW9uPzogUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uXG4gICk6IElDbHVzdGVySW5zdGFuY2VbXSB7XG4gICAgaWYgKHByb3BzLnJlYWRlcnMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IHJlYWRlckNvbmZpZ3M6IEF1cm9yYVJlYWRlckNvbmZpZ1tdO1xuICAgIGlmIChwcm9wcy5yZWFkZXJzPy5pbnN0YW5jZXMpIHtcbiAgICAgIHJlYWRlckNvbmZpZ3MgPSBwcm9wcy5yZWFkZXJzLmluc3RhbmNlcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY291bnQgPSBwcm9wcy5yZWFkZXJzPy5jb3VudCA/PyAxO1xuICAgICAgcmVhZGVyQ29uZmlncyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBzY2FsZVdpdGhXcml0ZXI6IGkgPT09IDBcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0UEkgPVxuICAgICAgcHJvcHMucmVhZGVycyAmJiBcImRlZmF1bHRFbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzXCIgaW4gcHJvcHMucmVhZGVyc1xuICAgICAgICA/IChwcm9wcy5yZWFkZXJzLmRlZmF1bHRFbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IGRlZmF1bHRQSUVuYWJsZWQpXG4gICAgICAgIDogZGVmYXVsdFBJRW5hYmxlZDtcblxuICAgIHJldHVybiByZWFkZXJDb25maWdzLm1hcCgoY29uZmlnLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZW5hYmxlUEkgPSBjb25maWcuZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cyA/PyBkZWZhdWx0UEk7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gY29uZmlnLmlkZW50aWZpZXJTdWZmaXggPz8gYHJlYWRlci0ke2luZGV4ICsgMX1gO1xuXG4gICAgICByZXR1cm4gQ2x1c3Rlckluc3RhbmNlLnNlcnZlcmxlc3NWMihcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJlYWRlciR7aW5kZXggKyAxfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBzY2FsZVdpdGhXcml0ZXI6IGNvbmZpZy5zY2FsZVdpdGhXcml0ZXIgPz8gaW5kZXggPT09IDAsXG4gICAgICAgICAgZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0czogZW5hYmxlUEksXG4gICAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogZW5hYmxlUEkgPyBwaUtleSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb246IGVuYWJsZVBJID8gcGlSZXRlbnRpb24gOiB1bmRlZmluZWQsXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LSR7aWRlbnRpZmllcn1gLFxuICAgICAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAgICAgLi4uKGNvbmZpZy5hdmFpbGFiaWxpdHlab25lICYmIHtcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGNvbmZpZy5hdmFpbGFiaWxpdHlab25lXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHJveHkocHJvcHM6IFJkc1Byb3BzLCBzZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgcHJveHlDb25maWcgPSBwcm9wcy5wcm94eSBhcyBQcm94eUNvbmZpZztcbiAgICBjb25zdCB2cGNTdWJuZXRzID0gcHJveHlDb25maWcudnBjU3VibmV0cyA/PyB7XG4gICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIodGhpcy5kYXRhYmFzZUNsdXN0ZXIpLFxuICAgICAgICBzZWNyZXRzOiBbdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldF0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbc2VjdXJpdHlHcm91cF0sXG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzLFxuICAgICAgICByZXF1aXJlVExTOiBwcm94eUNvbmZpZy5yZXF1aXJlVExTID8/IHRydWUsXG4gICAgICAgIGJvcnJvd1RpbWVvdXQ6IHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0XG4gICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0KVxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtYXhDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heENvbm5lY3Rpb25zLFxuICAgICAgICBtYXhJZGxlQ29ubmVjdGlvbnNQZXJjZW50OiBwcm94eUNvbmZpZy5tYXhJZGxlQ29ubmVjdGlvbnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZWNyZXRSb3RhdGlvbihwcm9wczogUmRzUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbjtcbiAgICBjb25zdCByb3RhdGlvblBlcmlvZCA9XG4gICAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHJvdGF0aW9uQ29uZmlnPy5hdXRvbWF0aWNhbGx5QWZ0ZXIpIHx8XG4gICAgICBEdXJhdGlvbi5kYXlzKDMwKTtcblxuICAgIGNvbnN0IG1hc3RlclNlY3JldCA9IG5ldyBTZWNyZXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfU1hc3RlclNlY3JldGAsIHtcbiAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgXG4gICAgfSk7XG5cbiAgICBuZXcgU2VjcmV0Um90YXRpb24odGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVNlY3JldFJvdGF0aW9uYCwge1xuICAgICAgYXBwbGljYXRpb246IG5ldyBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uKFxuICAgICAgICB0aGlzLmVuZ2luZUNvbmZpZy5yb3RhdGlvbkFwcE5hbWUsXG4gICAgICAgIFwiMS4xLjM2N1wiLFxuICAgICAgICB7IGlzTXVsdGlVc2VyOiB0cnVlIH1cbiAgICAgICksXG4gICAgICBzZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICBtYXN0ZXJTZWNyZXQ6IG1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YWJhc2VDbHVzdGVyLFxuICAgICAgdnBjOiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci52cGMsXG4gICAgICBhdXRvbWF0aWNhbGx5QWZ0ZXI6IHJvdGF0aW9uUGVyaW9kXG4gICAgfSk7XG4gIH1cblxuICBnZXRIb3N0RW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICAvLyBSZXR1cm4gcHJveHkgZW5kcG9pbnQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2x1c3RlciBlbmRwb2ludFxuICAgIGlmICh0aGlzLmRhdGFiYXNlUHJveHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWU7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5wb3J0KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscztcbiAgfVxuXG4gIGdldENmbkNsdXN0ZXIoKTogQ2ZuREJDbHVzdGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZm5DbHVzdGVyO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VDbHVzdGVyKCk6IERhdGFiYXNlQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDbHVzdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24oXG4gICAgZGF5cz86IG51bWJlclxuICApOiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24ge1xuICAgIHN3aXRjaCAoZGF5cykge1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLkRFRkFVTFQ7XG4gICAgICBjYXNlIDMxOlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18xO1xuICAgICAgY2FzZSA5MzpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMztcbiAgICAgIGNhc2UgMTg2OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU182O1xuICAgICAgY2FzZSAzNzI6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzEyO1xuICAgICAgY2FzZSA3MzE6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTE9OR19URVJNO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,16 +1,49 @@
|
|
|
1
|
+
import { type Duration } from "aws-cdk-lib";
|
|
1
2
|
import { Construct } from "constructs";
|
|
2
|
-
import { IVpc, Connections, IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
3
|
-
import { IClusterEngine } from "aws-cdk-lib/aws-rds";
|
|
4
|
-
import { Secret } from "../secrets";
|
|
3
|
+
import { type IVpc, type Connections, type IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
4
|
+
import { type IClusterEngine } from "aws-cdk-lib/aws-rds";
|
|
5
|
+
import { type Secret } from "../secrets";
|
|
6
|
+
import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type PerformanceInsightsConfig } from "../../../patterns/aws/database";
|
|
5
7
|
interface RdsAuroraGlobalProps {
|
|
6
8
|
vpc: IVpc;
|
|
7
9
|
databaseName: string;
|
|
8
|
-
/**
|
|
10
|
+
/** Primary region where the initial cluster & global cluster resource are created */
|
|
9
11
|
primaryRegion: string;
|
|
10
|
-
/**
|
|
12
|
+
/** Secondary regions where Aurora clusters will be deployed (for secret replication) */
|
|
13
|
+
secondaryRegions?: string[];
|
|
14
|
+
/** Optional deterministic id for the global cluster (should be shared across stacks/regions) */
|
|
11
15
|
globalClusterIdentifier?: string;
|
|
12
|
-
/**
|
|
16
|
+
/** Optional engine to forward to the underlying cluster */
|
|
13
17
|
engine?: IClusterEngine;
|
|
18
|
+
/** Engine-specific configuration (username, SSL params, rotation app) */
|
|
19
|
+
engineConfig?: EngineConfig;
|
|
20
|
+
/** Enable write forwarding on secondary clusters to forward writes to primary region */
|
|
21
|
+
enableGlobalWriteForwarding?: boolean;
|
|
22
|
+
/** Writer instance configuration */
|
|
23
|
+
writer?: AuroraWriterConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Reader instances configuration.
|
|
26
|
+
* - `{ count: N }` - Simple: N readers with defaults
|
|
27
|
+
* - `{ instances: [...] }` - Advanced: per-reader config
|
|
28
|
+
* - `false` - Explicitly disable readers (writer-only cluster)
|
|
29
|
+
* - Omit - Default: 1 reader
|
|
30
|
+
*/
|
|
31
|
+
readers?: AuroraReadersConfig | false;
|
|
32
|
+
/** RDS Proxy configuration. Omit = no proxy, {} = defaults, false = disabled */
|
|
33
|
+
proxy?: ProxyConfig | false;
|
|
34
|
+
/** Credentials configuration including username and secret rotation */
|
|
35
|
+
credentials?: CredentialsConfig;
|
|
36
|
+
/** Encryption configuration */
|
|
37
|
+
encryption?: AuroraEncryptionConfig;
|
|
38
|
+
/** Backup retention in days. Default: 14 */
|
|
39
|
+
backupRetention?: number;
|
|
40
|
+
/** CloudWatch monitoring interval. Default: 1 minute */
|
|
41
|
+
monitoringInterval?: Duration;
|
|
42
|
+
/** Preferred maintenance window. Default: "Sat:12:30-Sat:20:30" */
|
|
43
|
+
preferredMaintenanceWindow?: string;
|
|
44
|
+
/** Database port. Default: 35255 (FJALL on phone keypad) */
|
|
45
|
+
port?: number;
|
|
46
|
+
performanceInsights?: PerformanceInsightsConfig | false;
|
|
14
47
|
}
|
|
15
48
|
export declare class RdsAuroraGlobal extends Construct implements IConnectable {
|
|
16
49
|
connections: Connections;
|