UNPKG

@scloud/lambda-local

Version:

Run typical Lambda handlers locally.

197 lines 22.9 kB
"use strict"; 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==