@wheatstalk/aws-cdk-exec
Version:
An AWS CDK Cloud Assembly-aware command to help find and execute lambda functions and state machines
208 lines • 26.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LambdaFunctionExecutor = exports.StateMachineExecutor = exports.Executor = void 0;
const aws_sdk_1 = require("./aws-sdk");
const find_matching_resources_1 = require("./find-matching-resources");
const STATE_MACHINE_TYPE = 'AWS::StepFunctions::StateMachine';
const LAMBDA_TYPE = 'AWS::Lambda::Function';
/**
* Executor base class.
*/
class Executor {
/**
* Find an executor
*/
static async find(options) {
return findExecutors(options);
}
constructor(options) {
this.physicalResourceId = options.physicalResourceId;
this.constructPath = options.constructPath;
this.logicalResourceId = options.logicalResourceId;
}
env() {
return Promise.resolve({});
}
;
validateJsonObjectInput(input) {
if (input && !isJsonObject(input)) {
throw new Error('The provided input should be a JSON object');
}
}
}
exports.Executor = Executor;
/**
* Executes a Step Functions State Machine
*/
class StateMachineExecutor extends Executor {
constructor(options) {
super(options);
this.stepFunctions = options.stepFunctions;
}
async execute(input) {
this.validateJsonObjectInput(input);
const execution = await this.stepFunctions.startExecution({
stateMachineArn: this.physicalResourceId,
input,
}).promise();
while (true) {
const description = await this.stepFunctions.describeExecution({
executionArn: execution.executionArn,
}).promise();
const executionStatus = description.status;
if (executionStatus == 'RUNNING') {
await new Promise(res => setTimeout(res, 500));
continue;
}
if (executionStatus === 'SUCCEEDED') {
const output = description.output
? JSON.parse(description.output)
: undefined;
return {
output,
};
}
// Get the end of the execution history where we should find the final
// events/cause for the execution's failure.
const history = await this.stepFunctions.getExecutionHistory({
executionArn: execution.executionArn,
reverseOrder: true,
}).promise();
function getErrorOutput(events) {
var _a;
for (const event of events) {
switch (event.type) {
case 'ExecutionFailed':
try {
// Decode a JSON-encoded cause, such as for when a Lambda task
// exception was the root cause.
return {
...event.executionFailedEventDetails,
cause: JSON.parse((_a = event.executionFailedEventDetails) === null || _a === void 0 ? void 0 : _a.cause),
};
}
catch (e) {
return event.executionFailedEventDetails;
}
case 'ExecutionAborted':
return event.executionAbortedEventDetails;
case 'ExecutionTimedOut':
return event.executionTimedOutEventDetails;
}
}
return;
}
return {
error: `State machine execution's final status is ${executionStatus}`,
output: getErrorOutput(history.events),
};
}
}
}
exports.StateMachineExecutor = StateMachineExecutor;
/**
* Executes a lambda function
*/
class LambdaFunctionExecutor extends Executor {
constructor(options) {
super(options);
this.lambda = options.lambda;
}
async execute(input) {
var _a;
this.validateJsonObjectInput(input);
const response = await this.lambda.invoke({
FunctionName: this.physicalResourceId,
Payload: input,
}).promise();
const payload = (_a = response.Payload) === null || _a === void 0 ? void 0 : _a.toString();
if (!payload) {
throw new Error('Lambda invocation did not return a payload');
}
const output = JSON.parse(payload);
const error = getLambdaErrorMessage(output);
if (error) {
return {
error,
output,
};
}
return {
output,
};
}
async env() {
var _a;
const config = await this.lambda.getFunctionConfiguration({
FunctionName: this.physicalResourceId,
}).promise();
const environmentVariables = (_a = config.Environment) === null || _a === void 0 ? void 0 : _a.Variables;
return environmentVariables !== null && environmentVariables !== void 0 ? environmentVariables : {};
}
}
exports.LambdaFunctionExecutor = LambdaFunctionExecutor;
function getLambdaErrorMessage(output) {
if (typeof output !== 'object' || output === null) {
return;
}
if (output.errorMessage) {
return output.errorMessage;
}
return;
}
/**
* Finds an executor.
*/
async function findExecutors(options) {
const { sdk } = options;
const matchingResources = (0, find_matching_resources_1.findMatchingResources)({
...options,
types: [
STATE_MACHINE_TYPE,
LAMBDA_TYPE,
],
});
const lazyListStackResources = {};
function getLazyListStackResources(matchingResource) {
if (!lazyListStackResources[matchingResource.stackName]) {
lazyListStackResources[matchingResource.stackName] = new aws_sdk_1.LazyListStackResources(sdk, matchingResource.stackName);
}
return lazyListStackResources[matchingResource.stackName];
}
return Promise.all(matchingResources.map(async (matchingResource) => {
// Cache lazy lists
const listStackResources = getLazyListStackResources(matchingResource);
const stackResource = (await listStackResources.listStackResources())
.find(sr => sr.LogicalResourceId === matchingResource.logicalResourceId);
if (!stackResource || !stackResource.PhysicalResourceId) {
throw new Error(`Could not find the physical resource id for ${matchingResource.constructPath}`);
}
switch (stackResource.ResourceType) {
case STATE_MACHINE_TYPE:
return new StateMachineExecutor({
constructPath: matchingResource.constructPath,
logicalResourceId: matchingResource.logicalResourceId,
physicalResourceId: stackResource.PhysicalResourceId,
stepFunctions: sdk.stepFunctions(),
});
case LAMBDA_TYPE:
return new LambdaFunctionExecutor({
constructPath: matchingResource.constructPath,
logicalResourceId: matchingResource.logicalResourceId,
physicalResourceId: stackResource.PhysicalResourceId,
lambda: sdk.lambda(),
});
default:
throw new Error(`Unsupported resource type ${stackResource.ResourceType}`);
}
}));
}
function isJsonObject(json) {
try {
return typeof JSON.parse(json) == 'object';
}
catch (e) {
return false;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUNBQTREO0FBQzVELHVFQUF1SDtBQUV2SCxNQUFNLGtCQUFrQixHQUFHLGtDQUFrQyxDQUFDO0FBQzlELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDO0FBc0I1Qzs7R0FFRztBQUNILE1BQXNCLFFBQVE7SUFDNUI7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUE0QjtRQUM1QyxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBTUQsWUFBc0IsT0FBd0I7UUFDNUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztJQUNyRCxDQUFDO0lBU00sR0FBRztRQUNSLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQUEsQ0FBQztJQUVRLHVCQUF1QixDQUFDLEtBQXlCO1FBQ3pELElBQUksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7Q0FDRjtBQWxDRCw0QkFrQ0M7QUFzQkQ7O0dBRUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLFFBQVE7SUFHaEQsWUFBWSxPQUFvQztRQUM5QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMs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QUFPLElBQUksb0JBQW9CLENBQUM7b0JBQzlCLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhO29CQUM3QyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxpQkFBaUI7b0JBQ3JELGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxrQkFBa0I7b0JBQ3BELGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxFQUFFO2lCQUNuQyxDQUFDLENBQUM7WUFFTCxLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxJQUFJLHNCQUFzQixDQUFDO29CQUNoQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsYUFBYTtvQkFDN0MsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUMsaUJBQWlCO29CQUNyRCxrQkFBa0IsRUFBRSxhQUFhLENBQUMsa0JBQWtCO29CQUNwRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRTtpQkFDckIsQ0FBQyxDQUFDO1lBRUw7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDOUU7SUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQVk7SUFDaEMsSUFBSTtRQUNGLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQztLQUM1QztJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBJQXdzU2RrLCBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzIH0gZnJvbSAnLi9hd3Mtc2RrJztcbmltcG9ydCB7IEZpbmRNYXRjaGluZ1Jlc291cmNlT3B0aW9uc0NvbW1vbiwgZmluZE1hdGNoaW5nUmVzb3VyY2VzLCBNYXRjaGluZ1Jlc291cmNlIH0gZnJvbSAnLi9maW5kLW1hdGNoaW5nLXJlc291cmNlcyc7XG5cbmNvbnN0IFNUQVRFX01BQ0hJTkVfVFlQRSA9ICdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZSc7XG5jb25zdCBMQU1CREFfVFlQRSA9ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBTdGF0ZU1hY2hpbmVFeGVjdXRvcmBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdCBwYXRoIG9mIHRoZSBtYXRjaGluZyByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0cnVjdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2ljYWwgaWQgb2YgdGhlIG1hdGNoaW5nIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9naWNhbFJlc291cmNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBoeXNpY2FsIHJlc291cmNlIG9mIHRoZSByZXNvdXJjZSB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhlY3V0b3IgYmFzZSBjbGFzcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEV4ZWN1dG9yIHtcbiAgLyoqXG4gICAqIEZpbmQgYW4gZXhlY3V0b3JcbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKG9wdGlvbnM6IEZpbmRFeGVjdXRvck9wdGlvbnMpOiBQcm9taXNlPEV4ZWN1dG9yW10+IHtcbiAgICByZXR1cm4gZmluZEV4ZWN1dG9ycyhvcHRpb25zKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGNvbnN0cnVjdFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEV4ZWN1dG9yT3B0aW9ucykge1xuICAgIHRoaXMucGh5c2ljYWxSZXNvdXJjZUlkID0gb3B0aW9ucy5waHlzaWNhbFJlc291cmNlSWQ7XG4gICAgdGhpcy5jb25zdHJ1Y3RQYXRoID0gb3B0aW9ucy5jb25zdHJ1Y3RQYXRoO1xuICAgIHRoaXMubG9naWNhbFJlc291cmNlSWQgPSBvcHRpb25zLmxvZ2ljYWxSZXNvdXJjZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHJlc291cmNlXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCBJbnB1dCBmb3IgZXhlY3V0aW9uLlxuICAgKi9cbiAgYWJzdHJhY3QgZXhlY3V0ZShpbnB1dD86IHN0cmluZyk6IFByb21pc2U8RXhlY3V0ZVJlc3VsdD47XG5cbiAgcHVibGljIGVudigpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVKc29uT2JqZWN0SW5wdXQoaW5wdXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChpbnB1dCAmJiAhaXNKc29uT2JqZWN0KGlucHV0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgaW5wdXQgc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBmaW5kaW5nIGV4ZWN1dG9ycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kRXhlY3V0b3JPcHRpb25zIGV4dGVuZHMgRmluZE1hdGNoaW5nUmVzb3VyY2VPcHRpb25zQ29tbW9uIHtcbiAgLyoqXG4gICAqIEFXUyBTREtcbiAgICovXG4gIHJlYWRvbmx5IHNkazogSUF3c1Nkaztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgU3RhdGVNYWNoaW5lRXhlY3V0b3JgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVNYWNoaW5lRXhlY3V0b3JPcHRpb25zIGV4dGVuZHMgRXhlY3V0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBTdGVwIEZ1bmN0aW9ucyBTREtcbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBGdW5jdGlvbnM6IEFXUy5TdGVwRnVuY3Rpb25zO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgU3RlcCBGdW5jdGlvbnMgU3RhdGUgTWFjaGluZVxuICovXG5leHBvcnQgY2xhc3MgU3RhdGVNYWNoaW5lRXhlY3V0b3IgZXh0ZW5kcyBFeGVjdXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RlcEZ1bmN0aW9uczogQVdTLlN0ZXBGdW5jdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU3RhdGVNYWNoaW5lRXhlY3V0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5zdGVwRnVuY3Rpb25zID0gb3B0aW9ucy5zdGVwRnVuY3Rpb25zO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShpbnB1dD86IHN0cmluZyk6IFByb21pc2U8RXhlY3V0ZVJlc3VsdD4ge1xuICAgIHRoaXMudmFsaWRhdGVKc29uT2JqZWN0SW5wdXQoaW5wdXQpO1xuXG4gICAgY29uc3QgZXhlY3V0aW9uID0gYXdhaXQgdGhpcy5zdGVwRnVuY3Rpb25zLnN0YXJ0RXhlY3V0aW9uKHtcbiAgICAgIHN0YXRlTWFjaGluZUFybjogdGhpcy5waHlzaWNhbFJlc291cmNlSWQsXG4gICAgICBpbnB1dCxcbiAgICB9KS5wcm9taXNlKCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBhd2FpdCB0aGlzLnN0ZXBGdW5jdGlvbnMuZGVzY3JpYmVFeGVjdXRpb24oe1xuICAgICAgICBleGVjdXRpb25Bcm46IGV4ZWN1dGlvbi5leGVjdXRpb25Bcm4sXG4gICAgICB9KS5wcm9taXNlKCk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvblN0YXR1cyA9IGRlc2NyaXB0aW9uLnN0YXR1cztcbiAgICAgIGlmIChleGVjdXRpb25TdGF0dXMgPT0gJ1JVTk5JTkcnKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgNTAwKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uU3RhdHVzID09PSAnU1VDQ0VFREVEJykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBkZXNjcmlwdGlvbi5vdXRwdXRcbiAgICAgICAgICA/IEpTT04ucGFyc2UoZGVzY3JpcHRpb24ub3V0cHV0KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIGVuZCBvZiB0aGUgZXhlY3V0aW9uIGhpc3Rvcnkgd2hlcmUgd2Ugc2hvdWxkIGZpbmQgdGhlIGZpbmFsXG4gICAgICAvLyBldmVudHMvY2F1c2UgZm9yIHRoZSBleGVjdXRpb24ncyBmYWlsdXJlLlxuICAgICAgY29uc3QgaGlzdG9yeSA9IGF3YWl0IHRoaXMuc3RlcEZ1bmN0aW9ucy5nZXRFeGVjdXRpb25IaXN0b3J5KHtcbiAgICAgICAgZXhlY3V0aW9uQXJuOiBleGVjdXRpb24uZXhlY3V0aW9uQXJuLFxuICAgICAgICByZXZlcnNlT3JkZXI6IHRydWUsXG4gICAgICB9KS5wcm9taXNlKCk7XG5cbiAgICAgIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KGV2ZW50czogQVdTLlN0ZXBGdW5jdGlvbnMuSGlzdG9yeUV2ZW50TGlzdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRXhlY3V0aW9uRmFpbGVkJzpcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBEZWNvZGUgYSBKU09OLWVuY29kZWQgY2F1c2UsIHN1Y2ggYXMgZm9yIHdoZW4gYSBMYW1iZGEgdGFza1xuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3YXMgdGhlIHJvb3QgY2F1c2UuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmV4ZWN1dGlvbkZhaWxlZEV2ZW50RGV0YWlscyxcbiAgICAgICAgICAgICAgICAgIGNhdXNlOiBKU09OLnBhcnNlKGV2ZW50LmV4ZWN1dGlvbkZhaWxlZEV2ZW50RGV0YWlscz8uY2F1c2UhKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmV4ZWN1dGlvbkZhaWxlZEV2ZW50RGV0YWlscztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdFeGVjdXRpb25BYm9ydGVkJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmV4ZWN1dGlvbkFib3J0ZWRFdmVudERldGFpbHM7XG4gICAgICAgICAgICBjYXNlICdFeGVjdXRpb25UaW1lZE91dCc6XG4gICAgICAgICAgICAgIHJldHVybiBldmVudC5leGVjdXRpb25UaW1lZE91dEV2ZW50RGV0YWlscztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBgU3RhdGUgbWFjaGluZSBleGVjdXRpb24ncyBmaW5hbCBzdGF0dXMgaXMgJHtleGVjdXRpb25TdGF0dXN9YCxcbiAgICAgICAgb3V0cHV0OiBnZXRFcnJvck91dHB1dChoaXN0b3J5LmV2ZW50cyksXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBleGVjdXRvcidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24ncyBvdXRwdXQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIHJlYWRvbmx5IGVycm9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uRXhlY3V0b3JPcHRpb25zIGV4dGVuZHMgRXhlY3V0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgU0RLXG4gICAqL1xuICByZWFkb25seSBsYW1iZGE6IEFXUy5MYW1iZGE7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBsYW1iZGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUZ1bmN0aW9uRXhlY3V0b3IgZXh0ZW5kcyBFeGVjdXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhOiBBV1MuTGFtYmRhO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IExhbWJkYUZ1bmN0aW9uRXhlY3V0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zLmxhbWJkYTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXQ/OiBzdHJpbmcpOiBQcm9taXNlPEV4ZWN1dGVSZXN1bHQ+IHtcbiAgICB0aGlzLnZhbGlkYXRlSnNvbk9iamVjdElucHV0KGlucHV0KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5sYW1iZGEuaW52b2tlKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogdGhpcy5waHlzaWNhbFJlc291cmNlSWQsXG4gICAgICBQYXlsb2FkOiBpbnB1dCxcbiAgICB9KS5wcm9taXNlKCk7XG5cbiAgICBjb25zdCBwYXlsb2FkID0gcmVzcG9uc2UuUGF5bG9hZD8udG9TdHJpbmcoKTtcbiAgICBpZiAoIXBheWxvYWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTGFtYmRhIGludm9jYXRpb24gZGlkIG5vdCByZXR1cm4gYSBwYXlsb2FkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICBjb25zdCBlcnJvciA9IGdldExhbWJkYUVycm9yTWVzc2FnZShvdXRwdXQpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIG91dHB1dCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dHB1dCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVudigpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmxhbWJkYS5nZXRGdW5jdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgRnVuY3Rpb25OYW1lOiB0aGlzLnBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICB9KS5wcm9taXNlKCk7XG5cbiAgICBjb25zdCBlbnZpcm9ubWVudFZhcmlhYmxlcyA9IGNvbmZpZy5FbnZpcm9ubWVudD8uVmFyaWFibGVzO1xuICAgIHJldHVybiBlbnZpcm9ubWVudFZhcmlhYmxlcyA/PyB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW1iZGFFcnJvck1lc3NhZ2Uob3V0cHV0OiBhbnkpIHtcbiAgaWYgKHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnIHx8IG91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvdXRwdXQuZXJyb3JNZXNzYWdlKSB7XG4gICAgcmV0dXJuIG91dHB1dC5lcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRmluZHMgYW4gZXhlY3V0b3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRFeGVjdXRvcnMob3B0aW9uczogRmluZEV4ZWN1dG9yT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JbXT4ge1xuICBjb25zdCB7IHNkayB9ID0gb3B0aW9ucztcblxuICBjb25zdCBtYXRjaGluZ1Jlc291cmNlcyA9IGZpbmRNYXRjaGluZ1Jlc291cmNlcyh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlczogW1xuICAgICAgU1RBVEVfTUFDSElORV9UWVBFLFxuICAgICAgTEFNQkRBX1RZUEUsXG4gICAgXSxcbiAgfSk7XG5cbiAgY29uc3QgbGF6eUxpc3RTdGFja1Jlc291cmNlczogUmVjb3JkPHN0cmluZywgTGF6eUxpc3RTdGFja1Jlc291cmNlcz4gPSB7fTtcbiAgZnVuY3Rpb24gZ2V0TGF6eUxpc3RTdGFja1Jlc291cmNlcyhtYXRjaGluZ1Jlc291cmNlOiBNYXRjaGluZ1Jlc291cmNlKSB7XG4gICAgaWYgKCFsYXp5TGlzdFN0YWNrUmVzb3VyY2VzW21hdGNoaW5nUmVzb3VyY2Uuc3RhY2tOYW1lXSkge1xuICAgICAgbGF6eUxpc3RTdGFja1Jlc291cmNlc1ttYXRjaGluZ1Jlc291cmNlLnN0YWNrTmFtZV0gPSBuZXcgTGF6eUxpc3RTdGFja1Jlc291cmNlcyhzZGssIG1hdGNoaW5nUmVzb3VyY2Uuc3RhY2tOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGF6eUxpc3RTdGFja1Jlc291cmNlc1ttYXRjaGluZ1Jlc291cmNlLnN0YWNrTmFtZV07XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgbWF0Y2hpbmdSZXNvdXJjZXMubWFwKGFzeW5jIChtYXRjaGluZ1Jlc291cmNlKSA9PiB7XG4gICAgICAvLyBDYWNoZSBsYXp5IGxpc3RzXG4gICAgICBjb25zdCBsaXN0U3RhY2tSZXNvdXJjZXMgPSBnZXRMYXp5TGlzdFN0YWNrUmVzb3VyY2VzKG1hdGNoaW5nUmVzb3VyY2UpO1xuXG4gICAgICBjb25zdCBzdGFja1Jlc291cmNlID0gKGF3YWl0IGxpc3RTdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKSlcbiAgICAgICAgLmZpbmQoc3IgPT4gc3IuTG9naWNhbFJlc291cmNlSWQgPT09IG1hdGNoaW5nUmVzb3VyY2UubG9naWNhbFJlc291cmNlSWQpO1xuXG4gICAgICBpZiAoIXN0YWNrUmVzb3VyY2UgfHwgIXN0YWNrUmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHBoeXNpY2FsIHJlc291cmNlIGlkIGZvciAke21hdGNoaW5nUmVzb3VyY2UuY29uc3RydWN0UGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChzdGFja1Jlc291cmNlLlJlc291cmNlVHlwZSkge1xuICAgICAgICBjYXNlIFNUQVRFX01BQ0hJTkVfVFlQRTpcbiAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlTWFjaGluZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIGNvbnN0cnVjdFBhdGg6IG1hdGNoaW5nUmVzb3VyY2UuY29uc3RydWN0UGF0aCxcbiAgICAgICAgICAgIGxvZ2ljYWxSZXNvdXJjZUlkOiBtYXRjaGluZ1Jlc291cmNlLmxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdGFja1Jlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICAgICAgICAgIHN0ZXBGdW5jdGlvbnM6IHNkay5zdGVwRnVuY3Rpb25zKCksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBMQU1CREFfVFlQRTpcbiAgICAgICAgICByZXR1cm4gbmV3IExhbWJkYUZ1bmN0aW9uRXhlY3V0b3Ioe1xuICAgICAgICAgICAgY29uc3RydWN0UGF0aDogbWF0Y2hpbmdSZXNvdXJjZS5jb25zdHJ1Y3RQYXRoLFxuICAgICAgICAgICAgbG9naWNhbFJlc291cmNlSWQ6IG1hdGNoaW5nUmVzb3VyY2UubG9naWNhbFJlc291cmNlSWQsXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IHN0YWNrUmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgICAgICAgICAgbGFtYmRhOiBzZGsubGFtYmRhKCksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJlc291cmNlIHR5cGUgJHtzdGFja1Jlc291cmNlLlJlc291cmNlVHlwZX1gKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KGpzb246IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiB0eXBlb2YgSlNPTi5wYXJzZShqc29uKSA9PSAnb2JqZWN0JztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19