open-next-cdk
Version:
Deploy a NextJS app using OpenNext packaging to serverless AWS using CDK
107 lines • 16.5 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nextjs = exports.CONFIG_ENV_JSON_PATH = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/* eslint-disable prettier/prettier */
const os = require("os");
const path = require("path");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const s3 = require("aws-cdk-lib/aws-s3");
const constructs_1 = require("constructs");
const fs = require("fs-extra");
const ImageOptimizationLambda_1 = require("./ImageOptimizationLambda");
const NextjsAssetsDeployment_1 = require("./NextjsAssetsDeployment");
const NextjsBuild_1 = require("./NextjsBuild");
const NextjsDistribution_1 = require("./NextjsDistribution");
const NextjsLambda_1 = require("./NextjsLambda");
// contains server-side resolved environment vars in config bucket
exports.CONFIG_ENV_JSON_PATH = 'next-env.json';
/**
* The `Nextjs` construct is a higher level construct that makes it easy to create a NextJS app.
*
* Your standalone server application will be bundled using o(utput tracing and will be deployed to a Lambda function.
* Static assets will be deployed to an S3 bucket and served via CloudFront.
* You must use Next.js 10.3.0 or newer.
*
* Please provide a `nextjsPath` to the Next.js app inside your project.
*
* @example
* new Nextjs(this, "Web", {
* nextjsPath: path.resolve("packages/web"),
* })
*/
class Nextjs extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
this.props = props;
if (!props.quiet)
console.debug('┌ Building Next.js app ▼ ...');
// get dir to store temp build files in
const tempBuildDir = props.tempBuildDir
? path.resolve(path.join(props.tempBuildDir, `nextjs-cdk-build-${this.node.id}-${this.node.addr.substring(0, 4)}`))
: fs.mkdtempSync(path.join(os.tmpdir(), 'nextjs-cdk-build-'));
this.tempBuildDir = tempBuildDir;
// create static asset bucket
this.staticAssetBucket =
props.defaults?.assetDeployment?.bucket ??
new s3.Bucket(this, 'Bucket', {
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
});
// build nextjs app
this.nextBuild = new NextjsBuild_1.NextjsBuild(this, id, { ...props, tempBuildDir });
this.serverFunction = new NextjsLambda_1.NextJsLambda(this, 'Fn', {
...props,
tempBuildDir,
nextBuild: this.nextBuild,
lambda: props.defaults?.lambda,
});
// build image optimization
this.imageOptimizationFunction = new ImageOptimizationLambda_1.ImageOptimizationLambda(this, 'ImgOptFn', {
...props,
nextBuild: this.nextBuild,
bucket: props.imageOptimizationBucket || this.bucket,
lambdaOptions: props.defaults?.lambda,
});
// deploy nextjs static assets to s3
this.assetsDeployment = new NextjsAssetsDeployment_1.NextJsAssetsDeployment(this, 'AssetDeployment', {
...props,
...props.defaults?.assetDeployment,
tempBuildDir,
nextBuild: this.nextBuild,
bucket: this.staticAssetBucket,
});
// finish static deployment BEFORE deploying new function code
// as there is some time after the new static files are uploaded but before they are rewritten
const rewriter = this.assetsDeployment.rewriter?.rewriteNode;
if (rewriter) {
this.serverFunction.lambdaFunction.node.addDependency(rewriter);
}
else {
this.serverFunction.lambdaFunction.node.addDependency(...this.assetsDeployment.deployments);
}
this.distribution = new NextjsDistribution_1.NextjsDistribution(this, 'Distribution', {
...props,
...props.defaults?.distribution,
staticAssetsBucket: this.assetsDeployment.bucket,
tempBuildDir,
nextBuild: this.nextBuild,
serverFunction: this.serverFunction.lambdaFunction,
imageOptFunction: this.imageOptimizationFunction,
});
if (!props.quiet)
console.debug('└ Finished preparing NextJS app for deployment');
}
get url() {
const customDomain = this.distribution.customDomainName;
return customDomain ? `https://${customDomain}` : this.distribution.url;
}
get bucket() {
return this.staticAssetBucket;
}
}
exports.Nextjs = Nextjs;
_a = JSII_RTTI_SYMBOL_1;
Nextjs[_a] = { fqn: "open-next-cdk.Nextjs", version: "0.0.10" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL05leHRqcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFzQztBQUN0Qyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZDQUE0QztBQUc1Qyx5Q0FBeUM7QUFDekMsMkNBQXVDO0FBQ3ZDLCtCQUErQjtBQUMvQix1RUFBb0U7QUFDcEUscUVBQXVHO0FBRXZHLCtDQUE0QztBQUM1Qyw2REFBMkY7QUFDM0YsaURBQThDO0FBRTlDLGtFQUFrRTtBQUNyRCxRQUFBLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztBQXFDcEQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQWEsTUFBTyxTQUFRLHNCQUFTO0lBcUNuQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFZLEtBQWtCO1FBQ3BFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFEaUMsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUdwRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFaEUsdUNBQXVDO1FBQ3ZDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZO1lBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3BHO1lBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxZQUFZLEdB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QUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDOztBQWhISCx3QkFpSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBwcmV0dGllci9wcmV0dGllciAqL1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBGdW5jdGlvbk9wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEltYWdlT3B0aW1pemF0aW9uTGFtYmRhIH0gZnJvbSAnLi9JbWFnZU9wdGltaXphdGlvbkxhbWJkYSc7XG5pbXBvcnQgeyBOZXh0SnNBc3NldHNEZXBsb3ltZW50LCBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHNEZWZhdWx0cyB9IGZyb20gJy4vTmV4dGpzQXNzZXRzRGVwbG95bWVudCc7XG5pbXBvcnQgeyBCYXNlU2l0ZURvbWFpblByb3BzLCBOZXh0anNCYXNlUHJvcHMgfSBmcm9tICcuL05leHRqc0Jhc2UnO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tICcuL05leHRqc0J1aWxkJztcbmltcG9ydCB7IE5leHRqc0Rpc3RyaWJ1dGlvbiwgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHNEZWZhdWx0cyB9IGZyb20gJy4vTmV4dGpzRGlzdHJpYnV0aW9uJztcbmltcG9ydCB7IE5leHRKc0xhbWJkYSB9IGZyb20gJy4vTmV4dGpzTGFtYmRhJztcblxuLy8gY29udGFpbnMgc2VydmVyLXNpZGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQgdmFycyBpbiBjb25maWcgYnVja2V0XG5leHBvcnQgY29uc3QgQ09ORklHX0VOVl9KU09OX1BBVEggPSAnbmV4dC1lbnYuanNvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRG9tYWluUHJvcHMgZXh0ZW5kcyBCYXNlU2l0ZURvbWFpblByb3BzIHsgfVxuXG4vKipcbiAqIERlZmF1bHRzIGZvciBjcmVhdGVkIHJlc291cmNlcy5cbiAqIFdoeSBgYW55YD8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjkwMVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RlZmF1bHRzUHJvcHMge1xuICAvKipcbiAgICogT3ZlcnJpZGUgc3RhdGljIGZpbGUgZGVwbG95bWVudCBzZXR0aW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0RGVwbG95bWVudD86IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wc0RlZmF1bHRzO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBzZXJ2ZXIgbGFtYmRhIGZ1bmN0aW9uIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhPzogRnVuY3Rpb25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBzZXR0aW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzRGVmYXVsdHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgUzMgQnVja2V0IHRvIHVzZSwgZGVmYXVsdHMgdG8gYXNzZXRzIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VPcHRpbWl6YXRpb25CdWNrZXQ/OiBzMy5JQnVja2V0O1xuICAvKipcbiAgICogQWxsb3dzIHlvdSB0byBvdmVycmlkZSBkZWZhdWx0cyBmb3IgdGhlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXNcbiAgICogY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiBOZXh0anNEZWZhdWx0c1Byb3BzO1xufVxuXG4vKipcbiAqIFRoZSBgTmV4dGpzYCBjb25zdHJ1Y3QgaXMgYSBoaWdoZXIgbGV2ZWwgY29uc3RydWN0IHRoYXQgbWFrZXMgaXQgZWFzeSB0byBjcmVhdGUgYSBOZXh0SlMgYXBwLlxuICpcbiAqIFlvdXIgc3RhbmRhbG9uZSBzZXJ2ZXIgYXBwbGljYXRpb24gd2lsbCBiZSBidW5kbGVkIHVzaW5nIG8odXRwdXQgdHJhY2luZyBhbmQgd2lsbCBiZSBkZXBsb3llZCB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAqIFN0YXRpYyBhc3NldHMgd2lsbCBiZSBkZXBsb3llZCB0byBhbiBTMyBidWNrZXQgYW5kIHNlcnZlZCB2aWEgQ2xvdWRGcm9udC5cbiAqIFlvdSBtdXN0IHVzZSBOZXh0LmpzIDEwLjMuMCBvciBuZXdlci5cbiAqXG4gKiBQbGVhc2UgcHJvdmlkZSBhIGBuZXh0anNQYXRoYCB0byB0aGUgTmV4dC5qcyBhcHAgaW5zaWRlIHlvdXIgcHJvamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogbmV3IE5leHRqcyh0aGlzLCBcIldlYlwiLCB7XG4gKiAgIG5leHRqc1BhdGg6IHBhdGgucmVzb2x2ZShcInBhY2thZ2VzL3dlYlwiKSxcbiAqIH0pXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIG1haW4gTmV4dEpTIHNlcnZlciBoYW5kbGVyIGxhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzZXJ2ZXJGdW5jdGlvbjogTmV4dEpzTGFtYmRhO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugb3B0aW1pemF0aW9uIGhhbmRsZXIgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIGltYWdlT3B0aW1pemF0aW9uRnVuY3Rpb246IEltYWdlT3B0aW1pemF0aW9uTGFtYmRhO1xuXG4gIC8qKlxuICAgKiBCdWlsdCBOZXh0SlMgcHJvamVjdCBvdXRwdXQuXG4gICAqL1xuICBwdWJsaWMgbmV4dEJ1aWxkOiBOZXh0anNCdWlsZDtcblxuICAvKipcbiAgICogQXNzZXQgZGVwbG95bWVudCB0byBTMy5cbiAgICovXG4gIHB1YmxpYyBhc3NldHNEZXBsb3ltZW50OiBOZXh0SnNBc3NldHNEZXBsb3ltZW50O1xuXG4gIC8qKlxuICAgKiBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHB1YmxpYyBkaXN0cmlidXRpb246IE5leHRqc0Rpc3RyaWJ1dGlvbjtcblxuICAvKipcbiAgICogV2hlcmUgYnVpbGQtdGltZSBhc3NldHMgZm9yIGRlcGxveW1lbnQgYXJlIHN0b3JlZC5cbiAgICovXG4gIHB1YmxpYyB0ZW1wQnVpbGREaXI6IHN0cmluZztcblxuICBwdWJsaWMgY29uZmlnQnVja2V0PzogczMuQnVja2V0O1xuICBwdWJsaWMgbGFtYmRhRnVuY3Rpb25VcmwhOiBsYW1iZGEuRnVuY3Rpb25Vcmw7XG4gIHB1YmxpYyBpbWFnZU9wdGltaXphdGlvbkxhbWJkYUZ1bmN0aW9uVXJsITogbGFtYmRhLkZ1bmN0aW9uVXJsO1xuXG4gIHByb3RlY3RlZCBzdGF0aWNBc3NldEJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm90ZWN0ZWQgcHJvcHM6IE5leHRqc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmICghcHJvcHMucXVpZXQpIGNvbnNvbGUuZGVidWcoJ+KUjCBCdWlsZGluZyBOZXh0LmpzIGFwcCDilrwgLi4uJyk7XG5cbiAgICAvLyBnZXQgZGlyIHRvIHN0b3JlIHRlbXAgYnVpbGQgZmlsZXMgaW5cbiAgICBjb25zdCB0ZW1wQnVpbGREaXIgPSBwcm9wcy50ZW1wQnVpbGREaXJcbiAgICAgID8gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmpvaW4ocHJvcHMudGVtcEJ1aWxkRGlyLCBgbmV4dGpzLWNkay1idWlsZC0ke3RoaXMubm9kZS5pZH0tJHt0aGlzLm5vZGUuYWRkci5zdWJzdHJpbmcoMCwgNCl9YClcbiAgICAgIClcbiAgICAgIDogZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnbmV4dGpzLWNkay1idWlsZC0nKSk7XG5cbiAgICB0aGlzLnRlbXBCdWlsZERpciA9IHRlbXBCdWlsZERpcjtcblxuICAgIC8vIGNyZWF0ZSBzdGF0aWMgYXNzZXQgYnVja2V0XG4gICAgdGhpcy5zdGF0aWNBc3NldEJ1Y2tldCA9XG4gICAgICBwcm9wcy5kZWZhdWx0cz8uYXNzZXREZXBsb3ltZW50Py5idWNrZXQgPz9cbiAgICAgIG5ldyBzMy5CdWNrZXQodGhpcywgJ0J1Y2tldCcsIHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgLy8gYnVpbGQgbmV4dGpzIGFwcFxuICAgIHRoaXMubmV4dEJ1aWxkID0gbmV3IE5leHRqc0J1aWxkKHRoaXMsIGlkLCB7IC4uLnByb3BzLCB0ZW1wQnVpbGREaXIgfSk7XG4gICAgdGhpcy5zZXJ2ZXJGdW5jdGlvbiA9IG5ldyBOZXh0SnNMYW1iZGEodGhpcywgJ0ZuJywge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB0ZW1wQnVpbGREaXIsXG4gICAgICBuZXh0QnVpbGQ6IHRoaXMubmV4dEJ1aWxkLFxuICAgICAgbGFtYmRhOiBwcm9wcy5kZWZhdWx0cz8ubGFtYmRhLFxuICAgIH0pO1xuICAgIC8vIGJ1aWxkIGltYWdlIG9wdGltaXphdGlvblxuICAgIHRoaXMuaW1hZ2VPcHRpbWl6YXRpb25GdW5jdGlvbiA9IG5ldyBJbWFnZU9wdGltaXphdGlvbkxhbWJkYSh0aGlzLCAnSW1nT3B0Rm4nLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG5leHRCdWlsZDogdGhpcy5uZXh0QnVpbGQsXG4gICAgICBidWNrZXQ6IHByb3BzLmltYWdlT3B0aW1pemF0aW9uQnVja2V0IHx8IHRoaXMuYnVja2V0LFxuICAgICAgbGFtYmRhT3B0aW9uczogcHJvcHMuZGVmYXVsdHM/LmxhbWJkYSxcbiAgICB9KTtcblxuICAgIC8vIGRlcGxveSBuZXh0anMgc3RhdGljIGFzc2V0cyB0byBzM1xuICAgIHRoaXMuYXNzZXRzRGVwbG95bWVudCA9IG5ldyBOZXh0SnNBc3NldHNEZXBsb3ltZW50KHRoaXMsICdBc3NldERlcGxveW1lbnQnLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIC4uLnByb3BzLmRlZmF1bHRzPy5hc3NldERlcGxveW1lbnQsXG4gICAgICB0ZW1wQnVpbGREaXIsXG4gICAgICBuZXh0QnVpbGQ6IHRoaXMubmV4dEJ1aWxkLFxuICAgICAgYnVja2V0OiB0aGlzLnN0YXRpY0Fzc2V0QnVja2V0LFxuICAgIH0pO1xuICAgIC8vIGZpbmlzaCBzdGF0aWMgZGVwbG95bWVudCBCRUZPUkUgZGVwbG95aW5nIG5ldyBmdW5jdGlvbiBjb2RlXG4gICAgLy8gYXMgdGhlcmUgaXMgc29tZSB0aW1lIGFmdGVyIHRoZSBuZXcgc3RhdGljIGZpbGVzIGFyZSB1cGxvYWRlZCBidXQgYmVmb3JlIHRoZXkgYXJlIHJld3JpdHRlblxuICAgIGNvbnN0IHJld3JpdGVyID0gdGhpcy5hc3NldHNEZXBsb3ltZW50LnJld3JpdGVyPy5yZXdyaXRlTm9kZTtcbiAgICBpZiAocmV3cml0ZXIpIHtcbiAgICAgIHRoaXMuc2VydmVyRnVuY3Rpb24ubGFtYmRhRnVuY3Rpb24ubm9kZS5hZGREZXBlbmRlbmN5KHJld3JpdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXJ2ZXJGdW5jdGlvbi5sYW1iZGFGdW5jdGlvbi5ub2RlLmFkZERlcGVuZGVuY3koLi4udGhpcy5hc3NldHNEZXBsb3ltZW50LmRlcGxveW1lbnRzKTtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RyaWJ1dGlvbiA9IG5ldyBOZXh0anNEaXN0cmlidXRpb24odGhpcywgJ0Rpc3RyaWJ1dGlvbicsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgLi4ucHJvcHMuZGVmYXVsdHM/LmRpc3RyaWJ1dGlvbixcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogdGhpcy5hc3NldHNEZXBsb3ltZW50LmJ1Y2tldCxcbiAgICAgIHRlbXBCdWlsZERpcixcbiAgICAgIG5leHRCdWlsZDogdGhpcy5uZXh0QnVpbGQsXG4gICAgICBzZXJ2ZXJGdW5jdGlvbjogdGhpcy5zZXJ2ZXJGdW5jdGlvbi5sYW1iZGFGdW5jdGlvbixcbiAgICAgIGltYWdlT3B0RnVuY3Rpb246IHRoaXMuaW1hZ2VPcHRpbWl6YXRpb25GdW5jdGlvbixcbiAgICB9KTtcblxuICAgIGlmICghcHJvcHMucXVpZXQpIGNvbnNvbGUuZGVidWcoJ+KUlCBGaW5pc2hlZCBwcmVwYXJpbmcgTmV4dEpTIGFwcCBmb3IgZGVwbG95bWVudCcpO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21Eb21haW4gPSB0aGlzLmRpc3RyaWJ1dGlvbi5jdXN0b21Eb21haW5OYW1lO1xuICAgIHJldHVybiBjdXN0b21Eb21haW4gPyBgaHR0cHM6Ly8ke2N1c3RvbURvbWFpbn1gIDogdGhpcy5kaXN0cmlidXRpb24udXJsO1xuICB9XG5cbiAgcHVibGljIGdldCBidWNrZXQoKTogczMuSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRCdWNrZXQ7XG4gIH1cbn1cbiJdfQ==