UNPKG

cdk-nextjs-standalone

Version:

Deploy a NextJS app to AWS using CDK and OpenNext.

139 lines 22.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.NextjsRevalidation = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = require("fs"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources"); const aws_logs_1 = require("aws-cdk-lib/aws-logs"); const aws_sqs_1 = require("aws-cdk-lib/aws-sqs"); const custom_resources_1 = require("aws-cdk-lib/custom-resources"); const constructs_1 = require("constructs"); const common_lambda_props_1 = require("./utils/common-lambda-props"); /** * Builds the system for revalidating Next.js resources. This includes a Lambda function handler and queue system as well * as the DynamoDB table and provider function. * * @see {@link https://github.com/serverless-stack/open-next/blob/main/README.md?plain=1#L65} * */ class NextjsRevalidation extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.props = props; this.queue = this.createQueue(); this.queueFunction = this.createQueueFunction(); this.table = this.createRevalidationTable(); this.tableFunction = this.createRevalidationInsertFunction(this.table); this.props.serverFunction.lambdaFunction.addEnvironment('CACHE_DYNAMO_TABLE', this.table.tableName); if (this.props.serverFunction.lambdaFunction.role) { this.table.grantReadWriteData(this.props.serverFunction.lambdaFunction.role); } this.props.serverFunction.lambdaFunction // allow server fn to send messages to queue ?.addEnvironment('REVALIDATION_QUEUE_URL', this.queue.queueUrl); props.serverFunction.lambdaFunction?.addEnvironment('REVALIDATION_QUEUE_REGION', aws_cdk_lib_1.Stack.of(this).region); } createQueue() { const queue = new aws_sqs_1.Queue(this, 'Queue', { fifo: true, receiveMessageWaitTime: aws_cdk_lib_1.Duration.seconds(20), ...this.props.overrides?.queueProps, }); // https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-least-privilege-policy.html queue.addToResourcePolicy(new aws_iam_1.PolicyStatement({ sid: 'DenyUnsecureTransport', actions: ['sqs:*'], effect: aws_iam_1.Effect.DENY, principals: [new aws_iam_1.AnyPrincipal()], resources: [queue.queueArn], conditions: { Bool: { 'aws:SecureTransport': 'false' }, }, })); // Allow server to send messages to the queue queue.grantSendMessages(this.props.serverFunction.lambdaFunction); return queue; } createQueueFunction() { const commonFnProps = (0, common_lambda_props_1.getCommonFunctionProps)(this); const fn = new aws_lambda_1.Function(this, 'QueueFn', { ...commonFnProps, // open-next revalidation-function // see: https://github.com/serverless-stack/open-next/blob/274d446ed7e940cfbe7ce05a21108f4c854ee37a/README.md?plain=1#L65 code: aws_lambda_1.Code.fromAsset(this.props.nextBuild.nextRevalidateFnDir), handler: 'index.handler', description: 'Next.js Queue Revalidation Function', timeout: aws_cdk_lib_1.Duration.seconds(30), ...this.props.overrides?.queueFunctionProps, }); fn.addEventSource(new aws_lambda_event_sources_1.SqsEventSource(this.queue, { batchSize: 5 })); return fn; } createRevalidationTable() { return new aws_dynamodb_1.TableV2(this, 'Table', { partitionKey: { name: 'tag', type: aws_dynamodb_1.AttributeType.STRING }, sortKey: { name: 'path', type: aws_dynamodb_1.AttributeType.STRING }, billing: aws_dynamodb_1.Billing.onDemand(), globalSecondaryIndexes: [ { indexName: 'revalidate', partitionKey: { name: 'path', type: aws_dynamodb_1.AttributeType.STRING }, sortKey: { name: 'revalidatedAt', type: aws_dynamodb_1.AttributeType.NUMBER }, }, ], removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, ...this.props.overrides?.tableProps, }); } /** * This function will insert the initial batch of tag / path / revalidation data into the DynamoDB table during deployment. * @see: {@link https://open-next.js.org/inner_workings/isr#tags} * * @param revalidationTable table to grant function access to * @returns the revalidation insert provider function */ createRevalidationInsertFunction(revalidationTable) { const dynamodbProviderPath = this.props.nextBuild.nextRevalidateDynamoDBProviderFnDir; // note the function may not exist - it only exists if there are cache tags values defined in Next.js build meta files to be inserted // see: https://github.com/sst/open-next/blob/c2b05e3a5f82de40da1181e11c087265983c349d/packages/open-next/src/build.ts#L426-L458 if (fs.existsSync(dynamodbProviderPath)) { const commonFnProps = (0, common_lambda_props_1.getCommonFunctionProps)(this); const insertFn = new aws_lambda_1.Function(this, 'DynamoDBProviderFn', { ...commonFnProps, // open-next revalidation-function // see: https://github.com/serverless-stack/open-next/blob/274d446ed7e940cfbe7ce05a21108f4c854ee37a/README.md?plain=1#L65 code: aws_lambda_1.Code.fromAsset(this.props.nextBuild.nextRevalidateDynamoDBProviderFnDir), handler: 'index.handler', description: 'Next.js Revalidation DynamoDB Provider', timeout: aws_cdk_lib_1.Duration.minutes(1), environment: { CACHE_DYNAMO_TABLE: revalidationTable.tableName, }, ...this.props.overrides?.insertFunctionProps, }); revalidationTable.grantReadWriteData(insertFn); const provider = new custom_resources_1.Provider(this, 'DynamoDBProvider', { onEventHandler: insertFn, logRetention: aws_logs_1.RetentionDays.ONE_DAY, ...this.props.overrides?.insertProviderProps, }); new aws_cdk_lib_1.CustomResource(this, 'DynamoDBResource', { serviceToken: provider.serviceToken, properties: { version: Date.now().toString(), }, ...this.props.overrides?.insertCustomResourceProps, }); return insertFn; } return undefined; } } exports.NextjsRevalidation = NextjsRevalidation; _a = JSII_RTTI_SYMBOL_1; NextjsRevalidation[_a] = { fqn: "cdk-nextjs-standalone.NextjsRevalidation", version: "4.2.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzUmV2YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL05leHRqc1JldmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2Q0FBNkU7QUFDN0UsMkRBQW9GO0FBQ3BGLGlEQUE0RTtBQUM1RSx1REFBMkY7QUFDM0YsbUZBQXNFO0FBQ3RFLG1EQUFxRDtBQUNyRCxpREFBd0Q7QUFDeEQsbUVBQXdEO0FBQ3hELDJDQUF1QztBQVN2QyxxRUFBcUU7QUE4QnJFOzs7Ozs7R0FNRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFPL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMs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RUFBRSxrQkFBa0IsRUFBRTtnQkFDdEQsY0FBYyxFQUFFLFFBQVE7Z0JBQ3hCLFlBQVksRUFBRSx3QkFBYSxDQUFDLE9BQU87Z0JBQ25DLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsbUJBQW1CO2FBQzdDLENBQUMsQ0FBQztZQUVILElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQzNDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtnQkFDbkMsVUFBVSxFQUFFO29CQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO2lCQUMvQjtnQkFDRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHlCQUF5QjthQUNuRCxDQUFDLENBQUM7WUFFSCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzs7QUFySUgsZ0RBc0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmcsIFRhYmxlVjIgYXMgVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgQW55UHJpbmNpcGFsLCBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24sIEZ1bmN0aW9uT3B0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgU3FzRXZlbnRTb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0IHsgUmV0ZW50aW9uRGF5cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IFF1ZXVlLCBRdWV1ZVByb3BzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBPcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHMsXG4gIE9wdGlvbmFsRnVuY3Rpb25Qcm9wcyxcbiAgT3B0aW9uYWxQcm92aWRlclByb3BzLFxuICBPcHRpb25hbFRhYmxlUHJvcHNWMixcbn0gZnJvbSAnLi9nZW5lcmF0ZWQtc3RydWN0cyc7XG5pbXBvcnQgeyBOZXh0anNCdWlsZCB9IGZyb20gJy4vTmV4dGpzQnVpbGQnO1xuaW1wb3J0IHsgTmV4dGpzU2VydmVyIH0gZnJvbSAnLi9OZXh0anNTZXJ2ZXInO1xuaW1wb3J0IHsgZ2V0Q29tbW9uRnVuY3Rpb25Qcm9wcyB9IGZyb20gJy4vdXRpbHMvY29tbW9uLWxhbWJkYS1wcm9wcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmV2YWxpZGF0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgcXVldWVQcm9wcz86IFF1ZXVlUHJvcHM7XG4gIHJlYWRvbmx5IHF1ZXVlRnVuY3Rpb25Qcm9wcz86IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcztcbiAgcmVhZG9ubHkgdGFibGVQcm9wcz86IE9wdGlvbmFsVGFibGVQcm9wc1YyO1xuICByZWFkb25seSBpbnNlcnRGdW5jdGlvblByb3BzPzogT3B0aW9uYWxGdW5jdGlvblByb3BzO1xuICByZWFkb25seSBpbnNlcnRQcm92aWRlclByb3BzPzogT3B0aW9uYWxQcm92aWRlclByb3BzO1xuICByZWFkb25seSBpbnNlcnRDdXN0b21SZXNvdXJjZVByb3BzPzogT3B0aW9uYWxDdXN0b21SZXNvdXJjZVByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1JldmFsaWRhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIGZ1bmN0aW9uIHByb3BlcnRpZXMuXG4gICAqL1xuICByZWFkb25seSBsYW1iZGFPcHRpb25zPzogRnVuY3Rpb25PcHRpb25zO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQnVpbGR9XG4gICAqL1xuICByZWFkb25seSBuZXh0QnVpbGQ6IE5leHRqc0J1aWxkO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1JldmFsaWRhdGlvbk92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc1NlcnZlcn1cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlckZ1bmN0aW9uOiBOZXh0anNTZXJ2ZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzeXN0ZW0gZm9yIHJldmFsaWRhdGluZyBOZXh0LmpzIHJlc291cmNlcy4gVGhpcyBpbmNsdWRlcyBhIExhbWJkYSBmdW5jdGlvbiBoYW5kbGVyIGFuZCBxdWV1ZSBzeXN0ZW0gYXMgd2VsbFxuICogYXMgdGhlIER5bmFtb0RCIHRhYmxlIGFuZCBwcm92aWRlciBmdW5jdGlvbi5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc2VydmVybGVzcy1zdGFjay9vcGVuLW5leHQvYmxvYi9tYWluL1JFQURNRS5tZD9wbGFpbj0xI0w2NX1cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNSZXZhbGlkYXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBxdWV1ZTogUXVldWU7XG4gIHRhYmxlOiBUYWJsZTtcbiAgcXVldWVGdW5jdGlvbjogTGFtYmRhRnVuY3Rpb247XG4gIHRhYmxlRnVuY3Rpb246IExhbWJkYUZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByb3BzOiBOZXh0anNSZXZhbGlkYXRpb25Qcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzUmV2YWxpZGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMucXVldWUgPSB0aGlzLmNyZWF0ZVF1ZXVlKCk7XG4gICAgdGhpcy5xdWV1ZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVRdWV1ZUZ1bmN0aW9uKCk7XG5cbiAgICB0aGlzLnRhYmxlID0gdGhpcy5jcmVhdGVSZXZhbGlkYXRpb25UYWJsZSgpO1xuICAgIHRoaXMudGFibGVGdW5jdGlvbiA9IHRoaXMuY3JlYXRlUmV2YWxpZGF0aW9uSW5zZXJ0RnVuY3Rpb24odGhpcy50YWJsZSk7XG5cbiAgICB0aGlzLnByb3BzLnNlcnZlckZ1bmN0aW9uLmxhbWJkYUZ1bmN0aW9uLmFkZEVudmlyb25tZW50KCdDQUNIRV9EWU5BTU9fVEFCTEUnLCB0aGlzLnRhYmxlLnRhYmxlTmFtZSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5zZXJ2ZXJGdW5jdGlvbi5sYW1iZGFGdW5jdGlvbi5yb2xlKSB7XG4gICAgICB0aGlzLnRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YSh0aGlzLnByb3BzLnNlcnZlckZ1bmN0aW9uLmxhbWJkYUZ1bmN0aW9uLnJvbGUpO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMuc2VydmVyRnVuY3Rpb24ubGFtYmRhRnVuY3Rpb24gLy8gYWxsb3cgc2VydmVyIGZuIHRvIHNlbmQgbWVzc2FnZXMgdG8gcXVldWVcbiAgICAgID8uYWRkRW52aXJvbm1lbnQoJ1JFVkFMSURBVElPTl9RVUVVRV9VUkwnLCB0aGlzLnF1ZXVlLnF1ZXVlVXJsKTtcbiAgICBwcm9wcy5zZXJ2ZXJGdW5jdGlvbi5sYW1iZGFGdW5jdGlvbj8uYWRkRW52aXJvbm1lbnQoJ1JFVkFMSURBVElPTl9RVUVVRV9SRUdJT04nLCBTdGFjay5vZih0aGlzKS5yZWdpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVRdWV1ZSgpOiBRdWV1ZSB7XG4gICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUodGhpcywgJ1F1ZXVlJywge1xuICAgICAgZmlmbzogdHJ1ZSxcbiAgICAgIHJlY2VpdmVNZXNzYWdlV2FpdFRpbWU6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnF1ZXVlUHJvcHMsXG4gICAgfSk7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU1NpbXBsZVF1ZXVlU2VydmljZS9sYXRlc3QvU1FTRGV2ZWxvcGVyR3VpZGUvc3FzLWxlYXN0LXByaXZpbGVnZS1wb2xpY3kuaHRtbFxuICAgIHF1ZXVlLmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiAnRGVueVVuc2VjdXJlVHJhbnNwb3J0JyxcbiAgICAgICAgYWN0aW9uczogWydzcXM6KiddLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5ERU5ZLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IEFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcXVldWUucXVldWVBcm5dLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgQm9vbDogeyAnYXdzOlNlY3VyZVRyYW5zcG9ydCc6ICdmYWxzZScgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICAvLyBBbGxvdyBzZXJ2ZXIgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgcXVldWVcbiAgICBxdWV1ZS5ncmFudFNlbmRNZXNzYWdlcyh0aGlzLnByb3BzLnNlcnZlckZ1bmN0aW9uLmxhbWJkYUZ1bmN0aW9uKTtcbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVF1ZXVlRnVuY3Rpb24oKTogTGFtYmRhRnVuY3Rpb24ge1xuICAgIGNvbnN0IGNvbW1vbkZuUHJvcHMgPSBnZXRDb21tb25GdW5jdGlvblByb3BzKHRoaXMpO1xuICAgIGNvbnN0IGZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMsICdRdWV1ZUZuJywge1xuICAgICAgLi4uY29tbW9uRm5Qcm9wcyxcbiAgICAgIC8vIG9wZW4tbmV4dCByZXZhbGlkYXRpb24tZnVuY3Rpb25cbiAgICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3NlcnZlcmxlc3Mtc3RhY2svb3Blbi1uZXh0L2Jsb2IvMjc0ZDQ0NmVkN2U5NDBjZmJlN2NlMDVhMjExMDhmNGM4NTRlZTM3YS9SRUFETUUubWQ/cGxhaW49MSNMNjVcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHRoaXMucHJvcHMubmV4dEJ1aWxkLm5leHRSZXZhbGlkYXRlRm5EaXIpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgZGVzY3JpcHRpb246ICdOZXh0LmpzIFF1ZXVlIFJldmFsaWRhdGlvbiBGdW5jdGlvbicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5xdWV1ZUZ1bmN0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgZm4uYWRkRXZlbnRTb3VyY2UobmV3IFNxc0V2ZW50U291cmNlKHRoaXMucXVldWUsIHsgYmF0Y2hTaXplOiA1IH0pKTtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvblRhYmxlKCkge1xuICAgIHJldHVybiBuZXcgVGFibGUodGhpcywgJ1RhYmxlJywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6ICd0YWcnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgc29ydEtleTogeyBuYW1lOiAncGF0aCcsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICBiaWxsaW5nOiBCaWxsaW5nLm9uRGVtYW5kKCksXG4gICAgICBnbG9iYWxTZWNvbmRhcnlJbmRleGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRleE5hbWU6ICdyZXZhbGlkYXRlJyxcbiAgICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogJ3BhdGgnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICAgIHNvcnRLZXk6IHsgbmFtZTogJ3JldmFsaWRhdGVkQXQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLk5VTUJFUiB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy50YWJsZVByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgdGhlIGluaXRpYWwgYmF0Y2ggb2YgdGFnIC8gcGF0aCAvIHJldmFsaWRhdGlvbiBkYXRhIGludG8gdGhlIER5bmFtb0RCIHRhYmxlIGR1cmluZyBkZXBsb3ltZW50LlxuICAgKiBAc2VlOiB7QGxpbmsgaHR0cHM6Ly9vcGVuLW5leHQuanMub3JnL2lubmVyX3dvcmtpbmdzL2lzciN0YWdzfVxuICAgKlxuICAgKiBAcGFyYW0gcmV2YWxpZGF0aW9uVGFibGUgdGFibGUgdG8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvXG4gICAqIEByZXR1cm5zIHRoZSByZXZhbGlkYXRpb24gaW5zZXJ0IHByb3ZpZGVyIGZ1bmN0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvbkluc2VydEZ1bmN0aW9uKHJldmFsaWRhdGlvblRhYmxlOiBUYWJsZSkge1xuICAgIGNvbnN0IGR5bmFtb2RiUHJvdmlkZXJQYXRoID0gdGhpcy5wcm9wcy5uZXh0QnVpbGQubmV4dFJldmFsaWRhdGVEeW5hbW9EQlByb3ZpZGVyRm5EaXI7XG5cbiAgICAvLyBub3RlIHRoZSBmdW5jdGlvbiBtYXkgbm90IGV4aXN0IC0gaXQgb25seSBleGlzdHMgaWYgdGhlcmUgYXJlIGNhY2hlIHRhZ3MgdmFsdWVzIGRlZmluZWQgaW4gTmV4dC5qcyBidWlsZCBtZXRhIGZpbGVzIHRvIGJlIGluc2VydGVkXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vc3N0L29wZW4tbmV4dC9ibG9iL2MyYjA1ZTNhNWY4MmRlNDBkYTExODFlMTFjMDg3MjY1OTgzYzM0OWQvcGFja2FnZXMvb3Blbi1uZXh0L3NyYy9idWlsZC50cyNMNDI2LUw0NThcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkeW5hbW9kYlByb3ZpZGVyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbW1vbkZuUHJvcHMgPSBnZXRDb21tb25GdW5jdGlvblByb3BzKHRoaXMpO1xuICAgICAgY29uc3QgaW5zZXJ0Rm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24odGhpcywgJ0R5bmFtb0RCUHJvdmlkZXJGbicsIHtcbiAgICAgICAgLi4uY29tbW9uRm5Qcm9wcyxcbiAgICAgICAgLy8gb3Blbi1uZXh0IHJldmFsaWRhdGlvbi1mdW5jdGlvblxuICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXJ2ZXJsZXNzLXN0YWNrL29wZW4tbmV4dC9ibG9iLzI3NGQ0NDZlZDdlOTQwY2ZiZTdjZTA1YTIxMTA4ZjRjODU0ZWUzN2EvUkVBRE1FLm1kP3BsYWluPTEjTDY1XG4gICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHRoaXMucHJvcHMubmV4dEJ1aWxkLm5leHRSZXZhbGlkYXRlRHluYW1vREJQcm92aWRlckZuRGlyKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ05leHQuanMgUmV2YWxpZGF0aW9uIER5bmFtb0RCIFByb3ZpZGVyJyxcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBDQUNIRV9EWU5BTU9fVEFCTEU6IHJldmFsaWRhdGlvblRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lmluc2VydEZ1bmN0aW9uUHJvcHMsXG4gICAgICB9KTtcblxuICAgICAgcmV2YWxpZGF0aW9uVGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGluc2VydEZuKTtcblxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ0R5bmFtb0RCUHJvdmlkZXInLCB7XG4gICAgICAgIG9uRXZlbnRIYW5kbGVyOiBpbnNlcnRGbixcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9EQVksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbnNlcnRQcm92aWRlclByb3BzLFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnRHluYW1vREJSZXNvdXJjZScsIHtcbiAgICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICB2ZXJzaW9uOiBEYXRlLm5vdygpLnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbnNlcnRDdXN0b21SZXNvdXJjZVByb3BzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBpbnNlcnRGbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=