UNPKG

turbo-remote-cache-construct

Version:

A Turborepo Remote Cache implementation using AWS API Gateway, Lambda, S3, and DynamoDB.

108 lines 16.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LambdaFunctions = void 0; const constructs_1 = require("constructs"); const lambda = require("aws-cdk-lib/aws-lambda"); const path = require("path"); class LambdaFunctions extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.recordEventsFunction = new lambda.Function(this, 'RecordEventsFunction', { runtime: lambda.Runtime.NODEJS_20_X, functionName: 'turbo-remote-cache-record-events', handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/record-events')), environment: { EVENTS_TABLE_NAME: props.eventsTable.tableName, }, ...props.lambdaProps, }); this.artifactQueryFunction = new lambda.Function(this, 'ArtifactQueryFunction', { runtime: lambda.Runtime.NODEJS_20_X, functionName: 'turbo-remote-cache-artifact-query', handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/artifact-query')), environment: { EVENTS_TABLE_NAME: props.eventsTable.tableName, }, ...props.lambdaProps, }); this.statusFunction = new lambda.Function(this, 'StatusFunction', { runtime: lambda.Runtime.NODEJS_20_X, functionName: 'turbo-remote-cache-status', handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/status')), environment: { BUCKET_NAME: props.artifactsBucket.bucketName, }, ...props.lambdaProps, }); if (props.authorizerFunction) { this.authorizerFunction = props.authorizerFunction; } else { this.authorizerFunction = new lambda.Function(this, 'TokenAuthorizerFunction', { runtime: lambda.Runtime.NODEJS_20_X, functionName: 'turbo-remote-cache-token-authorizer', handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/token-authorizer')), environment: { TURBO_TOKEN: process.env.TURBO_TOKEN, }, ...props.lambdaProps, }); } if (props.userInfoFunction) { this.getUserInfoFunction = props.userInfoFunction; } else { this.getUserInfoFunction = new lambda.Function(this, 'GetUserInfoFunction', { runtime: lambda.Runtime.NODEJS_20_X, functionName: 'turbo-remote-cache-get-user-info', handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/get-user-info')), ...props.lambdaProps, }); } this.preflightArtifactFunction = new lambda.Function(this, 'PreflightArtifactFunction', { runtime: lambda.Runtime.NODEJS_20_X, functionName: 'turbo-remote-cache-preflight-artifact', handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/preflight-artifact')), environment: { ARTIFACTS_BUCKET: props.artifactsBucket.bucketName, }, }); // turbo login // TODO: implement lambda authorizer to validate third party JWT // this.initiateLoginFunction = new lambda.Function(this, 'InitiateLoginFunction', { // runtime: lambda.Runtime.NODEJS_20_X, // functionName: 'turbo-remote-cache-initiate-login', // handler: 'index.handler', // code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/initiate-login')), // environment: { // TURBO_TOKEN: process.env.TURBO_TOKEN!, // }, // ...props.lambdaProps, // }); // this.loginSuccessFunction = new lambda.Function(this, 'LoginSuccessFunction', { // runtime: lambda.Runtime.NODEJS_20_X, // functionName: 'turbo-remote-cache-login-success', // handler: 'index.handler', // code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/dist/login-success')), // environment: { // TURBO_TOKEN: process.env.TURBO_TOKEN!, // }, // ...props.lambdaProps, // }); props.artifactsBucket.grantRead(this.artifactQueryFunction); props.artifactsBucket.grantReadWrite(this.recordEventsFunction); props.artifactsBucket.grantRead(this.statusFunction); // Grant permissions props.eventsTable.grantReadWriteData(this.recordEventsFunction); props.eventsTable.grantReadData(this.artifactQueryFunction); props.artifactsBucket.grantReadWrite(this.preflightArtifactFunction); } } exports.LambdaFunctions = LambdaFunctions; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsaURBQWlEO0FBR2pELDZCQUE2QjtBQVU3QixNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFVNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzVFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsWUFBWSxFQUFFLGtDQUFrQztZQUNoRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsOEJBQThCLENBQUMsQ0FBQztZQUNqRixXQUFXLEVBQUU7Z0JBQ1gsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTO2FBQy9DO1lBQ0QsR0FBRyxLQUFLLENBQUMsV0FBVztTQUNyQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUM5RSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLFlBQVksRUFBRSxtQ0FBbUM7WUFDakQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLCtCQUErQixDQUFDLENBQUM7WUFDbEYsV0FBVyxFQUFFO2dCQUNYLGlCQUFpQixFQUFFLEtBQUss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RU4sa0ZBQWtGO1FBQ2xGLHlDQUF5QztRQUN6QyxzREFBc0Q7UUFDdEQsOEJBQThCO1FBQzlCLHVGQUF1RjtRQUN2RixtQkFBbUI7UUFDbkIsNkNBQTZDO1FBQzdDLE9BQU87UUFDUCwwQkFBMEI7UUFDMUIsTUFBTTtRQUVOLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVELEtBQUssQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2hFLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVyRCxvQkFBb0I7UUFDcEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRSxLQUFLLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUU1RCxLQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUN2RSxDQUFDO0NBQ0Y7QUFySEQsMENBcUhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uc1Byb3BzIHtcbiAgYXJ0aWZhY3RzQnVja2V0OiBzMy5CdWNrZXQ7XG4gIGV2ZW50c1RhYmxlOiBkeW5hbW9kYi5UYWJsZTtcbiAgbGFtYmRhUHJvcHM/OiBQYXJ0aWFsPGxhbWJkYS5GdW5jdGlvblByb3BzPjtcbiAgYXV0aG9yaXplckZ1bmN0aW9uPzogbGFtYmRhLkZ1bmN0aW9uO1xuICB1c2VySW5mb0Z1bmN0aW9uPzogbGFtYmRhLkZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb25zIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHJlY29yZEV2ZW50c0Z1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBhcnRpZmFjdFF1ZXJ5RnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0Z1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBpbml0aWF0ZUxvZ2luRnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGxvZ2luU3VjY2Vzc0Z1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBnZXRVc2VySW5mb0Z1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBhdXRob3JpemVyRnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHByZWZsaWdodEFydGlmYWN0RnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhRnVuY3Rpb25zUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5yZWNvcmRFdmVudHNGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ1JlY29yZEV2ZW50c0Z1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBmdW5jdGlvbk5hbWU6ICd0dXJiby1yZW1vdGUtY2FjaGUtcmVjb3JkLWV2ZW50cycsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS9kaXN0L3JlY29yZC1ldmVudHMnKSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBFVkVOVFNfVEFCTEVfTkFNRTogcHJvcHMuZXZlbnRzVGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLnByb3BzLmxhbWJkYVByb3BzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcnRpZmFjdFF1ZXJ5RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdBcnRpZmFjdFF1ZXJ5RnVuY3Rpb24nLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ3R1cmJvLXJlbW90ZS1jYWNoZS1hcnRpZmFjdC1xdWVyeScsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS9kaXN0L2FydGlmYWN0LXF1ZXJ5JykpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgRVZFTlRTX1RBQkxFX05BTUU6IHByb3BzLmV2ZW50c1RhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcy5sYW1iZGFQcm9wcyxcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdHVzRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdTdGF0dXNGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgZnVuY3Rpb25OYW1lOiAndHVyYm8tcmVtb3RlLWNhY2hlLXN0YXR1cycsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS9kaXN0L3N0YXR1cycpKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIEJVQ0tFVF9OQU1FOiBwcm9wcy5hcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcy5sYW1iZGFQcm9wcyxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5hdXRob3JpemVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuYXV0aG9yaXplckZ1bmN0aW9uID0gcHJvcHMuYXV0aG9yaXplckZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF1dGhvcml6ZXJGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ1Rva2VuQXV0aG9yaXplckZ1bmN0aW9uJywge1xuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAndHVyYm8tcmVtb3RlLWNhY2hlLXRva2VuLWF1dGhvcml6ZXInLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vbGFtYmRhL2Rpc3QvdG9rZW4tYXV0aG9yaXplcicpKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBUVVJCT19UT0tFTjogcHJvY2Vzcy5lbnYuVFVSQk9fVE9LRU4hLFxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wcy5sYW1iZGFQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy51c2VySW5mb0Z1bmN0aW9uKSB7XG4gICAgICB0aGlzLmdldFVzZXJJbmZvRnVuY3Rpb24gPSBwcm9wcy51c2VySW5mb0Z1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFVzZXJJbmZvRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdHZXRVc2VySW5mb0Z1bmN0aW9uJywge1xuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAndHVyYm8tcmVtb3RlLWNhY2hlLWdldC11c2VyLWluZm8nLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vbGFtYmRhL2Rpc3QvZ2V0LXVzZXItaW5mbycpKSxcbiAgICAgICAgLi4ucHJvcHMubGFtYmRhUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByZWZsaWdodEFydGlmYWN0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdQcmVmbGlnaHRBcnRpZmFjdEZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBmdW5jdGlvbk5hbWU6ICd0dXJiby1yZW1vdGUtY2FjaGUtcHJlZmxpZ2h0LWFydGlmYWN0JyxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vbGFtYmRhL2Rpc3QvcHJlZmxpZ2h0LWFydGlmYWN0JykpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQVJUSUZBQ1RTX0JVQ0tFVDogcHJvcHMuYXJ0aWZhY3RzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdHVyYm8gbG9naW5cbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbGFtYmRhIGF1dGhvcml6ZXIgdG8gdmFsaWRhdGUgdGhpcmQgcGFydHkgSldUXG4gICAgLy8gdGhpcy5pbml0aWF0ZUxvZ2luRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdJbml0aWF0ZUxvZ2luRnVuY3Rpb24nLCB7XG4gICAgLy8gICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAvLyAgIGZ1bmN0aW9uTmFtZTogJ3R1cmJvLXJlbW90ZS1jYWNoZS1pbml0aWF0ZS1sb2dpbicsXG4gICAgLy8gICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgLy8gICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS9kaXN0L2luaXRpYXRlLWxvZ2luJykpLFxuICAgIC8vICAgZW52aXJvbm1lbnQ6IHtcbiAgICAvLyAgICAgVFVSQk9fVE9LRU46IHByb2Nlc3MuZW52LlRVUkJPX1RPS0VOISxcbiAgICAvLyAgIH0sXG4gICAgLy8gICAuLi5wcm9wcy5sYW1iZGFQcm9wcyxcbiAgICAvLyB9KTtcblxuICAgIC8vIHRoaXMubG9naW5TdWNjZXNzRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdMb2dpblN1Y2Nlc3NGdW5jdGlvbicsIHtcbiAgICAvLyAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMF9YLFxuICAgIC8vICAgZnVuY3Rpb25OYW1lOiAndHVyYm8tcmVtb3RlLWNhY2hlLWxvZ2luLXN1Y2Nlc3MnLFxuICAgIC8vICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgIC8vICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9sYW1iZGEvZGlzdC9sb2dpbi1zdWNjZXNzJykpLFxuICAgIC8vICAgZW52aXJvbm1lbnQ6IHtcbiAgICAvLyAgICAgVFVSQk9fVE9LRU46IHByb2Nlc3MuZW52LlRVUkJPX1RPS0VOISxcbiAgICAvLyAgIH0sXG4gICAgLy8gICAuLi5wcm9wcy5sYW1iZGFQcm9wcyxcbiAgICAvLyB9KTtcblxuICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldC5ncmFudFJlYWQodGhpcy5hcnRpZmFjdFF1ZXJ5RnVuY3Rpb24pO1xuICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLnJlY29yZEV2ZW50c0Z1bmN0aW9uKTtcbiAgICBwcm9wcy5hcnRpZmFjdHNCdWNrZXQuZ3JhbnRSZWFkKHRoaXMuc3RhdHVzRnVuY3Rpb24pO1xuXG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbnNcbiAgICBwcm9wcy5ldmVudHNUYWJsZS5ncmFudFJlYWRXcml0ZURhdGEodGhpcy5yZWNvcmRFdmVudHNGdW5jdGlvbik7XG4gICAgcHJvcHMuZXZlbnRzVGFibGUuZ3JhbnRSZWFkRGF0YSh0aGlzLmFydGlmYWN0UXVlcnlGdW5jdGlvbik7XG5cbiAgICBwcm9wcy5hcnRpZmFjdHNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5wcmVmbGlnaHRBcnRpZmFjdEZ1bmN0aW9uKTtcbiAgfVxufSJdfQ==