@wisegpt/awscdk-slack-event-bus
Version:
Exposes a Slack Events API Request URL that validates and sends all received events to an AWS Event Bus
80 lines • 13.9 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SlackEventBus = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const apigwv2 = require("@aws-cdk/aws-apigatewayv2-alpha");
const aws_apigatewayv2_alpha_1 = require("@aws-cdk/aws-apigatewayv2-alpha");
const aws_apigatewayv2_integrations_alpha_1 = require("@aws-cdk/aws-apigatewayv2-integrations-alpha");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
const constructs_1 = require("constructs");
const slack_handler_function_1 = require("./lambdas/slack-handler-function");
const path_constants_1 = require("./path-constants");
const withSlash = (path) => (path.startsWith("/") ? path : "/" + path);
class SlackEventBus extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
this.props = props;
this.pEventBus = new aws_cdk_lib_1.aws_events.EventBus(this, "EventBus", {
eventBusName: this.props.eventBusName || SlackEventBus.SLACK_EVENT_BUS_NAME,
});
const slackHandlerLambda = new slack_handler_function_1.SlackHandlerFunction(this, "SlackHandlerLambda", {
description: "Lambda that handles Slack Events, Interactions, Commands and oAuth",
architecture: aws_lambda_1.Architecture.ARM_64,
environment: {
SLACK_SECRET_ARN: this.props.secret.secretArn,
SLACK_EVENT_BUS_NAME: this.pEventBus.eventBusName,
...(this.props.singleApp
? { SLACK_APP_ID: this.props.singleApp.appId }
: {}),
},
});
this.pSlackHandlerLambdaAlias = new aws_lambda_1.Alias(this, "SlackHandlerLambdaLiveAlias", {
aliasName: "latest",
version: slackHandlerLambda.currentVersion,
});
this.props.secret.grantRead(this.pSlackHandlerLambdaAlias);
this.pEventBus.grantPutEventsTo(this.pSlackHandlerLambdaAlias);
this.pHttpApi = this.props.httpApi
? this.props.httpApi
: new apigwv2.HttpApi(this, "HttpApi", {
description: "Slack Handler Http Api",
});
// add for handling slack events route
this.pHttpApi.addRoutes({
path: this.props.singleApp?.eventsApiPath
? withSlash(this.props.singleApp.eventsApiPath)
: `${path_constants_1.SLACK_PATH_APP_PREFIX}${path_constants_1.SLACK_PATH_EVENTS_API}`,
// ALL methods expect OPTIONS / ANY should be handled by our Lambda
methods: [aws_apigatewayv2_alpha_1.HttpMethod.POST],
integration: new aws_apigatewayv2_integrations_alpha_1.HttpLambdaIntegration("EventsPostIntegration", this.pSlackHandlerLambdaAlias),
});
}
static appPath(appId) {
return appId !== undefined
? path_constants_1.SLACK_PATH_APP_PREFIX.replace("{appId}", appId)
: path_constants_1.SLACK_PATH_APP_PREFIX;
}
slackEventsRequestUrl(appId) {
if (this.props.singleApp && this.props.singleApp.appId !== appId) {
throw new Error(`you can only use with '${this.props.singleApp.appId}' appId because props.singleApp is configured`);
}
if (this.props.singleApp) {
const { eventsApiPath } = this.props.singleApp;
return `${this.pHttpApi.apiEndpoint}${withSlash(eventsApiPath)}`;
}
return `${this.pHttpApi.apiEndpoint}${SlackEventBus.appPath(appId)}${path_constants_1.SLACK_PATH_EVENTS_API}`;
}
get eventBus() {
return this.pEventBus;
}
get slackHandlerLambdaAlias() {
return this.pSlackHandlerLambdaAlias;
}
}
exports.SlackEventBus = SlackEventBus;
_a = JSII_RTTI_SYMBOL_1;
SlackEventBus[_a] = { fqn: "@wisegpt/awscdk-slack-event-bus.SlackEventBus", version: "1.1.0" };
SlackEventBus.SLACK_EVENT_BUS_NAME = "slack-event-bus";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyREFBMkQ7QUFDM0QsNEVBQTZEO0FBQzdELHNHQUFxRjtBQUNyRiw2Q0FBbUQ7QUFDbkQsdURBQXdFO0FBRXhFLDJDQUF1QztBQUN2Qyw2RUFBd0U7QUFDeEUscURBQWdGO0FBRWhGLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBc0MvRSxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQWExQyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDTyxLQUF5QjtRQUUxQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRkEsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFJMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLHdCQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDckQsWUFBWSxFQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxvQkFBb0I7U0FDaEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLDZDQUFvQixDQUNqRCxJQUFJLEVBQ0osb0JBQW9CLEVBQ3BCO1lBQ0UsV0FBVyxFQUNULG9FQUFvRTtZQUN0RSxZQUFZLEVBQUUseUJBQVksQ0FBQyxNQUFNO1lBQ2pDLFdBQVcsRUFBRTtnQkFDWCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUM3QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7Z0JBQ2pELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7b0JBQ3RCLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7b0JBQzlDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUjtTQUNGLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLGtCQUFLLENBQ3ZDLElBQUksRUFDSiw2QkFBNkIsRUFDN0I7WUFDRSxTQUFTLEVBQUUsUUFBUTtZQUNuQixPQUFPLEVBQUUsa0JBQWtCLENBQUMsY0FBYztTQUMzQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTztZQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ3BCLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDbkMsV0FBVyxFQUFFLHdCQUF3QjthQUN0QyxDQUFDLENBQUM7UUFFUCxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGFBQWE7Z0JBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsR0FBRyxzQ0FBcUIsR0FBRyxzQ0FBcUIsRUFBRTtZQUN0RCxtRUFBbUU7WUFDbkUsT0FBTyxFQUFFLENBQUMsbUNBQVUsQ0FBQyxJQUFJLENBQUM7WUFDMUIsV0FBVyxFQUFFLElBQUksMkRBQXFCLENBQ3BDLHVCQUF1QixFQUN2QixJQUFJLENBQUMsd0JBQXdCLENBQzlCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQXJFTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWM7UUFDbkMsT0FBTyxLQUFLLEtBQUssU0FBUztZQUN4QixDQUFDLENBQUMsc0NBQXFCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7WUFDakQsQ0FBQyxDQUFDLHNDQUFxQixDQUFDO0lBQzVCLENBQUM7SUFtRUQscUJBQXFCLENBQUMsS0FBYztRQUNsQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQkFBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSywrQ0FBK0MsQ0FDcEcsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUN4QixNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFFL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1NBQ2xFO1FBRUQsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQ3pELEtBQUssQ0FDTixHQUFHLHNDQUFxQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQzs7QUFsR0gsc0NBbUdDOzs7QUFsR3lCLGtDQUFvQixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBpZ3d2MiBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYVwiO1xuaW1wb3J0IHsgSHR0cE1ldGhvZCB9IGZyb20gXCJAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWFscGhhXCI7XG5pbXBvcnQgeyBIdHRwTGFtYmRhSW50ZWdyYXRpb24gfSBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMtYWxwaGFcIjtcbmltcG9ydCB7IGF3c19ldmVudHMgYXMgRXZlbnRzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBBbGlhcywgQXJjaGl0ZWN0dXJlLCBJRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSVNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTbGFja0hhbmRsZXJGdW5jdGlvbiB9IGZyb20gXCIuL2xhbWJkYXMvc2xhY2staGFuZGxlci1mdW5jdGlvblwiO1xuaW1wb3J0IHsgU0xBQ0tfUEFUSF9BUFBfUFJFRklYLCBTTEFDS19QQVRIX0VWRU5UU19BUEkgfSBmcm9tIFwiLi9wYXRoLWNvbnN0YW50c1wiO1xuXG5jb25zdCB3aXRoU2xhc2ggPSAocGF0aDogc3RyaW5nKSA9PiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBcIi9cIiArIHBhdGgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNsYWNrRXZlbnRCdXNTaW5nbGVBcHBQcm9wcyB7XG4gIC8qKlxuICAgKiBgYXBwSWRgIHRvIHVzZSBmb3IgYWxsIHJlcXVlc3QgdmFsaWRhdGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogYGV2ZW50c0FwaVBhdGhgIHdoaWNoIHdvdWxkIGJlIHVzZWQgZm9yIHRoZSBldmVudHMgcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzQXBpUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNsYWNrRXZlbnRCdXNQcm9wcyB7XG4gIC8qKlxuICAgKiBgc2VjcmV0YCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgU2VjcmV0IHBhcmFtZXRlciB0aGF0IHN0b3JlcyB0aGUgc2lnbmluZy1zZWNyZXRcbiAgICogYW5kIGFsc28gaWYgb0F1dGggZW5hYmxlZDsgY2xpZW50IGlkIC8gY2xpZW50IHNlY3JldCBmb3IgZWFjaCBpbmRpdmlkdWFsIGFwcElkXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIGBldmVudEJ1c05hbWVgIG9wdGlvbmFsIG5hbWUgdG8gb3ZlcnJpZGUgdGhlIGV2ZW50IGJ1cyBuYW1lXG4gICAqL1xuICByZWFkb25seSBldmVudEJ1c05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGBodHRwQXBpYCBvcHRpb25hbCBIVFRQIEFQSSB0byB1c2UsIGluc3RlYWQgb2YgQ29uc3RydWN0IGNyZWF0aW5nIGEgbmV3IG9uZVxuICAgKi9cbiAgcmVhZG9ubHkgaHR0cEFwaT86IGFwaWd3djIuSHR0cEFwaTtcblxuICAvKipcbiAgICogYHNpbmdsZUFwcGAgb3B0aW9uYWxseSBjb25maWd1cmUgdG8gdXNlIGEgc2luZ2xlIGFwcGxpY2F0aW9uXG4gICAqIHdpdGggZml4ZWQgYXBwIGlkIGFuZCBwYXRoIHRvIHVzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQXBwPzogU2xhY2tFdmVudEJ1c1NpbmdsZUFwcFByb3BzO1xufVxuXG5leHBvcnQgY2xhc3MgU2xhY2tFdmVudEJ1cyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNMQUNLX0VWRU5UX0JVU19OQU1FID0gXCJzbGFjay1ldmVudC1idXNcIjtcblxuICBwcml2YXRlIHN0YXRpYyBhcHBQYXRoKGFwcElkPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFwcElkICE9PSB1bmRlZmluZWRcbiAgICAgID8gU0xBQ0tfUEFUSF9BUFBfUFJFRklYLnJlcGxhY2UoXCJ7YXBwSWR9XCIsIGFwcElkKVxuICAgICAgOiBTTEFDS19QQVRIX0FQUF9QUkVGSVg7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHBFdmVudEJ1czogRXZlbnRzLkV2ZW50QnVzO1xuICBwcml2YXRlIHJlYWRvbmx5IHBTbGFja0hhbmRsZXJMYW1iZGFBbGlhczogQWxpYXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcEh0dHBBcGk6IGFwaWd3djIuSHR0cEFwaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogU2xhY2tFdmVudEJ1c1Byb3BzXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnBFdmVudEJ1cyA9IG5ldyBFdmVudHMuRXZlbnRCdXModGhpcywgXCJFdmVudEJ1c1wiLCB7XG4gICAgICBldmVudEJ1c05hbWU6XG4gICAgICAgIHRoaXMucHJvcHMuZXZlbnRCdXNOYW1lIHx8IFNsYWNrRXZlbnRCdXMuU0xBQ0tfRVZFTlRfQlVTX05BTUUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzbGFja0hhbmRsZXJMYW1iZGEgPSBuZXcgU2xhY2tIYW5kbGVyRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJTbGFja0hhbmRsZXJMYW1iZGFcIixcbiAgICAgIHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJMYW1iZGEgdGhhdCBoYW5kbGVzIFNsYWNrIEV2ZW50cywgSW50ZXJhY3Rpb25zLCBDb21tYW5kcyBhbmQgb0F1dGhcIixcbiAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIFNMQUNLX1NFQ1JFVF9BUk46IHRoaXMucHJvcHMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgICBTTEFDS19FVkVOVF9CVVNfTkFNRTogdGhpcy5wRXZlbnRCdXMuZXZlbnRCdXNOYW1lLFxuICAgICAgICAgIC4uLih0aGlzLnByb3BzLnNpbmdsZUFwcFxuICAgICAgICAgICAgPyB7IFNMQUNLX0FQUF9JRDogdGhpcy5wcm9wcy5zaW5nbGVBcHAuYXBwSWQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucFNsYWNrSGFuZGxlckxhbWJkYUFsaWFzID0gbmV3IEFsaWFzKFxuICAgICAgdGhpcyxcbiAgICAgIFwiU2xhY2tIYW5kbGVyTGFtYmRhTGl2ZUFsaWFzXCIsXG4gICAgICB7XG4gICAgICAgIGFsaWFzTmFtZTogXCJsYXRlc3RcIixcbiAgICAgICAgdmVyc2lvbjogc2xhY2tIYW5kbGVyTGFtYmRhLmN1cnJlbnRWZXJzaW9uLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnByb3BzLnNlY3JldC5ncmFudFJlYWQodGhpcy5wU2xhY2tIYW5kbGVyTGFtYmRhQWxpYXMpO1xuICAgIHRoaXMucEV2ZW50QnVzLmdyYW50UHV0RXZlbnRzVG8odGhpcy5wU2xhY2tIYW5kbGVyTGFtYmRhQWxpYXMpO1xuXG4gICAgdGhpcy5wSHR0cEFwaSA9IHRoaXMucHJvcHMuaHR0cEFwaVxuICAgICAgPyB0aGlzLnByb3BzLmh0dHBBcGlcbiAgICAgIDogbmV3IGFwaWd3djIuSHR0cEFwaSh0aGlzLCBcIkh0dHBBcGlcIiwge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlNsYWNrIEhhbmRsZXIgSHR0cCBBcGlcIixcbiAgICAgICAgfSk7XG5cbiAgICAvLyBhZGQgZm9yIGhhbmRsaW5nIHNsYWNrIGV2ZW50cyByb3V0ZVxuICAgIHRoaXMucEh0dHBBcGkuYWRkUm91dGVzKHtcbiAgICAgIHBhdGg6IHRoaXMucHJvcHMuc2luZ2xlQXBwPy5ldmVudHNBcGlQYXRoXG4gICAgICAgID8gd2l0aFNsYXNoKHRoaXMucHJvcHMuc2luZ2xlQXBwLmV2ZW50c0FwaVBhdGgpXG4gICAgICAgIDogYCR7U0xBQ0tfUEFUSF9BUFBfUFJFRklYfSR7U0xBQ0tfUEFUSF9FVkVOVFNfQVBJfWAsXG4gICAgICAvLyBBTEwgbWV0aG9kcyBleHBlY3QgT1BUSU9OUyAvIEFOWSBzaG91bGQgYmUgaGFuZGxlZCBieSBvdXIgTGFtYmRhXG4gICAgICBtZXRob2RzOiBbSHR0cE1ldGhvZC5QT1NUXSxcbiAgICAgIGludGVncmF0aW9uOiBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICBcIkV2ZW50c1Bvc3RJbnRlZ3JhdGlvblwiLFxuICAgICAgICB0aGlzLnBTbGFja0hhbmRsZXJMYW1iZGFBbGlhc1xuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHNsYWNrRXZlbnRzUmVxdWVzdFVybChhcHBJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2luZ2xlQXBwICYmIHRoaXMucHJvcHMuc2luZ2xlQXBwLmFwcElkICE9PSBhcHBJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgeW91IGNhbiBvbmx5IHVzZSB3aXRoICcke3RoaXMucHJvcHMuc2luZ2xlQXBwLmFwcElkfScgYXBwSWQgYmVjYXVzZSBwcm9wcy5zaW5nbGVBcHAgaXMgY29uZmlndXJlZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuc2luZ2xlQXBwKSB7XG4gICAgICBjb25zdCB7IGV2ZW50c0FwaVBhdGggfSA9IHRoaXMucHJvcHMuc2luZ2xlQXBwO1xuXG4gICAgICByZXR1cm4gYCR7dGhpcy5wSHR0cEFwaS5hcGlFbmRwb2ludH0ke3dpdGhTbGFzaChldmVudHNBcGlQYXRoKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnBIdHRwQXBpLmFwaUVuZHBvaW50fSR7U2xhY2tFdmVudEJ1cy5hcHBQYXRoKFxuICAgICAgYXBwSWRcbiAgICApfSR7U0xBQ0tfUEFUSF9FVkVOVFNfQVBJfWA7XG4gIH1cblxuICBnZXQgZXZlbnRCdXMoKTogRXZlbnRzLkV2ZW50QnVzIHtcbiAgICByZXR1cm4gdGhpcy5wRXZlbnRCdXM7XG4gIH1cblxuICBnZXQgc2xhY2tIYW5kbGVyTGFtYmRhQWxpYXMoKTogSUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wU2xhY2tIYW5kbGVyTGFtYmRhQWxpYXM7XG4gIH1cbn1cbiJdfQ==