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.
- package/.jsii +236 -9
- package/API.md +161 -0
- package/cli/cli.ts +145 -75
- package/cli/icons/Arch_AWS-Lambda_16.svg +18 -0
- package/cli/icons/Arch_Amazon-DynamoDB_16.svg +18 -0
- package/cli/icons/Arch_Amazon-EventBridge_16.svg +18 -0
- package/cli/icons/Arch_Amazon-Simple-Notification-Service_16.svg +18 -0
- package/cli/icons/Arch_Amazon-Simple-Queue-Service_16.svg +18 -0
- package/cli/icons/Arch_Amazon-Simple-Storage-Service_16.svg +18 -0
- package/cli/index.html +84 -25
- package/cli/node_modules/commander/LICENSE +22 -0
- package/cli/node_modules/commander/Readme.md +1114 -0
- package/cli/node_modules/commander/esm.mjs +16 -0
- package/cli/node_modules/commander/index.js +27 -0
- package/cli/node_modules/commander/lib/argument.js +147 -0
- package/cli/node_modules/commander/lib/command.js +2161 -0
- package/cli/node_modules/commander/lib/error.js +45 -0
- package/cli/node_modules/commander/lib/help.js +406 -0
- package/cli/node_modules/commander/lib/option.js +324 -0
- package/cli/node_modules/commander/lib/suggestSimilar.js +100 -0
- package/cli/node_modules/commander/package-support.json +16 -0
- package/cli/node_modules/commander/package.json +80 -0
- package/cli/node_modules/commander/typings/index.d.ts +879 -0
- package/cli/package.json +23 -0
- package/cli/sampleData.ts +518 -0
- package/cli/style.css +66 -42
- package/cli/webServerlessSpy.ts +461 -0
- package/common/SpyEventSender.ts +291 -0
- package/common/getWebSocketUrl.ts +21 -4
- package/common/spyEvents/EventBridgeBaseSpyEvent.ts +13 -0
- package/common/spyEvents/EventBridgeRuleSpyEvent.ts +2 -7
- package/common/spyEvents/EventBridgeSpyEvent.ts +2 -7
- package/common/spyEvents/FunctionBaseSpyEvent.ts +7 -0
- package/common/spyEvents/FunctionConsole.ts +5 -0
- package/common/spyEvents/FunctionConsoleSpyEvent.ts +5 -8
- package/common/spyEvents/FunctionResponseSpyEvent.ts +2 -5
- package/common/spyEvents/SnsSpyEventBase.ts +11 -0
- package/common/spyEvents/SnsSubscriptionSpyEvent.ts +3 -9
- package/common/spyEvents/SnsTopicSpyEvent.ts +3 -9
- package/dist/releasetag.txt +1 -1
- package/extension/interceptor.ts +107 -27
- package/functions/sendMessage.ts +4 -2
- package/functions/sqsSubscriptionAndDropAllMessages.ts +3 -0
- package/lib/cli/cli.js +124 -65
- package/lib/cli/cli.mjs +125 -66
- package/lib/cli/sampleData.d.ts +892 -0
- package/lib/cli/sampleData.js +481 -0
- package/lib/cli/sampleData.mjs +478 -0
- package/lib/cli/webServerlessSpy.js +5516 -0
- package/lib/cli/webServerlessSpy.js.map +7 -0
- package/lib/common/SpyEventSender.d.ts +17 -0
- package/lib/common/SpyEventSender.js +227 -0
- package/lib/common/SpyEventSender.mjs +223 -0
- package/lib/common/getWebSocketUrl.d.ts +1 -1
- package/lib/common/getWebSocketUrl.js +19 -7
- package/lib/common/getWebSocketUrl.mjs +17 -5
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.d.ts +9 -0
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.js +3 -0
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.ts +2 -7
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.js +1 -1
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/EventBridgeSpyEvent.d.ts +2 -7
- package/lib/common/spyEvents/EventBridgeSpyEvent.js +1 -1
- package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/FunctionBaseSpyEvent.d.ts +6 -0
- package/lib/common/spyEvents/FunctionBaseSpyEvent.js +3 -0
- package/lib/common/spyEvents/FunctionBaseSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/FunctionConsole.d.ts +5 -0
- package/lib/common/spyEvents/FunctionConsole.js +3 -0
- package/lib/common/spyEvents/FunctionConsole.mjs +2 -0
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.ts +4 -8
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.js +1 -1
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/FunctionResponseSpyEvent.d.ts +2 -5
- package/lib/common/spyEvents/FunctionResponseSpyEvent.js +1 -1
- package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/SnsSpyEventBase.d.ts +10 -0
- package/lib/common/spyEvents/SnsSpyEventBase.js +3 -0
- package/lib/common/spyEvents/SnsSpyEventBase.mjs +2 -0
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.ts +2 -9
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.js +1 -1
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +1 -1
- package/lib/common/spyEvents/SnsTopicSpyEvent.d.ts +2 -9
- package/lib/common/spyEvents/SnsTopicSpyEvent.js +1 -1
- package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +1 -1
- package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +10793 -23825
- package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +4 -4
- package/lib/listener/ServerlessSpyListenerParams.d.ts +1 -0
- package/lib/listener/ServerlessSpyListenerParams.js +1 -1
- package/lib/listener/ServerlessSpyListenerParams.mjs +1 -1
- package/lib/listener/SpyHandlers.ts.d.ts +30 -2
- package/lib/listener/SpyHandlers.ts.js +1 -1
- package/lib/listener/SpyHandlers.ts.mjs +1 -1
- package/lib/listener/WsListener.d.ts +4 -21
- package/lib/listener/WsListener.js +21 -13
- package/lib/listener/WsListener.mjs +22 -14
- package/lib/src/ServerlessSpy.d.ts +44 -14
- package/lib/src/ServerlessSpy.js +228 -86
- package/lib/src/ServerlessSpy.mjs +227 -85
- package/lib/src/common/envVariableNames.d.ts +6 -2
- package/lib/src/common/envVariableNames.js +6 -2
- package/lib/src/common/envVariableNames.mjs +6 -2
- package/listener/ServerlessSpyListenerParams.ts +1 -0
- package/listener/SpyHandlers.ts.ts +70 -9
- package/listener/WsListener.ts +39 -24
- package/package.json +5 -3
- package/cli/serverlessSpy.js +0 -73
- package/cli/ws.ts +0 -79
- package/common/publishSpyEvent.ts +0 -269
- package/lib/cli/ws.d.ts +0 -1
- package/lib/cli/ws.js +0 -68
- package/lib/cli/ws.mjs +0 -66
- package/lib/common/publishSpyEvent.d.ts +0 -4
- package/lib/common/publishSpyEvent.js +0 -211
- package/lib/common/publishSpyEvent.mjs +0 -205
|
@@ -13,7 +13,11 @@ export declare enum envVariableNames {
|
|
|
13
13
|
SSPY_WS_ENDPOINT = "SSPY_WS_ENDPOINT",
|
|
14
14
|
SSPY_FUNCTION_NAME = "SSPY_FUNCTION_NAME",
|
|
15
15
|
/**
|
|
16
|
-
*DynamoDB table name that stores active websocket connections.
|
|
16
|
+
* DynamoDB table name that stores active websocket connections.
|
|
17
17
|
*/
|
|
18
|
-
SSPY_WS_TABLE_NAME = "SSPY_WS_TABLE_NAME"
|
|
18
|
+
SSPY_WS_TABLE_NAME = "SSPY_WS_TABLE_NAME",
|
|
19
|
+
/**
|
|
20
|
+
* Log debugging details.
|
|
21
|
+
*/
|
|
22
|
+
SSPY_DEBUG = "SSPY_DEBUG"
|
|
19
23
|
}
|
|
@@ -19,8 +19,12 @@ var envVariableNames;
|
|
|
19
19
|
envVariableNames["SSPY_WS_ENDPOINT"] = "SSPY_WS_ENDPOINT";
|
|
20
20
|
envVariableNames["SSPY_FUNCTION_NAME"] = "SSPY_FUNCTION_NAME";
|
|
21
21
|
/**
|
|
22
|
-
*DynamoDB table name that stores active websocket connections.
|
|
22
|
+
* DynamoDB table name that stores active websocket connections.
|
|
23
23
|
*/
|
|
24
24
|
envVariableNames["SSPY_WS_TABLE_NAME"] = "SSPY_WS_TABLE_NAME";
|
|
25
|
+
/**
|
|
26
|
+
* Log debugging details.
|
|
27
|
+
*/
|
|
28
|
+
envVariableNames["SSPY_DEBUG"] = "SSPY_DEBUG";
|
|
25
29
|
})(envVariableNames = exports.envVariableNames || (exports.envVariableNames = {}));
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52VmFyaWFibGVOYW1lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vZW52VmFyaWFibGVOYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEVBQTBFO0FBQzFFLG9EQUFvRDs7O0FBRXBELElBQVksZ0JBMkJYO0FBM0JELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gscUVBQWlELENBQUE7SUFFakQ7O09BRUc7SUFDSCw2REFBeUMsQ0FBQTtJQUV6Qzs7T0FFRztJQUNILHlEQUFxQyxDQUFBO0lBRXJDLDZEQUF5QyxDQUFBO0lBRXpDOztPQUVHO0lBQ0gsNkRBQXlDLENBQUE7SUFFekM7O09BRUc7SUFDSCw2Q0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBM0JXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBMkIzQiIsInNvdXJjZXNDb250ZW50IjpbIi8vdGhpcyBmaWxlIGlzIG5vdCB1bmRlciByb290IC0+IGNvbW1vbiBmb2xkZXIgYmVjYXVzZSBqc2lpIGRvZXMgbm90IGFsbG93XG4vL2NoYW5naW5nIHRzY29uZmluZy5qc29uIHRvIHJlbW92ZSByb290RGlyIHByb3BlcnR5XG5cbmV4cG9ydCBlbnVtIGVudlZhcmlhYmxlTmFtZXMge1xuICAvKipcbiAgICogTm90ZSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBzdWJzY3JpYmVkIHRvIFNRUywgc28gd2UgbmVlZCB0byBzZW5kIHNweSBldmVudHMgYXMgaXQgY29tZXMgZnJvbSBTUVMuXG4gICAqL1xuICBTU1BZX1NVQlNDUklCRURfVE9fU1FTID0gJ1NTUFlfU1VCU0NSSUJFRF9UT19TUVMnLFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHJlc291cmNlIEFSTnMgdG8gc2VydmljZSBrZXlzXG4gICAqL1xuICBTU1BZX0lORlJBX01BUFBJTkcgPSAnU1NQWV9JTkZSQV9NQVBQSU5HJyxcblxuICAvKipcbiAgICogV2ViIHNvY2tldCBlbmRwb2ludCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIHNweSBldmVudHMuXG4gICAqL1xuICBTU1BZX1dTX0VORFBPSU5UID0gJ1NTUFlfV1NfRU5EUE9JTlQnLFxuXG4gIFNTUFlfRlVOQ1RJT05fTkFNRSA9ICdTU1BZX0ZVTkNUSU9OX05BTUUnLFxuXG4gIC8qKlxuICAgKiBEeW5hbW9EQiB0YWJsZSBuYW1lIHRoYXQgc3RvcmVzIGFjdGl2ZSB3ZWJzb2NrZXQgY29ubmVjdGlvbnMuXG4gICAqL1xuICBTU1BZX1dTX1RBQkxFX05BTUUgPSAnU1NQWV9XU19UQUJMRV9OQU1FJyxcblxuICAvKipcbiAgICogTG9nIGRlYnVnZ2luZyBkZXRhaWxzLlxuICAgKi9cbiAgU1NQWV9ERUJVRyA9ICdTU1BZX0RFQlVHJyxcbn1cbiJdfQ==
|
|
@@ -16,8 +16,12 @@ export var envVariableNames;
|
|
|
16
16
|
envVariableNames["SSPY_WS_ENDPOINT"] = "SSPY_WS_ENDPOINT";
|
|
17
17
|
envVariableNames["SSPY_FUNCTION_NAME"] = "SSPY_FUNCTION_NAME";
|
|
18
18
|
/**
|
|
19
|
-
*DynamoDB table name that stores active websocket connections.
|
|
19
|
+
* DynamoDB table name that stores active websocket connections.
|
|
20
20
|
*/
|
|
21
21
|
envVariableNames["SSPY_WS_TABLE_NAME"] = "SSPY_WS_TABLE_NAME";
|
|
22
|
+
/**
|
|
23
|
+
* Log debugging details.
|
|
24
|
+
*/
|
|
25
|
+
envVariableNames["SSPY_DEBUG"] = "SSPY_DEBUG";
|
|
22
26
|
})(envVariableNames || (envVariableNames = {}));
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52VmFyaWFibGVOYW1lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vZW52VmFyaWFibGVOYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwRUFBMEU7QUFDMUUsb0RBQW9EO0FBRXBELE1BQU0sQ0FBTixJQUFZLGdCQTJCWDtBQTNCRCxXQUFZLGdCQUFnQjtJQUMxQjs7T0FFRztJQUNILHFFQUFpRCxDQUFBO0lBRWpEOztPQUVHO0lBQ0gsNkRBQXlDLENBQUE7SUFFekM7O09BRUc7SUFDSCx5REFBcUMsQ0FBQTtJQUVyQyw2REFBeUMsQ0FBQTtJQUV6Qzs7T0FFRztJQUNILDZEQUF5QyxDQUFBO0lBRXpDOztPQUVHO0lBQ0gsNkNBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQTNCVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBMkIzQiIsInNvdXJjZXNDb250ZW50IjpbIi8vdGhpcyBmaWxlIGlzIG5vdCB1bmRlciByb290IC0+IGNvbW1vbiBmb2xkZXIgYmVjYXVzZSBqc2lpIGRvZXMgbm90IGFsbG93XG4vL2NoYW5naW5nIHRzY29uZmluZy5qc29uIHRvIHJlbW92ZSByb290RGlyIHByb3BlcnR5XG5cbmV4cG9ydCBlbnVtIGVudlZhcmlhYmxlTmFtZXMge1xuICAvKipcbiAgICogTm90ZSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBzdWJzY3JpYmVkIHRvIFNRUywgc28gd2UgbmVlZCB0byBzZW5kIHNweSBldmVudHMgYXMgaXQgY29tZXMgZnJvbSBTUVMuXG4gICAqL1xuICBTU1BZX1NVQlNDUklCRURfVE9fU1FTID0gJ1NTUFlfU1VCU0NSSUJFRF9UT19TUVMnLFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHJlc291cmNlIEFSTnMgdG8gc2VydmljZSBrZXlzXG4gICAqL1xuICBTU1BZX0lORlJBX01BUFBJTkcgPSAnU1NQWV9JTkZSQV9NQVBQSU5HJyxcblxuICAvKipcbiAgICogV2ViIHNvY2tldCBlbmRwb2ludCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIHNweSBldmVudHMuXG4gICAqL1xuICBTU1BZX1dTX0VORFBPSU5UID0gJ1NTUFlfV1NfRU5EUE9JTlQnLFxuXG4gIFNTUFlfRlVOQ1RJT05fTkFNRSA9ICdTU1BZX0ZVTkNUSU9OX05BTUUnLFxuXG4gIC8qKlxuICAgKiBEeW5hbW9EQiB0YWJsZSBuYW1lIHRoYXQgc3RvcmVzIGFjdGl2ZSB3ZWJzb2NrZXQgY29ubmVjdGlvbnMuXG4gICAqL1xuICBTU1BZX1dTX1RBQkxFX05BTUUgPSAnU1NQWV9XU19UQUJMRV9OQU1FJyxcblxuICAvKipcbiAgICogTG9nIGRlYnVnZ2luZyBkZXRhaWxzLlxuICAgKi9cbiAgU1NQWV9ERUJVRyA9ICdTU1BZX0RFQlVHJyxcbn1cbiJdfQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DynamoDBSpyEvent } from '../common/spyEvents/DynamoDBSpyEvent';
|
|
2
2
|
import { EventBridgeRuleSpyEvent } from '../common/spyEvents/EventBridgeRuleSpyEvent';
|
|
3
3
|
import { EventBridgeSpyEvent } from '../common/spyEvents/EventBridgeSpyEvent';
|
|
4
|
+
import { FunctionConsole } from '../common/spyEvents/FunctionConsole';
|
|
4
5
|
import { FunctionConsoleSpyEvent } from '../common/spyEvents/FunctionConsoleSpyEvent';
|
|
5
6
|
import { FunctionContext } from '../common/spyEvents/FunctionContext';
|
|
6
7
|
import { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';
|
|
@@ -112,13 +113,26 @@ export interface FunctionBaseSpyHandler<TData = any>
|
|
|
112
113
|
FunctionRequestSpyEvent<TData>,
|
|
113
114
|
FunctionRequestSpyHandler<TData>
|
|
114
115
|
> {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
116
|
+
followedByConsole: (
|
|
117
|
+
// This implementation confuses TypeScript which does not accurately display the type.
|
|
118
|
+
param?: {
|
|
119
|
+
condition?: (event: {
|
|
120
|
+
spyEventType: 'FunctionConsole';
|
|
121
|
+
request: TData;
|
|
122
|
+
context: FunctionContext;
|
|
123
|
+
console: FunctionConsole;
|
|
124
|
+
}) => boolean;
|
|
125
|
+
timoutMs?: number;
|
|
126
|
+
}
|
|
127
|
+
) => Promise<
|
|
128
|
+
FunctionBaseSpyHandler<TData> &
|
|
129
|
+
FunctionConsoleSpyHandler<TData> &
|
|
130
|
+
JestExpectWithSpyMethods<
|
|
131
|
+
FunctionConsoleSpyEvent<TData>,
|
|
132
|
+
FunctionRequestSpyHandler<TData>
|
|
133
|
+
>
|
|
134
|
+
>;
|
|
135
|
+
|
|
122
136
|
followedByResponse: <TDataResponse = any>(
|
|
123
137
|
// This implementation confuses TypeScript which does not accurately display the type.
|
|
124
138
|
// Leave it for reference!
|
|
@@ -137,7 +151,7 @@ export interface FunctionBaseSpyHandler<TData = any>
|
|
|
137
151
|
timoutMs?: number;
|
|
138
152
|
}
|
|
139
153
|
) => Promise<
|
|
140
|
-
FunctionResponseSpyHandler &
|
|
154
|
+
FunctionResponseSpyHandler<TData> &
|
|
141
155
|
JestExpectWithSpyMethods<
|
|
142
156
|
FunctionRequestSpyEvent<TData>,
|
|
143
157
|
FunctionRequestSpyHandler<TData>
|
|
@@ -151,8 +165,55 @@ export interface FunctionRequestSpyHandler<TData = any>
|
|
|
151
165
|
}
|
|
152
166
|
|
|
153
167
|
export interface FunctionConsoleSpyHandler<TData = any>
|
|
154
|
-
extends
|
|
168
|
+
extends JestExpectWithSpyMethods<
|
|
169
|
+
FunctionConsoleSpyEvent<TData>,
|
|
170
|
+
FunctionConsoleSpyHandler<TData>
|
|
171
|
+
> {
|
|
155
172
|
getData: () => PrettifyForDisplay<FunctionConsoleSpyEvent<TData>>;
|
|
173
|
+
followedByConsole: (
|
|
174
|
+
// This implementation confuses TypeScript which does not accurately display the type.
|
|
175
|
+
param?: {
|
|
176
|
+
condition?: (event: {
|
|
177
|
+
spyEventType: 'FunctionConsole';
|
|
178
|
+
request: TData;
|
|
179
|
+
context: FunctionContext;
|
|
180
|
+
console: FunctionConsole;
|
|
181
|
+
}) => boolean;
|
|
182
|
+
timoutMs?: number;
|
|
183
|
+
}
|
|
184
|
+
) => Promise<
|
|
185
|
+
FunctionBaseSpyHandler<TData> &
|
|
186
|
+
FunctionConsoleSpyHandler<TData> &
|
|
187
|
+
JestExpectWithSpyMethods<
|
|
188
|
+
FunctionConsoleSpyEvent<TData>,
|
|
189
|
+
FunctionRequestSpyHandler<TData>
|
|
190
|
+
>
|
|
191
|
+
>;
|
|
192
|
+
|
|
193
|
+
followedByResponse: <TDataResponse = any>(
|
|
194
|
+
// This implementation confuses TypeScript which does not accurately display the type.
|
|
195
|
+
// Leave it for reference!
|
|
196
|
+
// param: PrettifyForDisplay<
|
|
197
|
+
// WaitForParams<
|
|
198
|
+
// PrettifyForDisplay<FunctionResponseSpyEvent<TData, TDataResponse>>
|
|
199
|
+
// >
|
|
200
|
+
// >
|
|
201
|
+
param?: {
|
|
202
|
+
condition?: (event: {
|
|
203
|
+
spyEventType: 'FunctionResponse';
|
|
204
|
+
request: TData;
|
|
205
|
+
context: FunctionContext;
|
|
206
|
+
response: TDataResponse;
|
|
207
|
+
}) => boolean;
|
|
208
|
+
timoutMs?: number;
|
|
209
|
+
}
|
|
210
|
+
) => Promise<
|
|
211
|
+
FunctionResponseSpyHandler<TData> &
|
|
212
|
+
JestExpectWithSpyMethods<
|
|
213
|
+
FunctionRequestSpyEvent<TData>,
|
|
214
|
+
FunctionRequestSpyHandler<TData>
|
|
215
|
+
>
|
|
216
|
+
>;
|
|
156
217
|
}
|
|
157
218
|
|
|
158
219
|
export interface FunctionResponseSpyHandler<TData = any>
|
package/listener/WsListener.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
|
-
import {
|
|
2
|
+
import { getSignedWebSocketUrl } from '../common/getWebSocketUrl';
|
|
3
3
|
import { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';
|
|
4
4
|
import { SpyEvent } from '../common/spyEvents/SpyEvent';
|
|
5
5
|
import { SpyMessage } from '../common/spyEvents/SpyMessage';
|
|
@@ -16,13 +16,16 @@ export class WsListener<TSpyEvents> {
|
|
|
16
16
|
private ws?: WebSocket;
|
|
17
17
|
private closed = true;
|
|
18
18
|
private functionPrefix = 'waitFor';
|
|
19
|
+
private debugMode = false;
|
|
20
|
+
|
|
21
|
+
public async start(params: ServerlessSpyListenerParams) {
|
|
22
|
+
this.debugMode = !!params.debugMode;
|
|
19
23
|
|
|
20
|
-
async start(params: ServerlessSpyListenerParams) {
|
|
21
24
|
this.waitForConnection = new Promise((resolve) => {
|
|
22
25
|
this.connectionOpenResolve = resolve;
|
|
23
26
|
});
|
|
24
27
|
|
|
25
|
-
const urlSigned = await
|
|
28
|
+
const urlSigned = await getSignedWebSocketUrl(
|
|
26
29
|
params.serverlessSpyWsUrl,
|
|
27
30
|
params.credentials
|
|
28
31
|
);
|
|
@@ -30,11 +33,14 @@ export class WsListener<TSpyEvents> {
|
|
|
30
33
|
this.ws = new WebSocket(urlSigned);
|
|
31
34
|
this.closed = false;
|
|
32
35
|
this.ws.on('open', () => {
|
|
36
|
+
this.log('Connection oppened');
|
|
33
37
|
this.connectionOpenResolve!();
|
|
34
38
|
});
|
|
35
39
|
this.ws.on('message', (data) => {
|
|
36
40
|
if (this.closed) return;
|
|
37
41
|
|
|
42
|
+
this.log('Message received', data);
|
|
43
|
+
|
|
38
44
|
const message = JSON.parse(data.toString()) as SpyMessageStorage;
|
|
39
45
|
|
|
40
46
|
message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
|
|
@@ -49,19 +55,20 @@ export class WsListener<TSpyEvents> {
|
|
|
49
55
|
this.resolveOldTrackerWithNewMessage(message);
|
|
50
56
|
});
|
|
51
57
|
this.ws.on('close', () => {
|
|
58
|
+
this.log('Connection closed');
|
|
59
|
+
|
|
52
60
|
this.closed = true;
|
|
53
|
-
//console.log('disconnected ' + new Date().toISOString());
|
|
54
61
|
});
|
|
55
62
|
|
|
56
63
|
await this.waitForConnection;
|
|
57
64
|
}
|
|
58
65
|
|
|
59
|
-
async stop() {
|
|
66
|
+
public async stop() {
|
|
60
67
|
this.closed = true;
|
|
61
68
|
this.ws!.close();
|
|
62
69
|
}
|
|
63
70
|
|
|
64
|
-
trackerMatchMessage(tracker: Tracker, message: SpyMessageStorage) {
|
|
71
|
+
private trackerMatchMessage(tracker: Tracker, message: SpyMessageStorage) {
|
|
65
72
|
if (tracker.finished) return;
|
|
66
73
|
|
|
67
74
|
if (
|
|
@@ -83,27 +90,30 @@ export class WsListener<TSpyEvents> {
|
|
|
83
90
|
(serviceKeyForFunction.endsWith('Request') ||
|
|
84
91
|
serviceKeyForFunction.endsWith('Console'))
|
|
85
92
|
) {
|
|
86
|
-
let
|
|
87
|
-
|
|
88
|
-
if (
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
serviceKeyForFunctionResponse.length - 'Console'.length
|
|
99
|
-
);
|
|
93
|
+
let serviceKeyForFunctionChain = serviceKeyForFunction;
|
|
94
|
+
|
|
95
|
+
if (serviceKeyForFunctionChain.endsWith('Request')) {
|
|
96
|
+
serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(
|
|
97
|
+
0,
|
|
98
|
+
serviceKeyForFunctionChain.length - 'Request'.length
|
|
99
|
+
);
|
|
100
|
+
} else if (serviceKeyForFunctionChain.endsWith('Console')) {
|
|
101
|
+
serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(
|
|
102
|
+
0,
|
|
103
|
+
serviceKeyForFunctionChain.length - 'Console'.length
|
|
104
|
+
);
|
|
100
105
|
}
|
|
101
106
|
|
|
102
|
-
|
|
107
|
+
spyAndJestMatchers.followedByConsole = (paramsW: WaitForParams) => {
|
|
108
|
+
return this.createWaitForXXXFunc(
|
|
109
|
+
`${serviceKeyForFunctionChain}Console`,
|
|
110
|
+
(message.data as FunctionRequestSpyEvent).context.awsRequestId
|
|
111
|
+
)(paramsW);
|
|
112
|
+
};
|
|
103
113
|
|
|
104
114
|
spyAndJestMatchers.followedByResponse = (paramsW: WaitForParams) => {
|
|
105
115
|
return this.createWaitForXXXFunc(
|
|
106
|
-
|
|
116
|
+
`${serviceKeyForFunctionChain}Response`,
|
|
107
117
|
(message.data as FunctionRequestSpyEvent).context.awsRequestId
|
|
108
118
|
)(paramsW);
|
|
109
119
|
};
|
|
@@ -179,7 +189,7 @@ export class WsListener<TSpyEvents> {
|
|
|
179
189
|
}
|
|
180
190
|
}
|
|
181
191
|
|
|
182
|
-
|
|
192
|
+
private createWaitForXXXFunc(
|
|
183
193
|
serviceKeyForFunction: string,
|
|
184
194
|
functionContextAwsRequestId?: string
|
|
185
195
|
) {
|
|
@@ -195,7 +205,6 @@ export class WsListener<TSpyEvents> {
|
|
|
195
205
|
};
|
|
196
206
|
});
|
|
197
207
|
|
|
198
|
-
//waitForXXXFunc
|
|
199
208
|
return (paramsW?: WaitForParams<SpyEvent>) => {
|
|
200
209
|
tracker.condition = paramsW?.condition;
|
|
201
210
|
|
|
@@ -253,6 +262,12 @@ export class WsListener<TSpyEvents> {
|
|
|
253
262
|
|
|
254
263
|
return proxy as ServerlessSpyListener<TSpyEvents>;
|
|
255
264
|
}
|
|
265
|
+
|
|
266
|
+
private log(message: string, ...optionalParams: any[]) {
|
|
267
|
+
if (this.debugMode) {
|
|
268
|
+
console.debug('SSPY', message, ...optionalParams);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
256
271
|
}
|
|
257
272
|
|
|
258
273
|
type Tracker = {
|
package/package.json
CHANGED
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"lint": "eslint **/*.ts",
|
|
33
33
|
"lint-fix": "eslint --fix './**/*.ts'",
|
|
34
34
|
"pretty": "prettier --write '**/*.ts'",
|
|
35
|
-
"bundle-extension": "scripts/run-task bundle-extension"
|
|
35
|
+
"bundle-extension": "scripts/run-task bundle-extension",
|
|
36
|
+
"cli": "scripts/run-task cli"
|
|
36
37
|
},
|
|
37
38
|
"author": {
|
|
38
39
|
"name": "Marko (ServerlessLife.com)",
|
|
@@ -78,7 +79,8 @@
|
|
|
78
79
|
},
|
|
79
80
|
"workspaces": [
|
|
80
81
|
"test",
|
|
81
|
-
"test/cdk"
|
|
82
|
+
"test/cdk",
|
|
83
|
+
"cli"
|
|
82
84
|
],
|
|
83
85
|
"peerDependencies": {
|
|
84
86
|
"aws-cdk-lib": "^2.37.1",
|
|
@@ -116,7 +118,7 @@
|
|
|
116
118
|
"require": "./lib/index.js"
|
|
117
119
|
},
|
|
118
120
|
"license": "Apache-2.0",
|
|
119
|
-
"version": "0.0.
|
|
121
|
+
"version": "0.0.37",
|
|
120
122
|
"types": "lib/index.d.ts",
|
|
121
123
|
"stability": "stable",
|
|
122
124
|
"jsii": {
|
package/cli/serverlessSpy.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
function run() {
|
|
2
|
-
const tableBody = document.getElementById("tableBody");
|
|
3
|
-
var modal = document.getElementById("myModal");
|
|
4
|
-
var span = document.getElementsByClassName("close")[0];
|
|
5
|
-
const modalContent = document.getElementById("modalContent");
|
|
6
|
-
span.onclick = function () {
|
|
7
|
-
modal.style.display = "none";
|
|
8
|
-
};
|
|
9
|
-
window.onclick = function (event) {
|
|
10
|
-
if (event.target == modal) {
|
|
11
|
-
modal.style.display = "none";
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
tableBody.addEventListener("click", function (e) {
|
|
16
|
-
const dataJson = JSON.stringify(
|
|
17
|
-
JSON.parse(e.target.parentElement.children[2].textContent),
|
|
18
|
-
null,
|
|
19
|
-
2
|
|
20
|
-
);
|
|
21
|
-
modalContent.innerText = dataJson;
|
|
22
|
-
modal.style.display = "block";
|
|
23
|
-
//alert();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
const url = "SERVERLESS_SPY_WS_URL";
|
|
27
|
-
//"wss://m6g3w6ttdh.execute-api.eu-west-1.amazonaws.com/prod?X-Amz-Security-Token=IQoJb3JpZ2luX2VjELL%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCWV1LXdlc3QtMSJGMEQCIDk%2BzQd0RC2DmEgCJEPoRFAkmnhCZl%2BSIlEG4TummRkIAiBIgNG8Yw%2FOAew3XNAE3yrNCK0G0q%2BZI8MwjEa8xoEonirrAQgbEAQaDDA3NjU4NTk2NzA3NSIMxVUxKhwdqGjFOsRtKsgB2eotQMFgl4CrD8uy%2Fe1UE6K4HVc6uWo0gdjgHMPb5C9Mq0wFgHTiDFjFxIFkJpmCiTRXKqNFrx5lpo9C5Ml1bpcv%2BTopT6wvpbFksxChhhnaqUDHiBaGuys8zEy8Bjlu4jF0nKccmUYdieD70%2FXz99OU4wKPxXyWbr0w82y1Xd6ag8g4VNx3EXEdULq7vkM6H2shSAH8EUlZoTD%2BqvIQvyKS8nta3ebhprO%2BsLRQv2YC6k1w46jHuOjtI7hSnmfSKnkUqAxS6g4wgZrFlwY6mQFNSXz7jSF3IRtdcpMEIp%2Bnghf2LhvZKeW6GkZs4DMeuhPjoBehfmXLJIJWgcvLoheQvIt28ddgHU60%2BoRKhZTxQKhpvSOaAbI6M%2B%2FyHvkC2hTR4fEBtESAMnzo8WocfxdaQQ0YVYq2m5NKSXs3QrrsYIIirkFYhB%2BjAwG8bqBAuE9SQNeIthHjT27hB7KUeIIoXtwSVGutv70%3D&X-Amz-Date=20220808T175057Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIARDVHBDXR4QCRLL4O%2F20220808%2Feu-west-1%2Fexecute-api%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=d58ab2b792a69f20f8e3bf9bf4fb19c8ec8f271bd1b594f8cd25c02d4c85521d";
|
|
28
|
-
const ws = new WebSocket(url);
|
|
29
|
-
|
|
30
|
-
ws.addEventListener("open", function (event) {
|
|
31
|
-
console.log("connected " + new Date().toISOString());
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
ws.addEventListener("message", function ({ data }) {
|
|
35
|
-
//debugger;
|
|
36
|
-
//console.log(`From server: ${data}`);
|
|
37
|
-
|
|
38
|
-
let parsed;
|
|
39
|
-
try {
|
|
40
|
-
parsed = JSON.parse(data);
|
|
41
|
-
} catch (err) {
|
|
42
|
-
console.error("Can not parse " + data);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
addLog(parsed);
|
|
46
|
-
|
|
47
|
-
// if (parsed) {
|
|
48
|
-
// console.log(
|
|
49
|
-
// `\x1b[47m\x1b[34m${parsed.timestamp} \x1b[31m🍕 ${
|
|
50
|
-
// parsed.serviceKey
|
|
51
|
-
// }\x1b[0m\x1b[32m\n${JSON.stringify(parsed.data, null, 2)}\x1b[0m`
|
|
52
|
-
// );
|
|
53
|
-
// }
|
|
54
|
-
});
|
|
55
|
-
ws.addEventListener("close", function () {
|
|
56
|
-
console.log("disconnected " + new Date().toISOString());
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
function addLog(data) {
|
|
60
|
-
const newRow = document.createElement("tr");
|
|
61
|
-
newRow.innerHTML = `
|
|
62
|
-
<td>${new Date(data.timestamp).toLocaleTimeString()}</td>
|
|
63
|
-
<td>${data.serviceKey}</td>
|
|
64
|
-
<td>${JSON.stringify(data.data)}</td>
|
|
65
|
-
`;
|
|
66
|
-
tableBody.append(newRow);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
document.addEventListener("DOMContentLoaded", function () {
|
|
71
|
-
console.log("RUN");
|
|
72
|
-
run();
|
|
73
|
-
});
|
package/cli/ws.ts
DELETED
|
@@ -1,79 +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
|
-
|
|
6
|
-
async function run() {
|
|
7
|
-
// var credentialsProvider = awsCp.fromTemporaryCredentials();
|
|
8
|
-
// const credentials = await credentialsProvider();
|
|
9
|
-
|
|
10
|
-
// const client = new STSClient({});
|
|
11
|
-
// client.send()
|
|
12
|
-
|
|
13
|
-
// const command = new GetSessionTokenCommand({});
|
|
14
|
-
// const { Credentials: credentials } = await client.send(command);
|
|
15
|
-
// //const credentials = s.Credentials;
|
|
16
|
-
|
|
17
|
-
// console.log("credentials", credentials);
|
|
18
|
-
|
|
19
|
-
// const url = process.argv[2];
|
|
20
|
-
const url = 'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
|
|
21
|
-
|
|
22
|
-
// https://medium.com/@o.bredenberg/iam-sign-your-api-gateway-websocket-connection-request-no-custom-auth-from-your-frontend-65451166757d
|
|
23
|
-
const url2 = await getWebSocketUrl(url);
|
|
24
|
-
|
|
25
|
-
const ws = new WebSocket(url2);
|
|
26
|
-
|
|
27
|
-
const fileDescriptor = fs.openSync('spy_log.json', 'w');
|
|
28
|
-
// 📢📁⚡️💾 💽 💾 💿 📀🛢🪣📑🔊
|
|
29
|
-
|
|
30
|
-
ws.on('open', () => console.log(`connected ${new Date().toISOString()}`));
|
|
31
|
-
ws.on('message', (data: any) => {
|
|
32
|
-
// console.log(`From server: ${data}`);
|
|
33
|
-
|
|
34
|
-
let parsed;
|
|
35
|
-
try {
|
|
36
|
-
parsed = JSON.parse(data);
|
|
37
|
-
} catch (err) {
|
|
38
|
-
console.error(`Can not parse ${data}`);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (parsed) {
|
|
42
|
-
console.log(
|
|
43
|
-
`\x1b[47m\x1b[34m${parsed.timestamp} \x1b[31m🍕 ${
|
|
44
|
-
parsed.serviceKey
|
|
45
|
-
}\x1b[0m\x1b[32m\n${JSON.stringify(parsed.data, null, 2)}\x1b[0m`
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
fs.write(fileDescriptor, data, (error) => {
|
|
50
|
-
if (!error) {
|
|
51
|
-
// fs.close(fileDescriptor);
|
|
52
|
-
} else {
|
|
53
|
-
console.error(error);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
fs.write(fileDescriptor, '\n', (error) => {
|
|
57
|
-
if (!error) {
|
|
58
|
-
// fs.close(fileDescriptor);
|
|
59
|
-
} else {
|
|
60
|
-
console.error(error);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
ws.on('close', () => {
|
|
65
|
-
console.log(`disconnected ${new Date().toISOString()}`);
|
|
66
|
-
fs.close(fileDescriptor, () => undefined);
|
|
67
|
-
process.exit();
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
readline
|
|
71
|
-
.createInterface({
|
|
72
|
-
input: process.stdin,
|
|
73
|
-
output: process.stdout,
|
|
74
|
-
})
|
|
75
|
-
.on('line', (data) => {
|
|
76
|
-
ws.send(data);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
run().catch(console.error);
|