serverless-spy 0.0.36 → 0.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.jsii +3 -3
  2. package/cli/cli.ts +145 -75
  3. package/cli/icons/Arch_AWS-Lambda_16.svg +18 -0
  4. package/cli/icons/Arch_Amazon-DynamoDB_16.svg +18 -0
  5. package/cli/icons/Arch_Amazon-EventBridge_16.svg +18 -0
  6. package/cli/icons/Arch_Amazon-Simple-Notification-Service_16.svg +18 -0
  7. package/cli/icons/Arch_Amazon-Simple-Queue-Service_16.svg +18 -0
  8. package/cli/icons/Arch_Amazon-Simple-Storage-Service_16.svg +18 -0
  9. package/cli/index.html +84 -25
  10. package/cli/node_modules/commander/LICENSE +22 -0
  11. package/cli/node_modules/commander/Readme.md +1114 -0
  12. package/cli/node_modules/commander/esm.mjs +16 -0
  13. package/cli/node_modules/commander/index.js +27 -0
  14. package/cli/node_modules/commander/lib/argument.js +147 -0
  15. package/cli/node_modules/commander/lib/command.js +2161 -0
  16. package/cli/node_modules/commander/lib/error.js +45 -0
  17. package/cli/node_modules/commander/lib/help.js +406 -0
  18. package/cli/node_modules/commander/lib/option.js +324 -0
  19. package/cli/node_modules/commander/lib/suggestSimilar.js +100 -0
  20. package/cli/node_modules/commander/package-support.json +16 -0
  21. package/cli/node_modules/commander/package.json +80 -0
  22. package/cli/node_modules/commander/typings/index.d.ts +879 -0
  23. package/cli/package.json +23 -0
  24. package/cli/sampleData.ts +518 -0
  25. package/cli/style.css +66 -42
  26. package/cli/webServerlessSpy.ts +461 -0
  27. package/common/SpyEventSender.ts +291 -0
  28. package/common/getWebSocketUrl.ts +21 -4
  29. package/common/spyEvents/EventBridgeBaseSpyEvent.ts +13 -0
  30. package/common/spyEvents/EventBridgeRuleSpyEvent.ts +2 -7
  31. package/common/spyEvents/EventBridgeSpyEvent.ts +2 -7
  32. package/common/spyEvents/FunctionBaseSpyEvent.ts +7 -0
  33. package/common/spyEvents/FunctionConsole.ts +5 -0
  34. package/common/spyEvents/FunctionConsoleSpyEvent.ts +5 -8
  35. package/common/spyEvents/FunctionResponseSpyEvent.ts +2 -5
  36. package/common/spyEvents/SnsSpyEventBase.ts +11 -0
  37. package/common/spyEvents/SnsSubscriptionSpyEvent.ts +3 -9
  38. package/common/spyEvents/SnsTopicSpyEvent.ts +3 -9
  39. package/dist/releasetag.txt +1 -1
  40. package/extension/interceptor.ts +91 -14
  41. package/functions/sendMessage.ts +4 -2
  42. package/lib/cli/cli.js +124 -65
  43. package/lib/cli/cli.mjs +125 -66
  44. package/lib/cli/sampleData.d.ts +892 -0
  45. package/lib/cli/sampleData.js +481 -0
  46. package/lib/cli/sampleData.mjs +478 -0
  47. package/lib/cli/webServerlessSpy.js +5516 -0
  48. package/lib/cli/webServerlessSpy.js.map +7 -0
  49. package/lib/common/SpyEventSender.d.ts +17 -0
  50. package/lib/common/SpyEventSender.js +227 -0
  51. package/lib/common/SpyEventSender.mjs +223 -0
  52. package/lib/common/getWebSocketUrl.d.ts +1 -1
  53. package/lib/common/getWebSocketUrl.js +19 -7
  54. package/lib/common/getWebSocketUrl.mjs +17 -5
  55. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.d.ts +9 -0
  56. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.js +3 -0
  57. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.mjs +2 -0
  58. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.ts +2 -7
  59. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.js +1 -1
  60. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +1 -1
  61. package/lib/common/spyEvents/EventBridgeSpyEvent.d.ts +2 -7
  62. package/lib/common/spyEvents/EventBridgeSpyEvent.js +1 -1
  63. package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +1 -1
  64. package/lib/common/spyEvents/FunctionBaseSpyEvent.d.ts +6 -0
  65. package/lib/common/spyEvents/FunctionBaseSpyEvent.js +3 -0
  66. package/lib/common/spyEvents/FunctionBaseSpyEvent.mjs +2 -0
  67. package/lib/common/spyEvents/FunctionConsole.d.ts +5 -0
  68. package/lib/common/spyEvents/FunctionConsole.js +3 -0
  69. package/lib/common/spyEvents/FunctionConsole.mjs +2 -0
  70. package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.ts +4 -8
  71. package/lib/common/spyEvents/FunctionConsoleSpyEvent.js +1 -1
  72. package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +1 -1
  73. package/lib/common/spyEvents/FunctionResponseSpyEvent.d.ts +2 -5
  74. package/lib/common/spyEvents/FunctionResponseSpyEvent.js +1 -1
  75. package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +1 -1
  76. package/lib/common/spyEvents/SnsSpyEventBase.d.ts +10 -0
  77. package/lib/common/spyEvents/SnsSpyEventBase.js +3 -0
  78. package/lib/common/spyEvents/SnsSpyEventBase.mjs +2 -0
  79. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.ts +2 -9
  80. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.js +1 -1
  81. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +1 -1
  82. package/lib/common/spyEvents/SnsTopicSpyEvent.d.ts +2 -9
  83. package/lib/common/spyEvents/SnsTopicSpyEvent.js +1 -1
  84. package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +1 -1
  85. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +251 -181
  86. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +3 -3
  87. package/lib/listener/SpyHandlers.ts.d.ts +30 -2
  88. package/lib/listener/SpyHandlers.ts.js +1 -1
  89. package/lib/listener/SpyHandlers.ts.mjs +1 -1
  90. package/lib/listener/WsListener.js +11 -11
  91. package/lib/listener/WsListener.mjs +12 -12
  92. package/lib/src/ServerlessSpy.js +2 -3
  93. package/lib/src/ServerlessSpy.mjs +1 -2
  94. package/listener/SpyHandlers.ts.ts +70 -9
  95. package/listener/WsListener.ts +21 -18
  96. package/package.json +5 -3
  97. package/cli/serverlessSpy.js +0 -73
  98. package/cli/ws.ts +0 -79
  99. package/common/publishSpyEvent.ts +0 -269
  100. package/lib/cli/ws.d.ts +0 -1
  101. package/lib/cli/ws.js +0 -68
  102. package/lib/cli/ws.mjs +0 -66
  103. package/lib/common/publishSpyEvent.d.ts +0 -4
  104. package/lib/common/publishSpyEvent.js +0 -211
  105. package/lib/common/publishSpyEvent.mjs +0 -205
package/lib/cli/ws.js DELETED
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const fs = require("fs");
4
- const readline = require("readline");
5
- const ws_1 = require("ws");
6
- const getWebSocketUrl_1 = require("../common/getWebSocketUrl");
7
- async function run() {
8
- // var credentialsProvider = awsCp.fromTemporaryCredentials();
9
- // const credentials = await credentialsProvider();
10
- // const client = new STSClient({});
11
- // client.send()
12
- // const command = new GetSessionTokenCommand({});
13
- // const { Credentials: credentials } = await client.send(command);
14
- // //const credentials = s.Credentials;
15
- // console.log("credentials", credentials);
16
- // const url = process.argv[2];
17
- const url = 'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
18
- // https://medium.com/@o.bredenberg/iam-sign-your-api-gateway-websocket-connection-request-no-custom-auth-from-your-frontend-65451166757d
19
- const url2 = await (0, getWebSocketUrl_1.getWebSocketUrl)(url);
20
- const ws = new ws_1.default(url2);
21
- const fileDescriptor = fs.openSync('spy_log.json', 'w');
22
- // 📢📁⚡️💾 💽 💾 💿 📀🛢🪣📑🔊
23
- ws.on('open', () => console.log(`connected ${new Date().toISOString()}`));
24
- ws.on('message', (data) => {
25
- // console.log(`From server: ${data}`);
26
- let parsed;
27
- try {
28
- parsed = JSON.parse(data);
29
- }
30
- catch (err) {
31
- console.error(`Can not parse ${data}`);
32
- }
33
- if (parsed) {
34
- console.log(`\x1b[47m\x1b[34m${parsed.timestamp} \x1b[31m🍕 ${parsed.serviceKey}\x1b[0m\x1b[32m\n${JSON.stringify(parsed.data, null, 2)}\x1b[0m`);
35
- }
36
- fs.write(fileDescriptor, data, (error) => {
37
- if (!error) {
38
- // fs.close(fileDescriptor);
39
- }
40
- else {
41
- console.error(error);
42
- }
43
- });
44
- fs.write(fileDescriptor, '\n', (error) => {
45
- if (!error) {
46
- // fs.close(fileDescriptor);
47
- }
48
- else {
49
- console.error(error);
50
- }
51
- });
52
- });
53
- ws.on('close', () => {
54
- console.log(`disconnected ${new Date().toISOString()}`);
55
- fs.close(fileDescriptor, () => undefined);
56
- process.exit();
57
- });
58
- readline
59
- .createInterface({
60
- input: process.stdin,
61
- output: process.stdout,
62
- })
63
- .on('line', (data) => {
64
- ws.send(data);
65
- });
66
- }
67
- run().catch(console.error);
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jbGkvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5QkFBeUI7QUFDekIscUNBQXFDO0FBQ3JDLDJCQUEyQjtBQUMzQiwrREFBNEQ7QUFFNUQsS0FBSyxVQUFVLEdBQUc7SUFDaEIsOERBQThEO0lBQzlELG1EQUFtRDtJQUVuRCxvQ0FBb0M7SUFDcEMsZ0JBQWdCO0lBRWhCLGtEQUFrRDtJQUNsRCxtRUFBbUU7SUFDbkUsdUNBQXVDO0lBRXZDLDJDQUEyQztJQUUzQywrQkFBK0I7SUFDL0IsTUFBTSxHQUFHLEdBQUcsMkRBQTJELENBQUM7SUFFeEUseUlBQXlJO0lBQ3pJLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxpQ0FBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRS9CLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELCtCQUErQjtJQUUvQixFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO1FBQzdCLHVDQUF1QztRQUV2QyxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQUk7WUFDRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtQkFBbUIsTUFBTSxDQUFDLFNBQVMsZUFDakMsTUFBTSxDQUFDLFVBQ1Qsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDbEUsQ0FBQztTQUNIO1FBRUQsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDViw0QkFBNEI7YUFDN0I7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDViw0QkFBNEI7YUFDN0I7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUTtTQUNMLGVBQWUsQ0FBQztRQUNmLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQztTQUNELEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNuQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNELEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IGdldFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gIC8vIHZhciBjcmVkZW50aWFsc1Byb3ZpZGVyID0gYXdzQ3AuZnJvbVRlbXBvcmFyeUNyZWRlbnRpYWxzKCk7XG4gIC8vIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgY3JlZGVudGlhbHNQcm92aWRlcigpO1xuXG4gIC8vIGNvbnN0IGNsaWVudCA9IG5ldyBTVFNDbGllbnQoe30pO1xuICAvLyBjbGllbnQuc2VuZCgpXG5cbiAgLy8gY29uc3QgY29tbWFuZCA9IG5ldyBHZXRTZXNzaW9uVG9rZW5Db21tYW5kKHt9KTtcbiAgLy8gY29uc3QgeyBDcmVkZW50aWFsczogY3JlZGVudGlhbHMgfSA9IGF3YWl0IGNsaWVudC5zZW5kKGNvbW1hbmQpO1xuICAvLyAvL2NvbnN0IGNyZWRlbnRpYWxzID0gcy5DcmVkZW50aWFscztcblxuICAvLyBjb25zb2xlLmxvZyhcImNyZWRlbnRpYWxzXCIsIGNyZWRlbnRpYWxzKTtcblxuICAvLyBjb25zdCB1cmwgPSBwcm9jZXNzLmFyZ3ZbMl07XG4gIGNvbnN0IHVybCA9ICd3c3M6Ly9wcmVoMXhvMXhoLmV4ZWN1dGUtYXBpLmV1LXdlc3QtMS5hbWF6b25hd3MuY29tL3Byb2QnO1xuXG4gIC8vIGh0dHBzOi8vbWVkaXVtLmNvbS9Aby5icmVkZW5iZXJnL2lhbS1zaWduLXlvdXItYXBpLWdhdGV3YXktd2Vic29ja2V0LWNvbm5lY3Rpb24tcmVxdWVzdC1uby1jdXN0b20tYXV0aC1mcm9tLXlvdXItZnJvbnRlbmQtNjU0NTExNjY3NTdkXG4gIGNvbnN0IHVybDIgPSBhd2FpdCBnZXRXZWJTb2NrZXRVcmwodXJsKTtcblxuICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsMik7XG5cbiAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSBmcy5vcGVuU3luYygnc3B5X2xvZy5qc29uJywgJ3cnKTtcbiAgLy8g8J+TovCfk4HimqHvuI/wn5K+IPCfkr0g8J+SviDwn5K/IPCfk4Dwn5ui8J+qo/Cfk5Hwn5SKXG5cbiAgd3Mub24oJ29wZW4nLCAoKSA9PiBjb25zb2xlLmxvZyhgY29ubmVjdGVkICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApKTtcbiAgd3Mub24oJ21lc3NhZ2UnLCAoZGF0YTogYW55KSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coYEZyb20gc2VydmVyOiAke2RhdGF9YCk7XG5cbiAgICBsZXQgcGFyc2VkO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ2FuIG5vdCBwYXJzZSAke2RhdGF9YCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcXHgxYls0N21cXHgxYlszNG0ke3BhcnNlZC50aW1lc3RhbXB9IFxceDFiWzMxbfCfjZUgJHtcbiAgICAgICAgICBwYXJzZWQuc2VydmljZUtleVxuICAgICAgICB9XFx4MWJbMG1cXHgxYlszMm1cXG4ke0pTT04uc3RyaW5naWZ5KHBhcnNlZC5kYXRhLCBudWxsLCAyKX1cXHgxYlswbWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnMud3JpdGUoZmlsZURlc2NyaXB0b3IsIGRhdGEsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBmcy5jbG9zZShmaWxlRGVzY3JpcHRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmcy53cml0ZShmaWxlRGVzY3JpcHRvciwgJ1xcbicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBmcy5jbG9zZShmaWxlRGVzY3JpcHRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgZGlzY29ubmVjdGVkICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgIGZzLmNsb3NlKGZpbGVEZXNjcmlwdG9yLCAoKSA9PiB1bmRlZmluZWQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcblxuICByZWFkbGluZVxuICAgIC5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICAgIH0pXG4gICAgLm9uKCdsaW5lJywgKGRhdGEpID0+IHtcbiAgICAgIHdzLnNlbmQoZGF0YSk7XG4gICAgfSk7XG59XG5ydW4oKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiJdfQ==
package/lib/cli/ws.mjs DELETED
@@ -1,66 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as readline from 'readline';
3
- import WebSocket from 'ws';
4
- import { getWebSocketUrl } from '../common/getWebSocketUrl';
5
- async function run() {
6
- // var credentialsProvider = awsCp.fromTemporaryCredentials();
7
- // const credentials = await credentialsProvider();
8
- // const client = new STSClient({});
9
- // client.send()
10
- // const command = new GetSessionTokenCommand({});
11
- // const { Credentials: credentials } = await client.send(command);
12
- // //const credentials = s.Credentials;
13
- // console.log("credentials", credentials);
14
- // const url = process.argv[2];
15
- const url = 'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
16
- // https://medium.com/@o.bredenberg/iam-sign-your-api-gateway-websocket-connection-request-no-custom-auth-from-your-frontend-65451166757d
17
- const url2 = await getWebSocketUrl(url);
18
- const ws = new WebSocket(url2);
19
- const fileDescriptor = fs.openSync('spy_log.json', 'w');
20
- // 📢📁⚡️💾 💽 💾 💿 📀🛢🪣📑🔊
21
- ws.on('open', () => console.log(`connected ${new Date().toISOString()}`));
22
- ws.on('message', (data) => {
23
- // console.log(`From server: ${data}`);
24
- let parsed;
25
- try {
26
- parsed = JSON.parse(data);
27
- }
28
- catch (err) {
29
- console.error(`Can not parse ${data}`);
30
- }
31
- if (parsed) {
32
- console.log(`\x1b[47m\x1b[34m${parsed.timestamp} \x1b[31m🍕 ${parsed.serviceKey}\x1b[0m\x1b[32m\n${JSON.stringify(parsed.data, null, 2)}\x1b[0m`);
33
- }
34
- fs.write(fileDescriptor, data, (error) => {
35
- if (!error) {
36
- // fs.close(fileDescriptor);
37
- }
38
- else {
39
- console.error(error);
40
- }
41
- });
42
- fs.write(fileDescriptor, '\n', (error) => {
43
- if (!error) {
44
- // fs.close(fileDescriptor);
45
- }
46
- else {
47
- console.error(error);
48
- }
49
- });
50
- });
51
- ws.on('close', () => {
52
- console.log(`disconnected ${new Date().toISOString()}`);
53
- fs.close(fileDescriptor, () => undefined);
54
- process.exit();
55
- });
56
- readline
57
- .createInterface({
58
- input: process.stdin,
59
- output: process.stdout,
60
- })
61
- .on('line', (data) => {
62
- ws.send(data);
63
- });
64
- }
65
- run().catch(console.error);
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jbGkvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxLQUFLLFVBQVUsR0FBRztJQUNoQiw4REFBOEQ7SUFDOUQsbURBQW1EO0lBRW5ELG9DQUFvQztJQUNwQyxnQkFBZ0I7SUFFaEIsa0RBQWtEO0lBQ2xELG1FQUFtRTtJQUNuRSx1Q0FBdUM7SUFFdkMsMkNBQTJDO0lBRTNDLCtCQUErQjtJQUMvQixNQUFNLEdBQUcsR0FBRywyREFBMkQsQ0FBQztJQUV4RSx5SUFBeUk7SUFDekksTUFBTSxJQUFJLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFL0IsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsK0JBQStCO0lBRS9CLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7UUFDN0IsdUNBQXVDO1FBRXZDLElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSTtZQUNGLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUNULG1CQUFtQixNQUFNLENBQUMsU0FBUyxlQUNqQyxNQUFNLENBQUMsVUFDVCxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUNsRSxDQUFDO1NBQ0g7UUFFRCxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLDRCQUE0QjthQUM3QjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLDRCQUE0QjthQUM3QjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRO1NBQ0wsZUFBZSxDQUFDO1FBQ2YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDO1NBQ0QsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ25CLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0QsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gJ3JlYWRsaW5lJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnd3MnO1xuaW1wb3J0IHsgZ2V0V2ViU29ja2V0VXJsIH0gZnJvbSAnLi4vY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgLy8gdmFyIGNyZWRlbnRpYWxzUHJvdmlkZXIgPSBhd3NDcC5mcm9tVGVtcG9yYXJ5Q3JlZGVudGlhbHMoKTtcbiAgLy8gY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBjcmVkZW50aWFsc1Byb3ZpZGVyKCk7XG5cbiAgLy8gY29uc3QgY2xpZW50ID0gbmV3IFNUU0NsaWVudCh7fSk7XG4gIC8vIGNsaWVudC5zZW5kKClcblxuICAvLyBjb25zdCBjb21tYW5kID0gbmV3IEdldFNlc3Npb25Ub2tlbkNvbW1hbmQoe30pO1xuICAvLyBjb25zdCB7IENyZWRlbnRpYWxzOiBjcmVkZW50aWFscyB9ID0gYXdhaXQgY2xpZW50LnNlbmQoY29tbWFuZCk7XG4gIC8vIC8vY29uc3QgY3JlZGVudGlhbHMgPSBzLkNyZWRlbnRpYWxzO1xuXG4gIC8vIGNvbnNvbGUubG9nKFwiY3JlZGVudGlhbHNcIiwgY3JlZGVudGlhbHMpO1xuXG4gIC8vIGNvbnN0IHVybCA9IHByb2Nlc3MuYXJndlsyXTtcbiAgY29uc3QgdXJsID0gJ3dzczovL3ByZWgxeG8xeGguZXhlY3V0ZS1hcGkuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20vcHJvZCc7XG5cbiAgLy8gaHR0cHM6Ly9tZWRpdW0uY29tL0BvLmJyZWRlbmJlcmcvaWFtLXNpZ24teW91ci1hcGktZ2F0ZXdheS13ZWJzb2NrZXQtY29ubmVjdGlvbi1yZXF1ZXN0LW5vLWN1c3RvbS1hdXRoLWZyb20teW91ci1mcm9udGVuZC02NTQ1MTE2Njc1N2RcbiAgY29uc3QgdXJsMiA9IGF3YWl0IGdldFdlYlNvY2tldFVybCh1cmwpO1xuXG4gIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmwyKTtcblxuICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IGZzLm9wZW5TeW5jKCdzcHlfbG9nLmpzb24nLCAndycpO1xuICAvLyDwn5Oi8J+TgeKaoe+4j/Cfkr4g8J+SvSDwn5K+IPCfkr8g8J+TgPCfm6Lwn6qj8J+TkfCflIpcblxuICB3cy5vbignb3BlbicsICgpID0+IGNvbnNvbGUubG9nKGBjb25uZWN0ZWQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCkpO1xuICB3cy5vbignbWVzc2FnZScsIChkYXRhOiBhbnkpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhgRnJvbSBzZXJ2ZXI6ICR7ZGF0YX1gKTtcblxuICAgIGxldCBwYXJzZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDYW4gbm90IHBhcnNlICR7ZGF0YX1gKTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFxceDFiWzQ3bVxceDFiWzM0bSR7cGFyc2VkLnRpbWVzdGFtcH0gXFx4MWJbMzFt8J+NlSAke1xuICAgICAgICAgIHBhcnNlZC5zZXJ2aWNlS2V5XG4gICAgICAgIH1cXHgxYlswbVxceDFiWzMybVxcbiR7SlNPTi5zdHJpbmdpZnkocGFyc2VkLmRhdGEsIG51bGwsIDIpfVxceDFiWzBtYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmcy53cml0ZShmaWxlRGVzY3JpcHRvciwgZGF0YSwgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIC8vIGZzLmNsb3NlKGZpbGVEZXNjcmlwdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZzLndyaXRlKGZpbGVEZXNjcmlwdG9yLCAnXFxuJywgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIC8vIGZzLmNsb3NlKGZpbGVEZXNjcmlwdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgZnMuY2xvc2UoZmlsZURlc2NyaXB0b3IsICgpID0+IHVuZGVmaW5lZCk7XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xuXG4gIHJlYWRsaW5lXG4gICAgLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gICAgfSlcbiAgICAub24oJ2xpbmUnLCAoZGF0YSkgPT4ge1xuICAgICAgd3Muc2VuZChkYXRhKTtcbiAgICB9KTtcbn1cbnJ1bigpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuIl19
@@ -1,4 +0,0 @@
1
- import { SpyMessage } from './spyEvents/SpyMessage';
2
- export declare function publishSpyEvent(event: any): Promise<void>;
3
- export declare function postData(spyMessage: Omit<SpyMessage, 'timestamp'>): Promise<void>;
4
- export declare function getSpyEventType(serviceKey: string): string;
@@ -1,211 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSpyEventType = exports.postData = exports.publishSpyEvent = void 0;
4
- const client_apigatewaymanagementapi_1 = require("@aws-sdk/client-apigatewaymanagementapi");
5
- const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
6
- const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
7
- const envVariableNames_1 = require("../src/common/envVariableNames");
8
- const ddb = new client_dynamodb_1.DynamoDBClient({
9
- region: process.env.AWS_REGION,
10
- });
11
- const apigwManagementApi = new client_apigatewaymanagementapi_1.ApiGatewayManagementApi({
12
- apiVersion: '2018-11-29',
13
- endpoint: process.env[envVariableNames_1.envVariableNames.SSPY_WS_ENDPOINT],
14
- });
15
- let connections;
16
- async function publishSpyEvent(event) {
17
- console.log('EVENT', JSON.stringify(event));
18
- const mapping = JSON.parse(process.env[envVariableNames_1.envVariableNames.SSPY_INFRA_MAPPING]);
19
- console.log('mapping', JSON.stringify(mapping));
20
- let connectionData;
21
- const scanParams = new client_dynamodb_1.ScanCommand({
22
- TableName: process.env[envVariableNames_1.envVariableNames.SSPY_WS_TABLE_NAME],
23
- ProjectionExpression: 'connectionId',
24
- });
25
- connectionData = await ddb.send(scanParams);
26
- connections = connectionData.Items;
27
- console.log(`connections at ${new Date().toISOString()}`, JSON.stringify(connections));
28
- const postDataPromises = [];
29
- if (event?.Records && event.Records[0]?.Sns) {
30
- console.log('*** SNS ***');
31
- const eventSns = event;
32
- for (const record of eventSns.Records) {
33
- const subscriptionArn = record.EventSubscriptionArn;
34
- let serviceKey;
35
- if (mapping[subscriptionArn]) {
36
- // subscription event that could contain filter based on existing subscription
37
- serviceKey = mapping[subscriptionArn];
38
- }
39
- else {
40
- // catch all subscription
41
- const topicArn = record.Sns.TopicArn;
42
- serviceKey = mapping[topicArn];
43
- }
44
- let message;
45
- try {
46
- message = JSON.parse(record.Sns.Message);
47
- }
48
- catch {
49
- message = record.Sns.Message;
50
- }
51
- const spyEventType = getSpyEventType(serviceKey);
52
- const data = {
53
- spyEventType,
54
- message,
55
- subject: record.Sns.Subject,
56
- timestamp: record.Sns.Timestamp,
57
- topicArn: record.Sns.TopicArn,
58
- messageId: record.Sns.MessageId,
59
- messageAttributes: record.Sns.MessageAttributes,
60
- };
61
- const fluentEvent = {
62
- data,
63
- serviceKey,
64
- };
65
- postDataPromises.push(postData(fluentEvent));
66
- }
67
- }
68
- else if (event?.Records && event.Records[0]?.eventSource === 'aws:sqs') {
69
- console.log('*** SQS ***');
70
- const eventSqs = event;
71
- for (const record of eventSqs.Records) {
72
- const subscriptionArn = record.eventSourceARN;
73
- const serviceKey = mapping[subscriptionArn];
74
- let body;
75
- try {
76
- body = JSON.parse(record.body);
77
- }
78
- catch {
79
- body = record.body;
80
- }
81
- const data = {
82
- spyEventType: 'Sqs',
83
- body,
84
- messageAttributes: record.messageAttributes,
85
- };
86
- const fluentEvent = {
87
- data,
88
- serviceKey,
89
- };
90
- postDataPromises.push(postData(fluentEvent));
91
- }
92
- }
93
- else if (event?.Records && event.Records[0]?.s3) {
94
- console.log('*** S3 ***');
95
- const eventS3 = event;
96
- for (const record of eventS3.Records) {
97
- const bucketArn = record.s3.bucket.arn;
98
- const data = {
99
- spyEventType: 'S3',
100
- eventName: record.eventName,
101
- eventTime: record.eventTime,
102
- bucket: record.s3.bucket.name,
103
- key: record.s3.object.key,
104
- };
105
- const fluentEvent = {
106
- data,
107
- serviceKey: mapping[bucketArn],
108
- };
109
- postDataPromises.push(postData(fluentEvent));
110
- }
111
- }
112
- else if (event.Records && event.Records[0]?.dynamodb) {
113
- console.log('*** DYNAMODB ***');
114
- const eventDynamoDB = event;
115
- for (const record of eventDynamoDB.Records) {
116
- let arn = record.eventSourceARN;
117
- arn = arn.substring(0, arn.indexOf('/stream/'));
118
- const data = {
119
- spyEventType: 'DynamoDB',
120
- eventName: record.eventName,
121
- newImage: (0, util_dynamodb_1.unmarshall)(record.dynamodb?.NewImage),
122
- keys: (0, util_dynamodb_1.unmarshall)(record.dynamodb?.Keys),
123
- oldImage: record.dynamodb?.OldImage
124
- ? (0, util_dynamodb_1.unmarshall)(record.dynamodb?.OldImage)
125
- : undefined,
126
- };
127
- const fluentEvent = {
128
- data,
129
- serviceKey: mapping[arn],
130
- };
131
- postDataPromises.push(postData(fluentEvent));
132
- }
133
- }
134
- else if (event.detail &&
135
- event['detail-type'] &&
136
- event.version &&
137
- event.source) {
138
- console.log('*** EventBridge ***');
139
- const eventEb = event;
140
- const serviceKey = mapping.eventBridge; // the is new lambda for each subscription
141
- const spyEventType = getSpyEventType(serviceKey);
142
- const message = eventEb.detail;
143
- const data = {
144
- spyEventType,
145
- detail: message,
146
- detailType: eventEb['detail-type'],
147
- source: eventEb.source,
148
- time: eventEb.time,
149
- account: eventEb.account,
150
- };
151
- const fluentEvent = {
152
- data,
153
- serviceKey,
154
- };
155
- postDataPromises.push(postData(fluentEvent));
156
- }
157
- else {
158
- console.log('*** OTHER ***');
159
- const fluentEvent = event;
160
- postDataPromises.push(postData(fluentEvent));
161
- }
162
- await Promise.all(postDataPromises);
163
- }
164
- exports.publishSpyEvent = publishSpyEvent;
165
- async function postData(spyMessage) {
166
- // const postData = JSON.parse(event.body!).data;
167
- console.log('postData', JSON.stringify(spyMessage));
168
- if (!connections) {
169
- return;
170
- }
171
- const postCalls = connections.map(async ({ connectionId }) => {
172
- console.log(`Sending message to: ${connectionId.S}`);
173
- try {
174
- const postToConnectionCommand = new client_apigatewaymanagementapi_1.PostToConnectionCommand({
175
- ConnectionId: connectionId.S,
176
- Data: JSON.stringify({
177
- timestamp: new Date().toISOString(),
178
- serviceKey: spyMessage.serviceKey,
179
- data: spyMessage.data,
180
- }),
181
- });
182
- await apigwManagementApi.send(postToConnectionCommand);
183
- }
184
- catch (e) {
185
- console.error(`Fails sending message to: ${connectionId.S}`, e);
186
- console.error(`Status code: ${e.statusCode}`);
187
- if (e.$metadata.httpStatusCode === 410) {
188
- console.log(`Found stale connection, deleting ${connectionId}`);
189
- const deleteParams = new client_dynamodb_1.DeleteItemCommand({
190
- TableName: process.env[envVariableNames_1.envVariableNames.SSPY_WS_TABLE_NAME],
191
- Key: { connectionId },
192
- });
193
- await ddb.send(deleteParams);
194
- }
195
- else {
196
- throw e;
197
- }
198
- }
199
- });
200
- await Promise.all(postCalls);
201
- console.log('Send message finish');
202
- }
203
- exports.postData = postData;
204
- function getSpyEventType(serviceKey) {
205
- if (!serviceKey) {
206
- throw new Error('Missing serviceKey');
207
- }
208
- return serviceKey.substring(0, serviceKey.indexOf('#'));
209
- }
210
- exports.getSpyEventType = getSpyEventType;
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaFNweUV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29tbW9uL3B1Ymxpc2hTcHlFdmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RkFHaUQ7QUFDakQsOERBS2tDO0FBRWxDLDBEQUFvRDtBQVFwRCxxRUFBa0U7QUFVbEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxnQ0FBYyxDQUFDO0lBQzdCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVU7Q0FDL0IsQ0FBQyxDQUFDO0FBRUgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHdEQUF1QixDQUFDO0lBQ3JELFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFnQixDQUFDLGdCQUFnQixDQUFFO0NBQzFELENBQUMsQ0FBQztBQUVILElBQUksV0FBeUQsQ0FBQztBQUV2RCxLQUFLLFVBQVUsZUFBZSxDQUFDLEtBQVU7SUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBZ0IsQ0FBQyxrQkFBa0IsQ0FBRSxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWhELElBQUksY0FBYyxDQUFDO0lBRW5CLE1BQU0sVUFBVSxHQUFHLElBQUksNkJBQVcsQ0FBQztRQUNqQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBZ0IsQ0FBQyxrQkFBa0IsQ0FBVztRQUNyRSxvQkFBb0IsRUFBRSxjQUFjO0tBQ3JDLENBQUMsQ0FBQztJQUVILGNBQWMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJ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T0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUExQ0QsNEJBMENDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLFVBQWtCO0lBQ2hELElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7S0FDdkM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBTkQsMENBTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBcGlHYXRld2F5TWFuYWdlbWVudEFwaSxcbiAgUG9zdFRvQ29ubmVjdGlvbkNvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hcGlnYXRld2F5bWFuYWdlbWVudGFwaSc7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVWYWx1ZSxcbiAgRGVsZXRlSXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBTY2FuQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcblxuaW1wb3J0IHsgdW5tYXJzaGFsbCB9IGZyb20gJ0Bhd3Mtc2RrL3V0aWwtZHluYW1vZGInO1xuaW1wb3J0IHtcbiAgRHluYW1vREJTdHJlYW1FdmVudCxcbiAgUzNFdmVudCxcbiAgU05TRXZlbnQsXG4gIEV2ZW50QnJpZGdlRXZlbnQsXG4gIFNRU0V2ZW50LFxufSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGVudlZhcmlhYmxlTmFtZXMgfSBmcm9tICcuLi9zcmMvY29tbW9uL2VudlZhcmlhYmxlTmFtZXMnO1xuaW1wb3J0IHsgRHluYW1vREJTcHlFdmVudCB9IGZyb20gJy4vc3B5RXZlbnRzL0R5bmFtb0RCU3B5RXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRCcmlkZ2VSdWxlU3B5RXZlbnQgfSBmcm9tICcuL3NweUV2ZW50cy9FdmVudEJyaWRnZVJ1bGVTcHlFdmVudCc7XG5pbXBvcnQgeyBFdmVudEJyaWRnZVNweUV2ZW50IH0gZnJvbSAnLi9zcHlFdmVudHMvRXZlbnRCcmlkZ2VTcHlFdmVudCc7XG5pbXBvcnQgeyBTM1NweUV2ZW50IH0gZnJvbSAnLi9zcHlFdmVudHMvUzNTcHlFdmVudCc7XG5pbXBvcnQgeyBTbnNTdWJzY3JpcHRpb25TcHlFdmVudCB9IGZyb20gJy4vc3B5RXZlbnRzL1Nuc1N1YnNjcmlwdGlvblNweUV2ZW50JztcbmltcG9ydCB7IFNuc1RvcGljU3B5RXZlbnQgfSBmcm9tICcuL3NweUV2ZW50cy9TbnNUb3BpY1NweUV2ZW50JztcbmltcG9ydCB7IFNweU1lc3NhZ2UgfSBmcm9tICcuL3NweUV2ZW50cy9TcHlNZXNzYWdlJztcbmltcG9ydCB7IFNxc1NweUV2ZW50IH0gZnJvbSAnLi9zcHlFdmVudHMvU3FzU3B5RXZlbnQnO1xuXG5jb25zdCBkZGIgPSBuZXcgRHluYW1vREJDbGllbnQoe1xuICByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04sXG59KTtcblxuY29uc3QgYXBpZ3dNYW5hZ2VtZW50QXBpID0gbmV3IEFwaUdhdGV3YXlNYW5hZ2VtZW50QXBpKHtcbiAgYXBpVmVyc2lvbjogJzIwMTgtMTEtMjknLFxuICBlbmRwb2ludDogcHJvY2Vzcy5lbnZbZW52VmFyaWFibGVOYW1lcy5TU1BZX1dTX0VORFBPSU5UXSEsXG59KTtcblxubGV0IGNvbm5lY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXSB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTcHlFdmVudChldmVudDogYW55KSB7XG4gIGNvbnNvbGUubG9nKCdFVkVOVCcsIEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG5cbiAgY29uc3QgbWFwcGluZyA9IEpTT04ucGFyc2UocHJvY2Vzcy5lbnZbZW52VmFyaWFibGVOYW1lcy5TU1BZX0lORlJBX01BUFBJTkddISk7XG4gIGNvbnNvbGUubG9nKCdtYXBwaW5nJywgSlNPTi5zdHJpbmdpZnkobWFwcGluZykpO1xuXG4gIGxldCBjb25uZWN0aW9uRGF0YTtcblxuICBjb25zdCBzY2FuUGFyYW1zID0gbmV3IFNjYW5Db21tYW5kKHtcbiAgICBUYWJsZU5hbWU6IHByb2Nlc3MuZW52W2VudlZhcmlhYmxlTmFtZXMuU1NQWV9XU19UQUJMRV9OQU1FXSBhcyBzdHJpbmcsXG4gICAgUHJvamVjdGlvbkV4cHJlc3Npb246ICdjb25uZWN0aW9uSWQnLFxuICB9KTtcblxuICBjb25uZWN0aW9uRGF0YSA9IGF3YWl0IGRkYi5zZW5kKHNjYW5QYXJhbXMpO1xuXG4gIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbkRhdGEuSXRlbXM7XG5cbiAgY29uc29sZS5sb2coXG4gICAgYGNvbm5lY3Rpb25zIGF0ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWAsXG4gICAgSlNPTi5zdHJpbmdpZnkoY29ubmVjdGlvbnMpXG4gICk7XG5cbiAgY29uc3QgcG9zdERhdGFQcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcblxuICBpZiAoZXZlbnQ/LlJlY29yZHMgJiYgZXZlbnQuUmVjb3Jkc1swXT8uU25zKSB7XG4gICAgY29uc29sZS5sb2coJyoqKiBTTlMgKioqJyk7XG4gICAgY29uc3QgZXZlbnRTbnMgPSBldmVudCBhcyBTTlNFdmVudDtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudFNucy5SZWNvcmRzKSB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25Bcm4gPSByZWNvcmQuRXZlbnRTdWJzY3JpcHRpb25Bcm47XG5cbiAgICAgIGxldCBzZXJ2aWNlS2V5OiBzdHJpbmc7XG4gICAgICBpZiAobWFwcGluZ1tzdWJzY3JpcHRpb25Bcm5dKSB7XG4gICAgICAgIC8vIHN1YnNjcmlwdGlvbiBldmVudCB0aGF0IGNvdWxkIGNvbnRhaW4gZmlsdGVyIGJhc2VkIG9uIGV4aXN0aW5nIHN1YnNjcmlwdGlvblxuICAgICAgICBzZXJ2aWNlS2V5ID0gbWFwcGluZ1tzdWJzY3JpcHRpb25Bcm5dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2F0Y2ggYWxsIHN1YnNjcmlwdGlvblxuICAgICAgICBjb25zdCB0b3BpY0FybiA9IHJlY29yZC5TbnMuVG9waWNBcm47XG4gICAgICAgIHNlcnZpY2VLZXkgPSBtYXBwaW5nW3RvcGljQXJuXTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1lc3NhZ2U6IHN0cmluZztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04ucGFyc2UocmVjb3JkLlNucy5NZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBtZXNzYWdlID0gcmVjb3JkLlNucy5NZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcHlFdmVudFR5cGUgPSBnZXRTcHlFdmVudFR5cGUoc2VydmljZUtleSkgYXNcbiAgICAgICAgfCAnRnVuY3Rpb25TbnNUb3BpYydcbiAgICAgICAgfCAnRnVuY3Rpb25TbnNTdWJzY3JpcHRpb24nO1xuXG4gICAgICBjb25zdCBkYXRhOiBTbnNUb3BpY1NweUV2ZW50IHwgU25zU3Vic2NyaXB0aW9uU3B5RXZlbnQgPSB7XG4gICAgICAgIHNweUV2ZW50VHlwZSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3ViamVjdDogcmVjb3JkLlNucy5TdWJqZWN0LFxuICAgICAgICB0aW1lc3RhbXA6IHJlY29yZC5TbnMuVGltZXN0YW1wLFxuICAgICAgICB0b3BpY0FybjogcmVjb3JkLlNucy5Ub3BpY0FybixcbiAgICAgICAgbWVzc2FnZUlkOiByZWNvcmQuU25zLk1lc3NhZ2VJZCxcbiAgICAgICAgbWVzc2FnZUF0dHJpYnV0ZXM6IHJlY29yZC5TbnMuTWVzc2FnZUF0dHJpYnV0ZXMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmbHVlbnRFdmVudDogT21pdDxTcHlNZXNzYWdlLCAndGltZXN0YW1wJz4gPSB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNlcnZpY2VLZXksXG4gICAgICB9O1xuICAgICAgcG9zdERhdGFQcm9taXNlcy5wdXNoKHBvc3REYXRhKGZsdWVudEV2ZW50KSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV2ZW50Py5SZWNvcmRzICYmIGV2ZW50LlJlY29yZHNbMF0/LmV2ZW50U291cmNlID09PSAnYXdzOnNxcycpIHtcbiAgICBjb25zb2xlLmxvZygnKioqIFNRUyAqKionKTtcbiAgICBjb25zdCBldmVudFNxcyA9IGV2ZW50IGFzIFNRU0V2ZW50O1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50U3FzLlJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbkFybiA9IHJlY29yZC5ldmVudFNvdXJjZUFSTjtcblxuICAgICAgY29uc3Qgc2VydmljZUtleSA9IG1hcHBpbmdbc3Vic2NyaXB0aW9uQXJuXTtcbiAgICAgIGxldCBib2R5OiBzdHJpbmc7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBib2R5ID0gcmVjb3JkLmJvZHk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IFNxc1NweUV2ZW50ID0ge1xuICAgICAgICBzcHlFdmVudFR5cGU6ICdTcXMnLFxuICAgICAgICBib2R5LFxuICAgICAgICBtZXNzYWdlQXR0cmlidXRlczogcmVjb3JkLm1lc3NhZ2VBdHRyaWJ1dGVzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmx1ZW50RXZlbnQ6IE9taXQ8U3B5TWVzc2FnZSwgJ3RpbWVzdGFtcCc+ID0ge1xuICAgICAgICBkYXRhLFxuICAgICAgICBzZXJ2aWNlS2V5LFxuICAgICAgfTtcbiAgICAgIHBvc3REYXRhUHJvbWlzZXMucHVzaChwb3N0RGF0YShmbHVlbnRFdmVudCkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldmVudD8uUmVjb3JkcyAmJiBldmVudC5SZWNvcmRzWzBdPy5zMykge1xuICAgIGNvbnNvbGUubG9nKCcqKiogUzMgKioqJyk7XG4gICAgY29uc3QgZXZlbnRTMyA9IGV2ZW50IGFzIFMzRXZlbnQ7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXZlbnRTMy5SZWNvcmRzKSB7XG4gICAgICBjb25zdCBidWNrZXRBcm4gPSByZWNvcmQuczMuYnVja2V0LmFybjtcblxuICAgICAgY29uc3QgZGF0YTogUzNTcHlFdmVudCA9IHtcbiAgICAgICAgc3B5RXZlbnRUeXBlOiAnUzMnLFxuICAgICAgICBldmVudE5hbWU6IHJlY29yZC5ldmVudE5hbWUsXG4gICAgICAgIGV2ZW50VGltZTogcmVjb3JkLmV2ZW50VGltZSxcbiAgICAgICAgYnVja2V0OiByZWNvcmQuczMuYnVja2V0Lm5hbWUsXG4gICAgICAgIGtleTogcmVjb3JkLnMzLm9iamVjdC5rZXksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmbHVlbnRFdmVudDogT21pdDxTcHlNZXNzYWdlLCAndGltZXN0YW1wJz4gPSB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNlcnZpY2VLZXk6IG1hcHBpbmdbYnVja2V0QXJuXSxcbiAgICAgIH07XG4gICAgICBwb3N0RGF0YVByb21pc2VzLnB1c2gocG9zdERhdGEoZmx1ZW50RXZlbnQpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXZlbnQuUmVjb3JkcyAmJiBldmVudC5SZWNvcmRzWzBdPy5keW5hbW9kYikge1xuICAgIGNvbnNvbGUubG9nKCcqKiogRFlOQU1PREIgKioqJyk7XG4gICAgY29uc3QgZXZlbnREeW5hbW9EQiA9IGV2ZW50IGFzIER5bmFtb0RCU3RyZWFtRXZlbnQ7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXZlbnREeW5hbW9EQi5SZWNvcmRzKSB7XG4gICAgICBsZXQgYXJuID0gcmVjb3JkLmV2ZW50U291cmNlQVJOITtcbiAgICAgIGFybiA9IGFybi5zdWJzdHJpbmcoMCwgYXJuLmluZGV4T2YoJy9zdHJlYW0vJykpO1xuXG4gICAgICBjb25zdCBkYXRhOiBEeW5hbW9EQlNweUV2ZW50ID0ge1xuICAgICAgICBzcHlFdmVudFR5cGU6ICdEeW5hbW9EQicsXG4gICAgICAgIGV2ZW50TmFtZTogcmVjb3JkLmV2ZW50TmFtZSxcbiAgICAgICAgbmV3SW1hZ2U6IHVubWFyc2hhbGwocmVjb3JkLmR5bmFtb2RiPy5OZXdJbWFnZSBhcyBhbnkpLFxuICAgICAgICBrZXlzOiB1bm1hcnNoYWxsKHJlY29yZC5keW5hbW9kYj8uS2V5cyBhcyBhbnkpLFxuICAgICAgICBvbGRJbWFnZTogcmVjb3JkLmR5bmFtb2RiPy5PbGRJbWFnZVxuICAgICAgICAgID8gdW5tYXJzaGFsbChyZWNvcmQuZHluYW1vZGI/Lk9sZEltYWdlIGFzIGFueSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZsdWVudEV2ZW50OiBPbWl0PFNweU1lc3NhZ2UsICd0aW1lc3RhbXAnPiA9IHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc2VydmljZUtleTogbWFwcGluZ1thcm5dLFxuICAgICAgfTtcbiAgICAgIHBvc3REYXRhUHJvbWlzZXMucHVzaChwb3N0RGF0YShmbHVlbnRFdmVudCkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICBldmVudC5kZXRhaWwgJiZcbiAgICBldmVudFsnZGV0YWlsLXR5cGUnXSAmJlxuICAgIGV2ZW50LnZlcnNpb24gJiZcbiAgICBldmVudC5zb3VyY2VcbiAgKSB7XG4gICAgY29uc29sZS5sb2coJyoqKiBFdmVudEJyaWRnZSAqKionKTtcbiAgICBjb25zdCBldmVudEViID0gZXZlbnQgYXMgRXZlbnRCcmlkZ2VFdmVudDxhbnksIGFueT47XG5cbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gbWFwcGluZy5ldmVudEJyaWRnZTsgLy8gdGhlIGlzIG5ldyBsYW1iZGEgZm9yIGVhY2ggc3Vic2NyaXB0aW9uXG5cbiAgICBjb25zdCBzcHlFdmVudFR5cGUgPSBnZXRTcHlFdmVudFR5cGUoc2VydmljZUtleSkgYXNcbiAgICAgIHwgJ0V2ZW50QnJpZGdlJ1xuICAgICAgfCAnRXZlbnRCcmlkZ2VSdWxlJztcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudEViLmRldGFpbDtcblxuICAgIGNvbnN0IGRhdGE6IEV2ZW50QnJpZGdlU3B5RXZlbnQgfCBFdmVudEJyaWRnZVJ1bGVTcHlFdmVudCA9IHtcbiAgICAgIHNweUV2ZW50VHlwZSxcbiAgICAgIGRldGFpbDogbWVzc2FnZSxcbiAgICAgIGRldGFpbFR5cGU6IGV2ZW50RWJbJ2RldGFpbC10eXBlJ10sXG4gICAgICBzb3VyY2U6IGV2ZW50RWIuc291cmNlLFxuICAgICAgdGltZTogZXZlbnRFYi50aW1lLFxuICAgICAgYWNjb3VudDogZXZlbnRFYi5hY2NvdW50LFxuICAgIH07XG5cbiAgICBjb25zdCBmbHVlbnRFdmVudDogT21pdDxTcHlNZXNzYWdlLCAndGltZXN0YW1wJz4gPSB7XG4gICAgICBkYXRhLFxuICAgICAgc2VydmljZUtleSxcbiAgICB9O1xuICAgIHBvc3REYXRhUHJvbWlzZXMucHVzaChwb3N0RGF0YShmbHVlbnRFdmVudCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCcqKiogT1RIRVIgKioqJyk7XG4gICAgY29uc3QgZmx1ZW50RXZlbnQ6IE9taXQ8U3B5TWVzc2FnZSwgJ3RpbWVzdGFtcCc+ID0gZXZlbnQ7XG4gICAgcG9zdERhdGFQcm9taXNlcy5wdXNoKHBvc3REYXRhKGZsdWVudEV2ZW50KSk7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwb3N0RGF0YVByb21pc2VzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvc3REYXRhKHNweU1lc3NhZ2U6IE9taXQ8U3B5TWVzc2FnZSwgJ3RpbWVzdGFtcCc+KSB7XG4gIC8vIGNvbnN0IHBvc3REYXRhID0gSlNPTi5wYXJzZShldmVudC5ib2R5ISkuZGF0YTtcbiAgY29uc29sZS5sb2coJ3Bvc3REYXRhJywgSlNPTi5zdHJpbmdpZnkoc3B5TWVzc2FnZSkpO1xuXG4gIGlmICghY29ubmVjdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0Q2FsbHMgPSBjb25uZWN0aW9ucy5tYXAoYXN5bmMgKHsgY29ubmVjdGlvbklkIH0pID0+IHtcbiAgICBjb25zb2xlLmxvZyhgU2VuZGluZyBtZXNzYWdlIHRvOiAke2Nvbm5lY3Rpb25JZC5TfWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvc3RUb0Nvbm5lY3Rpb25Db21tYW5kID0gbmV3IFBvc3RUb0Nvbm5lY3Rpb25Db21tYW5kKHtcbiAgICAgICAgQ29ubmVjdGlvbklkOiBjb25uZWN0aW9uSWQuUyxcbiAgICAgICAgRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNlcnZpY2VLZXk6IHNweU1lc3NhZ2Uuc2VydmljZUtleSxcbiAgICAgICAgICBkYXRhOiBzcHlNZXNzYWdlLmRhdGEsXG4gICAgICAgIH0pIGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhcGlnd01hbmFnZW1lbnRBcGkuc2VuZChwb3N0VG9Db25uZWN0aW9uQ29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbHMgc2VuZGluZyBtZXNzYWdlIHRvOiAke2Nvbm5lY3Rpb25JZC5TfWAsIGUpO1xuICAgICAgY29uc29sZS5lcnJvcihgU3RhdHVzIGNvZGU6ICR7KGUgYXMgYW55KS5zdGF0dXNDb2RlfWApO1xuICAgICAgaWYgKChlIGFzIGFueSkuJG1ldGFkYXRhLmh0dHBTdGF0dXNDb2RlID09PSA0MTApIHtcbiAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIHN0YWxlIGNvbm5lY3Rpb24sIGRlbGV0aW5nICR7Y29ubmVjdGlvbklkfWApO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZVBhcmFtcyA9IG5ldyBEZWxldGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiBwcm9jZXNzLmVudltlbnZWYXJpYWJsZU5hbWVzLlNTUFlfV1NfVEFCTEVfTkFNRV0sXG4gICAgICAgICAgS2V5OiB7IGNvbm5lY3Rpb25JZCB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBkZGIuc2VuZChkZWxldGVQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHBvc3RDYWxscyk7XG4gIGNvbnNvbGUubG9nKCdTZW5kIG1lc3NhZ2UgZmluaXNoJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcHlFdmVudFR5cGUoc2VydmljZUtleTogc3RyaW5nKSB7XG4gIGlmICghc2VydmljZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzZXJ2aWNlS2V5Jyk7XG4gIH1cblxuICByZXR1cm4gc2VydmljZUtleS5zdWJzdHJpbmcoMCwgc2VydmljZUtleS5pbmRleE9mKCcjJykpO1xufVxuIl19
@@ -1,205 +0,0 @@
1
- import { ApiGatewayManagementApi, PostToConnectionCommand, } from '@aws-sdk/client-apigatewaymanagementapi';
2
- import { DeleteItemCommand, DynamoDBClient, ScanCommand, } from '@aws-sdk/client-dynamodb';
3
- import { unmarshall } from '@aws-sdk/util-dynamodb';
4
- import { envVariableNames } from '../src/common/envVariableNames';
5
- const ddb = new DynamoDBClient({
6
- region: process.env.AWS_REGION,
7
- });
8
- const apigwManagementApi = new ApiGatewayManagementApi({
9
- apiVersion: '2018-11-29',
10
- endpoint: process.env[envVariableNames.SSPY_WS_ENDPOINT],
11
- });
12
- let connections;
13
- export async function publishSpyEvent(event) {
14
- console.log('EVENT', JSON.stringify(event));
15
- const mapping = JSON.parse(process.env[envVariableNames.SSPY_INFRA_MAPPING]);
16
- console.log('mapping', JSON.stringify(mapping));
17
- let connectionData;
18
- const scanParams = new ScanCommand({
19
- TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME],
20
- ProjectionExpression: 'connectionId',
21
- });
22
- connectionData = await ddb.send(scanParams);
23
- connections = connectionData.Items;
24
- console.log(`connections at ${new Date().toISOString()}`, JSON.stringify(connections));
25
- const postDataPromises = [];
26
- if (event?.Records && event.Records[0]?.Sns) {
27
- console.log('*** SNS ***');
28
- const eventSns = event;
29
- for (const record of eventSns.Records) {
30
- const subscriptionArn = record.EventSubscriptionArn;
31
- let serviceKey;
32
- if (mapping[subscriptionArn]) {
33
- // subscription event that could contain filter based on existing subscription
34
- serviceKey = mapping[subscriptionArn];
35
- }
36
- else {
37
- // catch all subscription
38
- const topicArn = record.Sns.TopicArn;
39
- serviceKey = mapping[topicArn];
40
- }
41
- let message;
42
- try {
43
- message = JSON.parse(record.Sns.Message);
44
- }
45
- catch {
46
- message = record.Sns.Message;
47
- }
48
- const spyEventType = getSpyEventType(serviceKey);
49
- const data = {
50
- spyEventType,
51
- message,
52
- subject: record.Sns.Subject,
53
- timestamp: record.Sns.Timestamp,
54
- topicArn: record.Sns.TopicArn,
55
- messageId: record.Sns.MessageId,
56
- messageAttributes: record.Sns.MessageAttributes,
57
- };
58
- const fluentEvent = {
59
- data,
60
- serviceKey,
61
- };
62
- postDataPromises.push(postData(fluentEvent));
63
- }
64
- }
65
- else if (event?.Records && event.Records[0]?.eventSource === 'aws:sqs') {
66
- console.log('*** SQS ***');
67
- const eventSqs = event;
68
- for (const record of eventSqs.Records) {
69
- const subscriptionArn = record.eventSourceARN;
70
- const serviceKey = mapping[subscriptionArn];
71
- let body;
72
- try {
73
- body = JSON.parse(record.body);
74
- }
75
- catch {
76
- body = record.body;
77
- }
78
- const data = {
79
- spyEventType: 'Sqs',
80
- body,
81
- messageAttributes: record.messageAttributes,
82
- };
83
- const fluentEvent = {
84
- data,
85
- serviceKey,
86
- };
87
- postDataPromises.push(postData(fluentEvent));
88
- }
89
- }
90
- else if (event?.Records && event.Records[0]?.s3) {
91
- console.log('*** S3 ***');
92
- const eventS3 = event;
93
- for (const record of eventS3.Records) {
94
- const bucketArn = record.s3.bucket.arn;
95
- const data = {
96
- spyEventType: 'S3',
97
- eventName: record.eventName,
98
- eventTime: record.eventTime,
99
- bucket: record.s3.bucket.name,
100
- key: record.s3.object.key,
101
- };
102
- const fluentEvent = {
103
- data,
104
- serviceKey: mapping[bucketArn],
105
- };
106
- postDataPromises.push(postData(fluentEvent));
107
- }
108
- }
109
- else if (event.Records && event.Records[0]?.dynamodb) {
110
- console.log('*** DYNAMODB ***');
111
- const eventDynamoDB = event;
112
- for (const record of eventDynamoDB.Records) {
113
- let arn = record.eventSourceARN;
114
- arn = arn.substring(0, arn.indexOf('/stream/'));
115
- const data = {
116
- spyEventType: 'DynamoDB',
117
- eventName: record.eventName,
118
- newImage: unmarshall(record.dynamodb?.NewImage),
119
- keys: unmarshall(record.dynamodb?.Keys),
120
- oldImage: record.dynamodb?.OldImage
121
- ? unmarshall(record.dynamodb?.OldImage)
122
- : undefined,
123
- };
124
- const fluentEvent = {
125
- data,
126
- serviceKey: mapping[arn],
127
- };
128
- postDataPromises.push(postData(fluentEvent));
129
- }
130
- }
131
- else if (event.detail &&
132
- event['detail-type'] &&
133
- event.version &&
134
- event.source) {
135
- console.log('*** EventBridge ***');
136
- const eventEb = event;
137
- const serviceKey = mapping.eventBridge; // the is new lambda for each subscription
138
- const spyEventType = getSpyEventType(serviceKey);
139
- const message = eventEb.detail;
140
- const data = {
141
- spyEventType,
142
- detail: message,
143
- detailType: eventEb['detail-type'],
144
- source: eventEb.source,
145
- time: eventEb.time,
146
- account: eventEb.account,
147
- };
148
- const fluentEvent = {
149
- data,
150
- serviceKey,
151
- };
152
- postDataPromises.push(postData(fluentEvent));
153
- }
154
- else {
155
- console.log('*** OTHER ***');
156
- const fluentEvent = event;
157
- postDataPromises.push(postData(fluentEvent));
158
- }
159
- await Promise.all(postDataPromises);
160
- }
161
- export async function postData(spyMessage) {
162
- // const postData = JSON.parse(event.body!).data;
163
- console.log('postData', JSON.stringify(spyMessage));
164
- if (!connections) {
165
- return;
166
- }
167
- const postCalls = connections.map(async ({ connectionId }) => {
168
- console.log(`Sending message to: ${connectionId.S}`);
169
- try {
170
- const postToConnectionCommand = new PostToConnectionCommand({
171
- ConnectionId: connectionId.S,
172
- Data: JSON.stringify({
173
- timestamp: new Date().toISOString(),
174
- serviceKey: spyMessage.serviceKey,
175
- data: spyMessage.data,
176
- }),
177
- });
178
- await apigwManagementApi.send(postToConnectionCommand);
179
- }
180
- catch (e) {
181
- console.error(`Fails sending message to: ${connectionId.S}`, e);
182
- console.error(`Status code: ${e.statusCode}`);
183
- if (e.$metadata.httpStatusCode === 410) {
184
- console.log(`Found stale connection, deleting ${connectionId}`);
185
- const deleteParams = new DeleteItemCommand({
186
- TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME],
187
- Key: { connectionId },
188
- });
189
- await ddb.send(deleteParams);
190
- }
191
- else {
192
- throw e;
193
- }
194
- }
195
- });
196
- await Promise.all(postCalls);
197
- console.log('Send message finish');
198
- }
199
- export function getSpyEventType(serviceKey) {
200
- if (!serviceKey) {
201
- throw new Error('Missing serviceKey');
202
- }
203
- return serviceKey.substring(0, serviceKey.indexOf('#'));
204
- }
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaFNweUV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29tbW9uL3B1Ymxpc2hTcHlFdmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHVCQUF1QixHQUN4QixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFdBQVcsR0FDWixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVFwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVVsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGNBQWMsQ0FBQztJQUM3QixNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVO0NBQy9CLENBQUMsQ0FBQztBQUVILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQztJQUNyRCxVQUFVLEVBQUUsWUFBWTtJQUN4QixRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBRTtDQUMxRCxDQUFDLENBQUM7QUFFSCxJQUFJLFdBQXlELENBQUM7QUFFOUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsS0FBVTtJQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFFLENBQUMsQ0FBQztJQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFaEQsSUFBSSxjQUFjLENBQUM7SUFF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LENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxDQUFDO2FBQ1Q7U0FDRjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUNoRCxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFwaUdhdGV3YXlNYW5hZ2VtZW50QXBpLFxuICBQb3N0VG9Db25uZWN0aW9uQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWFwaWdhdGV3YXltYW5hZ2VtZW50YXBpJztcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZVZhbHVlLFxuICBEZWxldGVJdGVtQ29tbWFuZCxcbiAgRHluYW1vREJDbGllbnQsXG4gIFNjYW5Db21tYW5kLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtZHluYW1vZGInO1xuXG5pbXBvcnQgeyB1bm1hcnNoYWxsIH0gZnJvbSAnQGF3cy1zZGsvdXRpbC1keW5hbW9kYic7XG5pbXBvcnQge1xuICBEeW5hbW9EQlN0cmVhbUV2ZW50LFxuICBTM0V2ZW50LFxuICBTTlNFdmVudCxcbiAgRXZlbnRCcmlkZ2VFdmVudCxcbiAgU1FTRXZlbnQsXG59IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgZW52VmFyaWFibGVOYW1lcyB9IGZyb20gJy4uL3NyYy9jb21tb24vZW52VmFyaWFibGVOYW1lcyc7XG5pbXBvcnQgeyBEeW5hbW9EQlNweUV2ZW50IH0gZnJvbSAnLi9zcHlFdmVudHMvRHluYW1vREJTcHlFdmVudCc7XG5pbXBvcnQgeyBFdmVudEJyaWRnZVJ1bGVTcHlFdmVudCB9IGZyb20gJy4vc3B5RXZlbnRzL0V2ZW50QnJpZGdlUnVsZVNweUV2ZW50JztcbmltcG9ydCB7IEV2ZW50QnJpZGdlU3B5RXZlbnQgfSBmcm9tICcuL3NweUV2ZW50cy9FdmVudEJyaWRnZVNweUV2ZW50JztcbmltcG9ydCB7IFMzU3B5RXZlbnQgfSBmcm9tICcuL3NweUV2ZW50cy9TM1NweUV2ZW50JztcbmltcG9ydCB7IFNuc1N1YnNjcmlwdGlvblNweUV2ZW50IH0gZnJvbSAnLi9zcHlFdmVudHMvU25zU3Vic2NyaXB0aW9uU3B5RXZlbnQnO1xuaW1wb3J0IHsgU25zVG9waWNTcHlFdmVudCB9IGZyb20gJy4vc3B5RXZlbnRzL1Nuc1RvcGljU3B5RXZlbnQnO1xuaW1wb3J0IHsgU3B5TWVzc2FnZSB9IGZyb20gJy4vc3B5RXZlbnRzL1NweU1lc3NhZ2UnO1xuaW1wb3J0IHsgU3FzU3B5RXZlbnQgfSBmcm9tICcuL3NweUV2ZW50cy9TcXNTcHlFdmVudCc7XG5cbmNvbnN0IGRkYiA9IG5ldyBEeW5hbW9EQkNsaWVudCh7XG4gIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTixcbn0pO1xuXG5jb25zdCBhcGlnd01hbmFnZW1lbnRBcGkgPSBuZXcgQXBpR2F0ZXdheU1hbmFnZW1lbnRBcGkoe1xuICBhcGlWZXJzaW9uOiAnMjAxOC0xMS0yOScsXG4gIGVuZHBvaW50OiBwcm9jZXNzLmVudltlbnZWYXJpYWJsZU5hbWVzLlNTUFlfV1NfRU5EUE9JTlRdISxcbn0pO1xuXG5sZXQgY29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPltdIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaFNweUV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgY29uc29sZS5sb2coJ0VWRU5UJywgSlNPTi5zdHJpbmdpZnkoZXZlbnQpKTtcblxuICBjb25zdCBtYXBwaW5nID0gSlNPTi5wYXJzZShwcm9jZXNzLmVudltlbnZWYXJpYWJsZU5hbWVzLlNTUFlfSU5GUkFfTUFQUElOR10hKTtcbiAgY29uc29sZS5sb2coJ21hcHBpbmcnLCBKU09OLnN0cmluZ2lmeShtYXBwaW5nKSk7XG5cbiAgbGV0IGNvbm5lY3Rpb25EYXRhO1xuXG4gIGNvbnN0IHNjYW5QYXJhbXMgPSBuZXcgU2NhbkNvbW1hbmQoe1xuICAgIFRhYmxlTmFtZTogcHJvY2Vzcy5lbnZbZW52VmFyaWFibGVOYW1lcy5TU1BZX1dTX1RBQkxFX05BTUVdIGFzIHN0cmluZyxcbiAgICBQcm9qZWN0aW9uRXhwcmVzc2lvbjogJ2Nvbm5lY3Rpb25JZCcsXG4gIH0pO1xuXG4gIGNvbm5lY3Rpb25EYXRhID0gYXdhaXQgZGRiLnNlbmQoc2NhblBhcmFtcyk7XG5cbiAgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uRGF0YS5JdGVtcztcblxuICBjb25zb2xlLmxvZyhcbiAgICBgY29ubmVjdGlvbnMgYXQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICBKU09OLnN0cmluZ2lmeShjb25uZWN0aW9ucylcbiAgKTtcblxuICBjb25zdCBwb3N0RGF0YVByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXG4gIGlmIChldmVudD8uUmVjb3JkcyAmJiBldmVudC5SZWNvcmRzWzBdPy5TbnMpIHtcbiAgICBjb25zb2xlLmxvZygnKioqIFNOUyAqKionKTtcbiAgICBjb25zdCBldmVudFNucyA9IGV2ZW50IGFzIFNOU0V2ZW50O1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50U25zLlJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbkFybiA9IHJlY29yZC5FdmVudFN1YnNjcmlwdGlvbkFybjtcblxuICAgICAgbGV0IHNlcnZpY2VLZXk6IHN0cmluZztcbiAgICAgIGlmIChtYXBwaW5nW3N1YnNjcmlwdGlvbkFybl0pIHtcbiAgICAgICAgLy8gc3Vic2NyaXB0aW9uIGV2ZW50IHRoYXQgY291bGQgY29udGFpbiBmaWx0ZXIgYmFzZWQgb24gZXhpc3Rpbmcgc3Vic2NyaXB0aW9uXG4gICAgICAgIHNlcnZpY2VLZXkgPSBtYXBwaW5nW3N1YnNjcmlwdGlvbkFybl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjYXRjaCBhbGwgc3Vic2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IHRvcGljQXJuID0gcmVjb3JkLlNucy5Ub3BpY0FybjtcbiAgICAgICAgc2VydmljZUtleSA9IG1hcHBpbmdbdG9waWNBcm5dO1xuICAgICAgfVxuXG4gICAgICBsZXQgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShyZWNvcmQuU25zLk1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIG1lc3NhZ2UgPSByZWNvcmQuU25zLk1lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNweUV2ZW50VHlwZSA9IGdldFNweUV2ZW50VHlwZShzZXJ2aWNlS2V5KSBhc1xuICAgICAgICB8ICdGdW5jdGlvblNuc1RvcGljJ1xuICAgICAgICB8ICdGdW5jdGlvblNuc1N1YnNjcmlwdGlvbic7XG5cbiAgICAgIGNvbnN0IGRhdGE6IFNuc1RvcGljU3B5RXZlbnQgfCBTbnNTdWJzY3JpcHRpb25TcHlFdmVudCA9IHtcbiAgICAgICAgc3B5RXZlbnRUeXBlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdWJqZWN0OiByZWNvcmQuU25zLlN1YmplY3QsXG4gICAgICAgIHRpbWVzdGFtcDogcmVjb3JkLlNucy5UaW1lc3RhbXAsXG4gICAgICAgIHRvcGljQXJuOiByZWNvcmQuU25zLlRvcGljQXJuLFxuICAgICAgICBtZXNzYWdlSWQ6IHJlY29yZC5TbnMuTWVzc2FnZUlkLFxuICAgICAgICBtZXNzYWdlQXR0cmlidXRlczogcmVjb3JkLlNucy5NZXNzYWdlQXR0cmlidXRlcyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZsdWVudEV2ZW50OiBPbWl0PFNweU1lc3NhZ2UsICd0aW1lc3RhbXAnPiA9IHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc2VydmljZUtleSxcbiAgICAgIH07XG4gICAgICBwb3N0RGF0YVByb21pc2VzLnB1c2gocG9zdERhdGEoZmx1ZW50RXZlbnQpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXZlbnQ/LlJlY29yZHMgJiYgZXZlbnQuUmVjb3Jkc1swXT8uZXZlbnRTb3VyY2UgPT09ICdhd3M6c3FzJykge1xuICAgIGNvbnNvbGUubG9nKCcqKiogU1FTICoqKicpO1xuICAgIGNvbnN0IGV2ZW50U3FzID0gZXZlbnQgYXMgU1FTRXZlbnQ7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXZlbnRTcXMuUmVjb3Jkcykge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uQXJuID0gcmVjb3JkLmV2ZW50U291cmNlQVJOO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlS2V5ID0gbWFwcGluZ1tzdWJzY3JpcHRpb25Bcm5dO1xuICAgICAgbGV0IGJvZHk6IHN0cmluZztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYm9keSA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGJvZHkgPSByZWNvcmQuYm9keTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU3FzU3B5RXZlbnQgPSB7XG4gICAgICAgIHNweUV2ZW50VHlwZTogJ1NxcycsXG4gICAgICAgIGJvZHksXG4gICAgICAgIG1lc3NhZ2VBdHRyaWJ1dGVzOiByZWNvcmQubWVzc2FnZUF0dHJpYnV0ZXMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmbHVlbnRFdmVudDogT21pdDxTcHlNZXNzYWdlLCAndGltZXN0YW1wJz4gPSB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNlcnZpY2VLZXksXG4gICAgICB9O1xuICAgICAgcG9zdERhdGFQcm9taXNlcy5wdXNoKHBvc3REYXRhKGZsdWVudEV2ZW50KSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV2ZW50Py5SZWNvcmRzICYmIGV2ZW50LlJlY29yZHNbMF0/LnMzKSB7XG4gICAgY29uc29sZS5sb2coJyoqKiBTMyAqKionKTtcbiAgICBjb25zdCBldmVudFMzID0gZXZlbnQgYXMgUzNFdmVudDtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudFMzLlJlY29yZHMpIHtcbiAgICAgIGNvbnN0IGJ1Y2tldEFybiA9IHJlY29yZC5zMy5idWNrZXQuYXJuO1xuXG4gICAgICBjb25zdCBkYXRhOiBTM1NweUV2ZW50ID0ge1xuICAgICAgICBzcHlFdmVudFR5cGU6ICdTMycsXG4gICAgICAgIGV2ZW50TmFtZTogcmVjb3JkLmV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnRUaW1lOiByZWNvcmQuZXZlbnRUaW1lLFxuICAgICAgICBidWNrZXQ6IHJlY29yZC5zMy5idWNrZXQubmFtZSxcbiAgICAgICAga2V5OiByZWNvcmQuczMub2JqZWN0LmtleSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZsdWVudEV2ZW50OiBPbWl0PFNweU1lc3NhZ2UsICd0aW1lc3RhbXAnPiA9IHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc2VydmljZUtleTogbWFwcGluZ1tidWNrZXRBcm5dLFxuICAgICAgfTtcbiAgICAgIHBvc3REYXRhUHJvbWlzZXMucHVzaChwb3N0RGF0YShmbHVlbnRFdmVudCkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChldmVudC5SZWNvcmRzICYmIGV2ZW50LlJlY29yZHNbMF0/LmR5bmFtb2RiKSB7XG4gICAgY29uc29sZS5sb2coJyoqKiBEWU5BTU9EQiAqKionKTtcbiAgICBjb25zdCBldmVudER5bmFtb0RCID0gZXZlbnQgYXMgRHluYW1vREJTdHJlYW1FdmVudDtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudER5bmFtb0RCLlJlY29yZHMpIHtcbiAgICAgIGxldCBhcm4gPSByZWNvcmQuZXZlbnRTb3VyY2VBUk4hO1xuICAgICAgYXJuID0gYXJuLnN1YnN0cmluZygwLCBhcm4uaW5kZXhPZignL3N0cmVhbS8nKSk7XG5cbiAgICAgIGNvbnN0IGRhdGE6IER5bmFtb0RCU3B5RXZlbnQgPSB7XG4gICAgICAgIHNweUV2ZW50VHlwZTogJ0R5bmFtb0RCJyxcbiAgICAgICAgZXZlbnROYW1lOiByZWNvcmQuZXZlbnROYW1lLFxuICAgICAgICBuZXdJbWFnZTogdW5tYXJzaGFsbChyZWNvcmQuZHluYW1vZGI/Lk5ld0ltYWdlIGFzIGFueSksXG4gICAgICAgIGtleXM6IHVubWFyc2hhbGwocmVjb3JkLmR5bmFtb2RiPy5LZXlzIGFzIGFueSksXG4gICAgICAgIG9sZEltYWdlOiByZWNvcmQuZHluYW1vZGI/Lk9sZEltYWdlXG4gICAgICAgICAgPyB1bm1hcnNoYWxsKHJlY29yZC5keW5hbW9kYj8uT2xkSW1hZ2UgYXMgYW55KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmx1ZW50RXZlbnQ6IE9taXQ8U3B5TWVzc2FnZSwgJ3RpbWVzdGFtcCc+ID0ge1xuICAgICAgICBkYXRhLFxuICAgICAgICBzZXJ2aWNlS2V5OiBtYXBwaW5nW2Fybl0sXG4gICAgICB9O1xuICAgICAgcG9zdERhdGFQcm9taXNlcy5wdXNoKHBvc3REYXRhKGZsdWVudEV2ZW50KSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgIGV2ZW50LmRldGFpbCAmJlxuICAgIGV2ZW50WydkZXRhaWwtdHlwZSddICYmXG4gICAgZXZlbnQudmVyc2lvbiAmJlxuICAgIGV2ZW50LnNvdXJjZVxuICApIHtcbiAgICBjb25zb2xlLmxvZygnKioqIEV2ZW50QnJpZGdlICoqKicpO1xuICAgIGNvbnN0IGV2ZW50RWIgPSBldmVudCBhcyBFdmVudEJyaWRnZUV2ZW50PGFueSwgYW55PjtcblxuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBtYXBwaW5nLmV2ZW50QnJpZGdlOyAvLyB0aGUgaXMgbmV3IGxhbWJkYSBmb3IgZWFjaCBzdWJzY3JpcHRpb25cblxuICAgIGNvbnN0IHNweUV2ZW50VHlwZSA9IGdldFNweUV2ZW50VHlwZShzZXJ2aWNlS2V5KSBhc1xuICAgICAgfCAnRXZlbnRCcmlkZ2UnXG4gICAgICB8ICdFdmVudEJyaWRnZVJ1bGUnO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50RWIuZGV0YWlsO1xuXG4gICAgY29uc3QgZGF0YTogRXZlbnRCcmlkZ2VTcHlFdmVudCB8IEV2ZW50QnJpZGdlUnVsZVNweUV2ZW50ID0ge1xuICAgICAgc3B5RXZlbnRUeXBlLFxuICAgICAgZGV0YWlsOiBtZXNzYWdlLFxuICAgICAgZGV0YWlsVHlwZTogZXZlbnRFYlsnZGV0YWlsLXR5cGUnXSxcbiAgICAgIHNvdXJjZTogZXZlbnRFYi5zb3VyY2UsXG4gICAgICB0aW1lOiBldmVudEViLnRpbWUsXG4gICAgICBhY2NvdW50OiBldmVudEViLmFjY291bnQsXG4gICAgfTtcblxuICAgIGNvbnN0IGZsdWVudEV2ZW50OiBPbWl0PFNweU1lc3NhZ2UsICd0aW1lc3RhbXAnPiA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBzZXJ2aWNlS2V5LFxuICAgIH07XG4gICAgcG9zdERhdGFQcm9taXNlcy5wdXNoKHBvc3REYXRhKGZsdWVudEV2ZW50KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJyoqKiBPVEhFUiAqKionKTtcbiAgICBjb25zdCBmbHVlbnRFdmVudDogT21pdDxTcHlNZXNzYWdlLCAndGltZXN0YW1wJz4gPSBldmVudDtcbiAgICBwb3N0RGF0YVByb21pc2VzLnB1c2gocG9zdERhdGEoZmx1ZW50RXZlbnQpKTtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKHBvc3REYXRhUHJvbWlzZXMpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9zdERhdGEoc3B5TWVzc2FnZTogT21pdDxTcHlNZXNzYWdlLCAndGltZXN0YW1wJz4pIHtcbiAgLy8gY29uc3QgcG9zdERhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmJvZHkhKS5kYXRhO1xuICBjb25zb2xlLmxvZygncG9zdERhdGEnLCBKU09OLnN0cmluZ2lmeShzcHlNZXNzYWdlKSk7XG5cbiAgaWYgKCFjb25uZWN0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvc3RDYWxscyA9IGNvbm5lY3Rpb25zLm1hcChhc3luYyAoeyBjb25uZWN0aW9uSWQgfSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBTZW5kaW5nIG1lc3NhZ2UgdG86ICR7Y29ubmVjdGlvbklkLlN9YCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcG9zdFRvQ29ubmVjdGlvbkNvbW1hbmQgPSBuZXcgUG9zdFRvQ29ubmVjdGlvbkNvbW1hbmQoe1xuICAgICAgICBDb25uZWN0aW9uSWQ6IGNvbm5lY3Rpb25JZC5TLFxuICAgICAgICBEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgc2VydmljZUtleTogc3B5TWVzc2FnZS5zZXJ2aWNlS2V5LFxuICAgICAgICAgIGRhdGE6IHNweU1lc3NhZ2UuZGF0YSxcbiAgICAgICAgfSkgYXMgYW55LFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGFwaWd3TWFuYWdlbWVudEFwaS5zZW5kKHBvc3RUb0Nvbm5lY3Rpb25Db21tYW5kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlscyBzZW5kaW5nIG1lc3NhZ2UgdG86ICR7Y29ubmVjdGlvbklkLlN9YCwgZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGBTdGF0dXMgY29kZTogJHsoZSBhcyBhbnkpLnN0YXR1c0NvZGV9YCk7XG4gICAgICBpZiAoKGUgYXMgYW55KS4kbWV0YWRhdGEuaHR0cFN0YXR1c0NvZGUgPT09IDQxMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgc3RhbGUgY29ubmVjdGlvbiwgZGVsZXRpbmcgJHtjb25uZWN0aW9uSWR9YCk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlUGFyYW1zID0gbmV3IERlbGV0ZUl0ZW1Db21tYW5kKHtcbiAgICAgICAgICBUYWJsZU5hbWU6IHByb2Nlc3MuZW52W2VudlZhcmlhYmxlTmFtZXMuU1NQWV9XU19UQUJMRV9OQU1FXSxcbiAgICAgICAgICBLZXk6IHsgY29ubmVjdGlvbklkIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGRkYi5zZW5kKGRlbGV0ZVBhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocG9zdENhbGxzKTtcbiAgY29uc29sZS5sb2coJ1NlbmQgbWVzc2FnZSBmaW5pc2gnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNweUV2ZW50VHlwZShzZXJ2aWNlS2V5OiBzdHJpbmcpIHtcbiAgaWYgKCFzZXJ2aWNlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNlcnZpY2VLZXknKTtcbiAgfVxuXG4gIHJldHVybiBzZXJ2aWNlS2V5LnN1YnN0cmluZygwLCBzZXJ2aWNlS2V5LmluZGV4T2YoJyMnKSk7XG59XG4iXX0=