serverless-spy 2.3.10 → 2.3.11

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 (224) hide show
  1. package/.jsii +2 -2
  2. package/dist/releasetag.txt +1 -1
  3. package/lib/_virtual/rolldown_runtime.js +25 -0
  4. package/lib/_virtual/rolldown_runtime.mjs +11 -0
  5. package/lib/cli/cli.d.mts +1 -0
  6. package/lib/cli/cli.d.ts +1 -2
  7. package/lib/cli/cli.js +151 -208
  8. package/lib/cli/cli.js.map +1 -0
  9. package/lib/cli/cli.mjs +144 -205
  10. package/lib/cli/cli.mjs.map +1 -0
  11. package/lib/cli/sampleData.d.mts +896 -0
  12. package/lib/cli/sampleData.d.ts +860 -856
  13. package/lib/cli/sampleData.js +496 -480
  14. package/lib/cli/sampleData.js.map +1 -0
  15. package/lib/cli/sampleData.mjs +495 -477
  16. package/lib/cli/sampleData.mjs.map +1 -0
  17. package/lib/common/SpyEventSender.d.mts +26 -0
  18. package/lib/common/SpyEventSender.d.ts +23 -18
  19. package/lib/common/SpyEventSender.js +180 -230
  20. package/lib/common/SpyEventSender.js.map +1 -0
  21. package/lib/common/SpyEventSender.mjs +180 -227
  22. package/lib/common/SpyEventSender.mjs.map +1 -0
  23. package/lib/common/getWebSocketUrl.d.mts +7 -0
  24. package/lib/common/getWebSocketUrl.d.ts +7 -2
  25. package/lib/common/getWebSocketUrl.js +51 -62
  26. package/lib/common/getWebSocketUrl.js.map +1 -0
  27. package/lib/common/getWebSocketUrl.mjs +49 -60
  28. package/lib/common/getWebSocketUrl.mjs.map +1 -0
  29. package/lib/common/spyEvents/DynamoDBSpyEvent.d.mts +15 -0
  30. package/lib/common/spyEvents/DynamoDBSpyEvent.d.ts +14 -9
  31. package/lib/common/spyEvents/DynamoDBSpyEvent.js +0 -3
  32. package/lib/common/spyEvents/DynamoDBSpyEvent.mjs +1 -2
  33. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.d.mts +14 -0
  34. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.d.ts +13 -8
  35. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.js +0 -3
  36. package/lib/common/spyEvents/EventBridgeBaseSpyEvent.mjs +1 -2
  37. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.mts +9 -0
  38. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.ts +8 -3
  39. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.js +0 -3
  40. package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +1 -2
  41. package/lib/common/spyEvents/EventBridgeSpyEvent.d.mts +9 -0
  42. package/lib/common/spyEvents/EventBridgeSpyEvent.d.ts +8 -3
  43. package/lib/common/spyEvents/EventBridgeSpyEvent.js +0 -3
  44. package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +1 -2
  45. package/lib/common/spyEvents/FunctionBaseSpyEvent.d.mts +11 -0
  46. package/lib/common/spyEvents/FunctionBaseSpyEvent.d.ts +10 -5
  47. package/lib/common/spyEvents/FunctionBaseSpyEvent.js +0 -3
  48. package/lib/common/spyEvents/FunctionBaseSpyEvent.mjs +1 -2
  49. package/lib/common/spyEvents/FunctionConsole.d.mts +10 -0
  50. package/lib/common/spyEvents/FunctionConsole.d.ts +9 -5
  51. package/lib/common/spyEvents/FunctionConsole.js +0 -3
  52. package/lib/common/spyEvents/FunctionConsole.mjs +1 -2
  53. package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.mts +11 -0
  54. package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.ts +10 -5
  55. package/lib/common/spyEvents/FunctionConsoleSpyEvent.js +0 -3
  56. package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +1 -2
  57. package/lib/common/spyEvents/FunctionContext.d.mts +12 -0
  58. package/lib/common/spyEvents/FunctionContext.d.ts +11 -6
  59. package/lib/common/spyEvents/FunctionContext.js +0 -3
  60. package/lib/common/spyEvents/FunctionContext.mjs +1 -2
  61. package/lib/common/spyEvents/FunctionErrorSpyEvent.d.mts +13 -0
  62. package/lib/common/spyEvents/FunctionErrorSpyEvent.d.ts +12 -7
  63. package/lib/common/spyEvents/FunctionErrorSpyEvent.js +0 -3
  64. package/lib/common/spyEvents/FunctionErrorSpyEvent.mjs +1 -2
  65. package/lib/common/spyEvents/FunctionRequestSpyEvent.d.mts +12 -0
  66. package/lib/common/spyEvents/FunctionRequestSpyEvent.d.ts +11 -6
  67. package/lib/common/spyEvents/FunctionRequestSpyEvent.js +0 -3
  68. package/lib/common/spyEvents/FunctionRequestSpyEvent.mjs +1 -2
  69. package/lib/common/spyEvents/FunctionResponseSpyEvent.d.mts +10 -0
  70. package/lib/common/spyEvents/FunctionResponseSpyEvent.d.ts +9 -4
  71. package/lib/common/spyEvents/FunctionResponseSpyEvent.js +0 -3
  72. package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +1 -2
  73. package/lib/common/spyEvents/S3SpyEvent.d.mts +13 -0
  74. package/lib/common/spyEvents/S3SpyEvent.d.ts +12 -7
  75. package/lib/common/spyEvents/S3SpyEvent.js +0 -3
  76. package/lib/common/spyEvents/S3SpyEvent.mjs +1 -2
  77. package/lib/common/spyEvents/SnsSpyEventBase.d.mts +15 -0
  78. package/lib/common/spyEvents/SnsSpyEventBase.d.ts +14 -9
  79. package/lib/common/spyEvents/SnsSpyEventBase.js +0 -3
  80. package/lib/common/spyEvents/SnsSpyEventBase.mjs +1 -2
  81. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.mts +9 -0
  82. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.ts +8 -3
  83. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.js +0 -3
  84. package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +1 -2
  85. package/lib/common/spyEvents/SnsTopicSpyEvent.d.mts +9 -0
  86. package/lib/common/spyEvents/SnsTopicSpyEvent.d.ts +8 -3
  87. package/lib/common/spyEvents/SnsTopicSpyEvent.js +0 -3
  88. package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +1 -2
  89. package/lib/common/spyEvents/SpyEvent.d.mts +7 -0
  90. package/lib/common/spyEvents/SpyEvent.d.ts +6 -2
  91. package/lib/common/spyEvents/SpyEvent.js +0 -3
  92. package/lib/common/spyEvents/SpyEvent.mjs +1 -2
  93. package/lib/common/spyEvents/SpyMessage.d.mts +11 -0
  94. package/lib/common/spyEvents/SpyMessage.d.ts +10 -5
  95. package/lib/common/spyEvents/SpyMessage.js +0 -3
  96. package/lib/common/spyEvents/SpyMessage.mjs +1 -2
  97. package/lib/common/spyEvents/SqsSpyEvent.d.mts +12 -0
  98. package/lib/common/spyEvents/SqsSpyEvent.d.ts +11 -6
  99. package/lib/common/spyEvents/SqsSpyEvent.js +0 -3
  100. package/lib/common/spyEvents/SqsSpyEvent.mjs +1 -2
  101. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +2 -2
  102. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +2 -2
  103. package/lib/functions/onConnect.d.mts +1 -0
  104. package/lib/functions/onConnect.d.ts +1 -1
  105. package/lib/functions/onConnect.js +28 -26
  106. package/lib/functions/onConnect.js.map +1 -0
  107. package/lib/functions/onConnect.mjs +35 -26
  108. package/lib/functions/onConnect.mjs.map +1 -0
  109. package/lib/functions/onDisconnect.d.mts +10 -0
  110. package/lib/functions/onDisconnect.d.ts +9 -4
  111. package/lib/functions/onDisconnect.js +28 -27
  112. package/lib/functions/onDisconnect.js.map +1 -0
  113. package/lib/functions/onDisconnect.mjs +29 -25
  114. package/lib/functions/onDisconnect.mjs.map +1 -0
  115. package/lib/functions/sendMessage.d.mts +8 -0
  116. package/lib/functions/sendMessage.d.ts +7 -3
  117. package/lib/functions/sendMessage.js +26 -21
  118. package/lib/functions/sendMessage.js.map +1 -0
  119. package/lib/functions/sendMessage.mjs +28 -19
  120. package/lib/functions/sendMessage.mjs.map +1 -0
  121. package/lib/functions/sqsSubscriptionAndDropAllMessages.d.mts +5 -0
  122. package/lib/functions/sqsSubscriptionAndDropAllMessages.d.ts +5 -1
  123. package/lib/functions/sqsSubscriptionAndDropAllMessages.js +6 -5
  124. package/lib/functions/sqsSubscriptionAndDropAllMessages.js.map +1 -0
  125. package/lib/functions/sqsSubscriptionAndDropAllMessages.mjs +7 -3
  126. package/lib/functions/sqsSubscriptionAndDropAllMessages.mjs.map +1 -0
  127. package/lib/index.d.mts +4 -0
  128. package/lib/index.d.ts +4 -2
  129. package/lib/index.js +6 -19
  130. package/lib/index.mjs +5 -3
  131. package/lib/listener/PrettifyForDisplay.d.mts +5 -0
  132. package/lib/listener/PrettifyForDisplay.d.ts +5 -3
  133. package/lib/listener/PrettifyForDisplay.js +0 -3
  134. package/lib/listener/PrettifyForDisplay.mjs +1 -2
  135. package/lib/listener/RecursivePartial.d.mts +7 -0
  136. package/lib/listener/RecursivePartial.d.ts +7 -4
  137. package/lib/listener/RecursivePartial.js +0 -3
  138. package/lib/listener/RecursivePartial.mjs +1 -2
  139. package/lib/listener/ServerlessSpyListener.d.mts +23 -0
  140. package/lib/listener/ServerlessSpyListener.d.ts +22 -42
  141. package/lib/listener/ServerlessSpyListener.js +0 -3
  142. package/lib/listener/ServerlessSpyListener.mjs +1 -2
  143. package/lib/listener/ServerlessSpyListenerParams.d.mts +14 -0
  144. package/lib/listener/ServerlessSpyListenerParams.d.ts +13 -8
  145. package/lib/listener/ServerlessSpyListenerParams.js +0 -3
  146. package/lib/listener/ServerlessSpyListenerParams.mjs +1 -2
  147. package/lib/listener/SpyHandlers.ts.d.mts +158 -0
  148. package/lib/listener/SpyHandlers.ts.d.ts +144 -144
  149. package/lib/listener/SpyHandlers.ts.js +0 -3
  150. package/lib/listener/SpyHandlers.ts.mjs +1 -2
  151. package/lib/listener/WaitForParams.d.mts +10 -0
  152. package/lib/listener/WaitForParams.d.ts +9 -4
  153. package/lib/listener/WaitForParams.js +0 -3
  154. package/lib/listener/WaitForParams.mjs +1 -2
  155. package/lib/listener/WsListener.d.mts +27 -0
  156. package/lib/listener/WsListener.d.ts +26 -21
  157. package/lib/listener/WsListener.js +173 -231
  158. package/lib/listener/WsListener.js.map +1 -0
  159. package/lib/listener/WsListener.mjs +174 -228
  160. package/lib/listener/WsListener.mjs.map +1 -0
  161. package/lib/listener/createServerlessSpyListener.d.mts +8 -0
  162. package/lib/listener/createServerlessSpyListener.d.ts +8 -2
  163. package/lib/listener/createServerlessSpyListener.js +25 -25
  164. package/lib/listener/createServerlessSpyListener.js.map +1 -0
  165. package/lib/listener/createServerlessSpyListener.mjs +26 -23
  166. package/lib/listener/createServerlessSpyListener.mjs.map +1 -0
  167. package/lib/listener/index.d.mts +3 -0
  168. package/lib/listener/index.d.ts +3 -2
  169. package/lib/listener/index.js +3 -19
  170. package/lib/listener/index.mjs +3 -3
  171. package/lib/listener/iot-connection.d.mts +13 -0
  172. package/lib/listener/iot-connection.d.ts +12 -7
  173. package/lib/listener/iot-connection.js +48 -46
  174. package/lib/listener/iot-connection.js.map +1 -0
  175. package/lib/listener/iot-connection.mjs +46 -44
  176. package/lib/listener/iot-connection.mjs.map +1 -0
  177. package/lib/listener/matchers.d.mts +1 -0
  178. package/lib/listener/matchers.d.ts +1 -0
  179. package/lib/listener/matchers.js +0 -55
  180. package/lib/listener/matchers.mjs +1 -55
  181. package/lib/listener/setup.d.mts +1 -0
  182. package/lib/listener/setup.d.ts +1 -0
  183. package/lib/listener/setup.js +0 -21
  184. package/lib/listener/setup.mjs +1 -21
  185. package/lib/listener/topic.d.mts +6 -0
  186. package/lib/listener/topic.d.ts +6 -2
  187. package/lib/listener/topic.js +9 -7
  188. package/lib/listener/topic.js.map +1 -0
  189. package/lib/listener/topic.mjs +8 -4
  190. package/lib/listener/topic.mjs.map +1 -0
  191. package/lib/node_modules/tsdown/esm-shims.mjs +11 -0
  192. package/lib/node_modules/tsdown/esm-shims.mjs.map +1 -0
  193. package/lib/node_modules/uuid/dist/esm-node/native.js +10 -0
  194. package/lib/node_modules/uuid/dist/esm-node/native.js.map +1 -0
  195. package/lib/node_modules/uuid/dist/esm-node/native.mjs +8 -0
  196. package/lib/node_modules/uuid/dist/esm-node/native.mjs.map +1 -0
  197. package/lib/node_modules/uuid/dist/esm-node/rng.js +18 -0
  198. package/lib/node_modules/uuid/dist/esm-node/rng.js.map +1 -0
  199. package/lib/node_modules/uuid/dist/esm-node/rng.mjs +16 -0
  200. package/lib/node_modules/uuid/dist/esm-node/rng.mjs.map +1 -0
  201. package/lib/node_modules/uuid/dist/esm-node/stringify.js +15 -0
  202. package/lib/node_modules/uuid/dist/esm-node/stringify.js.map +1 -0
  203. package/lib/node_modules/uuid/dist/esm-node/stringify.mjs +14 -0
  204. package/lib/node_modules/uuid/dist/esm-node/stringify.mjs.map +1 -0
  205. package/lib/node_modules/uuid/dist/esm-node/v4.js +23 -0
  206. package/lib/node_modules/uuid/dist/esm-node/v4.js.map +1 -0
  207. package/lib/node_modules/uuid/dist/esm-node/v4.mjs +23 -0
  208. package/lib/node_modules/uuid/dist/esm-node/v4.mjs.map +1 -0
  209. package/lib/src/ServerlessSpy.d.mts +77 -0
  210. package/lib/src/ServerlessSpy.js +1 -1
  211. package/lib/src/ServerlessSpy.js.map +1 -0
  212. package/lib/src/ServerlessSpy.mjs +441 -618
  213. package/lib/src/ServerlessSpy.mjs.map +1 -0
  214. package/lib/src/common/envVariableNames.d.mts +35 -0
  215. package/lib/src/common/envVariableNames.js.map +1 -0
  216. package/lib/src/common/envVariableNames.mjs +43 -35
  217. package/lib/src/common/envVariableNames.mjs.map +1 -0
  218. package/lib/src/index.d.mts +2 -0
  219. package/lib/src/index.mjs +3 -2
  220. package/node_modules/debug/package.json +2 -3
  221. package/node_modules/debug/src/browser.js +1 -1
  222. package/node_modules/debug/src/common.js +1 -1
  223. package/package.json +2 -1
  224. package/tsdown.config.ts +16 -0
@@ -1,232 +1,174 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WsListener = void 0;
4
- const iot_connection_1 = require("./iot-connection");
5
- const topic_1 = require("./topic");
6
- class WsListener {
7
- constructor() {
8
- this.messages = [];
9
- this.trackers = [];
10
- this.closed = true;
11
- this.functionPrefix = 'waitFor';
12
- this.debugMode = false;
13
- this.fragments = new Map();
14
- }
15
- async start(params) {
16
- this.debugMode = !!params.debugMode;
17
- try {
18
- this.connection = await (0, iot_connection_1.getConnection)(this.debugMode, params.serverlessSpyWsUrl);
19
- this.closed = false;
20
- const topic = (0, topic_1.getTopic)(params.scope || '#');
21
- this.log(`Subscribing to topic ${topic}`);
22
- const connectionOpenResolve = this.connectionOpenResolve || params.connectionOpenResolve;
23
- const localConnection = this.connection;
24
- this.connection.on('connect', () => {
25
- this.closed = false;
26
- this.log('Connection opened');
27
- localConnection.subscribe(topic);
28
- if (connectionOpenResolve) {
29
- connectionOpenResolve();
30
- }
31
- });
32
- this.connection.on('message', (_topic, data) => {
33
- if (this.closed)
34
- return;
35
- this.log('Message received', data.toString());
36
- const fragment = JSON.parse(data.toString());
37
- let message = undefined;
38
- if (!fragment.id) {
39
- message = JSON.parse(fragment.data);
40
- }
41
- let pending = this.fragments.get(fragment.id);
42
- if (!pending) {
43
- pending = new Map();
44
- this.fragments.set(fragment.id, pending);
45
- }
46
- pending.set(fragment.index, fragment);
47
- if (pending.size === fragment.count) {
48
- const data = [...pending.values()]
49
- .sort((a, b) => a.index - b.index)
50
- .map((item) => item.data)
51
- .join('');
52
- this.fragments.delete(fragment.id);
53
- message = JSON.parse(data);
54
- }
55
- if (message) {
56
- message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
57
- if (message.serviceKey.startsWith('Function')) {
58
- message.functionContextAwsRequestId = message.data.context.awsRequestId;
59
- }
60
- this.messages.push(message);
61
- this.resolveOldTrackerWithNewMessage(message);
62
- }
63
- });
64
- this.connection.on('close', () => {
65
- this.log('Connection closed');
66
- this.closed = true;
67
- });
68
- const connectionOpenReject = this.connectionOpenReject || params.connectionOpenReject;
69
- this.connection.on('error', (error) => {
70
- this.log('Connection error:', error);
71
- connectionOpenReject?.(error);
72
- });
73
- }
74
- catch (e) {
75
- console.error('Failed to get connection', e);
76
- throw e;
77
- }
78
- }
79
- async stop() {
80
- this.closed = true;
81
- this.connection.end(true);
82
- }
83
- trackerMatchMessage(tracker, message) {
84
- if (tracker.finished)
85
- return;
86
- if ((tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||
87
- (tracker.serviceKeyForFunction &&
88
- tracker.serviceKeyForFunction === message.serviceKeyForFunction)) {
89
- if (this.trackerMatchCondition(tracker, message)) {
90
- tracker.finished = true;
91
- const spyAndJestMatchers = {
92
- getData: () => message.data,
93
- };
94
- const serviceKeyForFunction = tracker.serviceKeyForFunction;
95
- if (serviceKeyForFunction &&
96
- serviceKeyForFunction.startsWith('Function') &&
97
- (serviceKeyForFunction.endsWith('Request') ||
98
- serviceKeyForFunction.endsWith('Console'))) {
99
- let serviceKeyForFunctionChain = serviceKeyForFunction;
100
- if (serviceKeyForFunctionChain.endsWith('Request')) {
101
- serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(0, serviceKeyForFunctionChain.length - 'Request'.length);
102
- }
103
- else if (serviceKeyForFunctionChain.endsWith('Console')) {
104
- serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(0, serviceKeyForFunctionChain.length - 'Console'.length);
105
- }
106
- spyAndJestMatchers.followedByConsole = (paramsW) => {
107
- return this.createWaitForXXXFunc(`${serviceKeyForFunctionChain}Console`, message.data.context.awsRequestId)(paramsW);
108
- };
109
- spyAndJestMatchers.followedByResponse = (paramsW) => {
110
- return this.createWaitForXXXFunc(`${serviceKeyForFunctionChain}Response`, message.data.context.awsRequestId)(paramsW);
111
- };
112
- }
113
- const proxy = new Proxy(spyAndJestMatchers, {
114
- get: function (target, objectKey) {
115
- if (target.hasOwnProperty(objectKey)) {
116
- return target[objectKey];
117
- }
118
- else if (objectKey !== 'then') {
119
- return function () {
120
- const jestFunctionToExecute = expect(message.data)[objectKey];
121
- jestFunctionToExecute.apply(undefined, arguments);
122
- return proxy;
123
- };
124
- }
125
- },
126
- });
127
- tracker.promiseResolve(proxy);
128
- return true;
129
- }
130
- }
131
- return false;
132
- }
133
- resolveTrackerInOldMessages(tracker) {
134
- for (const message of this.messages) {
135
- if (this.trackerMatchMessage(tracker, message)) {
136
- return true;
137
- }
138
- }
139
- return false;
140
- }
141
- resolveOldTrackerWithNewMessage(message) {
142
- for (let index = 0; index < this.trackers.length; index++) {
143
- const tracker = this.trackers[index];
144
- if (this.trackerMatchMessage(tracker, message)) {
145
- this.trackers = this.trackers.splice(index, 1);
146
- return true;
147
- }
148
- }
149
- return false;
150
- }
151
- trackerMatchCondition(tracker, message) {
152
- const matchCondition = (tracker.condition && tracker.condition(message.data)) ||
153
- !tracker.condition;
154
- const matchRequestId = (tracker.functionContextAwsRequestId &&
155
- tracker.functionContextAwsRequestId ===
156
- message.functionContextAwsRequestId) ||
157
- !tracker.functionContextAwsRequestId;
158
- if (matchCondition && matchRequestId) {
159
- return true;
160
- }
161
- else {
162
- if (!matchCondition &&
163
- matchRequestId &&
164
- !tracker.possibleSpyMessageDataForDebugging) {
165
- tracker.possibleSpyMessageDataForDebugging = message.data;
166
- }
167
- return false;
168
- }
169
- }
170
- createWaitForXXXFunc(serviceKeyForFunction, functionContextAwsRequestId) {
171
- return (paramsW) => {
172
- let resolve;
173
- const promise = new Promise((res) => {
174
- resolve = res;
175
- });
176
- const tracker = {
177
- finished: false,
178
- // @ts-ignore
179
- promiseResolve: resolve,
180
- serviceKeyForFunction,
181
- functionContextAwsRequestId,
182
- };
183
- tracker.condition = paramsW?.condition;
184
- let timeoutPid;
185
- const timer = new Promise((_, reject) => {
186
- timeoutPid = setTimeout(() => {
187
- if (tracker.finished)
188
- return;
189
- tracker.finished = true;
190
- let message = `Timeout waiting for Serverless Spy message ${serviceKeyForFunction}.`;
191
- if (tracker.possibleSpyMessageDataForDebugging) {
192
- message += ` Similar matching spy event data: ${JSON.stringify(tracker.possibleSpyMessageDataForDebugging, null, 2)}`;
193
- }
194
- reject(new Error(message));
195
- }, paramsW?.timoutMs || 10000);
196
- });
197
- if (!this.resolveTrackerInOldMessages(tracker)) {
198
- this.trackers.push(tracker);
199
- }
200
- return Promise.race([promise, timer]).finally(() => {
201
- if (!!timeoutPid) {
202
- clearTimeout(timeoutPid);
203
- }
204
- });
205
- };
206
- }
207
- createProxy() {
208
- const spyListener = {};
209
- spyListener.stop = async () => {
210
- await this.stop();
211
- };
212
- return new Proxy(spyListener, {
213
- get: (target, objectKey) => {
214
- if (target.hasOwnProperty(objectKey)) {
215
- return target[objectKey].bind(target);
216
- }
217
- else if (typeof objectKey === 'string' &&
218
- objectKey.startsWith(this.functionPrefix)) {
219
- const serviceKeyForFunction = objectKey.substring(this.functionPrefix.length);
220
- return this.createWaitForXXXFunc(serviceKeyForFunction);
221
- }
222
- },
223
- });
224
- }
225
- log(message, ...optionalParams) {
226
- if (this.debugMode && !this.closed) {
227
- console.debug('SSPY', message, new Date().toISOString(), ...optionalParams);
228
- }
229
- }
230
- }
1
+ const require_listener_iot_connection = require('./iot-connection.js');
2
+ const require_listener_topic = require('./topic.js');
3
+
4
+ //#region listener/WsListener.ts
5
+ var WsListener = class {
6
+ constructor() {
7
+ this.messages = [];
8
+ this.trackers = [];
9
+ this.closed = true;
10
+ this.functionPrefix = "waitFor";
11
+ this.debugMode = false;
12
+ this.fragments = /* @__PURE__ */ new Map();
13
+ }
14
+ async start(params) {
15
+ this.debugMode = !!params.debugMode;
16
+ try {
17
+ this.connection = await require_listener_iot_connection.getConnection(this.debugMode, params.serverlessSpyWsUrl);
18
+ this.closed = false;
19
+ const topic = require_listener_topic.getTopic(params.scope || "#");
20
+ this.log(`Subscribing to topic ${topic}`);
21
+ const connectionOpenResolve = this.connectionOpenResolve || params.connectionOpenResolve;
22
+ const localConnection = this.connection;
23
+ this.connection.on("connect", () => {
24
+ this.closed = false;
25
+ this.log("Connection opened");
26
+ localConnection.subscribe(topic);
27
+ if (connectionOpenResolve) connectionOpenResolve();
28
+ });
29
+ this.connection.on("message", (_topic, data) => {
30
+ if (this.closed) return;
31
+ this.log("Message received", data.toString());
32
+ const fragment = JSON.parse(data.toString());
33
+ let message = void 0;
34
+ if (!fragment.id) message = JSON.parse(fragment.data);
35
+ let pending = this.fragments.get(fragment.id);
36
+ if (!pending) {
37
+ pending = /* @__PURE__ */ new Map();
38
+ this.fragments.set(fragment.id, pending);
39
+ }
40
+ pending.set(fragment.index, fragment);
41
+ if (pending.size === fragment.count) {
42
+ const data$1 = [...pending.values()].sort((a, b) => a.index - b.index).map((item) => item.data).join("");
43
+ this.fragments.delete(fragment.id);
44
+ message = JSON.parse(data$1);
45
+ }
46
+ if (message) {
47
+ message.serviceKeyForFunction = message.serviceKey.replace(/#/g, "");
48
+ if (message.serviceKey.startsWith("Function")) message.functionContextAwsRequestId = message.data.context.awsRequestId;
49
+ this.messages.push(message);
50
+ this.resolveOldTrackerWithNewMessage(message);
51
+ }
52
+ });
53
+ this.connection.on("close", () => {
54
+ this.log("Connection closed");
55
+ this.closed = true;
56
+ });
57
+ const connectionOpenReject = this.connectionOpenReject || params.connectionOpenReject;
58
+ this.connection.on("error", (error) => {
59
+ this.log("Connection error:", error);
60
+ connectionOpenReject?.(error);
61
+ });
62
+ } catch (e) {
63
+ console.error("Failed to get connection", e);
64
+ throw e;
65
+ }
66
+ }
67
+ async stop() {
68
+ this.closed = true;
69
+ this.connection.end(true);
70
+ }
71
+ trackerMatchMessage(tracker, message) {
72
+ if (tracker.finished) return;
73
+ if (tracker.serviceKey && tracker.serviceKey === message.serviceKey || tracker.serviceKeyForFunction && tracker.serviceKeyForFunction === message.serviceKeyForFunction) {
74
+ if (this.trackerMatchCondition(tracker, message)) {
75
+ tracker.finished = true;
76
+ const spyAndJestMatchers = { getData: () => message.data };
77
+ const serviceKeyForFunction = tracker.serviceKeyForFunction;
78
+ if (serviceKeyForFunction && serviceKeyForFunction.startsWith("Function") && (serviceKeyForFunction.endsWith("Request") || serviceKeyForFunction.endsWith("Console"))) {
79
+ let serviceKeyForFunctionChain = serviceKeyForFunction;
80
+ if (serviceKeyForFunctionChain.endsWith("Request")) serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(0, serviceKeyForFunctionChain.length - 7);
81
+ else if (serviceKeyForFunctionChain.endsWith("Console")) serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(0, serviceKeyForFunctionChain.length - 7);
82
+ spyAndJestMatchers.followedByConsole = (paramsW) => {
83
+ return this.createWaitForXXXFunc(`${serviceKeyForFunctionChain}Console`, message.data.context.awsRequestId)(paramsW);
84
+ };
85
+ spyAndJestMatchers.followedByResponse = (paramsW) => {
86
+ return this.createWaitForXXXFunc(`${serviceKeyForFunctionChain}Response`, message.data.context.awsRequestId)(paramsW);
87
+ };
88
+ }
89
+ const proxy = new Proxy(spyAndJestMatchers, { get: function(target, objectKey) {
90
+ if (target.hasOwnProperty(objectKey)) return target[objectKey];
91
+ else if (objectKey !== "then") return function() {
92
+ expect(message.data)[objectKey].apply(void 0, arguments);
93
+ return proxy;
94
+ };
95
+ } });
96
+ tracker.promiseResolve(proxy);
97
+ return true;
98
+ }
99
+ }
100
+ return false;
101
+ }
102
+ resolveTrackerInOldMessages(tracker) {
103
+ for (const message of this.messages) if (this.trackerMatchMessage(tracker, message)) return true;
104
+ return false;
105
+ }
106
+ resolveOldTrackerWithNewMessage(message) {
107
+ for (let index = 0; index < this.trackers.length; index++) {
108
+ const tracker = this.trackers[index];
109
+ if (this.trackerMatchMessage(tracker, message)) {
110
+ this.trackers = this.trackers.splice(index, 1);
111
+ return true;
112
+ }
113
+ }
114
+ return false;
115
+ }
116
+ trackerMatchCondition(tracker, message) {
117
+ const matchCondition = tracker.condition && tracker.condition(message.data) || !tracker.condition;
118
+ const matchRequestId = tracker.functionContextAwsRequestId && tracker.functionContextAwsRequestId === message.functionContextAwsRequestId || !tracker.functionContextAwsRequestId;
119
+ if (matchCondition && matchRequestId) return true;
120
+ else {
121
+ if (!matchCondition && matchRequestId && !tracker.possibleSpyMessageDataForDebugging) tracker.possibleSpyMessageDataForDebugging = message.data;
122
+ return false;
123
+ }
124
+ }
125
+ createWaitForXXXFunc(serviceKeyForFunction, functionContextAwsRequestId) {
126
+ return (paramsW) => {
127
+ let resolve;
128
+ const promise = new Promise((res) => {
129
+ resolve = res;
130
+ });
131
+ const tracker = {
132
+ finished: false,
133
+ promiseResolve: resolve,
134
+ serviceKeyForFunction,
135
+ functionContextAwsRequestId
136
+ };
137
+ tracker.condition = paramsW?.condition;
138
+ let timeoutPid;
139
+ const timer = new Promise((_, reject) => {
140
+ timeoutPid = setTimeout(() => {
141
+ if (tracker.finished) return;
142
+ tracker.finished = true;
143
+ let message = `Timeout waiting for Serverless Spy message ${serviceKeyForFunction}.`;
144
+ if (tracker.possibleSpyMessageDataForDebugging) message += ` Similar matching spy event data: ${JSON.stringify(tracker.possibleSpyMessageDataForDebugging, null, 2)}`;
145
+ reject(new Error(message));
146
+ }, paramsW?.timoutMs || 1e4);
147
+ });
148
+ if (!this.resolveTrackerInOldMessages(tracker)) this.trackers.push(tracker);
149
+ return Promise.race([promise, timer]).finally(() => {
150
+ if (!!timeoutPid) clearTimeout(timeoutPid);
151
+ });
152
+ };
153
+ }
154
+ createProxy() {
155
+ const spyListener = {};
156
+ spyListener.stop = async () => {
157
+ await this.stop();
158
+ };
159
+ return new Proxy(spyListener, { get: (target, objectKey) => {
160
+ if (target.hasOwnProperty(objectKey)) return target[objectKey].bind(target);
161
+ else if (typeof objectKey === "string" && objectKey.startsWith(this.functionPrefix)) {
162
+ const serviceKeyForFunction = objectKey.substring(this.functionPrefix.length);
163
+ return this.createWaitForXXXFunc(serviceKeyForFunction);
164
+ }
165
+ } });
166
+ }
167
+ log(message, ...optionalParams) {
168
+ if (this.debugMode && !this.closed) console.debug("SSPY", message, (/* @__PURE__ */ new Date()).toISOString(), ...optionalParams);
169
+ }
170
+ };
171
+
172
+ //#endregion
231
173
  exports.WsListener = WsListener;
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV3NMaXN0ZW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpc3RlbmVyL1dzTGlzdGVuZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQTJEO0FBRzNELG1DQUFtQztBQUtuQyxNQUFhLFVBQVU7SUFBdkI7UUFDVSxhQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUNuQyxhQUFRLEdBQWMsRUFBRSxDQUFDO1FBSXpCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxtQkFBYyxHQUFHLFNBQVMsQ0FBQztRQUMzQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQW1TL0QsQ0FBQztJQWpTUSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQW1DO1FBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLElBQUEsOEJBQWEsRUFDbkMsSUFBSSxDQUFDLFNBQVMsRUFDZCxNQUFNLENBQUMsa0JBQWtCLENBQzFCLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFRLEVBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLHdCQUF3QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLE1BQU0scUJBQXFCLEdBQ3pCLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxNQUFNLENBQUMscUJBQXFCLENBQUM7WUFDN0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtB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QUcsQ0FBQyxPQUFlLEVBQUUsR0FBRyxjQUFxQjtRQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkMsT0FBTyxDQUFDLEtBQUssQ0FDWCxNQUFNLEVBQ04sT0FBTyxFQUNQLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQ3hCLEdBQUcsY0FBYyxDQUNsQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTlTRCxnQ0E4U0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXZpY2UgfSBmcm9tICdhd3MtaW90LWRldmljZS1zZGsnO1xuaW1wb3J0IHsgZnJhZ21lbnQsIGdldENvbm5lY3Rpb24gfSBmcm9tICcuL2lvdC1jb25uZWN0aW9uJztcbmltcG9ydCB7IFNlcnZlcmxlc3NTcHlMaXN0ZW5lciB9IGZyb20gJy4vU2VydmVybGVzc1NweUxpc3RlbmVyJztcbmltcG9ydCB7IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyB9IGZyb20gJy4vU2VydmVybGVzc1NweUxpc3RlbmVyUGFyYW1zJztcbmltcG9ydCB7IGdldFRvcGljIH0gZnJvbSAnLi90b3BpYyc7XG5pbXBvcnQgeyBXYWl0Rm9yUGFyYW1zIH0gZnJvbSAnLi9XYWl0Rm9yUGFyYW1zJztcbmltcG9ydCB7IEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9GdW5jdGlvblJlcXVlc3RTcHlFdmVudCc7XG5pbXBvcnQgeyBTcHlNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9TcHlNZXNzYWdlJztcblxuZXhwb3J0IGNsYXNzIFdzTGlzdGVuZXI8VFNweUV2ZW50cz4ge1xuICBwcml2YXRlIG1lc3NhZ2VzOiBTcHlNZXNzYWdlU3RvcmFnZVtdID0gW107XG4gIHByaXZhdGUgdHJhY2tlcnM6IFRyYWNrZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgY29ubmVjdGlvbk9wZW5SZXNvbHZlPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uT3BlblJlamVjdD86IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIHByaXZhdGUgY2xvc2VkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBmdW5jdGlvblByZWZpeCA9ICd3YWl0Rm9yJztcbiAgcHJpdmF0ZSBkZWJ1Z01vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uOiBkZXZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBmcmFnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgTWFwPG51bWJlciwgZnJhZ21lbnQ+PigpO1xuXG4gIHB1YmxpYyBhc3luYyBzdGFydChwYXJhbXM6IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcykge1xuICAgIHRoaXMuZGVidWdNb2RlID0gISFwYXJhbXMuZGVidWdNb2RlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24gPSBhd2FpdCBnZXRDb25uZWN0aW9uKFxuICAgICAgICB0aGlzLmRlYnVnTW9kZSxcbiAgICAgICAgcGFyYW1zLnNlcnZlcmxlc3NTcHlXc1VybFxuICAgICAgKTtcbiAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICBjb25zdCB0b3BpYyA9IGdldFRvcGljKHBhcmFtcy5zY29wZSB8fCAnIycpO1xuICAgICAgdGhpcy5sb2coYFN1YnNjcmliaW5nIHRvIHRvcGljICR7dG9waWN9YCk7XG4gICAgICBjb25zdCBjb25uZWN0aW9uT3BlblJlc29sdmUgPVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25PcGVuUmVzb2x2ZSB8fCBwYXJhbXMuY29ubmVjdGlvbk9wZW5SZXNvbHZlO1xuICAgICAgY29uc3QgbG9jYWxDb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uO1xuICAgICAgdGhpcy5jb25uZWN0aW9uLm9uKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvZygnQ29ubmVjdGlvbiBvcGVuZWQnKTtcbiAgICAgICAgbG9jYWxDb25uZWN0aW9uLnN1YnNjcmliZSh0b3BpYyk7XG4gICAgICAgIGlmIChjb25uZWN0aW9uT3BlblJlc29sdmUpIHtcbiAgICAgICAgICBjb25uZWN0aW9uT3BlblJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24ub24oJ21lc3NhZ2UnLCAoX3RvcGljOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmxvZygnTWVzc2FnZSByZWNlaXZlZCcsIGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgICBsZXQgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghZnJhZ21lbnQuaWQpIHtcbiAgICAgICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShmcmFnbWVudC5kYXRhKSBhcyBTcHlNZXNzYWdlU3RvcmFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwZW5kaW5nID0gdGhpcy5mcmFnbWVudHMuZ2V0KGZyYWdtZW50LmlkKTtcbiAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgcGVuZGluZyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLmZyYWdtZW50cy5zZXQoZnJhZ21lbnQuaWQsIHBlbmRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHBlbmRpbmcuc2V0KGZyYWdtZW50LmluZGV4LCBmcmFnbWVudCk7XG5cbiAgICAgICAgaWYgKHBlbmRpbmcuc2l6ZSA9PT0gZnJhZ21lbnQuY291bnQpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gWy4uLnBlbmRpbmcudmFsdWVzKCldXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmRhdGEpXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgICAgdGhpcy5mcmFnbWVudHMuZGVsZXRlKGZyYWdtZW50LmlkKTtcbiAgICAgICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShkYXRhKSBhcyBTcHlNZXNzYWdlU3RvcmFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBtZXNzYWdlLnNlcnZpY2VLZXkucmVwbGFjZSgvIy9nLCAnJyk7XG5cbiAgICAgICAgICBpZiAobWVzc2FnZS5zZXJ2aWNlS2V5LnN0YXJ0c1dpdGgoJ0Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkID0gKFxuICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEgYXMgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnRcbiAgICAgICAgICAgICkuY29udGV4dC5hd3NSZXF1ZXN0SWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZU9sZFRyYWNrZXJXaXRoTmV3TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZygnQ29ubmVjdGlvbiBjbG9zZWQnKTtcblxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29ubmVjdGlvbk9wZW5SZWplY3QgPVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25PcGVuUmVqZWN0IHx8IHBhcmFtcy5jb25uZWN0aW9uT3BlblJlamVjdDtcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2coJ0Nvbm5lY3Rpb24gZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICBjb25uZWN0aW9uT3BlblJlamVjdD8uKGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgY29ubmVjdGlvbicsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5jb25uZWN0aW9uIS5lbmQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlcjogVHJhY2tlciwgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBpZiAodHJhY2tlci5maW5pc2hlZCkgcmV0dXJuO1xuXG4gICAgaWYgKFxuICAgICAgKHRyYWNrZXIuc2VydmljZUtleSAmJiB0cmFja2VyLnNlcnZpY2VLZXkgPT09IG1lc3NhZ2Uuc2VydmljZUtleSkgfHxcbiAgICAgICh0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiAmJlxuICAgICAgICB0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9PT0gbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy50cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdHJhY2tlci5maW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc3B5QW5kSmVzdE1hdGNoZXJzOiBhbnkgPSB7XG4gICAgICAgICAgZ2V0RGF0YTogKCkgPT4gbWVzc2FnZS5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uICYmXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLnN0YXJ0c1dpdGgoJ0Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAoc2VydmljZUtleUZvckZ1bmN0aW9uLmVuZHNXaXRoKCdSZXF1ZXN0JykgfHxcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5lbmRzV2l0aCgnQ29uc29sZScpKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgc2VydmljZUtleUZvckZ1bmN0aW9uQ2hhaW4gPSBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb247XG5cbiAgICAgICAgICBpZiAoc2VydmljZUtleUZvckZ1bmN0aW9uQ2hhaW4uZW5kc1dpdGgoJ1JlcXVlc3QnKSkge1xuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uQ2hhaW4gPSBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25DaGFpbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbkNoYWluLmxlbmd0aCAtICdSZXF1ZXN0Jy5sZW5ndGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25DaGFpbi5lbmRzV2l0aCgnQ29uc29sZScpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25DaGFpbiA9IHNlcnZpY2VLZXlGb3JGdW5jdGlvbkNoYWluLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uQ2hhaW4ubGVuZ3RoIC0gJ0NvbnNvbGUnLmxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzcHlBbmRKZXN0TWF0Y2hlcnMuZm9sbG93ZWRCeUNvbnNvbGUgPSAocGFyYW1zVzogV2FpdEZvclBhcmFtcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlV2FpdEZvclhYWEZ1bmMoXG4gICAgICAgICAgICAgIGAke3NlcnZpY2VLZXlGb3JGdW5jdGlvbkNoYWlufUNvbnNvbGVgLFxuICAgICAgICAgICAgICAobWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50KS5jb250ZXh0LmF3c1JlcXVlc3RJZFxuICAgICAgICAgICAgKShwYXJhbXNXKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc3B5QW5kSmVzdE1hdGNoZXJzLmZvbGxvd2VkQnlSZXNwb25zZSA9IChwYXJhbXNXOiBXYWl0Rm9yUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVXYWl0Rm9yWFhYRnVuYyhcbiAgICAgICAgICAgICAgYCR7c2VydmljZUtleUZvckZ1bmN0aW9uQ2hhaW59UmVzcG9uc2VgLFxuICAgICAgICAgICAgICAobWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50KS5jb250ZXh0LmF3c1JlcXVlc3RJZFxuICAgICAgICAgICAgKShwYXJhbXNXKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5QW5kSmVzdE1hdGNoZXJzLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkgIT09ICd0aGVuJykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGplc3RGdW5jdGlvblRvRXhlY3V0ZSA9IChleHBlY3QobWVzc2FnZS5kYXRhKSBhcyBhbnkpW1xuICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBqZXN0RnVuY3Rpb25Ub0V4ZWN1dGUuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0cmFja2VyLnByb21pc2VSZXNvbHZlKHByb3h5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXI6IFRyYWNrZXIpIHtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdGhpcy5tZXNzYWdlcykge1xuICAgICAgaWYgKHRoaXMudHJhY2tlck1hdGNoTWVzc2FnZSh0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPbGRUcmFja2VyV2l0aE5ld01lc3NhZ2UobWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmFja2Vycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRyYWNrZXIgPSB0aGlzLnRyYWNrZXJzW2luZGV4XTtcbiAgICAgIGlmICh0aGlzLnRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdGhpcy50cmFja2VycyA9IHRoaXMudHJhY2tlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlcjogVHJhY2tlciwgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBjb25zdCBtYXRjaENvbmRpdGlvbiA9XG4gICAgICAodHJhY2tlci5jb25kaXRpb24gJiYgdHJhY2tlci5jb25kaXRpb24obWVzc2FnZS5kYXRhKSkgfHxcbiAgICAgICF0cmFja2VyLmNvbmRpdGlvbjtcblxuICAgIGNvbnN0IG1hdGNoUmVxdWVzdElkID1cbiAgICAgICh0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCAmJlxuICAgICAgICB0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9PT1cbiAgICAgICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCkgfHxcbiAgICAgICF0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZDtcblxuICAgIGlmIChtYXRjaENvbmRpdGlvbiAmJiBtYXRjaFJlcXVlc3RJZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgIW1hdGNoQ29uZGl0aW9uICYmXG4gICAgICAgIG1hdGNoUmVxdWVzdElkICYmXG4gICAgICAgICF0cmFja2VyLnBvc3NpYmxlU3B5TWVzc2FnZURhdGFGb3JEZWJ1Z2dpbmdcbiAgICAgICkge1xuICAgICAgICB0cmFja2VyLnBvc3NpYmxlU3B5TWVzc2FnZURhdGFGb3JEZWJ1Z2dpbmcgPSBtZXNzYWdlLmRhdGE7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhcbiAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb246IHN0cmluZyxcbiAgICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIChwYXJhbXNXPzogV2FpdEZvclBhcmFtcykgPT4ge1xuICAgICAgbGV0IHJlc29sdmU6ICh2YWx1ZTogdm9pZCB8IFByb21pc2VMaWtlPGFueT4pID0+IHZvaWQ7XG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgfSk7XG4gICAgICBjb25zdCB0cmFja2VyOiBUcmFja2VyID0ge1xuICAgICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcHJvbWlzZVJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbixcbiAgICAgICAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkLFxuICAgICAgfTtcblxuICAgICAgdHJhY2tlci5jb25kaXRpb24gPSBwYXJhbXNXPy5jb25kaXRpb247XG5cbiAgICAgIGxldCB0aW1lb3V0UGlkOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICB0aW1lb3V0UGlkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRyYWNrZXIuZmluaXNoZWQpIHJldHVybjtcbiAgICAgICAgICB0cmFja2VyLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBUaW1lb3V0IHdhaXRpbmcgZm9yIFNlcnZlcmxlc3MgU3B5IG1lc3NhZ2UgJHtzZXJ2aWNlS2V5Rm9yRnVuY3Rpb259LmA7XG5cbiAgICAgICAgICBpZiAodHJhY2tlci5wb3NzaWJsZVNweU1lc3NhZ2VEYXRhRm9yRGVidWdnaW5nKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IGAgU2ltaWxhciBtYXRjaGluZyBzcHkgZXZlbnQgZGF0YTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgdHJhY2tlci5wb3NzaWJsZVNweU1lc3NhZ2VEYXRhRm9yRGVidWdnaW5nLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApfWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgICAgIH0sIHBhcmFtc1c/LnRpbW91dE1zIHx8IDEwMDAwKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMucmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXIpKSB7XG4gICAgICAgIHRoaXMudHJhY2tlcnMucHVzaCh0cmFja2VyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgdGltZXJdKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKCEhdGltZW91dFBpZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVQcm94eSgpIHtcbiAgICBjb25zdCBzcHlMaXN0ZW5lciA9IHt9IGFzIFNlcnZlcmxlc3NTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPjtcblxuICAgIHNweUxpc3RlbmVyLnN0b3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eTxTZXJ2ZXJsZXNzU3B5TGlzdGVuZXI8VFNweUV2ZW50cz4+KHNweUxpc3RlbmVyLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgb2JqZWN0S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShvYmplY3RLZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldLmJpbmQodGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2Ygb2JqZWN0S2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIG9iamVjdEtleS5zdGFydHNXaXRoKHRoaXMuZnVuY3Rpb25QcmVmaXgpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IG9iamVjdEtleS5zdWJzdHJpbmcoXG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9uUHJlZml4Lmxlbmd0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVXYWl0Rm9yWFhYRnVuYyhzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICBpZiAodGhpcy5kZWJ1Z01vZGUgJiYgIXRoaXMuY2xvc2VkKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAnU1NQWScsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgLi4ub3B0aW9uYWxQYXJhbXNcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbnR5cGUgVHJhY2tlciA9IHtcbiAgcHJvbWlzZVJlc29sdmU6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIGZpbmlzaGVkOiBib29sZWFuO1xuICBzZXJ2aWNlS2V5Pzogc3RyaW5nO1xuICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24/OiBzdHJpbmc7XG4gIGNvbmRpdGlvbj86IChkYXRhOiBhbnkpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIHBvc3NpYmxlU3B5TWVzc2FnZURhdGFGb3JEZWJ1Z2dpbmc/OiBhbnk7XG59O1xuXG50eXBlIFNweU1lc3NhZ2VTdG9yYWdlID0gU3B5TWVzc2FnZSAmIHtcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZztcbn07XG4iXX0=
174
+ //# sourceMappingURL=WsListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WsListener.js","names":["getConnection","getTopic","message: SpyMessageStorage | undefined","data","spyAndJestMatchers: any","resolve: (value: void | PromiseLike<any>) => void","tracker: Tracker","timeoutPid: NodeJS.Timeout | undefined"],"sources":["../../listener/WsListener.ts"],"sourcesContent":["import { device } from 'aws-iot-device-sdk';\nimport { fragment, getConnection } from './iot-connection';\nimport { ServerlessSpyListener } from './ServerlessSpyListener';\nimport { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams';\nimport { getTopic } from './topic';\nimport { WaitForParams } from './WaitForParams';\nimport { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';\nimport { SpyMessage } from '../common/spyEvents/SpyMessage';\n\nexport class WsListener<TSpyEvents> {\n private messages: SpyMessageStorage[] = [];\n private trackers: Tracker[] = [];\n\n private connectionOpenResolve?: () => void;\n private connectionOpenReject?: (reason?: any) => void;\n private closed = true;\n private functionPrefix = 'waitFor';\n private debugMode = false;\n private connection: device | undefined;\n\n private fragments = new Map<string, Map<number, fragment>>();\n\n public async start(params: ServerlessSpyListenerParams) {\n this.debugMode = !!params.debugMode;\n try {\n this.connection = await getConnection(\n this.debugMode,\n params.serverlessSpyWsUrl\n );\n this.closed = false;\n const topic = getTopic(params.scope || '#');\n this.log(`Subscribing to topic ${topic}`);\n const connectionOpenResolve =\n this.connectionOpenResolve || params.connectionOpenResolve;\n const localConnection = this.connection;\n this.connection.on('connect', () => {\n this.closed = false;\n this.log('Connection opened');\n localConnection.subscribe(topic);\n if (connectionOpenResolve) {\n connectionOpenResolve();\n }\n });\n this.connection.on('message', (_topic: string, data: Buffer) => {\n if (this.closed) return;\n\n this.log('Message received', data.toString());\n const fragment = JSON.parse(data.toString());\n let message: SpyMessageStorage | undefined = undefined;\n if (!fragment.id) {\n message = JSON.parse(fragment.data) as SpyMessageStorage;\n }\n\n let pending = this.fragments.get(fragment.id);\n if (!pending) {\n pending = new Map();\n this.fragments.set(fragment.id, pending);\n }\n pending.set(fragment.index, fragment);\n\n if (pending.size === fragment.count) {\n const data = [...pending.values()]\n .sort((a, b) => a.index - b.index)\n .map((item) => item.data)\n .join('');\n this.fragments.delete(fragment.id);\n message = JSON.parse(data) as SpyMessageStorage;\n }\n\n if (message) {\n message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');\n\n if (message.serviceKey.startsWith('Function')) {\n message.functionContextAwsRequestId = (\n message.data as FunctionRequestSpyEvent\n ).context.awsRequestId;\n }\n\n this.messages.push(message);\n this.resolveOldTrackerWithNewMessage(message);\n }\n });\n this.connection.on('close', () => {\n this.log('Connection closed');\n\n this.closed = true;\n });\n\n const connectionOpenReject =\n this.connectionOpenReject || params.connectionOpenReject;\n this.connection.on('error', (error) => {\n this.log('Connection error:', error);\n connectionOpenReject?.(error);\n });\n } catch (e) {\n console.error('Failed to get connection', e);\n throw e;\n }\n }\n\n public async stop() {\n this.closed = true;\n this.connection!.end(true);\n }\n\n private trackerMatchMessage(tracker: Tracker, message: SpyMessageStorage) {\n if (tracker.finished) return;\n\n if (\n (tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||\n (tracker.serviceKeyForFunction &&\n tracker.serviceKeyForFunction === message.serviceKeyForFunction)\n ) {\n if (this.trackerMatchCondition(tracker, message)) {\n tracker.finished = true;\n\n const spyAndJestMatchers: any = {\n getData: () => message.data,\n };\n\n const serviceKeyForFunction = tracker.serviceKeyForFunction;\n if (\n serviceKeyForFunction &&\n serviceKeyForFunction.startsWith('Function') &&\n (serviceKeyForFunction.endsWith('Request') ||\n serviceKeyForFunction.endsWith('Console'))\n ) {\n let serviceKeyForFunctionChain = serviceKeyForFunction;\n\n if (serviceKeyForFunctionChain.endsWith('Request')) {\n serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(\n 0,\n serviceKeyForFunctionChain.length - 'Request'.length\n );\n } else if (serviceKeyForFunctionChain.endsWith('Console')) {\n serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(\n 0,\n serviceKeyForFunctionChain.length - 'Console'.length\n );\n }\n\n spyAndJestMatchers.followedByConsole = (paramsW: WaitForParams) => {\n return this.createWaitForXXXFunc(\n `${serviceKeyForFunctionChain}Console`,\n (message.data as FunctionRequestSpyEvent).context.awsRequestId\n )(paramsW);\n };\n\n spyAndJestMatchers.followedByResponse = (paramsW: WaitForParams) => {\n return this.createWaitForXXXFunc(\n `${serviceKeyForFunctionChain}Response`,\n (message.data as FunctionRequestSpyEvent).context.awsRequestId\n )(paramsW);\n };\n }\n\n const proxy = new Proxy(spyAndJestMatchers, {\n get: function (target: any, objectKey: string) {\n if (target.hasOwnProperty(objectKey)) {\n return target[objectKey];\n } else if (objectKey !== 'then') {\n return function () {\n const jestFunctionToExecute = (expect(message.data) as any)[\n objectKey\n ];\n jestFunctionToExecute.apply(undefined, arguments);\n return proxy;\n };\n }\n },\n });\n\n tracker.promiseResolve(proxy);\n return true;\n }\n }\n return false;\n }\n\n private resolveTrackerInOldMessages(tracker: Tracker) {\n for (const message of this.messages) {\n if (this.trackerMatchMessage(tracker, message)) {\n return true;\n }\n }\n\n return false;\n }\n\n private resolveOldTrackerWithNewMessage(message: SpyMessageStorage) {\n for (let index = 0; index < this.trackers.length; index++) {\n const tracker = this.trackers[index];\n if (this.trackerMatchMessage(tracker, message)) {\n this.trackers = this.trackers.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n private trackerMatchCondition(tracker: Tracker, message: SpyMessageStorage) {\n const matchCondition =\n (tracker.condition && tracker.condition(message.data)) ||\n !tracker.condition;\n\n const matchRequestId =\n (tracker.functionContextAwsRequestId &&\n tracker.functionContextAwsRequestId ===\n message.functionContextAwsRequestId) ||\n !tracker.functionContextAwsRequestId;\n\n if (matchCondition && matchRequestId) {\n return true;\n } else {\n if (\n !matchCondition &&\n matchRequestId &&\n !tracker.possibleSpyMessageDataForDebugging\n ) {\n tracker.possibleSpyMessageDataForDebugging = message.data;\n }\n return false;\n }\n }\n\n private createWaitForXXXFunc(\n serviceKeyForFunction: string,\n functionContextAwsRequestId?: string\n ) {\n return (paramsW?: WaitForParams) => {\n let resolve: (value: void | PromiseLike<any>) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n const tracker: Tracker = {\n finished: false,\n // @ts-ignore\n promiseResolve: resolve,\n serviceKeyForFunction,\n functionContextAwsRequestId,\n };\n\n tracker.condition = paramsW?.condition;\n\n let timeoutPid: NodeJS.Timeout | undefined;\n const timer = new Promise((_, reject) => {\n timeoutPid = setTimeout(() => {\n if (tracker.finished) return;\n tracker.finished = true;\n let message = `Timeout waiting for Serverless Spy message ${serviceKeyForFunction}.`;\n\n if (tracker.possibleSpyMessageDataForDebugging) {\n message += ` Similar matching spy event data: ${JSON.stringify(\n tracker.possibleSpyMessageDataForDebugging,\n null,\n 2\n )}`;\n }\n\n reject(new Error(message));\n }, paramsW?.timoutMs || 10000);\n });\n\n if (!this.resolveTrackerInOldMessages(tracker)) {\n this.trackers.push(tracker);\n }\n\n return Promise.race([promise, timer]).finally(() => {\n if (!!timeoutPid) {\n clearTimeout(timeoutPid);\n }\n });\n };\n }\n\n public createProxy() {\n const spyListener = {} as ServerlessSpyListener<TSpyEvents>;\n\n spyListener.stop = async () => {\n await this.stop();\n };\n\n return new Proxy<ServerlessSpyListener<TSpyEvents>>(spyListener, {\n get: (target: any, objectKey: string) => {\n if (target.hasOwnProperty(objectKey)) {\n return target[objectKey].bind(target);\n } else if (\n typeof objectKey === 'string' &&\n objectKey.startsWith(this.functionPrefix)\n ) {\n const serviceKeyForFunction = objectKey.substring(\n this.functionPrefix.length\n );\n\n return this.createWaitForXXXFunc(serviceKeyForFunction);\n }\n },\n });\n }\n\n private log(message: string, ...optionalParams: any[]) {\n if (this.debugMode && !this.closed) {\n console.debug(\n 'SSPY',\n message,\n new Date().toISOString(),\n ...optionalParams\n );\n }\n }\n}\n\ntype Tracker = {\n promiseResolve: (data: any) => void;\n finished: boolean;\n serviceKey?: string;\n serviceKeyForFunction?: string;\n condition?: (data: any) => boolean;\n timoutMs?: number;\n functionContextAwsRequestId?: string;\n possibleSpyMessageDataForDebugging?: any;\n};\n\ntype SpyMessageStorage = SpyMessage & {\n serviceKeyForFunction: string;\n functionContextAwsRequestId?: string;\n};\n"],"mappings":"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"}