cdk-s3-upload-presignedurl-api
Version:
API to get an S3 presigned url for file uploads
128 lines • 20.9 kB
JavaScript
"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