faastjs
Version:
Serverless batch computing made simple.
170 lines • 23.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
/**
* The purpose of this test is to check that the trampoline function on AWS can
* route calls, invoke the wrapper, and return values correctly, without
* actually creating a cloud function. However, it does use real cloud queues.
*/
const client_sqs_1 = require("@aws-sdk/client-sqs");
const ava_1 = tslib_1.__importDefault(require("ava"));
const uuid_1 = require("uuid");
const aws_faast_1 = require("../src/aws/aws-faast");
const aws_queue_1 = require("../src/aws/aws-queue");
const aws_trampoline_1 = require("../src/aws/aws-trampoline");
const provider_1 = require("../src/provider");
const serialize_1 = require("../src/serialize");
const shared_1 = require("../src/shared");
const wrapper_1 = require("../src/wrapper");
const funcs = tslib_1.__importStar(require("./fixtures/functions"));
const util_1 = require("./fixtures/util");
const sqs = new client_sqs_1.SQS({ apiVersion: "2012-11-05", region: "us-west-2" });
process.env.AWS_REGION = "us-west-2";
process.env.FAAST_SILENT = "true";
const lambdaContext = {
callbackWaitsForEmptyEventLoop: true,
awsRequestId: "aws-trampoline-test-awsRequestId",
logGroupName: "aws-trampoline-test-logGroupName",
logStreamName: "aws-trampoline-test-logStreamName",
getRemainingTimeInMillis: () => 1000,
functionName: "aws-trampoline-test-functionName",
functionVersion: "aws-trampoline-test-functionVersion",
invokedFunctionArn: "aws-trampoline-test-invokedFunctionArn",
memoryLimitInMB: "1728",
done: () => { },
fail: _ => { },
succeed: (_) => { }
};
async function makeResponseQueue() {
const QueueName = `faast-${(0, uuid_1.v4)()}-test`;
const { QueueUrl } = await sqs.createQueue({ QueueName });
return QueueUrl;
}
async function deleteResponseQueue(QueueUrl) {
try {
// Sometimes AWS needs time to propagate the existence of a queue before
// deleting it. This manifests as a NonExistentQueue error. Waiting
// a short while seems to make this less common.
await (0, shared_1.sleep)(5000);
return await sqs.deleteQueue({ QueueUrl });
}
catch (err) {
console.error(`Could not delete response queue: ${err}`);
throw err;
}
}
async function getMessages(QueueUrl, kind, nExpected) {
const metrics = new aws_faast_1.AwsMetrics();
const cancel = new Promise(_ => { });
const result = [];
while (result.length < nExpected) {
const messages = await (0, aws_queue_1.receiveMessages)(sqs, QueueUrl, metrics, cancel);
result.push(...(0, provider_1.filterMessages)(messages.Messages, kind));
}
return result;
}
(0, ava_1.default)((0, util_1.title)("aws", "trampoline https mode with promise response"), async (t) => {
const wrapper = new wrapper_1.Wrapper(funcs, { childProcess: false, wrapperLog: () => { } });
const { trampoline } = (0, aws_trampoline_1.makeTrampoline)(wrapper);
const arg = "promise with https on aws";
const name = funcs.identityString.name;
const QueueUrl = await makeResponseQueue();
try {
await trampoline({
callId: "42",
name,
args: (0, serialize_1.serializeFunctionArgs)(name, [arg], true),
modulePath: "./fixtures/functions",
ResponseQueueId: QueueUrl
}, lambdaContext);
const [msg] = await getMessages(QueueUrl, "promise", 1);
(0, util_1.expectMessage)(t, msg, "promise", arg);
}
finally {
deleteResponseQueue(QueueUrl);
}
});
(0, ava_1.default)((0, util_1.title)("aws", "trampoline queue mode with promise response"), async (t) => {
const wrapper = new wrapper_1.Wrapper(funcs, { childProcess: false, wrapperLog: () => { } });
const arg = "promise with queue on aws";
const QueueUrl = await makeResponseQueue();
try {
const { trampoline } = (0, aws_trampoline_1.makeTrampoline)(wrapper);
const name = funcs.identityString.name;
const call = {
callId: "43",
name,
args: (0, serialize_1.serializeFunctionArgs)(name, [arg], true),
modulePath: "./fixtures/functions",
ResponseQueueId: QueueUrl
};
const event = {
Records: [
{
Sns: {
Message: (0, serialize_1.serialize)(call)
}
}
]
};
await trampoline(event, lambdaContext);
const [msg] = await getMessages(QueueUrl, "promise", 1);
(0, util_1.expectMessage)(t, msg, "promise", arg);
}
finally {
await deleteResponseQueue(QueueUrl);
}
});
(0, ava_1.default)((0, util_1.title)("aws", "trampoline https mode with async iterator response"), async (t) => {
const wrapper = new wrapper_1.Wrapper(funcs, { childProcess: false, wrapperLog: () => { } });
const { trampoline } = (0, aws_trampoline_1.makeTrampoline)(wrapper);
const name = funcs.asyncGenerator.name;
const arg = ["async generator with https on aws", "second arg"];
const QueueUrl = await makeResponseQueue();
try {
await trampoline({
callId: "44",
name,
args: (0, serialize_1.serializeFunctionArgs)(name, [arg], true),
modulePath: "./fixtures/functions",
ResponseQueueId: QueueUrl
}, lambdaContext);
const messages = await getMessages(QueueUrl, "iterator", arg.length + 1);
(0, util_1.checkIteratorMessages)(t, messages, arg);
}
finally {
await deleteResponseQueue(QueueUrl);
}
});
(0, ava_1.default)((0, util_1.title)("aws", "trampoline queue mode with async iterator response"), async (t) => {
const wrapper = new wrapper_1.Wrapper(funcs, { childProcess: false, wrapperLog: () => { } });
const QueueUrl = await makeResponseQueue();
const arg = ["async generator with queue on aws", "second arg"];
try {
const { trampoline } = (0, aws_trampoline_1.makeTrampoline)(wrapper);
const name = funcs.asyncGenerator.name;
const call = {
callId: "45",
name,
args: (0, serialize_1.serializeFunctionArgs)(name, [arg], true),
modulePath: "./fixtures/functions",
ResponseQueueId: QueueUrl
};
const event = {
Records: [
{
Sns: {
Message: (0, serialize_1.serialize)(call)
}
}
]
};
await trampoline(event, lambdaContext);
const messages = await getMessages(QueueUrl, "iterator", arg.length + 1);
(0, util_1.checkIteratorMessages)(t, messages, arg);
}
finally {
await deleteResponseQueue(QueueUrl);
}
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXRyYW1wb2xpbmUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvYXdzLXRyYW1wb2xpbmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7OztHQUlHO0FBQ0gsb0RBQTBDO0FBQzFDLHNEQUF1QjtBQUV2QiwrQkFBb0M7QUFDcEMsb0RBQWtEO0FBQ2xELG9EQUF1RDtBQUN2RCw4REFBMkQ7QUFDM0QsOENBQXVEO0FBQ3ZELGdEQUFvRTtBQUNwRSwwQ0FBc0M7QUFDdEMsNENBQXlDO0FBQ3pDLG9FQUE4QztBQUM5QywwQ0FBOEU7QUFFOUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxnQkFBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN2RSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBRWxDLE1BQU0sYUFBYSxHQUFZO0lBQzNCLDhCQUE4QixFQUFFLElBQUk7SUFDcEMsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxZQUFZLEVBQUUsa0NBQWtDO0lBQ2hELGFBQWEsRUFBRSxtQ0FBbUM7SUFDbEQsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtJQUNwQyxZQUFZLEVBQUUsa0NBQWtDO0lBQ2hELGVBQWUsRUFBRSxxQ0FBcUM7SUFDdEQsa0JBQWtCLEVBQUUsd0NBQXdDO0lBQzVELGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO0lBQ2QsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUUsQ0FBQztJQUNiLE9BQU8sRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLEdBQUUsQ0FBQztDQUM3QixDQUFDO0FBRUYsS0FBSyxVQUFVLGlCQUFpQjtJQUM1QixNQUFNLFNBQVMsR0FBRyxTQUFTLElBQUEsU0FBTSxHQUFFLE9BQU8sQ0FBQztJQUMzQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMxRCxPQUFPLFFBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFFBQWdCO0lBQy9DLElBQUksQ0FBQztRQUNELHdFQUF3RTtRQUN4RSxtRUFBbUU7UUFDbkUsZ0RBQWdEO1FBQ2hELE1BQU0sSUFBQSxjQUFLLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsT0FBTyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6RCxNQUFNLEdBQUcsQ0FBQztJQUNkLENBQUM7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLFdBQVcsQ0FBaUIsUUFBZ0IsRUFBRSxJQUFPLEVBQUUsU0FBaUI7SUFDbkYsTUFBTSxPQUFPLEdBQUcsSUFBSSxzQkFBVSxFQUFFLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbEIsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSwyQkFBZSxFQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFBLHlCQUFjLEVBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsSUFBQSxhQUFJLEVBQUMsSUFBQSxZQUFLLEVBQUMsS0FBSyxFQUFFLDZDQUE2QyxDQUFDLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFBLCtCQUFjLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUM7SUFDeEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQkFBaUIsRUFBRSxDQUFDO0lBQzNDLElBQUksQ0FBQztRQUNELE1BQU0sVUFBVSxDQUNaO1lBQ0ksTUFBTSxFQUFFLElBQUk7WUFDWixJQUFJO1lBQ0osSUFBSSxFQUFFLElBQUEsaUNBQXFCLEVBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQzlDLFVBQVUsRUFBRSxzQkFBc0I7WUFDbEMsZUFBZSxFQUFFLFFBQVE7U0FDNUIsRUFDRCxhQUFhLENBQ2hCLENBQUM7UUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFBLG9CQUFhLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztZQUFTLENBQUM7UUFDUCxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGFBQUksRUFBQyxJQUFBLFlBQUssRUFBQyxLQUFLLEVBQUUsNkNBQTZDLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7SUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEYsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQkFBaUIsRUFBRSxDQUFDO0lBQzNDLElBQUksQ0FBQztRQUNELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFBLCtCQUFjLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUc7WUFDVCxNQUFNLEVBQUUsSUFBSTtZQUNaLElBQUk7WUFDSixJQUFJLEVBQUUsSUFBQSxpQ0FBcUIsRUFBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDOUMsVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxlQUFlLEVBQUUsUUFBUTtTQUM1QixDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUc7WUFDVixPQUFPLEVBQUU7Z0JBQ0w7b0JBQ0ksR0FBRyxFQUFFO3dCQUNELE9BQU8sRUFBRSxJQUFBLHFCQUFTLEVBQUMsSUFBSSxDQUFDO3FCQUMzQjtpQkFDSjthQUNKO1NBQ0osQ0FBQztRQUVGLE1BQU0sVUFBVSxDQUFDLEtBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBQSxvQkFBYSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7WUFBUyxDQUFDO1FBQ1AsTUFBTSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGFBQUksRUFBQyxJQUFBLFlBQUssRUFBQyxLQUFLLEVBQUUsb0RBQW9ELENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7SUFDL0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEYsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUEsK0JBQWMsRUFBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztJQUN2QyxNQUFNLEdBQUcsR0FBRyxDQUFDLG1DQUFtQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxJQUFJLENBQUM7UUFDRCxNQUFNLFVBQVUsQ0FDWjtZQUNJLE1BQU0sRUFBRSxJQUFJO1lBQ1osSUFBSTtZQUNKLElBQUksRUFBRSxJQUFBLGlDQUFxQixFQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUM5QyxVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLGVBQWUsRUFBRSxRQUFRO1NBQzVCLEVBQ0QsYUFBYSxDQUNoQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUEsNEJBQXFCLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDO1lBQVMsQ0FBQztRQUNQLE1BQU0sbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsSUFBQSxZQUFLLEVBQUMsS0FBSyxFQUFFLG9EQUFvRCxDQUFDLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sUUFBUSxHQUFHLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxDQUFDLG1DQUFtQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWhFLElBQUksQ0FBQztRQUNELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFBLCtCQUFjLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUc7WUFDVCxNQUFNLEVBQUUsSUFBSTtZQUNaLElBQUk7WUFDSixJQUFJLEVBQUUsSUFBQSxpQ0FBcUIsRUFBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDOUMsVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxlQUFlLEVBQUUsUUFBUTtTQUM1QixDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUc7WUFDVixPQUFPLEVBQUU7Z0JBQ0w7b0JBQ0ksR0FBRyxFQUFFO3dCQUNELE9BQU8sRUFBRSxJQUFBLHFCQUFTLEVBQUMsSUFBSSxDQUFDO3FCQUMzQjtpQkFDSjthQUNKO1NBQ0osQ0FBQztRQUVGLE1BQU0sVUFBVSxDQUFDLEtBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUEsNEJBQXFCLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDO1lBQVMsQ0FBQztRQUNQLE1BQU0sbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgcHVycG9zZSBvZiB0aGlzIHRlc3QgaXMgdG8gY2hlY2sgdGhhdCB0aGUgdHJhbXBvbGluZSBmdW5jdGlvbiBvbiBBV1MgY2FuXG4gKiByb3V0ZSBjYWxscywgaW52b2tlIHRoZSB3cmFwcGVyLCBhbmQgcmV0dXJuIHZhbHVlcyBjb3JyZWN0bHksIHdpdGhvdXRcbiAqIGFjdHVhbGx5IGNyZWF0aW5nIGEgY2xvdWQgZnVuY3Rpb24uIEhvd2V2ZXIsIGl0IGRvZXMgdXNlIHJlYWwgY2xvdWQgcXVldWVzLlxuICovXG5pbXBvcnQgeyBTUVMgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNxc1wiO1xuaW1wb3J0IHRlc3QgZnJvbSBcImF2YVwiO1xuaW1wb3J0IHsgQ29udGV4dCwgU05TRXZlbnQgfSBmcm9tIFwiYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IEF3c01ldHJpY3MgfSBmcm9tIFwiLi4vc3JjL2F3cy9hd3MtZmFhc3RcIjtcbmltcG9ydCB7IHJlY2VpdmVNZXNzYWdlcyB9IGZyb20gXCIuLi9zcmMvYXdzL2F3cy1xdWV1ZVwiO1xuaW1wb3J0IHsgbWFrZVRyYW1wb2xpbmUgfSBmcm9tIFwiLi4vc3JjL2F3cy9hd3MtdHJhbXBvbGluZVwiO1xuaW1wb3J0IHsgZmlsdGVyTWVzc2FnZXMsIEtpbmQgfSBmcm9tIFwiLi4vc3JjL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemUsIHNlcmlhbGl6ZUZ1bmN0aW9uQXJncyB9IGZyb20gXCIuLi9zcmMvc2VyaWFsaXplXCI7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCIuLi9zcmMvc2hhcmVkXCI7XG5pbXBvcnQgeyBXcmFwcGVyIH0gZnJvbSBcIi4uL3NyYy93cmFwcGVyXCI7XG5pbXBvcnQgKiBhcyBmdW5jcyBmcm9tIFwiLi9maXh0dXJlcy9mdW5jdGlvbnNcIjtcbmltcG9ydCB7IGNoZWNrSXRlcmF0b3JNZXNzYWdlcywgZXhwZWN0TWVzc2FnZSwgdGl0bGUgfSBmcm9tIFwiLi9maXh0dXJlcy91dGlsXCI7XG5cbmNvbnN0IHNxcyA9IG5ldyBTUVMoeyBhcGlWZXJzaW9uOiBcIjIwMTItMTEtMDVcIiwgcmVnaW9uOiBcInVzLXdlc3QtMlwiIH0pO1xucHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA9IFwidXMtd2VzdC0yXCI7XG5wcm9jZXNzLmVudi5GQUFTVF9TSUxFTlQgPSBcInRydWVcIjtcblxuY29uc3QgbGFtYmRhQ29udGV4dDogQ29udGV4dCA9IHtcbiAgICBjYWxsYmFja1dhaXRzRm9yRW1wdHlFdmVudExvb3A6IHRydWUsXG4gICAgYXdzUmVxdWVzdElkOiBcImF3cy10cmFtcG9saW5lLXRlc3QtYXdzUmVxdWVzdElkXCIsXG4gICAgbG9nR3JvdXBOYW1lOiBcImF3cy10cmFtcG9saW5lLXRlc3QtbG9nR3JvdXBOYW1lXCIsXG4gICAgbG9nU3RyZWFtTmFtZTogXCJhd3MtdHJhbXBvbGluZS10ZXN0LWxvZ1N0cmVhbU5hbWVcIixcbiAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDEwMDAsXG4gICAgZnVuY3Rpb25OYW1lOiBcImF3cy10cmFtcG9saW5lLXRlc3QtZnVuY3Rpb25OYW1lXCIsXG4gICAgZnVuY3Rpb25WZXJzaW9uOiBcImF3cy10cmFtcG9saW5lLXRlc3QtZnVuY3Rpb25WZXJzaW9uXCIsXG4gICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBcImF3cy10cmFtcG9saW5lLXRlc3QtaW52b2tlZEZ1bmN0aW9uQXJuXCIsXG4gICAgbWVtb3J5TGltaXRJbk1COiBcIjE3MjhcIixcbiAgICBkb25lOiAoKSA9PiB7fSxcbiAgICBmYWlsOiBfID0+IHt9LFxuICAgIHN1Y2NlZWQ6IChfOiBzdHJpbmcpID0+IHt9XG59O1xuXG5hc3luYyBmdW5jdGlvbiBtYWtlUmVzcG9uc2VRdWV1ZSgpIHtcbiAgICBjb25zdCBRdWV1ZU5hbWUgPSBgZmFhc3QtJHt1dWlkdjQoKX0tdGVzdGA7XG4gICAgY29uc3QgeyBRdWV1ZVVybCB9ID0gYXdhaXQgc3FzLmNyZWF0ZVF1ZXVlKHsgUXVldWVOYW1lIH0pO1xuICAgIHJldHVybiBRdWV1ZVVybCE7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJlc3BvbnNlUXVldWUoUXVldWVVcmw6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIFNvbWV0aW1lcyBBV1MgbmVlZHMgdGltZSB0byBwcm9wYWdhdGUgdGhlIGV4aXN0ZW5jZSBvZiBhIHF1ZXVlIGJlZm9yZVxuICAgICAgICAvLyBkZWxldGluZyBpdC4gVGhpcyBtYW5pZmVzdHMgYXMgYSBOb25FeGlzdGVudFF1ZXVlIGVycm9yLiBXYWl0aW5nXG4gICAgICAgIC8vIGEgc2hvcnQgd2hpbGUgc2VlbXMgdG8gbWFrZSB0aGlzIGxlc3MgY29tbW9uLlxuICAgICAgICBhd2FpdCBzbGVlcCg1MDAwKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHNxcy5kZWxldGVRdWV1ZSh7IFF1ZXVlVXJsIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgZGVsZXRlIHJlc3BvbnNlIHF1ZXVlOiAke2Vycn1gKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWVzc2FnZXM8SyBleHRlbmRzIEtpbmQ+KFF1ZXVlVXJsOiBzdHJpbmcsIGtpbmQ6IEssIG5FeHBlY3RlZDogbnVtYmVyKSB7XG4gICAgY29uc3QgbWV0cmljcyA9IG5ldyBBd3NNZXRyaWNzKCk7XG4gICAgY29uc3QgY2FuY2VsID0gbmV3IFByb21pc2U8dm9pZD4oXyA9PiB7fSk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKHJlc3VsdC5sZW5ndGggPCBuRXhwZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCByZWNlaXZlTWVzc2FnZXMoc3FzLCBRdWV1ZVVybCwgbWV0cmljcywgY2FuY2VsKTtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4uZmlsdGVyTWVzc2FnZXMobWVzc2FnZXMuTWVzc2FnZXMsIGtpbmQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxudGVzdCh0aXRsZShcImF3c1wiLCBcInRyYW1wb2xpbmUgaHR0cHMgbW9kZSB3aXRoIHByb21pc2UgcmVzcG9uc2VcIiksIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBuZXcgV3JhcHBlcihmdW5jcywgeyBjaGlsZFByb2Nlc3M6IGZhbHNlLCB3cmFwcGVyTG9nOiAoKSA9PiB7fSB9KTtcbiAgICBjb25zdCB7IHRyYW1wb2xpbmUgfSA9IG1ha2VUcmFtcG9saW5lKHdyYXBwZXIpO1xuICAgIGNvbnN0IGFyZyA9IFwicHJvbWlzZSB3aXRoIGh0dHBzIG9uIGF3c1wiO1xuICAgIGNvbnN0IG5hbWUgPSBmdW5jcy5pZGVudGl0eVN0cmluZy5uYW1lO1xuICAgIGNvbnN0IFF1ZXVlVXJsID0gYXdhaXQgbWFrZVJlc3BvbnNlUXVldWUoKTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCB0cmFtcG9saW5lKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhbGxJZDogXCI0MlwiLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgYXJnczogc2VyaWFsaXplRnVuY3Rpb25BcmdzKG5hbWUsIFthcmddLCB0cnVlKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiBcIi4vZml4dHVyZXMvZnVuY3Rpb25zXCIsXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VRdWV1ZUlkOiBRdWV1ZVVybFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhbWJkYUNvbnRleHRcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBbbXNnXSA9IGF3YWl0IGdldE1lc3NhZ2VzKFF1ZXVlVXJsLCBcInByb21pc2VcIiwgMSk7XG4gICAgICAgIGV4cGVjdE1lc3NhZ2UodCwgbXNnLCBcInByb21pc2VcIiwgYXJnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGVSZXNwb25zZVF1ZXVlKFF1ZXVlVXJsKTtcbiAgICB9XG59KTtcblxudGVzdCh0aXRsZShcImF3c1wiLCBcInRyYW1wb2xpbmUgcXVldWUgbW9kZSB3aXRoIHByb21pc2UgcmVzcG9uc2VcIiksIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBuZXcgV3JhcHBlcihmdW5jcywgeyBjaGlsZFByb2Nlc3M6IGZhbHNlLCB3cmFwcGVyTG9nOiAoKSA9PiB7fSB9KTtcbiAgICBjb25zdCBhcmcgPSBcInByb21pc2Ugd2l0aCBxdWV1ZSBvbiBhd3NcIjtcbiAgICBjb25zdCBRdWV1ZVVybCA9IGF3YWl0IG1ha2VSZXNwb25zZVF1ZXVlKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyB0cmFtcG9saW5lIH0gPSBtYWtlVHJhbXBvbGluZSh3cmFwcGVyKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZ1bmNzLmlkZW50aXR5U3RyaW5nLm5hbWU7XG4gICAgICAgIGNvbnN0IGNhbGwgPSB7XG4gICAgICAgICAgICBjYWxsSWQ6IFwiNDNcIixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhcmdzOiBzZXJpYWxpemVGdW5jdGlvbkFyZ3MobmFtZSwgW2FyZ10sIHRydWUpLFxuICAgICAgICAgICAgbW9kdWxlUGF0aDogXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiLFxuICAgICAgICAgICAgUmVzcG9uc2VRdWV1ZUlkOiBRdWV1ZVVybFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIFJlY29yZHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFNuczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogc2VyaWFsaXplKGNhbGwpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgdHJhbXBvbGluZShldmVudCBhcyBTTlNFdmVudCwgbGFtYmRhQ29udGV4dCk7XG5cbiAgICAgICAgY29uc3QgW21zZ10gPSBhd2FpdCBnZXRNZXNzYWdlcyhRdWV1ZVVybCwgXCJwcm9taXNlXCIsIDEpO1xuICAgICAgICBleHBlY3RNZXNzYWdlKHQsIG1zZywgXCJwcm9taXNlXCIsIGFyZyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlUmVzcG9uc2VRdWV1ZShRdWV1ZVVybCk7XG4gICAgfVxufSk7XG5cbnRlc3QodGl0bGUoXCJhd3NcIiwgXCJ0cmFtcG9saW5lIGh0dHBzIG1vZGUgd2l0aCBhc3luYyBpdGVyYXRvciByZXNwb25zZVwiKSwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IG5ldyBXcmFwcGVyKGZ1bmNzLCB7IGNoaWxkUHJvY2VzczogZmFsc2UsIHdyYXBwZXJMb2c6ICgpID0+IHt9IH0pO1xuICAgIGNvbnN0IHsgdHJhbXBvbGluZSB9ID0gbWFrZVRyYW1wb2xpbmUod3JhcHBlcik7XG4gICAgY29uc3QgbmFtZSA9IGZ1bmNzLmFzeW5jR2VuZXJhdG9yLm5hbWU7XG4gICAgY29uc3QgYXJnID0gW1wiYXN5bmMgZ2VuZXJhdG9yIHdpdGggaHR0cHMgb24gYXdzXCIsIFwic2Vjb25kIGFyZ1wiXTtcbiAgICBjb25zdCBRdWV1ZVVybCA9IGF3YWl0IG1ha2VSZXNwb25zZVF1ZXVlKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdHJhbXBvbGluZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYWxsSWQ6IFwiNDRcIixcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHNlcmlhbGl6ZUZ1bmN0aW9uQXJncyhuYW1lLCBbYXJnXSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiLFxuICAgICAgICAgICAgICAgIFJlc3BvbnNlUXVldWVJZDogUXVldWVVcmxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYW1iZGFDb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgZ2V0TWVzc2FnZXMoUXVldWVVcmwsIFwiaXRlcmF0b3JcIiwgYXJnLmxlbmd0aCArIDEpO1xuICAgICAgICBjaGVja0l0ZXJhdG9yTWVzc2FnZXModCwgbWVzc2FnZXMsIGFyZyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlUmVzcG9uc2VRdWV1ZShRdWV1ZVVybCk7XG4gICAgfVxufSk7XG5cbnRlc3QodGl0bGUoXCJhd3NcIiwgXCJ0cmFtcG9saW5lIHF1ZXVlIG1vZGUgd2l0aCBhc3luYyBpdGVyYXRvciByZXNwb25zZVwiKSwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IG5ldyBXcmFwcGVyKGZ1bmNzLCB7IGNoaWxkUHJvY2VzczogZmFsc2UsIHdyYXBwZXJMb2c6ICgpID0+IHt9IH0pO1xuICAgIGNvbnN0IFF1ZXVlVXJsID0gYXdhaXQgbWFrZVJlc3BvbnNlUXVldWUoKTtcbiAgICBjb25zdCBhcmcgPSBbXCJhc3luYyBnZW5lcmF0b3Igd2l0aCBxdWV1ZSBvbiBhd3NcIiwgXCJzZWNvbmQgYXJnXCJdO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyB0cmFtcG9saW5lIH0gPSBtYWtlVHJhbXBvbGluZSh3cmFwcGVyKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZ1bmNzLmFzeW5jR2VuZXJhdG9yLm5hbWU7XG4gICAgICAgIGNvbnN0IGNhbGwgPSB7XG4gICAgICAgICAgICBjYWxsSWQ6IFwiNDVcIixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhcmdzOiBzZXJpYWxpemVGdW5jdGlvbkFyZ3MobmFtZSwgW2FyZ10sIHRydWUpLFxuICAgICAgICAgICAgbW9kdWxlUGF0aDogXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiLFxuICAgICAgICAgICAgUmVzcG9uc2VRdWV1ZUlkOiBRdWV1ZVVybFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIFJlY29yZHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFNuczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogc2VyaWFsaXplKGNhbGwpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgdHJhbXBvbGluZShldmVudCBhcyBTTlNFdmVudCwgbGFtYmRhQ29udGV4dCk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCBnZXRNZXNzYWdlcyhRdWV1ZVVybCwgXCJpdGVyYXRvclwiLCBhcmcubGVuZ3RoICsgMSk7XG4gICAgICAgIGNoZWNrSXRlcmF0b3JNZXNzYWdlcyh0LCBtZXNzYWdlcywgYXJnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBkZWxldGVSZXNwb25zZVF1ZXVlKFF1ZXVlVXJsKTtcbiAgICB9XG59KTtcbiJdfQ==