serverless-spy 0.0.35 → 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 (116) hide show
  1. package/.jsii +236 -9
  2. package/API.md +161 -0
  3. package/cli/cli.ts +145 -75
  4. package/cli/icons/Arch_AWS-Lambda_16.svg +18 -0
  5. package/cli/icons/Arch_Amazon-DynamoDB_16.svg +18 -0
  6. package/cli/icons/Arch_Amazon-EventBridge_16.svg +18 -0
  7. package/cli/icons/Arch_Amazon-Simple-Notification-Service_16.svg +18 -0
  8. package/cli/icons/Arch_Amazon-Simple-Queue-Service_16.svg +18 -0
  9. package/cli/icons/Arch_Amazon-Simple-Storage-Service_16.svg +18 -0
  10. package/cli/index.html +84 -25
  11. package/cli/node_modules/commander/LICENSE +22 -0
  12. package/cli/node_modules/commander/Readme.md +1114 -0
  13. package/cli/node_modules/commander/esm.mjs +16 -0
  14. package/cli/node_modules/commander/index.js +27 -0
  15. package/cli/node_modules/commander/lib/argument.js +147 -0
  16. package/cli/node_modules/commander/lib/command.js +2161 -0
  17. package/cli/node_modules/commander/lib/error.js +45 -0
  18. package/cli/node_modules/commander/lib/help.js +406 -0
  19. package/cli/node_modules/commander/lib/option.js +324 -0
  20. package/cli/node_modules/commander/lib/suggestSimilar.js +100 -0
  21. package/cli/node_modules/commander/package-support.json +16 -0
  22. package/cli/node_modules/commander/package.json +80 -0
  23. package/cli/node_modules/commander/typings/index.d.ts +879 -0
  24. package/cli/package.json +23 -0
  25. package/cli/sampleData.ts +518 -0
  26. package/cli/style.css +66 -42
  27. package/cli/webServerlessSpy.ts +461 -0
  28. package/common/SpyEventSender.ts +291 -0
  29. package/common/getWebSocketUrl.ts +21 -4
  30. package/common/spyEvents/EventBridgeBaseSpyEvent.ts +13 -0
  31. package/common/spyEvents/EventBridgeRuleSpyEvent.ts +2 -7
  32. package/common/spyEvents/EventBridgeSpyEvent.ts +2 -7
  33. package/common/spyEvents/FunctionBaseSpyEvent.ts +7 -0
  34. package/common/spyEvents/FunctionConsole.ts +5 -0
  35. package/common/spyEvents/FunctionConsoleSpyEvent.ts +5 -8
  36. package/common/spyEvents/FunctionResponseSpyEvent.ts +2 -5
  37. package/common/spyEvents/SnsSpyEventBase.ts +11 -0
  38. package/common/spyEvents/SnsSubscriptionSpyEvent.ts +3 -9
  39. package/common/spyEvents/SnsTopicSpyEvent.ts +3 -9
  40. package/dist/releasetag.txt +1 -1
  41. package/extension/interceptor.ts +107 -27
  42. package/functions/sendMessage.ts +4 -2
  43. package/functions/sqsSubscriptionAndDropAllMessages.ts +3 -0
  44. package/lib/cli/cli.js +124 -65
  45. package/lib/cli/cli.mjs +125 -66
  46. package/lib/cli/sampleData.d.ts +892 -0
  47. package/lib/cli/sampleData.js +481 -0
  48. package/lib/cli/sampleData.mjs +478 -0
  49. package/lib/cli/webServerlessSpy.js +5516 -0
  50. package/lib/cli/webServerlessSpy.js.map +7 -0
  51. package/lib/common/SpyEventSender.d.ts +17 -0
  52. package/lib/common/SpyEventSender.js +227 -0
  53. package/lib/common/SpyEventSender.mjs +223 -0
  54. package/lib/common/getWebSocketUrl.d.ts +1 -1
  55. package/lib/common/getWebSocketUrl.js +19 -7
  56. package/lib/common/getWebSocketUrl.mjs +17 -5
  57. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.d.ts +9 -0
  58. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.js +3 -0
  59. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.mjs +2 -0
  60. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.ts +2 -7
  61. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.js +1 -1
  62. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +1 -1
  63. package/lib/common/spyEvents/EventBridgeSpyEvent.d.ts +2 -7
  64. package/lib/common/spyEvents/EventBridgeSpyEvent.js +1 -1
  65. package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +1 -1
  66. package/lib/common/spyEvents/FunctionBaseSpyEvent.d.ts +6 -0
  67. package/lib/common/spyEvents/FunctionBaseSpyEvent.js +3 -0
  68. package/lib/common/spyEvents/FunctionBaseSpyEvent.mjs +2 -0
  69. package/lib/common/spyEvents/FunctionConsole.d.ts +5 -0
  70. package/lib/common/spyEvents/FunctionConsole.js +3 -0
  71. package/lib/common/spyEvents/FunctionConsole.mjs +2 -0
  72. package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.ts +4 -8
  73. package/lib/common/spyEvents/FunctionConsoleSpyEvent.js +1 -1
  74. package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +1 -1
  75. package/lib/common/spyEvents/FunctionResponseSpyEvent.d.ts +2 -5
  76. package/lib/common/spyEvents/FunctionResponseSpyEvent.js +1 -1
  77. package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +1 -1
  78. package/lib/common/spyEvents/SnsSpyEventBase.d.ts +10 -0
  79. package/lib/common/spyEvents/SnsSpyEventBase.js +3 -0
  80. package/lib/common/spyEvents/SnsSpyEventBase.mjs +2 -0
  81. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.ts +2 -9
  82. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.js +1 -1
  83. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +1 -1
  84. package/lib/common/spyEvents/SnsTopicSpyEvent.d.ts +2 -9
  85. package/lib/common/spyEvents/SnsTopicSpyEvent.js +1 -1
  86. package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +1 -1
  87. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +10793 -23825
  88. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +4 -4
  89. package/lib/listener/ServerlessSpyListenerParams.d.ts +1 -0
  90. package/lib/listener/ServerlessSpyListenerParams.js +1 -1
  91. package/lib/listener/ServerlessSpyListenerParams.mjs +1 -1
  92. package/lib/listener/SpyHandlers.ts.d.ts +30 -2
  93. package/lib/listener/SpyHandlers.ts.js +1 -1
  94. package/lib/listener/SpyHandlers.ts.mjs +1 -1
  95. package/lib/listener/WsListener.d.ts +4 -21
  96. package/lib/listener/WsListener.js +21 -13
  97. package/lib/listener/WsListener.mjs +22 -14
  98. package/lib/src/ServerlessSpy.d.ts +44 -14
  99. package/lib/src/ServerlessSpy.js +228 -86
  100. package/lib/src/ServerlessSpy.mjs +227 -85
  101. package/lib/src/common/envVariableNames.d.ts +6 -2
  102. package/lib/src/common/envVariableNames.js +6 -2
  103. package/lib/src/common/envVariableNames.mjs +6 -2
  104. package/listener/ServerlessSpyListenerParams.ts +1 -0
  105. package/listener/SpyHandlers.ts.ts +70 -9
  106. package/listener/WsListener.ts +39 -24
  107. package/package.json +5 -3
  108. package/cli/serverlessSpy.js +0 -73
  109. package/cli/ws.ts +0 -79
  110. package/common/publishSpyEvent.ts +0 -269
  111. package/lib/cli/ws.d.ts +0 -1
  112. package/lib/cli/ws.js +0 -68
  113. package/lib/cli/ws.mjs +0 -66
  114. package/lib/common/publishSpyEvent.d.ts +0 -4
  115. package/lib/common/publishSpyEvent.js +0 -211
  116. package/lib/common/publishSpyEvent.mjs +0 -205
package/cli/cli.ts CHANGED
@@ -1,97 +1,167 @@
1
1
  import * as fs from 'fs';
2
2
  import * as http from 'http';
3
3
  import * as path from 'path';
4
- import { getWebSocketUrl } from '../common/getWebSocketUrl';
4
+ import { promisify } from 'util';
5
+ import { program } from 'commander';
6
+ import { getInstalledPath } from 'get-installed-path';
7
+ import open from 'open';
8
+ import { getSignedWebSocketUrl } from '../common/getWebSocketUrl';
9
+
10
+ const readFileAsync = promisify(fs.readFile);
5
11
 
6
12
  async function run() {
7
- const cdkExportFileName = '../.spy/cdkExports.json';
8
-
9
- let serverlessSpyWsUrl: string | undefined;
10
- if (fs.existsSync(cdkExportFileName)) {
11
- const rawdata = fs.readFileSync(cdkExportFileName);
12
- const config = JSON.parse(rawdata.toString());
13
-
14
- if (config && config[Object.keys(config)[0]]) {
15
- // get first ServerlessSpyWsUrl
16
- // {
17
- // "my-stack": {
18
- // "ServerlessSpyWsUrl": "xxx"
19
- // }
20
- // }
21
-
22
- serverlessSpyWsUrl = config[Object.keys(config)[0]].ServerlessSpyWsUrl;
23
- }
24
- }
13
+ let stackList: string[] | undefined;
14
+ let cdkOutput: Record<string, Record<string, string>>;
25
15
 
26
- serverlessSpyWsUrl =
27
- 'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
16
+ program
17
+ .option('--ws <ws>', 'Websocket link')
18
+ .option(
19
+ '--cdkoutput <cdkoutput>',
20
+ 'CDK output file that contains Websocket link in a property ServerlessSpyWsUrl'
21
+ )
22
+ .option(
23
+ '--cdkstack <cdkstack>',
24
+ 'CDK stack in cdk output file. If not specified the first one is picked.'
25
+ )
26
+ .option('--open', 'Open browser', true)
27
+ .option(
28
+ '--port <p>',
29
+ `CDK stack in cdk output file. If not specified the first one is picked.`,
30
+ '3456'
31
+ );
32
+ program.parse();
28
33
 
29
- if (!serverlessSpyWsUrl) {
30
- throw new Error('Missing WS url');
31
- }
34
+ const options = program.opts();
32
35
 
33
- console.log('serverlessSpyWsUrl', serverlessSpyWsUrl);
36
+ if (!options.ws && !options.cdkoutput) {
37
+ throw new Error('--ws or --cdkstack parameter not specified');
38
+ }
34
39
 
35
- const wsUrl = await getWebSocketUrl(serverlessSpyWsUrl);
40
+ if (options.cdkoutput) {
41
+ const rawdata = fs.readFileSync(path.join(__dirname, options.cdkoutput));
42
+ cdkOutput = JSON.parse(rawdata.toString());
43
+ stackList = Object.keys(cdkOutput);
44
+ }
36
45
 
37
- // source https://developer.mozilla.org/en-US/docs/Learn/Server-side/Node_server_without_framework
38
46
  http
39
47
  .createServer((request, response) => {
40
- console.log('request ', request.url);
41
-
42
- let filePath = `.${request.url}`;
43
- if (filePath === './') {
44
- filePath = './index.html';
45
- }
46
-
47
- const extname = String(path.extname(filePath)).toLowerCase();
48
- const mimeTypes: any = {
49
- '.html': 'text/html',
50
- '.js': 'text/javascript',
51
- '.css': 'text/css',
52
- '.json': 'application/json',
53
- '.png': 'image/png',
54
- '.jpg': 'image/jpg',
55
- '.gif': 'image/gif',
56
- '.svg': 'image/svg+xml',
57
- '.wav': 'audio/wav',
58
- '.mp4': 'video/mp4',
59
- '.woff': 'application/font-woff',
60
- '.ttf': 'application/font-ttf',
61
- '.eot': 'application/vnd.ms-fontobject',
62
- '.otf': 'application/font-otf',
63
- '.wasm': 'application/wasm',
64
- };
65
-
66
- const contentType = mimeTypes[extname] || 'application/octet-stream';
67
-
68
- fs.readFile(filePath, (error, content) => {
69
- if (error) {
70
- if (error.code === 'ENOENT') {
71
- fs.readFile('./404.html', (_err, cont) => {
72
- response.writeHead(404, { 'Content-Type': 'text/html' });
73
- response.end(cont, 'utf-8');
48
+ void (async () => {
49
+ try {
50
+ //console.log('request ', request.url);
51
+ let filePath: string = `.${request.url}`;
52
+ //remove query parameters
53
+ filePath = filePath.split('?')[0];
54
+ let rootFolder = __dirname;
55
+
56
+ if (request.url?.startsWith('/webServerlessSpy.js')) {
57
+ //get transpiled TS to JS files
58
+ rootFolder = path.join(__dirname, `../lib/cli`);
59
+ } else if (request.url?.startsWith('/bootstrap/')) {
60
+ filePath = filePath.substring('/bootstrap/'.length);
61
+ const bootstrapFolder = await getInstalledPath('bootstrap', {
62
+ local: true,
63
+ });
64
+
65
+ rootFolder = bootstrapFolder;
66
+ } else if (request.url?.startsWith('/bootstrap-icons/')) {
67
+ filePath = filePath.substring('/bootstrap-icons/'.length);
68
+ const bootstrapFolder = await getInstalledPath('bootstrap-icons', {
69
+ local: true,
74
70
  });
71
+
72
+ rootFolder = bootstrapFolder;
75
73
  } else {
76
- response.writeHead(500);
77
- response.end(
78
- `Sorry, check with the site admin for error: ${error.code} ..\n`
79
- );
74
+ if (filePath === './') {
75
+ filePath = './index.html';
76
+ }
80
77
  }
81
- } else {
82
- response.writeHead(200, { 'Content-Type': contentType });
83
- if (request.url === '/serverlessSpy.js') {
84
- const contentNew = content
85
- .toString()
86
- .replace('SERVERLESS_SPY_WS_URL', wsUrl);
87
- response.end(contentNew, 'utf-8');
78
+
79
+ filePath = path.join(rootFolder, filePath);
80
+ //console.log(`${request.url} --> ${filePath}`);
81
+
82
+ const extname = String(path.extname(filePath)).toLowerCase();
83
+ const mimeTypes: any = {
84
+ '.html': 'text/html',
85
+ '.js': 'text/javascript',
86
+ '.css': 'text/css',
87
+ '.json': 'application/json',
88
+ '.png': 'image/png',
89
+ '.jpg': 'image/jpg',
90
+ '.gif': 'image/gif',
91
+ '.svg': 'image/svg+xml',
92
+ '.wav': 'audio/wav',
93
+ '.mp4': 'video/mp4',
94
+ '.woff': 'application/font-woff',
95
+ '.ttf': 'application/font-ttf',
96
+ '.eot': 'application/vnd.ms-fontobject',
97
+ '.otf': 'application/font-otf',
98
+ '.wasm': 'application/wasm',
99
+ };
100
+
101
+ const contentType = mimeTypes[extname] || 'application/octet-stream';
102
+
103
+ if (request.url === '/stackList') {
104
+ response.writeHead(200, { 'Content-Type': 'application/json' });
105
+ response.end(JSON.stringify(stackList), 'utf-8');
106
+ } else if (request.url?.match('^/wsUrl')) {
107
+ let wsUrl: string | undefined;
108
+ if (options.ws) {
109
+ wsUrl = options.ws;
110
+ } else {
111
+ // options.cdkoutput
112
+ const urlPaths = request.url.split('/');
113
+ let stack = urlPaths[2];
114
+
115
+ if (!stack) {
116
+ stack = options.cdkstack;
117
+ }
118
+
119
+ if (stack) {
120
+ wsUrl = cdkOutput[stack].ServerlessSpyWsUrl;
121
+ } else {
122
+ if (cdkOutput && cdkOutput[Object.keys(cdkOutput)[0]]) {
123
+ wsUrl =
124
+ cdkOutput[Object.keys(cdkOutput)[0]].ServerlessSpyWsUrl;
125
+ }
126
+ }
127
+ }
128
+
129
+ if (!wsUrl) {
130
+ throw new Error('Missing websocket url');
131
+ }
132
+
133
+ //console.log(`WS URL: ${wsUrl}`);
134
+ const signedWSUrl = await getSignedWebSocketUrl(wsUrl);
135
+ response.writeHead(200, { 'Content-Type': 'text/html' });
136
+ response.end(signedWSUrl, 'utf-8');
88
137
  } else {
89
- response.end(content, 'utf-8');
138
+ try {
139
+ const content = await readFileAsync(filePath);
140
+
141
+ response.writeHead(200, { 'Content-Type': contentType });
142
+ response.end(content, 'utf-8');
143
+ } catch (error: any) {
144
+ if (error.code === 'ENOENT') {
145
+ response.writeHead(404, { 'Content-Type': 'text/html' });
146
+ response.end(
147
+ `No such file or directory ${request.url}`,
148
+ 'utf-8'
149
+ );
150
+ } else {
151
+ response.writeHead(500);
152
+ response.end(`Error: ${error.code} ..\n`);
153
+ }
154
+ }
90
155
  }
156
+ } catch (err: any) {
157
+ response.writeHead(500, { 'Content-Type': 'text/html' });
158
+ response.end(err.message, 'utf-8');
91
159
  }
92
- });
160
+ })();
93
161
  })
94
- .listen(8125);
162
+ .listen(options.port);
163
+
164
+ await open(`http://localhost:${options.port}`);
95
165
  }
96
166
 
97
167
  run().catch(console.error);
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 64 (93537) - https://sketch.com -->
4
+ <title>Icon-Architecture/16/Arch_AWS-Lambda_16</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs>
7
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="linearGradient-1">
8
+ <stop stop-color="#C8511B" offset="0%"></stop>
9
+ <stop stop-color="#FF9900" offset="100%"></stop>
10
+ </linearGradient>
11
+ </defs>
12
+ <g id="Icon-Architecture/16/Arch_AWS-Lambda_16" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13
+ <g id="Icon-Architecture-BG/16/Compute" fill="url(#linearGradient-1)">
14
+ <rect id="Rectangle" x="0" y="0" width="24" height="24"></rect>
15
+ </g>
16
+ <path d="M8.35471698,19 L5.33377354,19 L8.87677893,11.806 L10.3893141,14.832 L8.35471698,19 Z M9.3369363,10.435 C9.25026989,10.262 9.06971487,10.153 8.87265196,10.153 L8.87058847,10.153 C8.67352556,10.153 8.49297054,10.264 8.40733588,10.437 L4.05028527,19.285 C3.97393629,19.439 3.98528546,19.622 4.07917407,19.767 C4.17409443,19.912 4.33814156,20 4.51560135,20 L8.68074777,20 C8.8809059,20 9.06249267,19.889 9.14812734,19.714 L11.4282793,15.043 C11.4943109,14.907 11.4932791,14.748 11.4262158,14.611 L9.3369363,10.435 Z M18.968257,19 L15.7987426,19 L10.1747116,7.289 C10.0901087,7.113 9.90749017,7 9.70733203,7 L7.61598901,7 L7.6180525,5 L11.7883576,5 L17.386595,16.71 C17.471198,16.887 17.6548482,17 17.8550063,17 L18.968257,17 L18.968257,19 Z M19.4841285,16 L18.1841324,16 L12.5869267,4.29 C12.5023238,4.113 12.3186735,4 12.1174836,4 L7.10321275,4 C6.81845169,4 6.58734126,4.224 6.58734126,4.5 L6.58424603,7.5 C6.58424603,7.632 6.63892841,7.759 6.73591225,7.854 C6.83186434,7.947 6.9628957,8 7.10011752,8 L9.37820602,8 L15.002237,19.711 C15.0868399,19.887 15.2694584,20 15.4696166,20 L19.4841285,20 C19.7688896,20 20,19.776 20,19.5 L20,16.5 C20,16.224 19.7688896,16 19.4841285,16 L19.4841285,16 Z" id="AWS-Lambda_Icon_16_Squid" fill="#FFFFFF"></path>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 64 (93537) - https://sketch.com -->
4
+ <title>Icon-Architecture/16/Arch_Amazon-DynamoDB_16</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs>
7
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="linearGradient-1">
8
+ <stop stop-color="#2E27AD" offset="0%"></stop>
9
+ <stop stop-color="#527FFF" offset="100%"></stop>
10
+ </linearGradient>
11
+ </defs>
12
+ <g id="Icon-Architecture/16/Arch_Amazon-DynamoDB_16" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13
+ <g id="Icon-Architecture-BG/16/Database" fill="url(#linearGradient-1)">
14
+ <rect id="Rectangle" x="0" y="0" width="24" height="24"></rect>
15
+ </g>
16
+ <path d="M14.3871979,13.0634319 L15.4218955,9.61738691 C15.468467,9.46474602 15.4391067,9.29896386 15.3439388,9.17058378 C15.2487709,9.04220369 15.0979197,8.96739955 14.9379567,8.96739955 L14.2383715,8.96739955 L15.2507958,6.94566591 L17.7798316,6.94566591 L16.9881159,9.313116 C16.9374946,9.46676775 16.9628052,9.63659338 17.0589856,9.76800607 C17.153141,9.90042962 17.3060171,9.97826636 17.4690174,9.97826636 L18.095708,9.97826636 L14.3871979,13.0634319 Z M19.9697053,9.29997473 C19.8968108,9.10083397 19.7074875,8.96739955 19.4938659,8.96739955 L18.1706274,8.96739955 L18.9623432,6.59994946 C19.0129644,6.4462977 18.9876538,6.27647207 18.8914735,6.14404852 C18.7963056,6.01263584 18.644442,5.93479909 18.4814417,5.93479909 L14.9379567,5.93479909 C14.7455961,5.93479909 14.5714591,6.04296184 14.485403,6.21379833 L12.9667666,9.24639879 C12.88881,9.40308314 12.8958969,9.58908264 12.9880275,9.73768006 C13.0811706,9.88728835 13.2441709,9.97826636 13.4193203,9.97826636 L14.2576076,9.97826636 L12.9343691,14.3816022 C12.8705863,14.595906 12.9536051,14.8253728 13.1409036,14.9486985 C13.2259472,15.0042962 13.3221275,15.0326005 13.4193203,15.0326005 C13.5347366,15.0326005 13.6491406,14.9931766 13.743296,14.9153399 L19.8178417,9.86100581 C19.980842,9.72453879 20.0425999,9.50113723 19.9697053,9.29997473 L19.9697053,9.29997473 Z M14.8346894,17.6285064 C14.8346894,18.0904726 13.2775809,18.9891332 10.4235568,18.9891332 C7.56953281,18.9891332 6.01242428,18.0904726 6.01242428,17.6285064 L6.01242428,16.562042 C7.04914673,17.1786707 8.74293255,17.495072 10.4235568,17.495072 C12.1041811,17.495072 13.797967,17.1786707 14.8346894,16.562042 L14.8346894,17.6285064 Z M14.8346894,15.1235785 C14.8346894,15.5855446 13.2775809,16.4842052 10.4235568,16.4842052 C7.56953281,16.4842052 6.01242428,15.5855446 6.01242428,15.1235785 C6.01242428,15.0275461 6.08633125,14.9133182 6.21187186,14.7950468 C7.21214704,15.316654 8.74698225,15.6239575 10.4235568,15.6239575 C10.4438053,15.6239575 11.9948393,15.5916098 11.9948393,15.5916098 L11.9948393,14.580743 C11.9745908,14.580743 10.4235568,14.6130907 10.4235568,14.6130907 C8.77128043,14.6130907 7.24656947,14.2886025 6.44574187,13.7680061 C6.17542458,13.5900935 6.0134367,13.3980288 6.01242428,13.252464 L6.01242428,12.1859995 C7.04914673,12.8026283 8.74293255,13.1200404 10.4235568,13.1200404 C10.6898244,13.1200404 11.8348763,13.0391711 12.1922621,13.0138994 L12.213523,12.5054334 L12.1203799,12.0050543 C11.7761557,12.0293151 10.6786878,12.1091736 10.4235568,12.1091736 C7.56953281,12.1091736 6.01242428,11.2095021 6.01242428,10.747536 C6.01242428,10.6474602 6.09139337,10.5281779 6.22503337,10.405863 C7.01877401,10.7566338 8.57183285,11.1508719 12.3178027,11.1963609 L12.3299518,10.1854941 C9.27951741,10.1491029 7.3437622,9.88223402 6.44574187,9.39095274 C6.17542458,9.21304018 6.0134367,9.02097549 6.01242428,8.87541066 L6.01242428,7.80995704 C7.04914673,8.4265858 8.74293255,8.74298711 10.4235568,8.74298711 C10.5015135,8.74298711 12.480803,8.70659591 12.5587596,8.70356331 L12.5152254,7.69370735 C12.4079084,7.69775082 10.5187247,7.73212029 10.4235568,7.73212029 C7.56953281,7.73212029 6.01242428,6.83345969 6.01242428,6.37149356 C6.01242428,5.90952742 7.56953281,5.01086682 10.4235568,5.01086682 C11.7447705,5.01086682 13.0001766,5.21809452 13.8668118,5.5809957 L14.25862,4.64796563 C13.2573324,4.23047763 11.8956217,4 10.4235568,4 C7.72949585,4 5.00101242,4.81374779 5,6.36947182 L5,8.88147587 C5,8.88147587 5.09213061,9.46070255 5.40092001,9.80742987 C5.08808091,10.1551681 5,10.4938084 5,10.7465251 L5,13.2625727 C5.00101242,13.510235 5.09213061,13.8438211 5.39788274,14.1875158 C5.08808091,14.5342431 5,14.8718726 5,15.1235785 L5,17.6335608 C5.00506212,19.1872631 7.7315207,20 10.4235568,20 C13.1186303,20 15.8471137,19.1862522 15.8471137,17.6305282 L15.8471137,15.1235785 L14.8346894,15.1235785 Z" id="Amazon-DynamoDB_Icon_16_Squid" fill="#FFFFFF"></path>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 64 (93537) - https://sketch.com -->
4
+ <title>Icon-Architecture/16/Arch_Amazon-EventBridge_16</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs>
7
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="linearGradient-1">
8
+ <stop stop-color="#B0084D" offset="0%"></stop>
9
+ <stop stop-color="#FF4F8B" offset="100%"></stop>
10
+ </linearGradient>
11
+ </defs>
12
+ <g id="Icon-Architecture/16/Arch_Amazon-EventBridge_16" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13
+ <g id="Icon-Architecture-BG/16/Application-Integration" fill="url(#linearGradient-1)">
14
+ <rect id="Rectangle" x="0" y="0" width="24" height="24"></rect>
15
+ </g>
16
+ <path d="M6.5485452,16.461 C6.00062039,16.461 5.55592779,16.012 5.55592779,15.461 C5.55592779,14.91 6.00062039,14.461 6.5485452,14.461 C7.09647,14.461 7.5411626,14.91 7.5411626,15.461 C7.5411626,16.012 7.09647,16.461 6.5485452,16.461 L6.5485452,16.461 Z M7.89254917,16.924 C8.28463304,16.558 8.53378001,16.041 8.53378001,15.461 C8.53378001,14.358 7.6434022,13.461 6.5485452,13.461 C6.34406601,13.461 6.15050561,13.502 5.96389354,13.56 L5.06954526,11.998 L6.3718593,9.723 L5.51324524,9.223 L4.06700168,11.748 C3.97766611,11.902 3.97766611,12.093 4.06700168,12.248 L5.11818351,14.081 C4.77672312,14.44 4.56331038,14.925 4.56331038,15.461 C4.56331038,16.564 5.45368819,17.461 6.5485452,17.461 C6.71133445,17.461 6.86717538,17.436 7.01904585,17.398 L7.79527266,18.753 C7.88361561,18.908 8.04739748,19.003 8.22408338,19.003 L10.998449,19.003 L10.998449,18.003 L8.51194243,18.003 L7.89254917,16.924 Z M17.4504622,9.517 C16.90353,9.517 16.4578448,9.068 16.4578448,8.517 C16.4578448,7.965 16.90353,7.517 17.4504622,7.517 C17.998387,7.517 18.4430796,7.965 18.4430796,8.517 C18.4430796,9.068 17.998387,9.517 17.4504622,9.517 L17.4504622,9.517 Z M18.8818165,9.896 C19.2232769,9.537 19.435697,9.052 19.435697,8.517 C19.435697,7.414 18.5453192,6.517 17.4504622,6.517 C17.2876729,6.517 17.1328246,6.542 16.9809542,6.58 L16.20572,5.225 C16.117377,5.07 15.9535951,4.975 15.7759166,4.975 L13.001551,4.975 L13.001551,5.975 L15.4890502,5.975 L16.1074508,7.054 C15.715367,7.419 15.4652274,7.937 15.4652274,8.517 C15.4652274,9.62 16.3565978,10.517 17.4504622,10.517 C17.6549414,10.517 17.8494944,10.476 18.0351138,10.418 L18.9314474,11.981 L17.6271481,14.254 L18.4857621,14.754 L19.9329983,12.231 C20.0223339,12.076 20.0223339,11.885 19.9329983,11.731 L18.8818165,9.896 Z M15.9794032,19 C15.4314784,19 14.9867858,18.551 14.9867858,18 C14.9867858,17.448 15.4314784,17 15.9794032,17 C16.527328,17 16.9720206,17.448 16.9720206,18 C16.9720206,18.551 16.527328,19 15.9794032,19 L15.9794032,19 Z M12.9836839,14.1 L10.7949625,14.1 L9.59091755,12 L10.7066195,10.053 L10.9607296,9.899 L13.2010671,9.899 L14.405112,12 L13.3162107,13.898 L12.9836839,14.1 Z M8.03846392,7 C7.49053912,7 7.04584652,6.551 7.04584652,6 C7.04584652,5.448 7.49053912,5 8.03846392,5 C8.58638873,5 9.03108133,5.448 9.03108133,6 C9.03108133,6.551 8.58638873,7 8.03846392,7 L8.03846392,7 Z M15.9794032,16 C15.6577951,16 15.3570321,16.085 15.0880328,16.222 L14.0914449,14.547 L15.4076556,12.25 C15.4969911,12.095 15.4969911,11.904 15.4076556,11.75 L13.9177368,9.149 C13.8293939,8.995 13.665612,8.899 13.4879335,8.899 L10.7264719,8.899 L9.67231218,7.13 C9.89366586,6.808 10.0236987,6.419 10.0236987,6 C10.0236987,4.897 9.13332093,4 8.03846392,4 C6.94360692,4 6.05322911,4.897 6.05322911,6 C6.05322911,7.103 6.94360692,8 8.03846392,8 C8.35113841,8 8.64396054,7.919 8.90799677,7.789 L9.9016068,9.459 L8.58936659,11.75 C8.50003102,11.904 8.50003102,12.095 8.58936659,12.25 L10.0792853,14.85 C10.1676283,15.004 10.3314101,15.1 10.508096,15.1 L13.2626093,15.1 L14.3286804,16.891 C14.1182455,17.209 13.9941684,17.589 13.9941684,18 C13.9941684,19.103 14.8845462,20 15.9794032,20 C17.0742602,20 17.964638,19.103 17.964638,18 C17.964638,16.897 17.0742602,16 15.9794032,16 L15.9794032,16 Z" id="Amazon-EventBridge_Icon_16_Squid" fill="#FFFFFF"></path>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 64 (93537) - https://sketch.com -->
4
+ <title>Icon-Architecture/16/Arch_AWS-Simple-Notification-Service_16</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs>
7
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="linearGradient-1">
8
+ <stop stop-color="#B0084D" offset="0%"></stop>
9
+ <stop stop-color="#FF4F8B" offset="100%"></stop>
10
+ </linearGradient>
11
+ </defs>
12
+ <g id="Icon-Architecture/16/Arch_AWS-Simple-Notification-Service_16" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13
+ <g id="Icon-Architecture-BG/16/Application-Integration" fill="url(#linearGradient-1)">
14
+ <rect id="Rectangle" x="0" y="0" width="24" height="24"></rect>
15
+ </g>
16
+ <path d="M6.4951189,11.5607705 C6.4951189,11.9743992 6.15969962,12.3097195 5.74818523,12.3097195 C5.33667084,12.3097195 5.00125156,11.9743992 5.00125156,11.5607705 C5.00125156,11.1471419 5.33667084,10.8118215 5.74818523,10.8118215 C6.15969962,10.8118215 6.4951189,11.1471419 6.4951189,11.5607705 L6.4951189,11.5607705 Z M12.4395494,18.9960469 C9.28861076,18.9960469 6.52015019,16.6006149 5.7261577,13.3116647 C5.73316646,13.3116647 5.74017522,13.3136726 5.74818523,13.3136726 C6.71239049,13.3136726 7.49637046,12.5275773 7.49637046,11.5607705 C7.49637046,10.6441614 6.78948686,9.89822426 5.89436796,9.82292778 C6.84155194,6.99579595 9.47083855,5.00395307 12.4395494,5.00395307 C13.7481852,5.00395307 14.8715895,5.23486227 15.7787234,5.68965301 L16.2272841,4.79111502 C15.1789737,4.26604756 13.9043805,4 12.4395494,4 C8.82202753,4 5.62302879,6.56610403 4.74593242,10.1291335 C4.29637046,10.4463826 4,10.9684382 4,11.5607705 C4,12.0958775 4.24530663,12.5697434 4.62377972,12.8910083 C5.29461827,16.9570183 8.61677096,20 12.4395494,20 C13.58398,20 14.9296621,19.6395808 16.2282854,18.9850035 L15.7777222,18.0874694 C14.6162703,18.673778 13.4307885,18.9960469 12.4395494,18.9960469 L12.4395494,18.9960469 Z M8.75994994,9.96046935 L12.2392991,9.96046935 L11.0217772,12.8056723 C10.9947434,12.8689214 10.9807259,12.9361862 10.9807259,13.0034511 L10.9807259,14.7061555 L10.0455569,15.1910648 L10.0455569,13.0034511 C10.0455569,12.9341783 10.0305382,12.8659095 10.0035044,12.8016565 L8.75994994,9.96046935 Z M9.28460576,16.4450022 C9.36370463,16.4931919 9.45481852,16.5172868 9.54493116,16.5172868 C9.62403004,16.5172868 9.70212766,16.4992157 9.77421777,16.4620694 L11.7116395,15.4581163 C11.8778473,15.3717764 11.9819775,15.2001004 11.9819775,15.0123612 L11.9819775,13.1068583 L13.4588235,9.65727552 C13.5249061,9.5016628 13.5098874,9.32295915 13.4177722,9.18240572 C13.3246558,9.04185229 13.1674593,8.95651628 12.9992491,8.95651628 L7.99299124,8.95651628 C7.82377972,8.95651628 7.66658323,9.04285625 7.57346683,9.18441363 C7.48135169,9.32597101 7.46733417,9.50567861 7.53441802,9.66028738 L9.04430538,13.1088662 L9.04430538,16.0153103 C9.04430538,16.1910021 9.13541927,16.3536425 9.28460576,16.4450022 L9.28460576,16.4450022 Z M18.2518148,14.823618 C18.6633292,14.823618 18.9987484,15.1589383 18.9987484,15.572567 C18.9987484,15.9861956 18.6633292,16.3225199 18.2518148,16.3225199 C17.8403004,16.3225199 17.5048811,15.9861956 17.5048811,15.572567 C17.5048811,15.1589383 17.8403004,14.823618 18.2518148,14.823618 L18.2518148,14.823618 Z M18.2518148,6.75384326 C18.6633292,6.75384326 18.9987484,7.09016753 18.9987484,7.50279224 C18.9987484,7.91642091 18.6633292,8.25274518 18.2518148,8.25274518 C17.8403004,8.25274518 17.5048811,7.91642091 17.5048811,7.50279224 C17.5048811,7.09016753 17.8403004,6.75384326 18.2518148,6.75384326 L18.2518148,6.75384326 Z M18.2518148,10.8118215 C18.6633292,10.8118215 18.9987484,11.1471419 18.9987484,11.5607705 C18.9987484,11.9743992 18.6633292,12.3097195 18.2518148,12.3097195 C17.8403004,12.3097195 17.5048811,11.9743992 17.5048811,11.5607705 C17.5048811,11.1471419 17.8403004,10.8118215 18.2518148,10.8118215 L18.2518148,10.8118215 Z M16.0030038,12.0627471 L16.5857322,12.0627471 C16.8030038,12.7835854 17.4628285,13.3136726 18.2518148,13.3136726 C19.21602,13.3136726 20,12.5275773 20,11.5607705 C20,10.5939637 19.21602,9.80786848 18.2518148,9.80786848 C17.4628285,9.80786848 16.8030038,10.3379557 16.5857322,11.058794 L16.0030038,11.058794 L16.0030038,8.00476878 L16.5857322,8.00476878 C16.8030038,8.72661103 17.4628285,9.25669825 18.2518148,9.25669825 C19.21602,9.25669825 20,8.46959905 20,7.50279224 C20,6.5369894 19.21602,5.74989019 18.2518148,5.74989019 C17.4628285,5.74989019 16.8030038,6.27997741 16.5857322,7.00081571 L15.502378,7.00081571 C15.2260325,7.00081571 15.0017522,7.2257012 15.0017522,7.50279224 L15.0017522,11.058794 L14.0005006,11.058794 L14.0005006,12.0627471 L15.0017522,12.0627471 L15.0017522,15.572567 C15.0017522,15.849658 15.2260325,16.0745435 15.502378,16.0745435 L16.5857322,16.0745435 C16.8030038,16.7953818 17.4628285,17.326473 18.2518148,17.326473 C19.21602,17.326473 20,16.5393738 20,15.572567 C20,14.6057602 19.21602,13.8196649 18.2518148,13.8196649 C17.4628285,13.8196649 16.8030038,14.3497521 16.5857322,15.0705904 L16.0030038,15.0705904 L16.0030038,12.0627471 Z" id="AWS-Simple-Notification-Service_Icon_16_Squid" fill="#FFFFFF"></path>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 64 (93537) - https://sketch.com -->
4
+ <title>Icon-Architecture/16/Arch_AWS-Simple-Queue-Service_16</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs>
7
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="linearGradient-1">
8
+ <stop stop-color="#B0084D" offset="0%"></stop>
9
+ <stop stop-color="#FF4F8B" offset="100%"></stop>
10
+ </linearGradient>
11
+ </defs>
12
+ <g id="Icon-Architecture/16/Arch_AWS-Simple-Queue-Service_16" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13
+ <g id="Icon-Architecture-BG/16/Application-Integration" fill="url(#linearGradient-1)">
14
+ <rect id="Rectangle" x="0" y="0" width="24" height="24"></rect>
15
+ </g>
16
+ <path d="M8.00538392,12.9850432 L9.00704291,12.9850432 L9.00704291,11.9942745 L8.00538392,11.9942745 L8.00538392,12.9850432 Z M15.0169969,12.986034 L16.0186559,12.986034 L16.0186559,11.9952653 L15.0169969,11.9952653 L15.0169969,12.986034 Z M12.7903089,11.2234565 C12.2824678,11.3522564 11.741572,11.3522564 11.2337309,11.2234565 C11.4350643,12.005173 11.4350643,12.8780402 11.2337309,13.6597567 C11.4881523,13.5953567 11.7485836,13.5626614 12.0120199,13.5626614 C12.2754562,13.5626614 12.5358876,13.5953567 12.7903089,13.6597567 C12.5889755,12.8780402 12.5889755,12.005173 12.7903089,11.2234565 L12.7903089,11.2234565 Z M14.3699252,10.3149216 C13.4053276,11.2690318 13.4053276,13.6141813 14.3699252,14.5682916 C14.4670861,14.6653869 14.5161674,14.7922053 14.5161674,14.9190237 C14.5161674,15.0458421 14.4670861,15.1726605 14.3699252,15.2687651 C14.2717626,15.3658604 14.1435503,15.4144081 14.0153379,15.4144081 C13.8871256,15.4144081 13.7589132,15.3658604 13.6617523,15.2687651 C12.7282061,14.3463594 11.2958337,14.3463594 10.3632892,15.2687651 C10.166964,15.4629557 9.85043979,15.4629557 9.65511629,15.2687651 C9.5569537,15.1726605 9.50787241,15.0458421 9.50787241,14.9190237 C9.50787241,14.7922053 9.5569537,14.6653869 9.65511629,14.5682916 C10.6187122,13.6141813 10.6187122,11.2690318 9.65511629,10.3149216 C9.5569537,10.218817 9.50787241,10.0919986 9.50787241,9.96518021 C9.50787241,9.83836181 9.5569537,9.71154342 9.65511629,9.61444809 C9.85043979,9.42124819 10.166964,9.42124819 10.3632892,9.61444809 C11.2958337,10.5378445 12.7282061,10.5378445 13.6617523,9.61444809 C13.8570758,9.42124819 14.1736,9.42124819 14.3699252,9.61444809 C14.4670861,9.71154342 14.5161674,9.83836181 14.5161674,9.96518021 C14.5161674,10.0919986 14.4670861,10.218817 14.3699252,10.3149216 L14.3699252,10.3149216 Z M18.8162895,12.0794806 C18.6980937,11.9635607 18.5418349,11.8991607 18.3755595,11.8991607 C18.2082825,11.8991607 18.051022,11.9635607 17.9328262,12.0794806 C17.6894231,12.3212282 17.6894231,12.7125818 17.9328262,12.9533386 C18.1692178,13.1851785 18.5788963,13.18716 18.8162895,12.9533386 C19.0596926,12.7125818 19.0596926,12.3212282 18.8162895,12.0794806 L18.8162895,12.0794806 Z M19.5244624,13.6538121 C19.2169531,13.9569873 18.8092779,14.1244272 18.3755595,14.1244272 C17.9398379,14.1244272 17.5321626,13.9569873 17.2246533,13.6538121 C16.5906032,13.0266555 16.5906032,12.0061637 17.2246533,11.3790071 C17.8376686,10.7726567 18.9094438,10.7716659 19.5244624,11.3790071 C20.1585125,12.0061637 20.1585125,13.0266555 19.5244624,13.6538121 L19.5244624,13.6538121 Z M6.0661721,12.0854252 C5.94797634,11.9695053 5.79171753,11.9051053 5.62544214,11.9051053 C5.45816509,11.9051053 5.30190628,11.9695053 5.18371052,12.0854252 C4.93930573,12.326182 4.93930573,12.7185264 5.18371052,12.9592832 C5.42010204,13.1911231 5.82978057,13.1931046 6.0661721,12.9592832 C6.31057689,12.7185264 6.31057689,12.326182 6.0661721,12.0854252 L6.0661721,12.0854252 Z M6.77534667,13.6597567 C6.46783736,13.9629319 6.06016214,14.1303718 5.62544214,14.1303718 C5.18972047,14.1303718 4.78204526,13.9629319 4.47553761,13.6597567 C3.84148746,13.0326001 3.84148746,12.0121083 4.47553761,11.3849518 C5.08955457,10.7776105 6.15932638,10.7776105 6.77534667,11.3849518 C7.40839515,12.0121083 7.40839515,13.0326001 6.77534667,13.6597567 L6.77534667,13.6597567 Z M15.8844336,16.4081491 C13.7248568,18.5432556 10.2130403,18.5422649 8.05546687,16.4081491 C7.47650797,15.8354848 7.10889911,15.3371281 6.86148934,14.7922053 L5.94797634,15.196439 C6.24647072,15.8562909 6.67818575,16.4467891 7.34729396,17.1086225 C8.6214042,18.3698711 10.2951764,19 11.9699502,19 C13.6437224,19 15.3184963,18.3698711 16.5926065,17.1086225 C17.1044543,16.6033305 17.6753999,15.9821185 18.0400038,15.2013928 L17.1294957,14.7862607 C16.8330047,15.423325 16.356215,15.9424878 15.8844336,16.4081491 L15.8844336,16.4081491 Z M6.8795192,10.1722509 L5.97001283,9.75711878 C6.26750556,9.12104527 6.70523054,8.52856559 7.34929727,7.89051055 C9.8965161,5.36999497 14.0433844,5.36999497 16.5906032,7.88951978 C17.0563746,8.35121799 17.6393402,8.97936535 18.0139606,9.7501834 L17.1124675,10.1791862 C16.8670611,9.67587575 16.4994522,9.20129754 15.8824303,8.58999325 C13.7238551,6.45686824 10.214042,6.45884977 8.05747018,8.58999325 C7.49153285,9.15076834 7.12893229,9.63822654 6.8795192,10.1722509 L6.8795192,10.1722509 Z" id="AWS-Simple-Queue-Service_Icon_16_Squid" fill="#FFFFFF"></path>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>Icon-Architecture/16/Arch_Amazon-Simple-Storage-Service_16</title>
4
+ <defs>
5
+ <linearGradient x1="0%" y1="100%" x2="100%" y2="0%" id="linearGradient-1">
6
+ <stop stop-color="#1B660F" offset="0%"></stop>
7
+ <stop stop-color="#6CAE3E" offset="100%"></stop>
8
+ </linearGradient>
9
+ </defs>
10
+ <g id="Icon-Architecture/16/Arch_Amazon-Simple-Storage-Service_16" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
11
+ <g id="Rectangle" fill="url(#linearGradient-1)">
12
+ <rect x="0" y="0" width="24" height="24"></rect>
13
+ </g>
14
+ <g id="Icon-Service/16/Amazon-Simple-Storage-Service_16" transform="translate(4.000000, 4.000000)" fill="#FFFFFF">
15
+ <path d="M13.9082,9.0508 L13.9492,8.8068 C14.2152,8.9598 14.4192,9.0888 14.5642,9.1918 C14.3942,9.1638 14.1662,9.1138 13.9082,9.0508 L13.9082,9.0508 Z M12.0492,14.0928 C11.9992,14.3958 10.9792,14.9998 7.4782,14.9998 C4.0442,14.9998 3.0432,14.3968 2.9932,14.0898 L1.2592,3.9648 C2.6962,4.6678 5.1522,4.9998 7.5002,4.9998 C9.8502,4.9998 12.3112,4.6658 13.7482,3.9618 L12.9402,8.7748 C11.3852,8.2668 9.5682,7.3978 8.6442,6.9548 L8.4742,6.8728 C8.4092,6.3838 8.0072,5.9998 7.5002,5.9998 C6.9482,5.9998 6.5002,6.4488 6.5002,6.9998 C6.5002,7.5508 6.9482,7.9998 7.5002,7.9998 C7.7212,7.9998 7.9142,7.9138 8.0792,7.7928 L8.2132,7.8568 C9.1842,8.3228 11.1192,9.2468 12.7732,9.7698 L12.0492,14.0928 Z M7.5002,0.9998 C11.7612,0.9998 13.9712,2.0368 14.0002,2.4898 L14.0002,2.5188 C13.9462,2.9768 11.7352,3.9998 7.5002,3.9998 C3.2702,3.9998 1.0592,2.9798 1.0002,2.5208 L1.0002,2.4888 C1.0302,2.0348 3.2422,0.9998 7.5002,0.9998 L7.5002,0.9998 Z M15.0002,2.4998 C15.0002,0.7818 11.1122,-0.0002 7.5002,-0.0002 C3.8872,-0.0002 0.0002,0.7818 0.0002,2.4998 L0.0472,2.8158 L2.0072,14.2548 C2.1972,15.4248 3.9362,15.9998 7.4782,15.9998 C12.2072,15.9998 12.9142,14.9908 13.0352,14.2568 L13.7422,10.0428 C14.3202,10.1828 14.7312,10.2388 15.0232,10.2388 C15.4852,10.2388 15.6612,10.1038 15.7832,9.9598 C15.9292,9.7858 15.9852,9.5668 15.9422,9.3428 C15.8492,8.8678 15.3302,8.4158 14.1252,7.7598 L14.9542,2.8138 L15.0002,2.4998 Z" id="Amazon-Simple-Storage-Service-Icon_16_Squid"></path>
16
+ </g>
17
+ </g>
18
+ </svg>
package/cli/index.html CHANGED
@@ -2,39 +2,98 @@
2
2
  <html>
3
3
 
4
4
  <head>
5
- <title>Our Funky HTML Page</title>
6
- <meta name="description" content="Our first page">
7
- <meta name="keywords" content="html tutorial template">
5
+ <title>ServerlessSpy</title>
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <link href="bootstrap/dist/css/bootstrap.css" rel="stylesheet">
9
+ <link rel="stylesheet" href="bootstrap-icons/font/bootstrap-icons.css">
10
+ <script src="bootstrap/dist/js/bootstrap.bundle.js"></script>
8
11
  <link rel="stylesheet" href="style.css">
9
12
  </link>
10
- <script src="serverlessSpy.js"></script>
13
+ <script src="webServerlessSpy.js"></script>
11
14
  </head>
12
15
 
13
16
 
14
17
  <body>
15
- <table>
16
- <thead>
17
- <tr>
18
- <th>Time</th>
19
- <th>Service key</th>
20
- <th>Data</th>
21
- </tr>
22
- </thead>
23
- <tbody id="tableBody" class="log">
24
-
25
- </tbody>
26
- </table>
27
-
28
- <div id="myModal" class="modal">
29
-
30
- <!-- Modal content -->
31
- <div class="modal-content">
32
- <span class="close">&times;</span>
33
- <p>
34
- <pre id="modalContent"></pre>
35
- </p>
18
+ <div class="container-fluid">
19
+
20
+ <div class="mb-1 row" id="stackListContainer">
21
+ <label for="stackList" class="col col-form-label w-auto">Stack:</label>
22
+ <select class="col form-select w-auto" id="stackList">
23
+ </select>
24
+ </div>
25
+
26
+ <div class="table-responsive">
27
+ <table class="table table-striped table-bordered">
28
+ <thead>
29
+ <tr>
30
+ <th class="col-time" scope="col">
31
+ </th>
32
+ <th class="col-servicekey" scope="col">
33
+
34
+ <div class="input-group input-group-sm" data-bs-toggle="tooltip" data-bs-html="true"
35
+ title="<p class='text-start'>Examples:</p><p class='text-start font-monospace'>MyFunction</p><p class='text-start font-monospace'>^Function</p><p class='text-start font-monospace'>^Function.*Response$</p>">
36
+
37
+ <div class="input-group-text"><i class="bi bi-funnel-fill"></i></div>
38
+ <input type="text" class="form-control" id="serviceKeyFilter" placeholder="Filter (regex)">
39
+ </div>
40
+
41
+ </th>
42
+ <th class="col-data" scope="col">
43
+ <div class="input-group input-group-sm">
44
+ <div class="input-group-text"><i class="bi bi-funnel-fill"></i></div>
45
+ <input type="text" class="form-control" id="dataFilter" placeholder="Filter (regex)">
46
+ </div>
47
+ </th>
48
+ </tr>
49
+ </thead>
50
+ <tbody id="tableBody" class="log">
51
+
52
+ </tbody>
53
+ </table>
36
54
  </div>
55
+ </div>
56
+
37
57
 
58
+
59
+ <div id="detailsModal" class="modal fade" tabindex="-1">
60
+ <div class="modal-dialog modal-dialog-scrollable modal-xl">
61
+ <div class="modal-content">
62
+ <div class="modal-header">
63
+ <h5 class="modal-title">Details</h5>
64
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
65
+ </div>
66
+ <div class="modal-body">
67
+ <p>Time:
68
+ <span class="fw-bold" id="time">2022-09-19T10:12:15.489Z</span>
69
+ </p>
70
+ <p>Service key:
71
+ <span class="fw-bold" id="serviceKey">Function#ToSnsAndDynamoDb#Response</span>
72
+ </p>
73
+ <p>Data:</p>
74
+ <pre id="data"></pre>
75
+ </div>
76
+ <div class="modal-footer">
77
+ <button type="button" class="btn btn-primary" data-bs-dismiss="modal">Close</button>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ </div>
82
+
83
+ <div id="errorModal" class="modal fade" tabindex="-1">
84
+ <div class="modal-dialog">
85
+ <div class="modal-content">
86
+ <div class="modal-header">
87
+ <h5 class="modal-title">Error</h5>
88
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
89
+ </div>
90
+ <div class="modal-body" id="errorContent">
91
+ </div>
92
+ <div class="modal-footer">
93
+ <button type="button" class="btn btn-primary" data-bs-dismiss="modal">Close</button>
94
+ </div>
95
+ </div>
96
+ </div>
38
97
  </div>
39
98
  </body>
40
99
 
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.