@scloud/lambda-local
Version:
Run typical Lambda handlers locally.
197 lines • 22.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.webappLocal = void 0;
/* eslint-disable no-unused-vars */
// eslint-disable-next-line import/no-extraneous-dependencies
const fs = __importStar(require("fs"));
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 webappLocal(handler, staticContent) {
if (staticContent?.sourceDirectory) {
if (!fs.existsSync(staticContent.sourceDirectory)) {
throw new Error(`Static directory not found: ${staticContent.sourceDirectory}`);
}
}
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: '*/*', limit: '6mb' }));
// "Static bucket" serving
if (staticContent)
app.use(staticContent.appPath, express_1.default.static(staticContent.sourceDirectory));
// Route everything else to the Lambda handler function
app.all('/*', 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])}`);
});
// Invoke the function handler:
const result = await handler(event, contextTemplate);
// 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) => {
const value = `${result[key]}`;
console.log(` - ${key}: ${JSON.stringify(value).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}`);
}
});
app.listen(port, () => {
console.log(`Lambda handler can be invoked at http://localhost:${port}`);
});
}
exports.webappLocal = webappLocal;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwTG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2ViYXBwTG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsNkRBQTZEO0FBQzdELHVDQUF5QjtBQUN6QixzREFBcUQ7QUFHckQsTUFBTSxhQUFhLEdBQXlCO0lBQzFDLElBQUksRUFBRSxFQUFFO0lBQ1IsT0FBTyxFQUFFLEVBQUU7SUFDWCxpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsZUFBZSxFQUFFLEtBQUs7SUFDdEIsSUFBSSxFQUFFLEVBQUU7SUFDUixjQUFjLEVBQUUsSUFBSTtJQUNwQixxQkFBcUIsRUFBRSxFQUFFO0lBQ3pCLCtCQUErQixFQUFFLEVBQUU7SUFDbkMsY0FBYyxFQUFFLElBQUk7SUFDcEIsUUFBUSxFQUFFLEdBQUc7SUFDYixjQUFjLEVBQUU7UUFDZCxTQUFTLEVBQUUsRUFBRTtRQUNiLEtBQUssRUFBRSxFQUFFO1FBQ1QsVUFBVSxFQUFFLElBQUk7UUFDaEIsVUFBVSxFQUFFLEVBQUU7UUFDZCxRQUFRLEVBQUU7WUFDUixTQUFTLEVBQUUsSUFBSTtZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxJQUFJO1lBQ1osVUFBVSxFQUFFLElBQUk7WUFDaEIsNkJBQTZCLEVBQUUsSUFBSTtZQUNuQyx5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLGlCQUFpQixFQUFFLElBQUk7WUFDdkIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixjQUFjLEVBQUUsSUFBSTtZQUNwQixRQUFRLEVBQUUsRUFBRTtZQUNaLElBQUksRUFBRSxJQUFJO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSTtTQUNkO1FBQ0QsSUFBSSxFQUFFLEVBQUU7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Q0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWpIRCxrQ0FpSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGV4cHJlc3MsIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IEFQSUdhdGV3YXlQcm94eUV2ZW50LCBBUElHYXRld2F5UHJveHlSZXN1bHQsIENvbnRleHQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuY29uc3QgZXZlbnRUZW1wbGF0ZTogQVBJR2F0ZXdheVByb3h5RXZlbnQgPSB7XG4gIGJvZHk6ICcnLFxuICBoZWFkZXJzOiB7fSxcbiAgbXVsdGlWYWx1ZUhlYWRlcnM6IHt9LFxuICBodHRwTWV0aG9kOiAnJyxcbiAgaXNCYXNlNjRFbmNvZGVkOiBmYWxzZSxcbiAgcGF0aDogJycsXG4gIHBhdGhQYXJhbWV0ZXJzOiBudWxsLFxuICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9LFxuICBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiB7fSxcbiAgc3RhZ2VWYXJpYWJsZXM6IG51bGwsXG4gIHJlc291cmNlOiAnPycsXG4gIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgYWNjb3VudElkOiAnJyxcbiAgICBhcGlJZDogJycsXG4gICAgYXV0aG9yaXplcjogbnVsbCxcbiAgICBodHRwTWV0aG9kOiAnJyxcbiAgICBpZGVudGl0eToge1xuICAgICAgYWNjZXNzS2V5OiBudWxsLFxuICAgICAgYWNjb3VudElkOiBudWxsLFxuICAgICAgYXBpS2V5OiBudWxsLFxuICAgICAgYXBpS2V5SWQ6IG51bGwsXG4gICAgICBjYWxsZXI6IG51bGwsXG4gICAgICBjbGllbnRDZXJ0OiBudWxsLFxuICAgICAgY29nbml0b0F1dGhlbnRpY2F0aW9uUHJvdmlkZXI6IG51bGwsXG4gICAgICBjb2duaXRvQXV0aGVudGljYXRpb25UeXBlOiBudWxsLFxuICAgICAgY29nbml0b0lkZW50aXR5SWQ6IG51bGwsXG4gICAgICBjb2duaXRvSWRlbnRpdHlQb29sSWQ6IG51bGwsXG4gICAgICBwcmluY2lwYWxPcmdJZDogbnVsbCxcbiAgICAgIHNvdXJjZUlwOiAnJyxcbiAgICAgIHVzZXI6IG51bGwsXG4gICAgICB1c2VyQWdlbnQ6IG51bGwsXG4gICAgICB1c2VyQXJuOiBudWxsLFxuICAgIH0sXG4gICAgcGF0aDogJycsXG4gICAgcHJvdG9jb2w6ICcnLFxuICAgIHJlcXVlc3RJZDogJycsXG4gICAgcmVxdWVzdFRpbWVFcG9jaDogMCxcbiAgICByZXNvdXJjZUlkOiAnJyxcbiAgICByZXNvdXJjZVBhdGg6ICcnLFxuICAgIHN0YWdlOiAnJyxcbiAgfSxcbn07XG5jb25zdCBjb250ZXh0VGVtcGxhdGU6IENvbnRleHQgPSB7XG4gIGF3c1JlcXVlc3RJZDogJycsXG4gIGNhbGxiYWNrV2FpdHNGb3JFbXB0eUV2ZW50TG9vcDogZmFsc2UsXG4gIGZ1bmN0aW9uTmFtZTogJycsXG4gIGZ1bmN0aW9uVmVyc2lvbjogJycsXG4gIGludm9rZWRGdW5jdGlvbkFybjogJycsXG4gIGxvZ0dyb3VwTmFtZTogJycsXG4gIGxvZ1N0cmVhbU5hbWU6ICcnLFxuICBtZW1vcnlMaW1pdEluTUI6ICcnLFxuICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDAsXG4gIGRvbmU6ICgpID0+IHsgfSxcbiAgZmFpbDogKCkgPT4geyB9LFxuICBzdWNjZWVkOiAoKSA9PiB7IH0sXG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBmdW5jdGlvbiB3ZWJhcHBMb2NhbChcbiAgaGFuZGxlcjogKFxuICAgIGV2ZW50OiBBUElHYXRld2F5UHJveHlFdmVudCwgY29udGV4dDogQ29udGV4dCkgPT4gUHJvbWlzZTxBUElHYXRld2F5UHJveHlSZXN1bHQ+LFxuICBzdGF0aWNDb250ZW50PzogeyBzb3VyY2VEaXJlY3Rvcnk6IHN0cmluZywgYXBwUGF0aDogc3RyaW5nOyB9LFxuKSB7XG4gIGlmIChzdGF0aWNDb250ZW50Py5zb3VyY2VEaXJlY3RvcnkpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3RhdGljQ29udGVudC5zb3VyY2VEaXJlY3RvcnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXRpYyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAke3N0YXRpY0NvbnRlbnQuc291cmNlRGlyZWN0b3J5fWApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSArKHByb2Nlc3MuZW52LlBPUlQgfHwgJzMwMDAnKTtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMzQ1MTY2L2hvdy10by1mb3JjZS1wYXJzZS1yZXF1ZXN0LWJvZHktYXMtcGxhaW4tdGV4dC1pbnN0ZWFkLW9mLWpzb24taW4tZXhwcmVzc1xuICBhcHAudXNlKGV4cHJlc3MudGV4dCh7IHR5cGU6ICcqLyonLCBsaW1pdDogJzZtYicgfSkpO1xuXG4gIC8vIFwiU3RhdGljIGJ1Y2tldFwiIHNlcnZpbmdcbiAgaWYgKHN0YXRpY0NvbnRlbnQpIGFwcC51c2Uoc3RhdGljQ29udGVudC5hcHBQYXRoLCBleHByZXNzLnN0YXRpYyhzdGF0aWNDb250ZW50LnNvdXJjZURpcmVjdG9yeSkpO1xuXG4gIC8vIFJvdXRlIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAgYXBwLmFsbCgnLyonLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgLy8gY29uc3QgdXJsID0gbmV3IFVSTChyZXEub3JpZ2luYWxVcmwsICdodHRwczovL2V4YW1wbGUuY29tJyk7XG4gICAgLy8gSGVhZGVycyAtIE5CIGl0IHNlZW1zIHRoYXQgaW4gTGFtYmRhIG11bHRpVmFsdWVIZWFkZXJzIGFsd2F5cyBjb250YWlucyB0aGUgdmFsdWVzIGZyb20gaGVhZGVyc1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBjb25zdCBtdWx0aVZhbHVlSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCB1bmRlZmluZWQ+ID0ge307XG4gICAgT2JqZWN0LmtleXMocmVxLmhlYWRlcnMpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgaWYgKHJlcS5oZWFkZXJzW2hlYWRlcl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW2hlYWRlcl0gPSB1bmRlZmluZWQ7XG4gICAgICAgIG11bHRpVmFsdWVIZWFkZXJzW2hlYWRlcl0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlcS5oZWFkZXJzW2hlYWRlcl0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGhlYWRlcnNbaGVhZGVyXSA9IHJlcS5oZWFkZXJzW2hlYWRlcl0gYXMgc3RyaW5nO1xuICAgICAgICBtdWx0aVZhbHVlSGVhZGVyc1toZWFkZXJdID0gW3JlcS5oZWFkZXJzW2hlYWRlcl0gYXMgc3RyaW5nXTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcS5oZWFkZXJzW2hlYWRlcl0pKSB7XG4gICAgICAgIG11bHRpVmFsdWVIZWFkZXJzW2hlYWRlcl0gPSByZXEuaGVhZGVyc1toZWFkZXJdIGFzIHN0cmluZ1tdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUXVlcnkgc3RyaW5nIC0gYmFzaWMgdHJhbnNsYXRpb25cbiAgICBjb25zdCBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBjb25zdCBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBPYmplY3Qua2V5cyhyZXEucXVlcnkpLmZvckVhY2goKHBhcmFtZXRlcikgPT4ge1xuICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtZXRlcl0gPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIHJlcS5xdWVyeVtwYXJhbWV0ZXJdID09PSAnc3RyaW5nJykgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtZXRlcl0gPSByZXEucXVlcnlbcGFyYW1ldGVyXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXEucXVlcnlbcGFyYW1ldGVyXSkpIG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnNbcGFyYW1ldGVyXSA9IHJlcS5xdWVyeVtwYXJhbWV0ZXJdIGFzIHN0cmluZ1tdO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAuLi5ldmVudFRlbXBsYXRlLFxuICAgICAgYm9keTogdHlwZW9mIHJlcS5ib2R5ID09PSAnc3RyaW5nJyA/IHJlcS5ib2R5IDogSlNPTi5zdHJpbmdpZnkocmVxLmJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG11bHRpVmFsdWVIZWFkZXJzLFxuICAgICAgaHR0cE1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLFxuICAgICAgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyxcbiAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgIC4uLmV2ZW50VGVtcGxhdGUucmVxdWVzdENvbnRleHQsXG4gICAgICAgIGh0dHBNZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICBwcm90b2NvbDogcmVxLnByb3RvY29sLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFByaW50IG91dCB0aGUgZXZlbnQgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGhhbmRsZXJcbiAgICAgIGNvbnNvbGUubG9nKCdFdmVudDonKTtcbiAgICAgIE9iamVjdC5rZXlzKGV2ZW50KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYCAtICR7a2V5fTogJHtKU09OLnN0cmluZ2lmeShldmVudFtrZXkgYXMga2V5b2YgQVBJR2F0ZXdheVByb3h5RXZlbnRdKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGhhbmRsZXI6XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0VGVtcGxhdGUpO1xuXG4gICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWxcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgNDA0OiAke2V2ZW50LnBhdGh9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1Jlc3VsdDonKTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyZXN1bHRba2V5IGFzIGtleW9mIEFQSUdhdGV3YXlQcm94eVJlc3VsdF19YDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgLSAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpLnNsaWNlKDAsIDEwMCl9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCB0aGUgcmVzcG9uc2VcbiAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1c0NvZGUpO1xuICAgICAgaWYgKHJlc3VsdC5tdWx0aVZhbHVlSGVhZGVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHJlcy5zZXQoa2V5LCByZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMhW2tleV0ubWFwKCh2YWx1ZSkgPT4gYCR7dmFsdWV9YCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuaGVhZGVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgcmVzLnNldChrZXksIGAke3Jlc3VsdC5oZWFkZXJzIVtrZXldfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yIGFuZCBzZW5kIGEgNTAwIHJlc3BvbnNlXG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIGNvbnNvbGUubG9nKChlIGFzIEVycm9yKS5zdGFjayk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZChgJHtlfWApO1xuICAgIH1cbiAgfSk7XG5cbiAgYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYExhbWJkYSBoYW5kbGVyIGNhbiBiZSBpbnZva2VkIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuICB9KTtcbn1cbiJdfQ==