@fjall/components-infrastructure 0.86.0 → 0.87.3
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/README.md +3 -3
- package/dist/lib/app.d.ts +166 -6
- package/dist/lib/app.js +212 -20
- package/dist/lib/aspects/resourceInventory.d.ts +4 -4
- package/dist/lib/aspects/resourceInventory.js +3 -3
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/identityCenter.js +1 -5
- package/dist/lib/config/aws/organisation.js +1 -4
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +7 -1
- package/dist/lib/patterns/aws/buildkite.js +3 -2
- package/dist/lib/patterns/aws/cdn.d.ts +164 -0
- package/dist/lib/patterns/aws/cdn.js +264 -0
- package/dist/lib/patterns/aws/compute.d.ts +278 -59
- package/dist/lib/patterns/aws/compute.js +384 -188
- package/dist/lib/patterns/aws/connections.d.ts +46 -0
- package/dist/lib/patterns/aws/connections.js +159 -0
- package/dist/lib/patterns/aws/database.d.ts +124 -11
- package/dist/lib/patterns/aws/database.js +188 -66
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +3 -0
- package/dist/lib/patterns/aws/index.js +4 -1
- package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
- package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
- package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
- package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
- package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/database.js +65 -0
- package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
- package/dist/lib/patterns/aws/interfaces/index.js +49 -0
- package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
- package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
- package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
- package/dist/lib/patterns/aws/messaging.d.ts +183 -0
- package/dist/lib/patterns/aws/messaging.js +239 -0
- package/dist/lib/patterns/aws/network.js +4 -4
- package/dist/lib/patterns/aws/pattern.d.ts +67 -0
- package/dist/lib/patterns/aws/pattern.js +69 -0
- package/dist/lib/patterns/aws/payload.d.ts +87 -0
- package/dist/lib/patterns/aws/payload.js +526 -0
- package/dist/lib/patterns/aws/storage.d.ts +127 -15
- package/dist/lib/patterns/aws/storage.js +234 -38
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
- package/dist/lib/resources/aws/backup/backupVault.js +1 -2
- package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
- package/dist/lib/resources/aws/base/awsStack.js +1 -7
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
- package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
- package/dist/lib/resources/aws/cdn/index.js +18 -0
- package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
- package/dist/lib/resources/aws/compute/ec2.js +33 -6
- package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
- package/dist/lib/resources/aws/compute/ecs.js +31 -115
- package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
- package/dist/lib/resources/aws/compute/lambda.js +209 -32
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
- package/dist/lib/resources/aws/database/dynamodb.js +181 -0
- package/dist/lib/resources/aws/database/index.d.ts +1 -0
- package/dist/lib/resources/aws/database/index.js +2 -1
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
- package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
- package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
- package/dist/lib/resources/aws/index.d.ts +2 -0
- package/dist/lib/resources/aws/index.js +3 -1
- package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
- package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
- package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/index.js +20 -0
- package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
- package/dist/lib/resources/aws/messaging/sns.js +70 -0
- package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
- package/dist/lib/resources/aws/messaging/sqs.js +231 -0
- package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/utils.js +7 -0
- package/dist/lib/resources/aws/networking/ipam.js +1 -2
- package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
- package/dist/lib/resources/aws/networking/vpc.js +1 -2
- package/dist/lib/resources/aws/storage/ecr.js +8 -5
- package/dist/lib/resources/aws/storage/s3.js +1 -2
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.js +1 -1
- package/dist/lib/utils/getConfig.js +3 -2
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/manifestWriter.d.ts +174 -0
- package/dist/lib/utils/manifestWriter.js +233 -0
- package/dist/lib/utils/standardTagsAspect.js +1 -8
- package/dist/lib/utils/validationLogger.d.ts +34 -0
- package/dist/lib/utils/validationLogger.js +83 -0
- package/package.json +3 -3
- package/dist/lib/__tests__/setup.d.ts +0 -48
- package/dist/lib/__tests__/setup.js +0 -1
- package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
- package/dist/lib/patterns/aws/cicdRole.js +0 -68
- package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
- package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
- package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import { SingletonFunction as singletonFunction, Function, type Code, type Runtime, FunctionUrlAuthType, type FunctionUrlCorsOptions } from "aws-cdk-lib/aws-lambda";
|
|
1
|
+
import { SingletonFunction as singletonFunction, Function, type Code, type Runtime, Architecture, FunctionUrlAuthType, type FunctionUrlCorsOptions, type InvokeMode } from "aws-cdk-lib/aws-lambda";
|
|
2
|
+
import { type Bucket } from "aws-cdk-lib/aws-s3";
|
|
2
3
|
import { PolicyStatement, type IRole } from "aws-cdk-lib/aws-iam";
|
|
3
4
|
import { type IVpc } from "aws-cdk-lib/aws-ec2";
|
|
5
|
+
import { Rule, type EventPattern } from "aws-cdk-lib/aws-events";
|
|
6
|
+
import { type IQueue } from "aws-cdk-lib/aws-sqs";
|
|
7
|
+
import { type ITable } from "aws-cdk-lib/aws-dynamodb";
|
|
4
8
|
import { type Construct } from "constructs";
|
|
5
9
|
import { type KeyValue } from "../../../types";
|
|
6
10
|
import { type SecretImport } from "../secrets";
|
|
@@ -10,6 +14,8 @@ export interface lambdaFunctionProps {
|
|
|
10
14
|
lambdaDescription?: string;
|
|
11
15
|
roleDescription?: string;
|
|
12
16
|
runtime: Runtime;
|
|
17
|
+
/** Lambda CPU architecture. Default: x86_64 */
|
|
18
|
+
architecture?: Architecture;
|
|
13
19
|
vpc?: IVpc;
|
|
14
20
|
timeout?: number;
|
|
15
21
|
memorySize?: number;
|
|
@@ -17,12 +23,16 @@ export interface lambdaFunctionProps {
|
|
|
17
23
|
enableFunctionUrl?: boolean;
|
|
18
24
|
functionUrlAuthType?: FunctionUrlAuthType;
|
|
19
25
|
functionUrlCors?: FunctionUrlCorsOptions;
|
|
26
|
+
/** Invoke mode for Function URL. Use RESPONSE_STREAM for Lambda streaming. */
|
|
27
|
+
functionUrlInvokeMode?: InvokeMode;
|
|
20
28
|
environment?: KeyValue;
|
|
21
29
|
tags?: KeyValue;
|
|
22
30
|
scheduleExpression?: string;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
secrets?: string[];
|
|
32
|
+
ssmSecretsPath?: string;
|
|
33
|
+
secretsImport?: Record<string, SecretImport>;
|
|
34
|
+
appName?: string;
|
|
35
|
+
functionName?: string;
|
|
26
36
|
}
|
|
27
37
|
export interface SingletonFunctionProps extends lambdaFunctionProps {
|
|
28
38
|
uuid?: string;
|
|
@@ -37,11 +47,90 @@ export declare class SingletonFunction extends singletonFunction {
|
|
|
37
47
|
private addPoliciesToRole;
|
|
38
48
|
}
|
|
39
49
|
export declare class LambdaFunction extends Function {
|
|
50
|
+
private functionUrlValue?;
|
|
40
51
|
constructor(scope: Construct, id: string, props: lambdaFunctionProps);
|
|
41
52
|
/**
|
|
42
53
|
* The Lambda's execution role (auto-generated by CDK)
|
|
43
54
|
*/
|
|
44
55
|
get executionRole(): IRole | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Get the Lambda function URL if enabled.
|
|
58
|
+
*/
|
|
59
|
+
getFunctionUrl(): string | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Add an SQS queue as an event source for this Lambda function.
|
|
62
|
+
* This will trigger the Lambda when messages arrive in the queue.
|
|
63
|
+
*/
|
|
64
|
+
addSqsEventSource(queue: IQueue, options?: {
|
|
65
|
+
batchSize?: number;
|
|
66
|
+
maxBatchingWindow?: number;
|
|
67
|
+
reportBatchItemFailures?: boolean;
|
|
68
|
+
}): void;
|
|
69
|
+
/**
|
|
70
|
+
* Add a DynamoDB table stream as an event source for this Lambda function.
|
|
71
|
+
* This will trigger the Lambda when items are modified in the table.
|
|
72
|
+
* Requires DynamoDB Streams to be enabled on the table.
|
|
73
|
+
*/
|
|
74
|
+
addDynamoDbEventSource(table: ITable, options?: {
|
|
75
|
+
batchSize?: number;
|
|
76
|
+
startingPosition?: "TRIM_HORIZON" | "LATEST";
|
|
77
|
+
maxBatchingWindow?: number;
|
|
78
|
+
retryAttempts?: number;
|
|
79
|
+
parallelizationFactor?: number;
|
|
80
|
+
reportBatchItemFailures?: boolean;
|
|
81
|
+
}): void;
|
|
82
|
+
/**
|
|
83
|
+
* Add an S3 bucket as an event source for this Lambda function.
|
|
84
|
+
* This will trigger the Lambda when objects are created, modified, or deleted.
|
|
85
|
+
* Useful for ISR cache invalidation and file processing workflows.
|
|
86
|
+
*/
|
|
87
|
+
addS3EventSource(bucket: Bucket, options?: {
|
|
88
|
+
events?: Array<"OBJECT_CREATED" | "OBJECT_REMOVED" | "OBJECT_CREATED_PUT" | "OBJECT_CREATED_POST" | "OBJECT_CREATED_COPY" | "OBJECT_REMOVED_DELETE">;
|
|
89
|
+
filters?: Array<{
|
|
90
|
+
prefix?: string;
|
|
91
|
+
suffix?: string;
|
|
92
|
+
}>;
|
|
93
|
+
}): void;
|
|
94
|
+
/**
|
|
95
|
+
* Add an EventBridge rule as an event source for this Lambda function.
|
|
96
|
+
* This will trigger the Lambda when events matching the pattern are published.
|
|
97
|
+
* Useful for scheduled jobs, cross-service event handling, and custom event patterns.
|
|
98
|
+
*/
|
|
99
|
+
addEventBridgeEventSource(ruleId: string, options: {
|
|
100
|
+
schedule?: string;
|
|
101
|
+
eventPattern?: EventPattern;
|
|
102
|
+
description?: string;
|
|
103
|
+
}): Rule;
|
|
45
104
|
private addPoliciesToRole;
|
|
46
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Add secrets support using AWS Parameters and Secrets Lambda Extension.
|
|
107
|
+
*
|
|
108
|
+
* The extension fetches secrets at runtime from:
|
|
109
|
+
* - SSM Parameter Store: via http://localhost:2773/systemsmanager/parameters/get
|
|
110
|
+
* - Secrets Manager: via http://localhost:2773/secretsmanager/get
|
|
111
|
+
*
|
|
112
|
+
* This replaces the insecure unsafeUnwrap() pattern which resolved secrets at
|
|
113
|
+
* deploy time and exposed them in Lambda environment configuration.
|
|
114
|
+
*/
|
|
115
|
+
private addSecretsSupport;
|
|
116
|
+
/**
|
|
117
|
+
* Add the AWS Parameters and Secrets Lambda Extension layer.
|
|
118
|
+
* Configures cache TTL for rotation support.
|
|
119
|
+
*/
|
|
120
|
+
private addSecretsExtensionLayer;
|
|
121
|
+
/**
|
|
122
|
+
* Add Secrets Manager support for CDK-managed secrets (e.g., database credentials).
|
|
123
|
+
* Stores ARN + field as env vars - the Lambda Extension fetches actual values at runtime.
|
|
124
|
+
*/
|
|
125
|
+
private addSecretsManagerSupport;
|
|
126
|
+
/**
|
|
127
|
+
* Add SSM Parameter Store support for user-managed secrets (via fjall secret add).
|
|
128
|
+
* Stores base path and secret names as env vars for consumer code.
|
|
129
|
+
*/
|
|
130
|
+
private addSsmSecretsSupport;
|
|
131
|
+
/**
|
|
132
|
+
* Derive SSM secrets path for Lambda functions.
|
|
133
|
+
* Pattern: /<appName>/lambda/<functionName>
|
|
134
|
+
*/
|
|
135
|
+
private deriveSsmSecretsPath;
|
|
47
136
|
}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.LambdaFunction = exports.SingletonFunction = void 0;
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
6
|
+
const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
|
|
7
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
6
8
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
7
9
|
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
8
10
|
const aws_events_1 = require("aws-cdk-lib/aws-events");
|
|
@@ -11,6 +13,20 @@ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
|
|
11
13
|
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
|
12
14
|
const uuid_1 = require("uuid");
|
|
13
15
|
const vpc_1 = require("../networking/vpc");
|
|
16
|
+
/**
|
|
17
|
+
* AWS Parameters and Secrets Lambda Extension configuration.
|
|
18
|
+
* @see https://docs.aws.amazon.com/systems-manager/latest/userguide/ps-integration-lambda-extensions.html
|
|
19
|
+
*/
|
|
20
|
+
const LAMBDA_SECRETS_EXTENSION = {
|
|
21
|
+
/** AWS account ID that publishes the extension layer */
|
|
22
|
+
ACCOUNT_ID: "177933569100",
|
|
23
|
+
/** Layer name for the extension */
|
|
24
|
+
LAYER_NAME: "AWS-Parameters-and-Secrets-Lambda-Extension",
|
|
25
|
+
/** Current stable version of the extension */
|
|
26
|
+
VERSION: "11",
|
|
27
|
+
/** Cache TTL in seconds - 60s supports secret rotation while reducing API calls */
|
|
28
|
+
CACHE_TTL_SECONDS: "60"
|
|
29
|
+
};
|
|
14
30
|
class SingletonFunction extends aws_lambda_1.SingletonFunction {
|
|
15
31
|
constructor(scope, id, props) {
|
|
16
32
|
super(scope, id, {
|
|
@@ -23,7 +39,6 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
|
|
|
23
39
|
? aws_cdk_lib_1.Size.mebibytes(props.ephemeralStorageSize)
|
|
24
40
|
: undefined
|
|
25
41
|
});
|
|
26
|
-
// Add inline policies to the Lambda's auto-generated role
|
|
27
42
|
this.addPoliciesToRole(props.inlinePolicy);
|
|
28
43
|
}
|
|
29
44
|
/**
|
|
@@ -63,28 +78,27 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
63
78
|
description: props.lambdaDescription || `${id} Lambda`,
|
|
64
79
|
environment: props.environment
|
|
65
80
|
});
|
|
66
|
-
// Add inline policies to the Lambda's auto-generated role
|
|
67
81
|
this.addPoliciesToRole(props.inlinePolicy);
|
|
68
|
-
this.
|
|
82
|
+
this.addSecretsSupport(props.secrets, props.ssmSecretsPath, props.secretsImport, props.appName, props.functionName, props.architecture);
|
|
69
83
|
if (props.enableFunctionUrl) {
|
|
70
84
|
const functionUrl = this.addFunctionUrl({
|
|
71
85
|
authType: props.functionUrlAuthType || aws_lambda_1.FunctionUrlAuthType.AWS_IAM,
|
|
72
|
-
cors: props.functionUrlCors
|
|
86
|
+
cors: props.functionUrlCors,
|
|
87
|
+
invokeMode: props.functionUrlInvokeMode
|
|
73
88
|
});
|
|
89
|
+
this.functionUrlValue = functionUrl.url;
|
|
74
90
|
new aws_cdk_lib_1.CfnOutput(this, `${id}FunctionUrl`, {
|
|
75
91
|
key: `${id}FunctionUrl`,
|
|
76
92
|
value: functionUrl.url,
|
|
77
93
|
description: `${id} Function URL`
|
|
78
94
|
});
|
|
79
95
|
}
|
|
80
|
-
// Add schedule if provided
|
|
81
96
|
if (props.scheduleExpression) {
|
|
82
97
|
const rule = new aws_events_1.Rule(this, `${id}ScheduleRule`, {
|
|
83
98
|
schedule: aws_events_1.Schedule.expression(props.scheduleExpression)
|
|
84
99
|
});
|
|
85
100
|
rule.addTarget(new aws_events_targets_1.LambdaFunction(this));
|
|
86
101
|
}
|
|
87
|
-
// Create log group with one week retention
|
|
88
102
|
new aws_logs_1.LogGroup(this, `${id}LogGroup`, {
|
|
89
103
|
logGroupName: `/aws/lambda/${this.functionName}`,
|
|
90
104
|
retention: aws_logs_1.RetentionDays.ONE_WEEK
|
|
@@ -96,42 +110,205 @@ class LambdaFunction extends aws_lambda_1.Function {
|
|
|
96
110
|
get executionRole() {
|
|
97
111
|
return this.role;
|
|
98
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Get the Lambda function URL if enabled.
|
|
115
|
+
*/
|
|
116
|
+
getFunctionUrl() {
|
|
117
|
+
return this.functionUrlValue;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Add an SQS queue as an event source for this Lambda function.
|
|
121
|
+
* This will trigger the Lambda when messages arrive in the queue.
|
|
122
|
+
*/
|
|
123
|
+
addSqsEventSource(queue, options) {
|
|
124
|
+
const eventSource = new aws_lambda_event_sources_1.SqsEventSource(queue, {
|
|
125
|
+
batchSize: options?.batchSize ?? 10,
|
|
126
|
+
maxBatchingWindow: options?.maxBatchingWindow
|
|
127
|
+
? aws_cdk_lib_1.Duration.seconds(options.maxBatchingWindow)
|
|
128
|
+
: undefined,
|
|
129
|
+
reportBatchItemFailures: options?.reportBatchItemFailures ?? true
|
|
130
|
+
});
|
|
131
|
+
this.addEventSource(eventSource);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Add a DynamoDB table stream as an event source for this Lambda function.
|
|
135
|
+
* This will trigger the Lambda when items are modified in the table.
|
|
136
|
+
* Requires DynamoDB Streams to be enabled on the table.
|
|
137
|
+
*/
|
|
138
|
+
addDynamoDbEventSource(table, options) {
|
|
139
|
+
const startingPosition = options?.startingPosition === "TRIM_HORIZON"
|
|
140
|
+
? aws_lambda_1.StartingPosition.TRIM_HORIZON
|
|
141
|
+
: aws_lambda_1.StartingPosition.LATEST;
|
|
142
|
+
const eventSource = new aws_lambda_event_sources_1.DynamoEventSource(table, {
|
|
143
|
+
startingPosition,
|
|
144
|
+
batchSize: options?.batchSize ?? 100,
|
|
145
|
+
maxBatchingWindow: options?.maxBatchingWindow
|
|
146
|
+
? aws_cdk_lib_1.Duration.seconds(options.maxBatchingWindow)
|
|
147
|
+
: undefined,
|
|
148
|
+
retryAttempts: options?.retryAttempts,
|
|
149
|
+
parallelizationFactor: options?.parallelizationFactor,
|
|
150
|
+
reportBatchItemFailures: options?.reportBatchItemFailures ?? true
|
|
151
|
+
});
|
|
152
|
+
this.addEventSource(eventSource);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Add an S3 bucket as an event source for this Lambda function.
|
|
156
|
+
* This will trigger the Lambda when objects are created, modified, or deleted.
|
|
157
|
+
* Useful for ISR cache invalidation and file processing workflows.
|
|
158
|
+
*/
|
|
159
|
+
addS3EventSource(bucket, options) {
|
|
160
|
+
const eventTypes = (options?.events ?? ["OBJECT_CREATED"]).map((event) => {
|
|
161
|
+
switch (event) {
|
|
162
|
+
case "OBJECT_CREATED":
|
|
163
|
+
return aws_s3_1.EventType.OBJECT_CREATED;
|
|
164
|
+
case "OBJECT_REMOVED":
|
|
165
|
+
return aws_s3_1.EventType.OBJECT_REMOVED;
|
|
166
|
+
case "OBJECT_CREATED_PUT":
|
|
167
|
+
return aws_s3_1.EventType.OBJECT_CREATED_PUT;
|
|
168
|
+
case "OBJECT_CREATED_POST":
|
|
169
|
+
return aws_s3_1.EventType.OBJECT_CREATED_POST;
|
|
170
|
+
case "OBJECT_CREATED_COPY":
|
|
171
|
+
return aws_s3_1.EventType.OBJECT_CREATED_COPY;
|
|
172
|
+
case "OBJECT_REMOVED_DELETE":
|
|
173
|
+
return aws_s3_1.EventType.OBJECT_REMOVED_DELETE;
|
|
174
|
+
default: {
|
|
175
|
+
const _exhaustive = event;
|
|
176
|
+
throw new Error(`Unknown S3 event type: ${_exhaustive}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
const s3EventSourceProps = {
|
|
181
|
+
events: eventTypes,
|
|
182
|
+
filters: options?.filters
|
|
183
|
+
};
|
|
184
|
+
const eventSource = new aws_lambda_event_sources_1.S3EventSource(bucket, s3EventSourceProps);
|
|
185
|
+
this.addEventSource(eventSource);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Add an EventBridge rule as an event source for this Lambda function.
|
|
189
|
+
* This will trigger the Lambda when events matching the pattern are published.
|
|
190
|
+
* Useful for scheduled jobs, cross-service event handling, and custom event patterns.
|
|
191
|
+
*/
|
|
192
|
+
addEventBridgeEventSource(ruleId, options) {
|
|
193
|
+
if (!options.schedule && !options.eventPattern) {
|
|
194
|
+
throw new Error("EventBridge rule requires either schedule or eventPattern");
|
|
195
|
+
}
|
|
196
|
+
const rule = new aws_events_1.Rule(this, ruleId, {
|
|
197
|
+
schedule: options.schedule
|
|
198
|
+
? aws_events_1.Schedule.expression(options.schedule)
|
|
199
|
+
: undefined,
|
|
200
|
+
eventPattern: options.eventPattern,
|
|
201
|
+
description: options.description
|
|
202
|
+
});
|
|
203
|
+
rule.addTarget(new aws_events_targets_1.LambdaFunction(this));
|
|
204
|
+
return rule;
|
|
205
|
+
}
|
|
99
206
|
addPoliciesToRole(statements) {
|
|
100
207
|
for (const statement of statements) {
|
|
101
208
|
this.addToRolePolicy(statement);
|
|
102
209
|
}
|
|
103
210
|
}
|
|
104
|
-
|
|
105
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Add secrets support using AWS Parameters and Secrets Lambda Extension.
|
|
213
|
+
*
|
|
214
|
+
* The extension fetches secrets at runtime from:
|
|
215
|
+
* - SSM Parameter Store: via http://localhost:2773/systemsmanager/parameters/get
|
|
216
|
+
* - Secrets Manager: via http://localhost:2773/secretsmanager/get
|
|
217
|
+
*
|
|
218
|
+
* This replaces the insecure unsafeUnwrap() pattern which resolved secrets at
|
|
219
|
+
* deploy time and exposed them in Lambda environment configuration.
|
|
220
|
+
*/
|
|
221
|
+
addSecretsSupport(secrets, ssmSecretsPath, secretsImport, appName, functionName, architecture) {
|
|
222
|
+
const hasSecretsManager = secretsImport && Object.keys(secretsImport).length > 0;
|
|
223
|
+
const hasSsmSecrets = (secrets?.length ?? 0) > 0;
|
|
224
|
+
if (!hasSecretsManager && !hasSsmSecrets)
|
|
106
225
|
return;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
226
|
+
this.addSecretsExtensionLayer(architecture);
|
|
227
|
+
if (hasSecretsManager) {
|
|
228
|
+
this.addSecretsManagerSupport(secretsImport);
|
|
229
|
+
}
|
|
230
|
+
if (hasSsmSecrets) {
|
|
231
|
+
this.addSsmSecretsSupport(secrets, ssmSecretsPath, appName, functionName);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Add the AWS Parameters and Secrets Lambda Extension layer.
|
|
236
|
+
* Configures cache TTL for rotation support.
|
|
237
|
+
*/
|
|
238
|
+
addSecretsExtensionLayer(architecture) {
|
|
239
|
+
const archSuffix = architecture === aws_lambda_1.Architecture.ARM_64 ? "-Arm64" : "";
|
|
240
|
+
const layerArn = `arn:aws:lambda:${aws_cdk_lib_1.Stack.of(this).region}:${LAMBDA_SECRETS_EXTENSION.ACCOUNT_ID}:layer:` +
|
|
241
|
+
`${LAMBDA_SECRETS_EXTENSION.LAYER_NAME}${archSuffix}:${LAMBDA_SECRETS_EXTENSION.VERSION}`;
|
|
242
|
+
this.addLayers(aws_lambda_1.LayerVersion.fromLayerVersionArn(this, `${this.node.id}SecretsExtension`, layerArn));
|
|
243
|
+
this.addEnvironment("SECRETS_MANAGER_TTL", LAMBDA_SECRETS_EXTENSION.CACHE_TTL_SECONDS);
|
|
244
|
+
this.addEnvironment("SSM_PARAMETER_STORE_TTL", LAMBDA_SECRETS_EXTENSION.CACHE_TTL_SECONDS);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Add Secrets Manager support for CDK-managed secrets (e.g., database credentials).
|
|
248
|
+
* Stores ARN + field as env vars - the Lambda Extension fetches actual values at runtime.
|
|
249
|
+
*/
|
|
250
|
+
addSecretsManagerSupport(secretsImport) {
|
|
251
|
+
for (const [key, secretImport] of Object.entries(secretsImport)) {
|
|
252
|
+
const secret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, `${this.node.id}ImportedSecret${key}`, secretImport.name);
|
|
253
|
+
this.addEnvironment(`${key}_SECRET_ARN`, secret.secretArn);
|
|
254
|
+
if (secretImport.field) {
|
|
255
|
+
this.addEnvironment(`${key}_SECRET_FIELD`, secretImport.field);
|
|
256
|
+
}
|
|
116
257
|
secret.grantRead(this);
|
|
117
|
-
addedSecrets = true;
|
|
118
258
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
259
|
+
this.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
260
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
261
|
+
actions: ["kms:Decrypt", "kms:DescribeKey"],
|
|
262
|
+
resources: ["*"],
|
|
263
|
+
conditions: {
|
|
264
|
+
StringEquals: {
|
|
265
|
+
"kms:ViaService": `secretsmanager.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Add SSM Parameter Store support for user-managed secrets (via fjall secret add).
|
|
272
|
+
* Stores base path and secret names as env vars for consumer code.
|
|
273
|
+
*/
|
|
274
|
+
addSsmSecretsSupport(secrets, ssmSecretsPath, appName, functionName) {
|
|
275
|
+
const basePath = this.deriveSsmSecretsPath(ssmSecretsPath, appName, functionName);
|
|
276
|
+
this.addEnvironment("SSM_SECRETS_PATH", basePath);
|
|
277
|
+
this.addEnvironment("SSM_SECRET_NAMES", secrets.join(","));
|
|
278
|
+
const scopedPath = appName ? `/${appName}/*` : `${basePath}/*`;
|
|
279
|
+
this.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
280
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
281
|
+
actions: ["ssm:GetParameter", "ssm:GetParameters"],
|
|
282
|
+
resources: [
|
|
283
|
+
`arn:aws:ssm:${aws_cdk_lib_1.Stack.of(this).region}:*:parameter${scopedPath}`
|
|
284
|
+
]
|
|
285
|
+
}));
|
|
286
|
+
this.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
287
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
288
|
+
actions: ["kms:Decrypt"],
|
|
289
|
+
resources: ["*"],
|
|
290
|
+
conditions: {
|
|
291
|
+
StringEquals: {
|
|
292
|
+
"kms:ViaService": `ssm.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`
|
|
131
293
|
}
|
|
132
|
-
}
|
|
294
|
+
}
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Derive SSM secrets path for Lambda functions.
|
|
299
|
+
* Pattern: /<appName>/lambda/<functionName>
|
|
300
|
+
*/
|
|
301
|
+
deriveSsmSecretsPath(explicitPath, appName, functionName) {
|
|
302
|
+
if (explicitPath) {
|
|
303
|
+
return explicitPath;
|
|
304
|
+
}
|
|
305
|
+
if (!appName || !functionName) {
|
|
306
|
+
throw new Error("Lambda function has secrets defined but no ssmSecretsPath is set " +
|
|
307
|
+
"and appName/functionName are not available. " +
|
|
308
|
+
"Either set ssmSecretsPath explicitly, or ensure App.getName() returns a value.");
|
|
133
309
|
}
|
|
310
|
+
return `/${appName}/lambda/${functionName}`;
|
|
134
311
|
}
|
|
135
312
|
}
|
|
136
313
|
exports.LambdaFunction = LambdaFunction;
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQStEO0FBQy9ELHVEQU9nQztBQUNoQyxpREFBMEU7QUFDMUUsaURBQTREO0FBQzVELHVEQUF3RDtBQUN4RCx1RUFBZ0Y7QUFDaEYsbURBQStEO0FBQy9ELHVFQUF3RDtBQUV4RCwrQkFBa0M7QUFHbEMsMkNBQXdDO0FBc0N4QyxNQUFhLGlCQUFrQixTQUFRLDhCQUFpQjtJQUN0RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsSUFBSSxFQUFFLElBQUEsU0FBSSxHQUFFO1lBQ1osT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxtQkFBbUI7WUFDaEUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7Z0JBQzlDLENBQUMsQ0FBQyxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsMERBQTBEO1FBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU8saUJBQWlCLENBQUMsVUFBNkI7UUFDckQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxJQUFJ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RUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCO3FCQUMxRTtpQkFDRjthQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZIRCx3Q0F1SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjaywgU2l6ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgU2luZ2xldG9uRnVuY3Rpb24gYXMgc2luZ2xldG9uRnVuY3Rpb24sXG4gIEZ1bmN0aW9uLFxuICB0eXBlIENvZGUsXG4gIHR5cGUgUnVudGltZSxcbiAgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIHR5cGUgSVJvbGUsIEVmZmVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMsIFN1Ym5ldFR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgUnVsZSwgU2NoZWR1bGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gYXMgTGFtYmRhVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgdHlwZSBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uL25ldHdvcmtpbmcvdnBjXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgbGFtYmRhRnVuY3Rpb25Qcm9wcyB7XG4gIGNvZGU6IENvZGU7XG4gIGhhbmRsZXI6IHN0cmluZztcbiAgbGFtYmRhRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJvbGVEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcnVudGltZTogUnVudGltZTtcbiAgdnBjPzogSVZwYztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgaW5saW5lUG9saWN5OiBQb2xpY3lTdGF0ZW1lbnRbXTtcblxuICAvLyBMYW1iZGEgVVJMIHByb3BlcnRpZXNcbiAgZW5hYmxlRnVuY3Rpb25Vcmw/OiBib29sZWFuO1xuICBmdW5jdGlvblVybEF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgZnVuY3Rpb25VcmxDb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcblxuICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgZW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcblxuICAvLyBUYWdzXG4gIHRhZ3M/OiBLZXlWYWx1ZTtcblxuICAvLyBTY2hlZHVsZSAoY3JvbiBvciByYXRlKVxuICBzY2hlZHVsZUV4cHJlc3Npb24/OiBzdHJpbmc7IC8vIGUuZy4gJ2Nyb24oMCAxMiAqICogPyAqKScgb3IgJ3JhdGUoNSBtaW51dGVzKSdcblxuICAvLyBDb250YWluZXIgc2VjcmV0cyBpbXBvcnQgKGtleTogZW52IHZhciwgdmFsdWU6IFNlY3JldEltcG9ydClcbiAgY29udGFpbmVyU2VjcmV0c0ltcG9ydD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWNyZXRJbXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xldG9uRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYUZ1bmN0aW9uUHJvcHMge1xuICB1dWlkPzogc3RyaW5nO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbmdsZXRvbkZ1bmN0aW9uIGV4dGVuZHMgc2luZ2xldG9uRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2luZ2xldG9uRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB1dWlkOiB1dWlkKCksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMubGFtYmRhRGVzY3JpcHRpb24gfHwgYCR7aWR9IHNpbmdsZXRvbiBsYW1iZGFgLFxuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZVxuICAgICAgICA/IFNpemUubWViaWJ5dGVzKHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGlubGluZSBwb2xpY2llcyB0byB0aGUgTGFtYmRhJ3MgYXV0by1nZW5lcmF0ZWQgcm9sZVxuICAgIHRoaXMuYWRkUG9saWNpZXNUb1JvbGUocHJvcHMuaW5saW5lUG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhJ3MgZXhlY3V0aW9uIHJvbGUgKGF1dG8tZ2VuZXJhdGVkIGJ5IENESylcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhlY3V0aW9uUm9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUG9saWNpZXNUb1JvbGUoc3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBsYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgc3VibmV0IHNlbGVjdGlvbiB0byBtYXRjaCBWUEMgZW5kcG9pbnQgcGxhY2VtZW50XG4gICAgLy8gLSBXaXRoIE5BVDogUFJJVkFURV9XSVRIX0VHUkVTUyAoY2FuIGFjY2VzcyBpbnRlcm5ldCB2aWEgTkFUKVxuICAgIC8vIC0gV2l0aG91dCBOQVQ6IFBSSVZBVEVfSVNPTEFURUQgKGNhbiBhY2Nlc3MgVlBDIGVuZHBvaW50cyBvbmx5LCBubyBpbnRlcm5ldClcbiAgICBsZXQgdnBjU3VibmV0cztcbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICBjb25zdCBoYXNOYXRHYXRld2F5cyA9XG4gICAgICAgIHByb3BzLnZwYyBpbnN0YW5jZW9mIFZwYyA/IHByb3BzLnZwYy5oYXNOYXRHYXRld2F5cyA6IHRydWU7XG4gICAgICB2cGNTdWJuZXRzID0ge1xuICAgICAgICBzdWJuZXRUeXBlOiBoYXNOYXRHYXRld2F5c1xuICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgOiBTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhwcm9wcy50aW1lb3V0KVxuICAgICAgICA6IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgfHwgMTI4LFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBMYW1iZGFgLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgaW5saW5lIHBvbGljaWVzIHRvIHRoZSBMYW1iZGEncyBhdXRvLWdlbmVyYXRlZCByb2xlXG4gICAgdGhpcy5hZGRQb2xpY2llc1RvUm9sZShwcm9wcy5pbmxpbmVQb2xpY3kpO1xuICAgIHRoaXMuYWRkQ29udGFpbmVyU2VjcmV0c0ltcG9ydFRvUm9sZShpZCwgcHJvcHMuY29udGFpbmVyU2VjcmV0c0ltcG9ydCk7XG5cbiAgICBpZiAocHJvcHMuZW5hYmxlRnVuY3Rpb25VcmwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uVXJsID0gdGhpcy5hZGRGdW5jdGlvblVybCh7XG4gICAgICAgIGF1dGhUeXBlOiBwcm9wcy5mdW5jdGlvblVybEF1dGhUeXBlIHx8IEZ1bmN0aW9uVXJsQXV0aFR5cGUuQVdTX0lBTSxcbiAgICAgICAgY29yczogcHJvcHMuZnVuY3Rpb25VcmxDb3JzXG4gICAgICB9KTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1GdW5jdGlvblVybGAsIHtcbiAgICAgICAga2V5OiBgJHtpZH1GdW5jdGlvblVybGAsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvblVybC51cmwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpZH0gRnVuY3Rpb24gVVJMYFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNjaGVkdWxlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgY29uc3QgcnVsZSA9IG5ldyBSdWxlKHRoaXMsIGAke2lkfVNjaGVkdWxlUnVsZWAsIHtcbiAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uKVxuICAgICAgfSk7XG4gICAgICBydWxlLmFkZFRhcmdldChuZXcgTGFtYmRhVGFyZ2V0KHRoaXMpKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbG9nIGdyb3VwIHdpdGggb25lIHdlZWsgcmV0ZW50aW9uXG4gICAgbmV3IExvZ0dyb3VwKHRoaXMsIGAke2lkfUxvZ0dyb3VwYCwge1xuICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHt0aGlzLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9XRUVLXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIExhbWJkYSdzIGV4ZWN1dGlvbiByb2xlIChhdXRvLWdlbmVyYXRlZCBieSBDREspXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4ZWN1dGlvblJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICBwcml2YXRlIGFkZFBvbGljaWVzVG9Sb2xlKHN0YXRlbWVudHM6IFBvbGljeVN0YXRlbWVudFtdKSB7XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENvbnRhaW5lclNlY3JldHNJbXBvcnRUb1JvbGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb250YWluZXJTZWNyZXRzSW1wb3J0Pzoge1xuICAgICAgW2tleTogc3RyaW5nXTogU2VjcmV0SW1wb3J0O1xuICAgIH1cbiAgKSB7XG4gICAgaWYgKCFjb250YWluZXJTZWNyZXRzSW1wb3J0KSByZXR1cm47XG5cbiAgICBsZXQgYWRkZWRTZWNyZXRzID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHNlY3JldEltcG9ydF0gb2YgT2JqZWN0LmVudHJpZXMoY29udGFpbmVyU2VjcmV0c0ltcG9ydCkpIHtcbiAgICAgIC8vIEltcG9ydCB0aGUgc2VjcmV0IGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gICAgICBjb25zdCBzZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7aWR9SW1wb3J0ZWRTZWNyZXQke2tleX1gLFxuICAgICAgICBzZWNyZXRJbXBvcnQubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRm9yIExhbWJkYSwgaW5qZWN0IHRoZSBzZWNyZXQgQVJOIGFzIGFuIGVudiB2YXJcbiAgICAgIC8vIFRoZSBMYW1iZGEgZnVuY3Rpb24gY29kZSB3aWxsIHJldHJpZXZlIHRoZSBhY3R1YWwgdmFsdWUgYXQgcnVudGltZVxuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHNlY3JldC5zZWNyZXRBcm4pO1xuXG4gICAgICAvLyBHcmFudCByZWFkIGFjY2VzcyB0byB0aGUgbGFtYmRhIGl0c2VsZlxuICAgICAgLy8gKHRoaXMgc2hvdWxkIGF1dG8gYXR0YWNoIHRvIHRoZSBnZW5lcmF0ZWQgcm9sZSlcbiAgICAgIHNlY3JldC5ncmFudFJlYWQodGhpcyk7XG5cbiAgICAgIGFkZGVkU2VjcmV0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGFkZGVkU2VjcmV0cykge1xuICAgICAgLy8gQWRkIEtNUyBkZWNyeXB0IHBlcm1pc3Npb25zIGZvciBzZWNyZXRzXG4gICAgICAvLyBXaGVuIGltcG9ydGluZyBzZWNyZXRzIHdpdGggZnJvbVNlY3JldE5hbWVWMiwgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIEtNUyBrZXksXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIGdyYW50IGRlY3J5cHQgcGVybWlzc2lvbiBvbiBhbGwga2V5cyB1c2VkIGJ5IFNlY3JldHMgTWFuYWdlclxuICAgICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCIsIFwia21zOkRlc2NyaWJlS2V5XCJdLFxuICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgXCJrbXM6VmlhU2VydmljZVwiOiBgc2VjcmV0c21hbmFnZXIuJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQStEO0FBQy9ELHVEQVdnQztBQUNoQyxtRkFLOEM7QUFDOUMsK0NBQTREO0FBQzVELGlEQUEwRTtBQUMxRSxpREFBNEQ7QUFDNUQsdURBQTJFO0FBQzNFLHVFQUFnRjtBQUNoRixtREFBK0Q7QUFDL0QsdUVBQXdEO0FBSXhELCtCQUFrQztBQUdsQywyQ0FBd0M7QUFFeEM7OztHQUdHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRztJQUMvQix3REFBd0Q7SUFDeEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsbUNBQW1DO0lBQ25DLFVBQVUsRUFBRSw2Q0FBNkM7SUFDekQsOENBQThDO0lBQzlDLE9BQU8sRUFBRSxJQUFJO0lBQ2IsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLElBQUk7Q0FDZixDQUFDO0FBdUNYLE1BQWEsaUJBQWtCLFNBQVEsOEJBQWlCO0lBQ3RELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLEtBQUs7WUFDUixJQUFJLEVBQUUsSUFBQSxTQUFJLEdBQUU7WUFDWixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsaUJBQWlCLElBQUksR0FBRyxFQUFFLG1CQUFtQjtZQUNoRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQjtnQkFDOUMsQ0FBQyxDQUFDLGtCQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDLENBQUM7UUFFSCxJQUFJ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QixTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDaEIsVUFBVSxFQUFFO2dCQUNWLFlBQVksRUFBRTtvQkFDWixnQkFBZ0IsRUFBRSxPQUFPLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCO2lCQUMvRDthQUNGO1NBQ0YsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQzFCLFlBQXFCLEVBQ3JCLE9BQWdCLEVBQ2hCLFlBQXFCO1FBRXJCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUNiLG1FQUFtRTtnQkFDakUsOENBQThDO2dCQUM5QyxnRkFBZ0YsQ0FDbkYsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksT0FBTyxXQUFXLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQTVZRCx3Q0E0WUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjaywgU2l6ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgU2luZ2xldG9uRnVuY3Rpb24gYXMgc2luZ2xldG9uRnVuY3Rpb24sXG4gIEZ1bmN0aW9uLFxuICB0eXBlIENvZGUsXG4gIHR5cGUgUnVudGltZSxcbiAgQXJjaGl0ZWN0dXJlLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIHR5cGUgSW52b2tlTW9kZSxcbiAgU3RhcnRpbmdQb3NpdGlvbixcbiAgTGF5ZXJWZXJzaW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICBTcXNFdmVudFNvdXJjZSxcbiAgRHluYW1vRXZlbnRTb3VyY2UsXG4gIFMzRXZlbnRTb3VyY2UsXG4gIHR5cGUgUzNFdmVudFNvdXJjZVByb3BzXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXNcIjtcbmltcG9ydCB7IHR5cGUgQnVja2V0LCBFdmVudFR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIHR5cGUgSVJvbGUsIEVmZmVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMsIFN1Ym5ldFR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgUnVsZSwgU2NoZWR1bGUsIHR5cGUgRXZlbnRQYXR0ZXJuIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIGFzIExhbWJkYVRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIElRdWV1ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3FzXCI7XG5pbXBvcnQgeyB0eXBlIElUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgdHlwZSBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uL25ldHdvcmtpbmcvdnBjXCI7XG5cbi8qKlxuICogQVdTIFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbiBjb25maWd1cmF0aW9uLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3lzdGVtcy1tYW5hZ2VyL2xhdGVzdC91c2VyZ3VpZGUvcHMtaW50ZWdyYXRpb24tbGFtYmRhLWV4dGVuc2lvbnMuaHRtbFxuICovXG5jb25zdCBMQU1CREFfU0VDUkVUU19FWFRFTlNJT04gPSB7XG4gIC8qKiBBV1MgYWNjb3VudCBJRCB0aGF0IHB1Ymxpc2hlcyB0aGUgZXh0ZW5zaW9uIGxheWVyICovXG4gIEFDQ09VTlRfSUQ6IFwiMTc3OTMzNTY5MTAwXCIsXG4gIC8qKiBMYXllciBuYW1lIGZvciB0aGUgZXh0ZW5zaW9uICovXG4gIExBWUVSX05BTUU6IFwiQVdTLVBhcmFtZXRlcnMtYW5kLVNlY3JldHMtTGFtYmRhLUV4dGVuc2lvblwiLFxuICAvKiogQ3VycmVudCBzdGFibGUgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9uICovXG4gIFZFUlNJT046IFwiMTFcIixcbiAgLyoqIENhY2hlIFRUTCBpbiBzZWNvbmRzIC0gNjBzIHN1cHBvcnRzIHNlY3JldCByb3RhdGlvbiB3aGlsZSByZWR1Y2luZyBBUEkgY2FsbHMgKi9cbiAgQ0FDSEVfVFRMX1NFQ09ORFM6IFwiNjBcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBsYW1iZGFGdW5jdGlvblByb3BzIHtcbiAgY29kZTogQ29kZTtcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBsYW1iZGFEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcm9sZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBydW50aW1lOiBSdW50aW1lO1xuICAvKiogTGFtYmRhIENQVSBhcmNoaXRlY3R1cmUuIERlZmF1bHQ6IHg4Nl82NCAqL1xuICBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG4gIHZwYz86IElWcGM7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIGlubGluZVBvbGljeTogUG9saWN5U3RhdGVtZW50W107XG5cbiAgZW5hYmxlRnVuY3Rpb25Vcmw/OiBib29sZWFuO1xuICBmdW5jdGlvblVybEF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgZnVuY3Rpb25VcmxDb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcbiAgLyoqIEludm9rZSBtb2RlIGZvciBGdW5jdGlvbiBVUkwuIFVzZSBSRVNQT05TRV9TVFJFQU0gZm9yIExhbWJkYSBzdHJlYW1pbmcuICovXG4gIGZ1bmN0aW9uVXJsSW52b2tlTW9kZT86IEludm9rZU1vZGU7XG5cbiAgZW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcblxuICB0YWdzPzogS2V5VmFsdWU7XG5cbiAgc2NoZWR1bGVFeHByZXNzaW9uPzogc3RyaW5nO1xuXG4gIHNlY3JldHM/OiBzdHJpbmdbXTtcbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xldG9uRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYUZ1bmN0aW9uUHJvcHMge1xuICB1dWlkPzogc3RyaW5nO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbmdsZXRvbkZ1bmN0aW9uIGV4dGVuZHMgc2luZ2xldG9uRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2luZ2xldG9uRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB1dWlkOiB1dWlkKCksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMubGFtYmRhRGVzY3JpcHRpb24gfHwgYCR7aWR9IHNpbmdsZXRvbiBsYW1iZGFgLFxuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZVxuICAgICAgICA/IFNpemUubWViaWJ5dGVzKHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRQb2xpY2llc1RvUm9sZShwcm9wcy5pbmxpbmVQb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEncyBleGVjdXRpb24gcm9sZSAoYXV0by1nZW5lcmF0ZWQgYnkgQ0RLKVxuICAgKi9cbiAgcHVibGljIGdldCBleGVjdXRpb25Sb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQb2xpY2llc1RvUm9sZShzdGF0ZW1lbnRzOiBQb2xpY3lTdGF0ZW1lbnRbXSkge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMpIHtcbiAgICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbiBleHRlbmRzIEZ1bmN0aW9uIHtcbiAgcHJpdmF0ZSBmdW5jdGlvblVybFZhbHVlPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBsYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgc3VibmV0IHNlbGVjdGlvbiB0byBtYXRjaCBWUEMgZW5kcG9pbnQgcGxhY2VtZW50XG4gICAgLy8gLSBXaXRoIE5BVDogUFJJVkFURV9XSVRIX0VHUkVTUyAoY2FuIGFjY2VzcyBpbnRlcm5ldCB2aWEgTkFUKVxuICAgIC8vIC0gV2l0aG91dCBOQVQ6IFBSSVZBVEVfSVNPTEFURUQgKGNhbiBhY2Nlc3MgVlBDIGVuZHBvaW50cyBvbmx5LCBubyBpbnRlcm5ldClcbiAgICBsZXQgdnBjU3VibmV0cztcbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICBjb25zdCBoYXNOYXRHYXRld2F5cyA9XG4gICAgICAgIHByb3BzLnZwYyBpbnN0YW5jZW9mIFZwYyA/IHByb3BzLnZwYy5oYXNOYXRHYXRld2F5cyA6IHRydWU7XG4gICAgICB2cGNTdWJuZXRzID0ge1xuICAgICAgICBzdWJuZXRUeXBlOiBoYXNOYXRHYXRld2F5c1xuICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgOiBTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhwcm9wcy50aW1lb3V0KVxuICAgICAgICA6IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgfHwgMTI4LFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBMYW1iZGFgLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZFBvbGljaWVzVG9Sb2xlKHByb3BzLmlubGluZVBvbGljeSk7XG5cbiAgICB0aGlzLmFkZFNlY3JldHNTdXBwb3J0KFxuICAgICAgcHJvcHMuc2VjcmV0cyxcbiAgICAgIHByb3BzLnNzbVNlY3JldHNQYXRoLFxuICAgICAgcHJvcHMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIHByb3BzLmFwcE5hbWUsXG4gICAgICBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBwcm9wcy5hcmNoaXRlY3R1cmVcbiAgICApO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZUZ1bmN0aW9uVXJsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvblVybCA9IHRoaXMuYWRkRnVuY3Rpb25Vcmwoe1xuICAgICAgICBhdXRoVHlwZTogcHJvcHMuZnVuY3Rpb25VcmxBdXRoVHlwZSB8fCBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgIGNvcnM6IHByb3BzLmZ1bmN0aW9uVXJsQ29ycyxcbiAgICAgICAgaW52b2tlTW9kZTogcHJvcHMuZnVuY3Rpb25VcmxJbnZva2VNb2RlXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5mdW5jdGlvblVybFZhbHVlID0gZnVuY3Rpb25VcmwudXJsO1xuXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUZ1bmN0aW9uVXJsYCwge1xuICAgICAgICBrZXk6IGAke2lkfUZ1bmN0aW9uVXJsYCxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uVXJsLnVybCxcbiAgICAgICAgZGVzY3JpcHRpb246IGAke2lkfSBGdW5jdGlvbiBVUkxgXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uKSB7XG4gICAgICBjb25zdCBydWxlID0gbmV3IFJ1bGUodGhpcywgYCR7aWR9U2NoZWR1bGVSdWxlYCwge1xuICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuZXhwcmVzc2lvbihwcm9wcy5zY2hlZHVsZUV4cHJlc3Npb24pXG4gICAgICB9KTtcbiAgICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyBMYW1iZGFUYXJnZXQodGhpcykpO1xuICAgIH1cblxuICAgIG5ldyBMb2dHcm91cCh0aGlzLCBgJHtpZH1Mb2dHcm91cGAsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7dGhpcy5mdW5jdGlvbk5hbWV9YCxcbiAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfV0VFS1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEncyBleGVjdXRpb24gcm9sZSAoYXV0by1nZW5lcmF0ZWQgYnkgQ0RLKVxuICAgKi9cbiAgcHVibGljIGdldCBleGVjdXRpb25Sb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTGFtYmRhIGZ1bmN0aW9uIFVSTCBpZiBlbmFibGVkLlxuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9uVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25VcmxWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gU1FTIHF1ZXVlIGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBtZXNzYWdlcyBhcnJpdmUgaW4gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGFkZFNxc0V2ZW50U291cmNlKFxuICAgIHF1ZXVlOiBJUXVldWUsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgICAgIG1heEJhdGNoaW5nV2luZG93PzogbnVtYmVyO1xuICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgU3FzRXZlbnRTb3VyY2UocXVldWUsIHtcbiAgICAgIGJhdGNoU2l6ZTogb3B0aW9ucz8uYmF0Y2hTaXplID8/IDEwLFxuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c6IG9wdGlvbnM/Lm1heEJhdGNoaW5nV2luZG93XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhvcHRpb25zLm1heEJhdGNoaW5nV2luZG93KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzOiBvcHRpb25zPy5yZXBvcnRCYXRjaEl0ZW1GYWlsdXJlcyA/PyB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudFNvdXJjZShldmVudFNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgRHluYW1vREIgdGFibGUgc3RyZWFtIGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBpdGVtcyBhcmUgbW9kaWZpZWQgaW4gdGhlIHRhYmxlLlxuICAgKiBSZXF1aXJlcyBEeW5hbW9EQiBTdHJlYW1zIHRvIGJlIGVuYWJsZWQgb24gdGhlIHRhYmxlLlxuICAgKi9cbiAgcHVibGljIGFkZER5bmFtb0RiRXZlbnRTb3VyY2UoXG4gICAgdGFibGU6IElUYWJsZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAgICAgc3RhcnRpbmdQb3NpdGlvbj86IFwiVFJJTV9IT1JJWk9OXCIgfCBcIkxBVEVTVFwiO1xuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c/OiBudW1iZXI7XG4gICAgICByZXRyeUF0dGVtcHRzPzogbnVtYmVyO1xuICAgICAgcGFyYWxsZWxpemF0aW9uRmFjdG9yPzogbnVtYmVyO1xuICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnRpbmdQb3NpdGlvbiA9XG4gICAgICBvcHRpb25zPy5zdGFydGluZ1Bvc2l0aW9uID09PSBcIlRSSU1fSE9SSVpPTlwiXG4gICAgICAgID8gU3RhcnRpbmdQb3NpdGlvbi5UUklNX0hPUklaT05cbiAgICAgICAgOiBTdGFydGluZ1Bvc2l0aW9uLkxBVEVTVDtcblxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IER5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICBzdGFydGluZ1Bvc2l0aW9uLFxuICAgICAgYmF0Y2hTaXplOiBvcHRpb25zPy5iYXRjaFNpemUgPz8gMTAwLFxuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c6IG9wdGlvbnM/Lm1heEJhdGNoaW5nV2luZG93XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhvcHRpb25zLm1heEJhdGNoaW5nV2luZG93KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJldHJ5QXR0ZW1wdHM6IG9wdGlvbnM/LnJldHJ5QXR0ZW1wdHMsXG4gICAgICBwYXJhbGxlbGl6YXRpb25GYWN0b3I6IG9wdGlvbnM/LnBhcmFsbGVsaXphdGlvbkZhY3RvcixcbiAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzOiBvcHRpb25zPy5yZXBvcnRCYXRjaEl0ZW1GYWlsdXJlcyA/PyB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudFNvdXJjZShldmVudFNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIFMzIGJ1Y2tldCBhcyBhbiBldmVudCBzb3VyY2UgZm9yIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgTGFtYmRhIHdoZW4gb2JqZWN0cyBhcmUgY3JlYXRlZCwgbW9kaWZpZWQsIG9yIGRlbGV0ZWQuXG4gICAqIFVzZWZ1bCBmb3IgSVNSIGNhY2hlIGludmFsaWRhdGlvbiBhbmQgZmlsZSBwcm9jZXNzaW5nIHdvcmtmbG93cy5cbiAgICovXG4gIHB1YmxpYyBhZGRTM0V2ZW50U291cmNlKFxuICAgIGJ1Y2tldDogQnVja2V0LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBldmVudHM/OiBBcnJheTxcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEXCJcbiAgICAgICAgfCBcIk9CSkVDVF9SRU1PVkVEXCJcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEX1BVVFwiXG4gICAgICAgIHwgXCJPQkpFQ1RfQ1JFQVRFRF9QT1NUXCJcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEX0NPUFlcIlxuICAgICAgICB8IFwiT0JKRUNUX1JFTU9WRURfREVMRVRFXCJcbiAgICAgID47XG4gICAgICBmaWx0ZXJzPzogQXJyYXk8eyBwcmVmaXg/OiBzdHJpbmc7IHN1ZmZpeD86IHN0cmluZyB9PjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50VHlwZXMgPSAob3B0aW9ucz8uZXZlbnRzID8/IFtcIk9CSkVDVF9DUkVBVEVEXCJdKS5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRFwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQ7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfUkVNT1ZFRFwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQ7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRF9QVVRcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX1BVVDtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9DUkVBVEVEX1BPU1RcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX1BPU1Q7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRF9DT1BZXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRF9DT1BZO1xuICAgICAgICBjYXNlIFwiT0JKRUNUX1JFTU9WRURfREVMRVRFXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRF9ERUxFVEU7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBldmVudDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUzMgZXZlbnQgdHlwZTogJHtfZXhoYXVzdGl2ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgczNFdmVudFNvdXJjZVByb3BzOiBTM0V2ZW50U291cmNlUHJvcHMgPSB7XG4gICAgICBldmVudHM6IGV2ZW50VHlwZXMsXG4gICAgICBmaWx0ZXJzOiBvcHRpb25zPy5maWx0ZXJzXG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IFMzRXZlbnRTb3VyY2UoYnVja2V0LCBzM0V2ZW50U291cmNlUHJvcHMpO1xuICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnRTb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBFdmVudEJyaWRnZSBydWxlIGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBldmVudHMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gYXJlIHB1Ymxpc2hlZC5cbiAgICogVXNlZnVsIGZvciBzY2hlZHVsZWQgam9icywgY3Jvc3Mtc2VydmljZSBldmVudCBoYW5kbGluZywgYW5kIGN1c3RvbSBldmVudCBwYXR0ZXJucy5cbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudEJyaWRnZUV2ZW50U291cmNlKFxuICAgIHJ1bGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHNjaGVkdWxlPzogc3RyaW5nO1xuICAgICAgZXZlbnRQYXR0ZXJuPzogRXZlbnRQYXR0ZXJuO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfVxuICApOiBSdWxlIHtcbiAgICBpZiAoIW9wdGlvbnMuc2NoZWR1bGUgJiYgIW9wdGlvbnMuZXZlbnRQYXR0ZXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRXZlbnRCcmlkZ2UgcnVsZSByZXF1aXJlcyBlaXRoZXIgc2NoZWR1bGUgb3IgZXZlbnRQYXR0ZXJuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVsZSA9IG5ldyBSdWxlKHRoaXMsIHJ1bGVJZCwge1xuICAgICAgc2NoZWR1bGU6IG9wdGlvbnMuc2NoZWR1bGVcbiAgICAgICAgPyBTY2hlZHVsZS5leHByZXNzaW9uKG9wdGlvbnMuc2NoZWR1bGUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnRQYXR0ZXJuOiBvcHRpb25zLmV2ZW50UGF0dGVybixcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uXG4gICAgfSk7XG5cbiAgICBydWxlLmFkZFRhcmdldChuZXcgTGFtYmRhVGFyZ2V0KHRoaXMpKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUG9saWNpZXNUb1JvbGUoc3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc2VjcmV0cyBzdXBwb3J0IHVzaW5nIEFXUyBQYXJhbWV0ZXJzIGFuZCBTZWNyZXRzIExhbWJkYSBFeHRlbnNpb24uXG4gICAqXG4gICAqIFRoZSBleHRlbnNpb24gZmV0Y2hlcyBzZWNyZXRzIGF0IHJ1bnRpbWUgZnJvbTpcbiAgICogLSBTU00gUGFyYW1ldGVyIFN0b3JlOiB2aWEgaHR0cDovL2xvY2FsaG9zdDoyNzczL3N5c3RlbXNtYW5hZ2VyL3BhcmFtZXRlcnMvZ2V0XG4gICAqIC0gU2VjcmV0cyBNYW5hZ2VyOiB2aWEgaHR0cDovL2xvY2FsaG9zdDoyNzczL3NlY3JldHNtYW5hZ2VyL2dldFxuICAgKlxuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBpbnNlY3VyZSB1bnNhZmVVbndyYXAoKSBwYXR0ZXJuIHdoaWNoIHJlc29sdmVkIHNlY3JldHMgYXRcbiAgICogZGVwbG95IHRpbWUgYW5kIGV4cG9zZWQgdGhlbSBpbiBMYW1iZGEgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYWRkU2VjcmV0c1N1cHBvcnQoXG4gICAgc2VjcmV0cz86IHN0cmluZ1tdLFxuICAgIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nLFxuICAgIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+LFxuICAgIGFwcE5hbWU/OiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nLFxuICAgIGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoYXNTZWNyZXRzTWFuYWdlciA9XG4gICAgICBzZWNyZXRzSW1wb3J0ICYmIE9iamVjdC5rZXlzKHNlY3JldHNJbXBvcnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaGFzU3NtU2VjcmV0cyA9IChzZWNyZXRzPy5sZW5ndGggPz8gMCkgPiAwO1xuXG4gICAgaWYgKCFoYXNTZWNyZXRzTWFuYWdlciAmJiAhaGFzU3NtU2VjcmV0cykgcmV0dXJuO1xuXG4gICAgdGhpcy5hZGRTZWNyZXRzRXh0ZW5zaW9uTGF5ZXIoYXJjaGl0ZWN0dXJlKTtcblxuICAgIGlmIChoYXNTZWNyZXRzTWFuYWdlcikge1xuICAgICAgdGhpcy5hZGRTZWNyZXRzTWFuYWdlclN1cHBvcnQoc2VjcmV0c0ltcG9ydCk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NzbVNlY3JldHMpIHtcbiAgICAgIHRoaXMuYWRkU3NtU2VjcmV0c1N1cHBvcnQoXG4gICAgICAgIHNlY3JldHMhLFxuICAgICAgICBzc21TZWNyZXRzUGF0aCxcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgZnVuY3Rpb25OYW1lXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIEFXUyBQYXJhbWV0ZXJzIGFuZCBTZWNyZXRzIExhbWJkYSBFeHRlbnNpb24gbGF5ZXIuXG4gICAqIENvbmZpZ3VyZXMgY2FjaGUgVFRMIGZvciByb3RhdGlvbiBzdXBwb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTZWNyZXRzRXh0ZW5zaW9uTGF5ZXIoYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlKTogdm9pZCB7XG4gICAgY29uc3QgYXJjaFN1ZmZpeCA9IGFyY2hpdGVjdHVyZSA9PT0gQXJjaGl0ZWN0dXJlLkFSTV82NCA/IFwiLUFybTY0XCIgOiBcIlwiO1xuICAgIGNvbnN0IGxheWVyQXJuID1cbiAgICAgIGBhcm46YXdzOmxhbWJkYToke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn06JHtMQU1CREFfU0VDUkVUU19FWFRFTlNJT04uQUNDT1VOVF9JRH06bGF5ZXI6YCArXG4gICAgICBgJHtMQU1CREFfU0VDUkVUU19FWFRFTlNJT04uTEFZRVJfTkFNRX0ke2FyY2hTdWZmaXh9OiR7TEFNQkRBX1NFQ1JFVFNfRVhURU5TSU9OLlZFUlNJT059YDtcblxuICAgIHRoaXMuYWRkTGF5ZXJzKFxuICAgICAgTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMubm9kZS5pZH1TZWNyZXRzRXh0ZW5zaW9uYCxcbiAgICAgICAgbGF5ZXJBcm5cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudChcbiAgICAgIFwiU0VDUkVUU19NQU5BR0VSX1RUTFwiLFxuICAgICAgTEFNQkRBX1NFQ1JFVFNfRVhURU5TSU9OLkNBQ0hFX1RUTF9TRUNPTkRTXG4gICAgKTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFxuICAgICAgXCJTU01fUEFSQU1FVEVSX1NUT1JFX1RUTFwiLFxuICAgICAgTEFNQkRBX1NFQ1JFVFNfRVhURU5TSU9OLkNBQ0hFX1RUTF9TRUNPTkRTXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgU2VjcmV0cyBNYW5hZ2VyIHN1cHBvcnQgZm9yIENESy1tYW5hZ2VkIHNlY3JldHMgKGUuZy4sIGRhdGFiYXNlIGNyZWRlbnRpYWxzKS5cbiAgICogU3RvcmVzIEFSTiArIGZpZWxkIGFzIGVudiB2YXJzIC0gdGhlIExhbWJkYSBFeHRlbnNpb24gZmV0Y2hlcyBhY3R1YWwgdmFsdWVzIGF0IHJ1bnRpbWUuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlY3JldHNNYW5hZ2VyU3VwcG9ydChcbiAgICBzZWNyZXRzSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+XG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgc2VjcmV0SW1wb3J0XSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzSW1wb3J0KSkge1xuICAgICAgY29uc3Qgc2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMubm9kZS5pZH1JbXBvcnRlZFNlY3JldCR7a2V5fWAsXG4gICAgICAgIHNlY3JldEltcG9ydC5uYW1lXG4gICAgICApO1xuXG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGAke2tleX1fU0VDUkVUX0FSTmAsIHNlY3JldC5zZWNyZXRBcm4pO1xuICAgICAgaWYgKHNlY3JldEltcG9ydC5maWVsZCkge1xuICAgICAgICB0aGlzLmFkZEVudmlyb25tZW50KGAke2tleX1fU0VDUkVUX0ZJRUxEYCwgc2VjcmV0SW1wb3J0LmZpZWxkKTtcbiAgICAgIH1cblxuICAgICAgc2VjcmV0LmdyYW50UmVhZCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wia21zOkRlY3J5cHRcIiwgXCJrbXM6RGVzY3JpYmVLZXlcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgXCJrbXM6VmlhU2VydmljZVwiOiBgc2VjcmV0c21hbmFnZXIuJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFNTTSBQYXJhbWV0ZXIgU3RvcmUgc3VwcG9ydCBmb3IgdXNlci1tYW5hZ2VkIHNlY3JldHMgKHZpYSBmamFsbCBzZWNyZXQgYWRkKS5cbiAgICogU3RvcmVzIGJhc2UgcGF0aCBhbmQgc2VjcmV0IG5hbWVzIGFzIGVudiB2YXJzIGZvciBjb25zdW1lciBjb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTc21TZWNyZXRzU3VwcG9ydChcbiAgICBzZWNyZXRzOiBzdHJpbmdbXSxcbiAgICBzc21TZWNyZXRzUGF0aD86IHN0cmluZyxcbiAgICBhcHBOYW1lPzogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMuZGVyaXZlU3NtU2VjcmV0c1BhdGgoXG4gICAgICBzc21TZWNyZXRzUGF0aCxcbiAgICAgIGFwcE5hbWUsXG4gICAgICBmdW5jdGlvbk5hbWVcbiAgICApO1xuXG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudChcIlNTTV9TRUNSRVRTX1BBVEhcIiwgYmFzZVBhdGgpO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoXCJTU01fU0VDUkVUX05BTUVTXCIsIHNlY3JldHMuam9pbihcIixcIikpO1xuXG4gICAgY29uc3Qgc2NvcGVkUGF0aCA9IGFwcE5hbWUgPyBgLyR7YXBwTmFtZX0vKmAgOiBgJHtiYXNlUGF0aH0vKmA7XG4gICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcInNzbTpHZXRQYXJhbWV0ZXJcIiwgXCJzc206R2V0UGFyYW1ldGVyc1wiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYGFybjphd3M6c3NtOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToqOnBhcmFtZXRlciR7c2NvcGVkUGF0aH1gXG4gICAgICAgIF1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJrbXM6RGVjcnlwdFwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICBcImttczpWaWFTZXJ2aWNlXCI6IGBzc20uJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIFNTTSBzZWNyZXRzIHBhdGggZm9yIExhbWJkYSBmdW5jdGlvbnMuXG4gICAqIFBhdHRlcm46IC88YXBwTmFtZT4vbGFtYmRhLzxmdW5jdGlvbk5hbWU+XG4gICAqL1xuICBwcml2YXRlIGRlcml2ZVNzbVNlY3JldHNQYXRoKFxuICAgIGV4cGxpY2l0UGF0aD86IHN0cmluZyxcbiAgICBhcHBOYW1lPzogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGlmIChleHBsaWNpdFBhdGgpIHtcbiAgICAgIHJldHVybiBleHBsaWNpdFBhdGg7XG4gICAgfVxuXG4gICAgaWYgKCFhcHBOYW1lIHx8ICFmdW5jdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJMYW1iZGEgZnVuY3Rpb24gaGFzIHNlY3JldHMgZGVmaW5lZCBidXQgbm8gc3NtU2VjcmV0c1BhdGggaXMgc2V0IFwiICtcbiAgICAgICAgICBcImFuZCBhcHBOYW1lL2Z1bmN0aW9uTmFtZSBhcmUgbm90IGF2YWlsYWJsZS4gXCIgK1xuICAgICAgICAgIFwiRWl0aGVyIHNldCBzc21TZWNyZXRzUGF0aCBleHBsaWNpdGx5LCBvciBlbnN1cmUgQXBwLmdldE5hbWUoKSByZXR1cm5zIGEgdmFsdWUuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAvJHthcHBOYW1lfS9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YDtcbiAgfVxufVxuIl19
|
|
@@ -25,4 +25,4 @@ class Database extends constructs_1.Construct {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
exports.default = Database;
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLDJDQUF1QztBQUd2Qyx5QkFBK0I7QUFNL0IsTUFBcUIsUUFBUyxTQUFRLHNCQUFTO0lBSzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQy9DLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQ1YsRUFBVSxFQUNWLEtBQThCO1FBRTlCLE9BQU8sQ0FBQyxFQUFnQixFQUFFLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQWtCO2dCQUM5QixHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUcsRUFBRSxDQUFDLFVBQVUsRUFBVSxJQUFJLEtBQUssRUFBRSxHQUFHO2lCQUM1QzthQUNGLENBQUM7WUFFRixPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaENELDJCQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIFZwY1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgdHlwZSBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgUmRzQXVyb3JhIH0gZnJvbSBcIi4vXCI7XG5cbmludGVyZmFjZSBEYXRhYmFzZVByb3BzIHtcbiAgdnBjOiBWcGM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZTogUmRzQXVyb3JhO1xuICBwdWJsaWMgY29ubmVjdGlvbnMhOiBDb25uZWN0aW9ucztcbiAgcHVibGljIGRhdGFiYXNlU2VjcmV0TmFtZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IFJkc0F1cm9yYShzY29wZSwgYCR7aWR9UmRzYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkYXRhYmFzZU5hbWU6IGlkLnJlcGxhY2UoXCJEYXRhYmFzZVwiLCBcIlwiKVxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMucmVzb3VyY2UuY29ubmVjdGlvbnM7XG4gIH1cblxuICAvL3RvZG86IG1vdmUgdG8gZ2VuZXJpYyAncmVzb3VyY2UnIGNsYXNzXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzPzogUGFydGlhbDxEYXRhYmFzZVByb3BzPlxuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBEYXRhYmFzZVByb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogKHNiLmdldE5ldHdvcmsoKSBhcyBWcGMpIHx8IHByb3BzPy52cGNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { type ITable } from "aws-cdk-lib/aws-dynamodb";
|
|
3
|
+
import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
|
|
4
|
+
export type DynamoDBAttributeType = "S" | "N" | "B";
|
|
5
|
+
export interface DynamoDBKeySchema {
|
|
6
|
+
name: string;
|
|
7
|
+
type: DynamoDBAttributeType;
|
|
8
|
+
}
|
|
9
|
+
export interface DynamoDBGlobalSecondaryIndex {
|
|
10
|
+
indexName: string;
|
|
11
|
+
partitionKey: DynamoDBKeySchema;
|
|
12
|
+
sortKey?: DynamoDBKeySchema;
|
|
13
|
+
projectionType?: "ALL" | "KEYS_ONLY" | "INCLUDE";
|
|
14
|
+
nonKeyAttributes?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface DynamoDBTableProps {
|
|
17
|
+
tableName?: string;
|
|
18
|
+
partitionKey: DynamoDBKeySchema;
|
|
19
|
+
sortKey?: DynamoDBKeySchema;
|
|
20
|
+
billingMode?: "PAY_PER_REQUEST" | "PROVISIONED";
|
|
21
|
+
readCapacity?: number;
|
|
22
|
+
writeCapacity?: number;
|
|
23
|
+
globalSecondaryIndexes?: DynamoDBGlobalSecondaryIndex[];
|
|
24
|
+
timeToLiveAttribute?: string;
|
|
25
|
+
stream?: "NEW_IMAGE" | "OLD_IMAGE" | "NEW_AND_OLD_IMAGES" | "KEYS_ONLY";
|
|
26
|
+
pointInTimeRecovery?: boolean;
|
|
27
|
+
encryption?: "AWS_OWNED" | "AWS_MANAGED" | "CUSTOMER_MANAGED";
|
|
28
|
+
removalPolicy?: "DESTROY" | "RETAIN" | "SNAPSHOT";
|
|
29
|
+
}
|
|
30
|
+
export declare class DynamoDBTable extends Construct {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
private table;
|
|
33
|
+
constructor(scope: Construct, id: string, props: DynamoDBTableProps);
|
|
34
|
+
/**
|
|
35
|
+
* Get the DynamoDB table name.
|
|
36
|
+
*/
|
|
37
|
+
getTableName(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get the DynamoDB table ARN.
|
|
40
|
+
*/
|
|
41
|
+
getTableArn(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get the DynamoDB table stream ARN (if streaming is enabled).
|
|
44
|
+
*/
|
|
45
|
+
getTableStreamArn(): string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Get the underlying CDK Table construct.
|
|
48
|
+
*/
|
|
49
|
+
getTable(): ITable;
|
|
50
|
+
/**
|
|
51
|
+
* Grant read permissions to the grantee.
|
|
52
|
+
*/
|
|
53
|
+
grantRead(grantee: IGrantable): Grant;
|
|
54
|
+
/**
|
|
55
|
+
* Grant write permissions to the grantee.
|
|
56
|
+
*/
|
|
57
|
+
grantWrite(grantee: IGrantable): Grant;
|
|
58
|
+
/**
|
|
59
|
+
* Grant read and write permissions to the grantee.
|
|
60
|
+
*/
|
|
61
|
+
grantReadWrite(grantee: IGrantable): Grant;
|
|
62
|
+
/**
|
|
63
|
+
* Grant full access (read, write, delete) to the grantee.
|
|
64
|
+
*/
|
|
65
|
+
grantFullAccess(grantee: IGrantable): Grant;
|
|
66
|
+
/**
|
|
67
|
+
* Grant stream read permissions to the grantee.
|
|
68
|
+
*/
|
|
69
|
+
grantStreamRead(grantee: IGrantable): Grant;
|
|
70
|
+
}
|