UNPKG

cdk-s3-upload-presignedurl-api

Version:
128 lines 20.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.S3UploadPresignedUrlApi = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway"); const aws_cognito_1 = require("aws-cdk-lib/aws-cognito"); const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); // import { Tracing } from 'aws-cdk-lib/aws-lambda'; // import { NodejsFunction, Charset } from 'aws-cdk-lib/aws-lambda-nodejs'; const aws_logs_1 = require("aws-cdk-lib/aws-logs"); const aws_s3_1 = require("aws-cdk-lib/aws-s3"); const constructs_1 = require("constructs"); const index_function_1 = require("./index-function"); class S3UploadPresignedUrlApi extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.userPool = undefined; this.userPoolClient = undefined; const securedApi = props?.secured === undefined ? true : props.secured; if (!securedApi && props?.existingUserPoolObj) { throw new Error('You don\'t need to pass a User Pool if the API is not secured'); } this.bucket = props?.existingBucketObj || new aws_s3_1.Bucket(this, 'uploadBucket', { cors: [ { allowedMethods: [aws_s3_1.HttpMethods.HEAD, aws_s3_1.HttpMethods.GET, aws_s3_1.HttpMethods.PUT], allowedOrigins: props?.allowedOrigins || ['*'], allowedHeaders: ['Authorization', '*'], }, ], }); // Lambda function in charge of creating the PreSigned URL const getS3SignedUrlLambda = new index_function_1.IndexFunction(this, 'getS3SignedUrlLambda', { description: 'Function that creates a presigned URL to upload a file into S3', environment: { UPLOAD_BUCKET: this.bucket.bucketName, URL_EXPIRATION_SECONDS: (props?.expiration || 300).toString(), ALLOWED_ORIGIN: props?.allowedOrigins?.join(',') || '*', }, tracing: aws_lambda_1.Tracing.ACTIVE, logRetention: props?.logRetention || aws_logs_1.RetentionDays.ONE_WEEK, timeout: aws_cdk_lib_1.Duration.seconds(10), memorySize: 256, }); this.bucket.grantPut(getS3SignedUrlLambda); // Rest API const apiLogGroup = new aws_logs_1.LogGroup(this, 'S3SignedUrlApiLogGroup', { retention: props?.logRetention || aws_logs_1.RetentionDays.ONE_WEEK, }); let apiProps = props?.apiGatewayProps || { description: 'API that retrieves a presigned URL to upload a file into S3', endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL], deployOptions: { accessLogDestination: new aws_apigateway_1.LogGroupLogDestination(apiLogGroup), accessLogFormat: aws_apigateway_1.AccessLogFormat.jsonWithStandardFields(), loggingLevel: aws_apigateway_1.MethodLoggingLevel.INFO, metricsEnabled: true, tracingEnabled: true, dataTraceEnabled: false, stageName: 'prod', }, defaultMethodOptions: securedApi ? { authorizationType: aws_apigateway_1.AuthorizationType.COGNITO } : undefined, }; this.restApi = new aws_apigateway_1.RestApi(this, 'S3SignedUrlApi', apiProps); // Adding security on the API if needed var apiGatewayAuthorizer = undefined; if (securedApi) { if (!props?.existingUserPoolObj) { this.userPool = new aws_cognito_1.UserPool(this, 'CognitoUserPool', { selfSignUpEnabled: true, }); this.userPoolClient = new aws_cognito_1.UserPoolClient(this, 'CognitoUserPoolClient', { userPool: this.userPool, }); const cfnUserPool = this.userPool.node.findChild('Resource'); cfnUserPool.userPoolAddOns = { advancedSecurityMode: 'ENFORCED', }; new aws_cdk_lib_1.CfnOutput(this, 'User Pool Id', { value: this.userPool.userPoolId }); new aws_cdk_lib_1.CfnOutput(this, 'User Pool Client Id', { value: this.userPoolClient.userPoolClientId }); } else { this.userPool = props.existingUserPoolObj; } apiGatewayAuthorizer = new aws_apigateway_1.CognitoUserPoolsAuthorizer(this, 'CognitoAuthorizer', { cognitoUserPools: [this.userPool], identitySource: 'method.request.header.Authorization', }); apiGatewayAuthorizer._attachToApi(this.restApi); } // Adding GET method on the API this.restApi.root.addMethod('GET', new aws_apigateway_1.LambdaIntegration(getS3SignedUrlLambda), { requestParameters: { 'method.request.querystring.contentType': true, }, requestValidatorOptions: { requestValidatorName: 'validate-request-param', validateRequestBody: false, validateRequestParameters: true, }, }); // CORS configuration for the API this.restApi.root.addCorsPreflight({ allowHeaders: ['Authorization', '*'], allowOrigins: props?.allowedOrigins || ['*'], allowMethods: ['OPTIONS', 'GET'], allowCredentials: true, }); if (securedApi) { this.restApi.methods.forEach(method => { const cfnmethod = method.node.defaultChild; if (method.httpMethod == 'OPTIONS') { cfnmethod.addPropertyOverride('AuthorizationType', 'NONE'); } else { cfnmethod.addPropertyOverride('AuthorizationType', 'COGNITO_USER_POOLS'); cfnmethod.addPropertyOverride('AuthorizerId', apiGatewayAuthorizer.authorizerId); } }); } } } exports.S3UploadPresignedUrlApi = S3UploadPresignedUrlApi; _a = JSII_RTTI_SYMBOL_1; S3UploadPresignedUrlApi[_a] = { fqn: "cdk-s3-upload-presignedurl-api.S3UploadPresignedUrlApi", version: "0.0.7" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBa0Q7QUFDbEQsK0RBQXVPO0FBQ3ZPLHlEQUFnRjtBQUNoRix1REFBaUQ7QUFDakQsb0RBQW9EO0FBQ3BELDJFQUEyRTtBQUMzRSxtREFBK0Q7QUFDL0QsK0NBQXlEO0FBQ3pELDJDQUF1QztBQUN2QyxxREFBaUQ7QUFzRGpELE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFPcEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQztRQUMxRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSkgsYUFBUSxHQUFvQixTQUFTLENBQUM7UUFDdEMsbUJBQWMsR0FBMEIsU0FBUyxDQUFDO1FBS2hFLE1BQU0sVUFBVSxHQUFhLEtBQUssRUFBRSxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFakYsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsaUJBQWlCLElBQUksSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUN6RSxJQUFJLEVBQUU7Z0JBQ0o7b0JBQ0UsY0FBYyxFQUFFLENBQUMsb0JBQVcsQ0FBQyxJQUFJLEVBQUUsb0JBQVcsQ0FBQyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHLENBQUM7b0JBQ3BFLGNBQWMsRUFBRSxLQUFLLEVBQUUsY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUM5QyxjQUFjLEVBQUUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDO2lCQUN2QzthQUNGO1NBQ0YsQ0FBQyxD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TUFBTSxDQUFDLElBQUksQ0FBQyxZQUF5QixDQUFDO2dCQUN4RCxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFO29CQUNsQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQzVEO3FCQUFNO29CQUNMLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUN6RSxTQUFTLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNsRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFFSCxDQUFDOztBQTdISCwwREErSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgQ2ZuT3V0cHV0IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQWNjZXNzTG9nRm9ybWF0LCBBdXRob3JpemF0aW9uVHlwZSwgQXV0aG9yaXplciwgQ2ZuTWV0aG9kLCBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplciwgRW5kcG9pbnRUeXBlLCBMYW1iZGFJbnRlZ3JhdGlvbiwgTG9nR3JvdXBMb2dEZXN0aW5hdGlvbiwgTWV0aG9kTG9nZ2luZ0xldmVsLCBSZXN0QXBpLCBSZXN0QXBpUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgeyBDZm5Vc2VyUG9vbCwgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZ25pdG8nO1xuaW1wb3J0IHsgVHJhY2luZyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuLy8gaW1wb3J0IHsgVHJhY2luZyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuLy8gaW1wb3J0IHsgTm9kZWpzRnVuY3Rpb24sIENoYXJzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IEJ1Y2tldCwgSHR0cE1ldGhvZHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJbmRleEZ1bmN0aW9uIH0gZnJvbSAnLi9pbmRleC1mdW5jdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVMzVXBsb2FkU2lnbmVkVXJsQXBpUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYnVja2V0IHdoZXJlIGZpbGVzIHNob3VsZCBiZSB1cGxvYWRlZCB0by4gU2hvdWxkIGNvbnRhaW5zIHRoZSBDT1JTIHByb3BlcnRpZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IEJ1Y2tldCBpcyBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0J1Y2tldE9iaj86IEJ1Y2tldDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgQ29nbml0byBVc2VyIFBvb2wgdG8gc2VjdXJlIHRoZSBBUEkuIFlvdSBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgVXNlciBQb29sIENsaWVudCB0b28uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBVc2VyIFBvb2wgKGFuZCBVc2VyIFBvb2wgQ2xpZW50KSBhcmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdVc2VyUG9vbE9iaj86IFVzZXJQb29sO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBDT1JTIGFsbG93ZWRPcmlnaW5zLlxuICAgKiBTaG91bGQgYWxsb3cgeW91ciBkb21haW4ocykgYXMgYWxsb3dlZCBvcmlnaW4gdG8gcmVxdWVzdCB0aGUgQVBJXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnKiddXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBleHBpcmF0aW9uIHRpbWUgaW4gc2Vjb25kLiBUaW1lIGJlZm9yZSB0aGUgcHJlc2lnbmVkIHVybCBleHBpcmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyYXRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHVzZXIgcHJvdmlkZWQgcHJvcHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJvcHMgZm9yIHRoZSBBUEkgR2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IHByb3BzIGFyZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBhcGlHYXRld2F5UHJvcHM/OiBSZXN0QXBpUHJvcHMgfCBhbnk7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJvb2xlYW4gdG8gc3BlY2lmeSBpZiB0aGUgQVBJIGlzIHNlY3VyZWQgKHdpdGggQ29nbml0bykgb3IgcHVibGljbHkgb3BlblxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzZWN1cmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbG9nIHJldGVudGlvbiB0aW1lIGZvciBMYW1iZGEgYW5kIEFQSSBHYXRld2F5XG4gICAqXG4gICAqIEBkZWZhdWx0IG9uZSB3ZWVrXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBSZXRlbnRpb25EYXlzO1xufVxuXG5leHBvcnQgY2xhc3MgUzNVcGxvYWRQcmVzaWduZWRVcmxBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIHB1YmxpYyByZWFkb25seSBidWNrZXQ6IEJ1Y2tldDtcbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGk6IFJlc3RBcGk7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbD86IFVzZXJQb29sIHwgYW55ID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2xDbGllbnQ/OiBVc2VyUG9vbENsaWVudCB8IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IElTM1VwbG9hZFNpZ25lZFVybEFwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHNlY3VyZWRBcGkgOiBib29sZWFuID0gcHJvcHM/LnNlY3VyZWQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwcm9wcy5zZWN1cmVkO1xuXG4gICAgaWYgKCFzZWN1cmVkQXBpICYmIHByb3BzPy5leGlzdGluZ1VzZXJQb29sT2JqKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBkb25cXCd0IG5lZWQgdG8gcGFzcyBhIFVzZXIgUG9vbCBpZiB0aGUgQVBJIGlzIG5vdCBzZWN1cmVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5idWNrZXQgPSBwcm9wcz8uZXhpc3RpbmdCdWNrZXRPYmogfHwgbmV3IEJ1Y2tldCh0aGlzLCAndXBsb2FkQnVja2V0Jywge1xuICAgICAgY29yczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IFtIdHRwTWV0aG9kcy5IRUFELCBIdHRwTWV0aG9kcy5HRVQsIEh0dHBNZXRob2RzLlBVVF0sXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHByb3BzPy5hbGxvd2VkT3JpZ2lucyB8fCBbJyonXSxcbiAgICAgICAgICBhbGxvd2VkSGVhZGVyczogWydBdXRob3JpemF0aW9uJywgJyonXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBMYW1iZGEgZnVuY3Rpb24gaW4gY2hhcmdlIG9mIGNyZWF0aW5nIHRoZSBQcmVTaWduZWQgVVJMXG4gICAgY29uc3QgZ2V0UzNTaWduZWRVcmxMYW1iZGEgPSBuZXcgSW5kZXhGdW5jdGlvbih0aGlzLCAnZ2V0UzNTaWduZWRVcmxMYW1iZGEnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Z1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIHByZXNpZ25lZCBVUkwgdG8gdXBsb2FkIGEgZmlsZSBpbnRvIFMzJyxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFVQTE9BRF9CVUNLRVQ6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIFVSTF9FWFBJUkFUSU9OX1NFQ09ORFM6IChwcm9wcz8uZXhwaXJhdGlvbiB8fCAzMDApLnRvU3RyaW5nKCksXG4gICAgICAgIEFMTE9XRURfT1JJR0lOOiBwcm9wcz8uYWxsb3dlZE9yaWdpbnM/LmpvaW4oJywnKSB8fCAnKicsXG4gICAgICB9LFxuICAgICAgdHJhY2luZzogVHJhY2luZy5BQ1RJVkUsXG4gICAgICBsb2dSZXRlbnRpb246IHByb3BzPy5sb2dSZXRlbnRpb24gfHwgUmV0ZW50aW9uRGF5cy5PTkVfV0VFSyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgbWVtb3J5U2l6ZTogMjU2LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWNrZXQuZ3JhbnRQdXQoZ2V0UzNTaWduZWRVcmxMYW1iZGEpO1xuXG4gICAgLy8gUmVzdCBBUElcbiAgICBjb25zdCBhcGlMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCAnUzNTaWduZWRVcmxBcGlMb2dHcm91cCcsIHtcbiAgICAgIHJldGVudGlvbjogcHJvcHM/LmxvZ1JldGVudGlvbiB8fCBSZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgIH0pO1xuXG4gICAgbGV0IGFwaVByb3BzOiBSZXN0QXBpUHJvcHMgPSBwcm9wcz8uYXBpR2F0ZXdheVByb3BzIHx8IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQVBJIHRoYXQgcmV0cmlldmVzIGEgcHJlc2lnbmVkIFVSTCB0byB1cGxvYWQgYSBmaWxlIGludG8gUzMnLFxuICAgICAgZW5kcG9pbnRUeXBlczogW0VuZHBvaW50VHlwZS5SRUdJT05BTF0sXG4gICAgICBkZXBsb3lPcHRpb25zOiB7XG4gICAgICAgIGFjY2Vzc0xvZ0Rlc3RpbmF0aW9uOiBuZXcgTG9nR3JvdXBMb2dEZXN0aW5hdGlvbihhcGlMb2dHcm91cCksXG4gICAgICAgIGFjY2Vzc0xvZ0Zvcm1hdDogQWNjZXNzTG9nRm9ybWF0Lmpzb25XaXRoU3RhbmRhcmRGaWVsZHMoKSxcbiAgICAgICAgbG9nZ2luZ0xldmVsOiBNZXRob2RMb2dnaW5nTGV2ZWwuSU5GTyxcbiAgICAgICAgbWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIHRyYWNpbmdFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhVHJhY2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3RhZ2VOYW1lOiAncHJvZCcsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdE1ldGhvZE9wdGlvbnM6IHNlY3VyZWRBcGkgPyB7IGF1dGhvcml6YXRpb25UeXBlOiBBdXRob3JpemF0aW9uVHlwZS5DT0dOSVRPIH0gOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIHRoaXMucmVzdEFwaSA9IG5ldyBSZXN0QXBpKHRoaXMsICdTM1NpZ25lZFVybEFwaScsIGFwaVByb3BzKTtcblxuICAgIC8vIEFkZGluZyBzZWN1cml0eSBvbiB0aGUgQVBJIGlmIG5lZWRlZFxuICAgIHZhciBhcGlHYXRld2F5QXV0aG9yaXplcjogQXV0aG9yaXplciB8IGFueSA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChzZWN1cmVkQXBpKSB7XG4gICAgICBpZiAoIXByb3BzPy5leGlzdGluZ1VzZXJQb29sT2JqKSB7XG4gICAgICAgIHRoaXMudXNlclBvb2wgPSBuZXcgVXNlclBvb2wodGhpcywgJ0NvZ25pdG9Vc2VyUG9vbCcsIHtcbiAgICAgICAgICBzZWxmU2lnblVwRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXNlclBvb2xDbGllbnQgPSBuZXcgVXNlclBvb2xDbGllbnQodGhpcywgJ0NvZ25pdG9Vc2VyUG9vbENsaWVudCcsIHtcbiAgICAgICAgICB1c2VyUG9vbDogdGhpcy51c2VyUG9vbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNmblVzZXJQb29sID0gdGhpcy51c2VyUG9vbC5ub2RlLmZpbmRDaGlsZCgnUmVzb3VyY2UnKSBhcyBDZm5Vc2VyUG9vbDtcbiAgICAgICAgY2ZuVXNlclBvb2wudXNlclBvb2xBZGRPbnMgPSB7XG4gICAgICAgICAgYWR2YW5jZWRTZWN1cml0eU1vZGU6ICdFTkZPUkNFRCcsXG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCAnVXNlciBQb29sIElkJywgeyB2YWx1ZTogdGhpcy51c2VyUG9vbC51c2VyUG9vbElkIH0pO1xuICAgICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsICdVc2VyIFBvb2wgQ2xpZW50IElkJywgeyB2YWx1ZTogdGhpcy51c2VyUG9vbENsaWVudC51c2VyUG9vbENsaWVudElkIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51c2VyUG9vbCA9IHByb3BzLmV4aXN0aW5nVXNlclBvb2xPYmo7XG4gICAgICB9XG5cbiAgICAgIGFwaUdhdGV3YXlBdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyKHRoaXMsICdDb2duaXRvQXV0aG9yaXplcicsIHtcbiAgICAgICAgY29nbml0b1VzZXJQb29sczogW3RoaXMudXNlclBvb2xdLFxuICAgICAgICBpZGVudGl0eVNvdXJjZTogJ21ldGhvZC5yZXF1ZXN0LmhlYWRlci5BdXRob3JpemF0aW9uJyxcbiAgICAgIH0pO1xuICAgICAgYXBpR2F0ZXdheUF1dGhvcml6ZXIuX2F0dGFjaFRvQXBpKHRoaXMucmVzdEFwaSk7XG4gICAgfVxuXG4gICAgLy8gQWRkaW5nIEdFVCBtZXRob2Qgb24gdGhlIEFQSVxuICAgIHRoaXMucmVzdEFwaS5yb290LmFkZE1ldGhvZCgnR0VUJywgbmV3IExhbWJkYUludGVncmF0aW9uKGdldFMzU2lnbmVkVXJsTGFtYmRhKSwge1xuICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgICAgJ21ldGhvZC5yZXF1ZXN0LnF1ZXJ5c3RyaW5nLmNvbnRlbnRUeXBlJzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0VmFsaWRhdG9yT3B0aW9uczoge1xuICAgICAgICByZXF1ZXN0VmFsaWRhdG9yTmFtZTogJ3ZhbGlkYXRlLXJlcXVlc3QtcGFyYW0nLFxuICAgICAgICB2YWxpZGF0ZVJlcXVlc3RCb2R5OiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGVSZXF1ZXN0UGFyYW1ldGVyczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDT1JTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBUElcbiAgICB0aGlzLnJlc3RBcGkucm9vdC5hZGRDb3JzUHJlZmxpZ2h0KHtcbiAgICAgIGFsbG93SGVhZGVyczogWydBdXRob3JpemF0aW9uJywgJyonXSxcbiAgICAgIGFsbG93T3JpZ2luczogcHJvcHM/LmFsbG93ZWRPcmlnaW5zIHx8IFsnKiddLFxuICAgICAgYWxsb3dNZXRob2RzOiBbJ09QVElPTlMnLCAnR0VUJ10sXG4gICAgICBhbGxvd0NyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHNlY3VyZWRBcGkpIHtcbiAgICAgIHRoaXMucmVzdEFwaS5tZXRob2RzLmZvckVhY2gobWV0aG9kID0+IHtcbiAgICAgICAgY29uc3QgY2ZubWV0aG9kID0gbWV0aG9kLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbk1ldGhvZDtcbiAgICAgICAgaWYgKG1ldGhvZC5odHRwTWV0aG9kID09ICdPUFRJT05TJykge1xuICAgICAgICAgIGNmbm1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdBdXRob3JpemF0aW9uVHlwZScsICdOT05FJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2ZubWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ0F1dGhvcml6YXRpb25UeXBlJywgJ0NPR05JVE9fVVNFUl9QT09MUycpO1xuICAgICAgICAgIGNmbm1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdBdXRob3JpemVySWQnLCBhcGlHYXRld2F5QXV0aG9yaXplci5hdXRob3JpemVySWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG59Il19