@scloud/lambda-local
Version:
Run typical Lambda handlers locally.
170 lines • 22.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.webappRoutesLocal = void 0;
const express_1 = __importDefault(require("express"));
const eventTemplate = {
body: '',
headers: {},
multiValueHeaders: {},
httpMethod: '',
isBase64Encoded: false,
path: '',
pathParameters: null,
queryStringParameters: {},
multiValueQueryStringParameters: {},
stageVariables: null,
resource: '?',
requestContext: {
accountId: '',
apiId: '',
authorizer: null,
httpMethod: '',
identity: {
accessKey: null,
accountId: null,
apiKey: null,
apiKeyId: null,
caller: null,
clientCert: null,
cognitoAuthenticationProvider: null,
cognitoAuthenticationType: null,
cognitoIdentityId: null,
cognitoIdentityPoolId: null,
principalOrgId: null,
sourceIp: '',
user: null,
userAgent: null,
userArn: null,
},
path: '',
protocol: '',
requestId: '',
requestTimeEpoch: 0,
resourceId: '',
resourcePath: '',
stage: '',
},
};
const contextTemplate = {
awsRequestId: '',
callbackWaitsForEmptyEventLoop: false,
functionName: '',
functionVersion: '',
invokedFunctionArn: '',
logGroupName: '',
logStreamName: '',
memoryLimitInMB: '',
getRemainingTimeInMillis: () => 0,
done: () => { },
fail: () => { },
succeed: () => { },
};
// eslint-disable-next-line no-unused-vars
function webappRoutesLocal(cloudfrontPathMappings, staticContent) {
const port = +(process.env.port || '3000');
const app = (0, express_1.default)();
// https://stackoverflow.com/questions/12345166/how-to-force-parse-request-body-as-plain-text-instead-of-json-in-express
app.use(express_1.default.text({ type: '*/*' }));
Object.keys(cloudfrontPathMappings).forEach((route) => {
app.all(route, async (req, res) => {
// const url = new URL(req.originalUrl, 'https://example.com');
// Headers - NB it seems that in Lambda multiValueHeaders always contains the values from headers
const headers = {};
const multiValueHeaders = {};
Object.keys(req.headers).forEach((header) => {
if (req.headers[header] === undefined) {
headers[header] = undefined;
multiValueHeaders[header] = undefined;
}
if (typeof req.headers[header] === 'string') {
headers[header] = req.headers[header];
multiValueHeaders[header] = [req.headers[header]];
}
if (Array.isArray(req.headers[header])) {
multiValueHeaders[header] = req.headers[header];
}
});
// Query string - basic translation
const queryStringParameters = {};
const multiValueQueryStringParameters = {};
Object.keys(req.query).forEach((parameter) => {
queryStringParameters[parameter] = undefined;
if (typeof req.query[parameter] === 'string')
queryStringParameters[parameter] = req.query[parameter];
if (Array.isArray(req.query[parameter]))
multiValueQueryStringParameters[parameter] = req.query[parameter];
});
const event = {
...eventTemplate,
body: typeof req.body === 'string' ? req.body : JSON.stringify(req.body),
headers,
multiValueHeaders,
httpMethod: req.method,
path: req.path,
queryStringParameters,
multiValueQueryStringParameters,
requestContext: {
...eventTemplate.requestContext,
httpMethod: req.method,
path: req.path,
protocol: req.protocol,
},
};
try {
// Print out the event that will be sent to the handler
console.log('Event:');
Object.keys(event).forEach((key) => {
console.log(` - ${key}: ${JSON.stringify(event[key])}`);
});
const paths = Object.keys(cloudfrontPathMappings);
// Use the handler for this Express route
const handler = cloudfrontPathMappings[route];
if (!handler)
console.log(`Unmatched path: ${event.path}`);
// Invoke the function handler:
const result = handler ? await handler(event, contextTemplate) : { statusCode: 404, body: `Path not matched: ${event.path} (${paths})` };
// Print out the response if successful
if (result) {
if (result.statusCode === 404) {
console.log(`404: ${event.path}`);
}
else {
console.log('Result:');
Object.keys(result).forEach((key) => {
console.log(` - ${key}: ${JSON.stringify(result[key]).slice(0, 100)}`);
});
}
}
// Send the response
res.status(result.statusCode);
if (result.multiValueHeaders) {
Object.keys(result.multiValueHeaders).forEach((key) => {
res.set(key, result.multiValueHeaders[key].map((value) => `${value}`));
});
}
if (result.headers) {
Object.keys(result.headers).forEach((key) => {
res.set(key, `${result.headers[key]}`);
});
}
res.send(result.body);
}
catch (e) {
// Log the error and send a 500 response
console.log(e);
console.log(e.stack);
res.status(500).send(`${e}`);
}
});
});
if (staticContent)
app.use(express_1.default.static(staticContent));
app.listen(port, () => {
console.log(`Lambda handler can be invoked at http://localhost:${port}`);
});
}
exports.webappRoutesLocal = webappRoutesLocal;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwUm91dGVzTG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2ViYXBwUm91dGVzTG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0Esc0RBQXFEO0FBT3JELE1BQU0sYUFBYSxHQUF5QjtJQUMxQyxJQUFJLEVBQUUsRUFBRTtJQUNSLE9BQU8sRUFBRSxFQUFFO0lBQ1gsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixVQUFVLEVBQUUsRUFBRTtJQUNkLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLElBQUksRUFBRSxFQUFFO0lBQ1IsY0FBYyxFQUFFLElBQUk7SUFDcEIscUJBQXFCLEVBQUUsRUFBRTtJQUN6QiwrQkFBK0IsRUFBRSxFQUFFO0lBQ25DLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFFBQVEsRUFBRSxHQUFHO0lBQ2IsY0FBYyxFQUFFO1FBQ2QsU0FBUyxFQUFFLEVBQUU7UUFDYixLQUFLLEVBQUUsRUFBRTtRQUNULFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFVBQVUsRUFBRSxFQUFFO1FBQ2QsUUFBUSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixTQUFTLEVBQUUsSUFBSTtZQUNmLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsSUFBSTtZQUNaLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLDZCQUE2QixFQUFFLElBQUk7WUFDbkMseUJBQXlCLEVBQUUsSUFBSTtZQUMvQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLEVBQUU7WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUk7U0FDZDtRQUNELElBQUksRUFBRSxFQUFFO1FBQ1IsUUFBUSxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUUsRUFBRTtRQUNiLGdCQUFn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QUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksYUFBYTtRQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUUxRCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUE1R0QsOENBNEdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdodHRwJztcbmltcG9ydCBleHByZXNzLCB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBBUElHYXRld2F5UHJveHlFdmVudCwgQVBJR2F0ZXdheVByb3h5UmVzdWx0LCBDb250ZXh0IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRmcm9udFBhdGhNYXBwaW5ncyB7XG4gIFtrZXk6IHN0cmluZ106IChldmVudDogQVBJR2F0ZXdheVByb3h5RXZlbnQsIGNvbnRleHQ6IENvbnRleHQpID0+IFByb21pc2U8QVBJR2F0ZXdheVByb3h5UmVzdWx0Pjtcbn1cblxuY29uc3QgZXZlbnRUZW1wbGF0ZTogQVBJR2F0ZXdheVByb3h5RXZlbnQgPSB7XG4gIGJvZHk6ICcnLFxuICBoZWFkZXJzOiB7fSxcbiAgbXVsdGlWYWx1ZUhlYWRlcnM6IHt9LFxuICBodHRwTWV0aG9kOiAnJyxcbiAgaXNCYXNlNjRFbmNvZGVkOiBmYWxzZSxcbiAgcGF0aDogJycsXG4gIHBhdGhQYXJhbWV0ZXJzOiBudWxsLFxuICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9LFxuICBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiB7fSxcbiAgc3RhZ2VWYXJpYWJsZXM6IG51bGwsXG4gIHJlc291cmNlOiAnPycsXG4gIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgYWNjb3VudElkOiAnJyxcbiAgICBhcGlJZDogJycsXG4gICAgYXV0aG9yaXplcjogbnVsbCxcbiAgICBodHRwTWV0aG9kOiAnJyxcbiAgICBpZGVudGl0eToge1xuICAgICAgYWNjZXNzS2V5OiBudWxsLFxuICAgICAgYWNjb3VudElkOiBudWxsLFxuICAgICAgYXBpS2V5OiBudWxsLFxuICAgICAgYXBpS2V5SWQ6IG51bGwsXG4gICAgICBjYWxsZXI6IG51bGwsXG4gICAgICBjbGllbnRDZXJ0OiBudWxsLFxuICAgICAgY29nbml0b0F1dGhlbnRpY2F0aW9uUHJvdmlkZXI6IG51bGwsXG4gICAgICBjb2duaXRvQXV0aGVudGljYXRpb25UeXBlOiBudWxsLFxuICAgICAgY29nbml0b0lkZW50aXR5SWQ6IG51bGwsXG4gICAgICBjb2duaXRvSWRlbnRpdHlQb29sSWQ6IG51bGwsXG4gICAgICBwcmluY2lwYWxPcmdJZDogbnVsbCxcbiAgICAgIHNvdXJjZUlwOiAnJyxcbiAgICAgIHVzZXI6IG51bGwsXG4gICAgICB1c2VyQWdlbnQ6IG51bGwsXG4gICAgICB1c2VyQXJuOiBudWxsLFxuICAgIH0sXG4gICAgcGF0aDogJycsXG4gICAgcHJvdG9jb2w6ICcnLFxuICAgIHJlcXVlc3RJZDogJycsXG4gICAgcmVxdWVzdFRpbWVFcG9jaDogMCxcbiAgICByZXNvdXJjZUlkOiAnJyxcbiAgICByZXNvdXJjZVBhdGg6ICcnLFxuICAgIHN0YWdlOiAnJyxcbiAgfSxcbn07XG5jb25zdCBjb250ZXh0VGVtcGxhdGU6IENvbnRleHQgPSB7XG4gIGF3c1JlcXVlc3RJZDogJycsXG4gIGNhbGxiYWNrV2FpdHNGb3JFbXB0eUV2ZW50TG9vcDogZmFsc2UsXG4gIGZ1bmN0aW9uTmFtZTogJycsXG4gIGZ1bmN0aW9uVmVyc2lvbjogJycsXG4gIGludm9rZWRGdW5jdGlvbkFybjogJycsXG4gIGxvZ0dyb3VwTmFtZTogJycsXG4gIGxvZ1N0cmVhbU5hbWU6ICcnLFxuICBtZW1vcnlMaW1pdEluTUI6ICcnLFxuICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDAsXG4gIGRvbmU6ICgpID0+IHsgfSxcbiAgZmFpbDogKCkgPT4geyB9LFxuICBzdWNjZWVkOiAoKSA9PiB7IH0sXG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBmdW5jdGlvbiB3ZWJhcHBSb3V0ZXNMb2NhbChjbG91ZGZyb250UGF0aE1hcHBpbmdzOiBDbG91ZGZyb250UGF0aE1hcHBpbmdzLCBzdGF0aWNDb250ZW50Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHBvcnQgPSArKHByb2Nlc3MuZW52LnBvcnQgfHwgJzMwMDAnKTtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMzQ1MTY2L2hvdy10by1mb3JjZS1wYXJzZS1yZXF1ZXN0LWJvZHktYXMtcGxhaW4tdGV4dC1pbnN0ZWFkLW9mLWpzb24taW4tZXhwcmVzc1xuICBhcHAudXNlKGV4cHJlc3MudGV4dCh7IHR5cGU6ICcqLyonIH0pKTtcblxuICBPYmplY3Qua2V5cyhjbG91ZGZyb250UGF0aE1hcHBpbmdzKS5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgIGFwcC5hbGwocm91dGUsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLm9yaWdpbmFsVXJsLCAnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgICAgLy8gSGVhZGVycyAtIE5CIGl0IHNlZW1zIHRoYXQgaW4gTGFtYmRhIG11bHRpVmFsdWVIZWFkZXJzIGFsd2F5cyBjb250YWlucyB0aGUgdmFsdWVzIGZyb20gaGVhZGVyc1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgY29uc3QgbXVsdGlWYWx1ZUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMocmVxLmhlYWRlcnMpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICBpZiAocmVxLmhlYWRlcnNbaGVhZGVyXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaGVhZGVyc1toZWFkZXJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG11bHRpVmFsdWVIZWFkZXJzW2hlYWRlcl0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXEuaGVhZGVyc1toZWFkZXJdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGhlYWRlcnNbaGVhZGVyXSA9IHJlcS5oZWFkZXJzW2hlYWRlcl0gYXMgc3RyaW5nO1xuICAgICAgICAgIG11bHRpVmFsdWVIZWFkZXJzW2hlYWRlcl0gPSBbcmVxLmhlYWRlcnNbaGVhZGVyXSBhcyBzdHJpbmddO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcS5oZWFkZXJzW2hlYWRlcl0pKSB7XG4gICAgICAgICAgbXVsdGlWYWx1ZUhlYWRlcnNbaGVhZGVyXSA9IHJlcS5oZWFkZXJzW2hlYWRlcl0gYXMgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBRdWVyeSBzdHJpbmcgLSBiYXNpYyB0cmFuc2xhdGlvblxuICAgICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgICBjb25zdCBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHJlcS5xdWVyeSkuZm9yRWFjaCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5xdWVyeVtwYXJhbWV0ZXJdID09PSAnc3RyaW5nJykgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtZXRlcl0gPSByZXEucXVlcnlbcGFyYW1ldGVyXSBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcS5xdWVyeVtwYXJhbWV0ZXJdKSkgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gcmVxLnF1ZXJ5W3BhcmFtZXRlcl0gYXMgc3RyaW5nW107XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgIC4uLmV2ZW50VGVtcGxhdGUsXG4gICAgICAgIGJvZHk6IHR5cGVvZiByZXEuYm9keSA9PT0gJ3N0cmluZycgPyByZXEuYm9keSA6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgICAgIGh0dHBNZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnMsXG4gICAgICAgIG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMsXG4gICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgLi4uZXZlbnRUZW1wbGF0ZS5yZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICBodHRwTWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICAgIHByb3RvY29sOiByZXEucHJvdG9jb2wsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBQcmludCBvdXQgdGhlIGV2ZW50IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBoYW5kbGVyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFdmVudDonKTtcbiAgICAgICAgT2JqZWN0LmtleXMoZXZlbnQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgLSAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkoZXZlbnRba2V5IGFzIGtleW9mIEFQSUdhdGV3YXlQcm94eUV2ZW50XSl9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhdGhzID0gT2JqZWN0LmtleXMoY2xvdWRmcm9udFBhdGhNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gVXNlIHRoZSBoYW5kbGVyIGZvciB0aGlzIEV4cHJlc3Mgcm91dGVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGNsb3VkZnJvbnRQYXRoTWFwcGluZ3Nbcm91dGVdO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIGNvbnNvbGUubG9nKGBVbm1hdGNoZWQgcGF0aDogJHtldmVudC5wYXRofWApO1xuXG4gICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gaGFuZGxlcjpcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBUElHYXRld2F5UHJveHlSZXN1bHQgPSBoYW5kbGVyID8gYXdhaXQgaGFuZGxlcihldmVudCwgY29udGV4dFRlbXBsYXRlKSA6IHsgc3RhdHVzQ29kZTogNDA0LCBib2R5OiBgUGF0aCBub3QgbWF0Y2hlZDogJHtldmVudC5wYXRofSAoJHtwYXRoc30pYCB9O1xuXG4gICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bFxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGA0MDQ6ICR7ZXZlbnQucGF0aH1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1Jlc3VsdDonKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgLSAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0W2tleSBhcyBrZXlvZiBBUElHYXRld2F5UHJveHlSZXN1bHRdKS5zbGljZSgwLCAxMDApfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgcmVzcG9uc2VcbiAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgIGlmIChyZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhyZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgcmVzLnNldChrZXksIHJlc3VsdC5tdWx0aVZhbHVlSGVhZGVycyFba2V5XS5tYXAoKHZhbHVlKSA9PiBgJHt2YWx1ZX1gKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgcmVzLnNldChrZXksIGAke3Jlc3VsdC5oZWFkZXJzIVtrZXldfWApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBhbmQgc2VuZCBhIDUwMCByZXNwb25zZVxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgY29uc29sZS5sb2coKGUgYXMgRXJyb3IpLnN0YWNrKTtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoYCR7ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKHN0YXRpY0NvbnRlbnQpIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMoc3RhdGljQ29udGVudCkpO1xuXG4gIGFwcC5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBMYW1iZGEgaGFuZGxlciBjYW4gYmUgaW52b2tlZCBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbiAgfSk7XG59XG4iXX0=