serverless-spy 0.0.33 → 0.0.34
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 +9 -9
- package/common/publishSpyEvent.ts +269 -0
- package/dist/releasetag.txt +1 -1
- package/extension/interceptor.ts +24 -13
- package/functions/onConnect.ts +2 -1
- package/functions/onDisconnect.ts +2 -1
- package/functions/sendMessage.ts +3 -268
- package/lib/common/publishSpyEvent.d.ts +4 -0
- package/lib/common/publishSpyEvent.js +211 -0
- package/lib/common/publishSpyEvent.mjs +205 -0
- package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +13890 -13
- package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +4 -4
- package/lib/listener/{SpyListener.d.ts → ServerlessSpyListener.d.ts} +12 -12
- package/lib/listener/ServerlessSpyListener.js +3 -0
- package/lib/listener/ServerlessSpyListener.mjs +2 -0
- package/lib/listener/ServerlessSpyListenerParams.d.ts +5 -0
- package/lib/listener/ServerlessSpyListenerParams.js +3 -0
- package/lib/listener/ServerlessSpyListenerParams.mjs +2 -0
- package/lib/listener/SpyHandlers.ts.d.ts +1 -1
- package/lib/listener/SpyHandlers.ts.js +1 -1
- package/lib/listener/SpyHandlers.ts.mjs +1 -1
- package/lib/listener/WaitForParams.d.ts +5 -0
- package/lib/listener/WaitForParams.js +3 -0
- package/lib/listener/WaitForParams.mjs +2 -0
- package/lib/listener/WsListener.d.ts +38 -0
- package/lib/listener/WsListener.js +185 -0
- package/lib/listener/WsListener.mjs +181 -0
- package/lib/listener/createServerlessSpyListener.d.ts +2 -13
- package/lib/listener/createServerlessSpyListener.js +5 -163
- package/lib/listener/createServerlessSpyListener.mjs +5 -163
- package/lib/listener/index.d.ts +1 -1
- package/lib/listener/index.js +2 -2
- package/lib/listener/index.mjs +2 -2
- package/lib/src/ServerlessSpy.d.ts +16 -8
- package/lib/src/ServerlessSpy.js +94 -53
- package/lib/src/ServerlessSpy.mjs +93 -52
- package/lib/src/common/envVariableNames.d.ts +8 -0
- package/lib/src/common/envVariableNames.js +15 -0
- package/lib/src/common/envVariableNames.mjs +12 -0
- package/listener/{SpyListener.ts → ServerlessSpyListener.ts} +12 -13
- package/listener/ServerlessSpyListenerParams.ts +6 -0
- package/listener/SpyHandlers.ts.ts +1 -1
- package/listener/WaitForParams.ts +6 -0
- package/listener/WsListener.ts +273 -0
- package/listener/createServerlessSpyListener.ts +5 -265
- package/listener/index.ts +1 -1
- package/package.json +1 -1
- package/lib/listener/SpyListener.js +0 -3
- package/lib/listener/SpyListener.mjs +0 -2
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { WebSocket } from 'ws';
|
|
2
|
+
import { getWebSocketUrl } from '../common/getWebSocketUrl';
|
|
3
|
+
export class WsListener {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.messages = [];
|
|
6
|
+
this.trackers = [];
|
|
7
|
+
this.closed = true;
|
|
8
|
+
this.functionPrefix = 'waitFor';
|
|
9
|
+
}
|
|
10
|
+
async start(params) {
|
|
11
|
+
this.waitForConnection = new Promise((resolve) => {
|
|
12
|
+
this.connectionOpenResolve = resolve;
|
|
13
|
+
});
|
|
14
|
+
const urlSigned = await getWebSocketUrl(params.serverlessSpyWsUrl, params.credentials);
|
|
15
|
+
this.ws = new WebSocket(urlSigned);
|
|
16
|
+
this.closed = false;
|
|
17
|
+
this.ws.on('open', () => {
|
|
18
|
+
this.connectionOpenResolve();
|
|
19
|
+
});
|
|
20
|
+
this.ws.on('message', (data) => {
|
|
21
|
+
if (this.closed)
|
|
22
|
+
return;
|
|
23
|
+
const message = JSON.parse(data.toString());
|
|
24
|
+
message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
|
|
25
|
+
if (message.serviceKey.startsWith('Function')) {
|
|
26
|
+
message.functionContextAwsRequestId = message.data.context.awsRequestId;
|
|
27
|
+
}
|
|
28
|
+
this.messages.push(message);
|
|
29
|
+
this.resolveOldTrackerWithNewMessage(message);
|
|
30
|
+
});
|
|
31
|
+
this.ws.on('close', () => {
|
|
32
|
+
this.closed = true;
|
|
33
|
+
//console.log('disconnected ' + new Date().toISOString());
|
|
34
|
+
});
|
|
35
|
+
await this.waitForConnection;
|
|
36
|
+
}
|
|
37
|
+
async stop() {
|
|
38
|
+
this.closed = true;
|
|
39
|
+
this.ws.close();
|
|
40
|
+
}
|
|
41
|
+
trackerMatchMessage(tracker, message) {
|
|
42
|
+
if (tracker.finished)
|
|
43
|
+
return;
|
|
44
|
+
if ((tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||
|
|
45
|
+
(tracker.serviceKeyForFunction &&
|
|
46
|
+
tracker.serviceKeyForFunction === message.serviceKeyForFunction)) {
|
|
47
|
+
if (this.trackerMatchCondition(tracker, message)) {
|
|
48
|
+
tracker.finished = true;
|
|
49
|
+
const spyAndJestMatchers = {
|
|
50
|
+
getData: () => message.data,
|
|
51
|
+
};
|
|
52
|
+
const serviceKeyForFunction = tracker.serviceKeyForFunction;
|
|
53
|
+
if (serviceKeyForFunction &&
|
|
54
|
+
serviceKeyForFunction.startsWith('Function') &&
|
|
55
|
+
(serviceKeyForFunction.endsWith('Request') ||
|
|
56
|
+
serviceKeyForFunction.endsWith('Console'))) {
|
|
57
|
+
let serviceKeyForFunctionResponse = serviceKeyForFunction;
|
|
58
|
+
if (serviceKeyForFunctionResponse.endsWith('Request')) {
|
|
59
|
+
serviceKeyForFunctionResponse =
|
|
60
|
+
serviceKeyForFunctionResponse.substring(0, serviceKeyForFunctionResponse.length - 'Request'.length);
|
|
61
|
+
}
|
|
62
|
+
else if (serviceKeyForFunctionResponse.endsWith('Console')) {
|
|
63
|
+
serviceKeyForFunctionResponse =
|
|
64
|
+
serviceKeyForFunctionResponse.substring(0, serviceKeyForFunctionResponse.length - 'Console'.length);
|
|
65
|
+
}
|
|
66
|
+
serviceKeyForFunctionResponse += 'Response';
|
|
67
|
+
spyAndJestMatchers.followedByResponse = (paramsW) => {
|
|
68
|
+
return this.createWaitForXXXFunc(serviceKeyForFunctionResponse, message.data.context.awsRequestId)(paramsW);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const proxy = new Proxy(spyAndJestMatchers, {
|
|
72
|
+
get: function (target, objectKey) {
|
|
73
|
+
if (target.hasOwnProperty(objectKey)) {
|
|
74
|
+
return target[objectKey];
|
|
75
|
+
}
|
|
76
|
+
else if (objectKey !== 'then') {
|
|
77
|
+
return function () {
|
|
78
|
+
const jestFunctionToExecute = expect(message.data)[objectKey];
|
|
79
|
+
jestFunctionToExecute.apply(undefined, arguments);
|
|
80
|
+
return proxy;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
tracker.promiseResolve(proxy);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
resolveTrackerInOldMessages(tracker) {
|
|
92
|
+
for (const message of this.messages) {
|
|
93
|
+
if (this.trackerMatchMessage(tracker, message)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
resolveOldTrackerWithNewMessage(message) {
|
|
100
|
+
for (let index = 0; index < this.trackers.length; index++) {
|
|
101
|
+
const tracker = this.trackers[index];
|
|
102
|
+
if (this.trackerMatchMessage(tracker, message)) {
|
|
103
|
+
this.trackers = this.trackers.splice(index, 1);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
trackerMatchCondition(tracker, message) {
|
|
110
|
+
const matchCondition = (tracker.condition && tracker.condition(message.data)) ||
|
|
111
|
+
!tracker.condition;
|
|
112
|
+
const matchRequestId = (tracker.functionContextAwsRequestId &&
|
|
113
|
+
tracker.functionContextAwsRequestId ===
|
|
114
|
+
message.functionContextAwsRequestId) ||
|
|
115
|
+
!tracker.functionContextAwsRequestId;
|
|
116
|
+
if (matchCondition && matchRequestId) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (!matchCondition &&
|
|
121
|
+
matchRequestId &&
|
|
122
|
+
!tracker.possibleSpyMessageDataForDebugging) {
|
|
123
|
+
tracker.possibleSpyMessageDataForDebugging = message.data;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
createWaitForXXXFunc(serviceKeyForFunction, functionContextAwsRequestId) {
|
|
129
|
+
let tracker;
|
|
130
|
+
const promise = new Promise((resolve, reject) => {
|
|
131
|
+
tracker = {
|
|
132
|
+
finished: false,
|
|
133
|
+
promiseResolve: resolve,
|
|
134
|
+
promiseReject: reject,
|
|
135
|
+
serviceKeyForFunction,
|
|
136
|
+
functionContextAwsRequestId,
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
//waitForXXXFunc
|
|
140
|
+
return (paramsW) => {
|
|
141
|
+
tracker.condition = paramsW?.condition;
|
|
142
|
+
const timer = setTimeout(() => {
|
|
143
|
+
if (tracker.finished)
|
|
144
|
+
return;
|
|
145
|
+
tracker.finished = true;
|
|
146
|
+
let message = `Timeout waiting for Serverless Spy message ${serviceKeyForFunction}.`;
|
|
147
|
+
if (tracker.possibleSpyMessageDataForDebugging) {
|
|
148
|
+
message += ` Similar matching spy event data: ${JSON.stringify(tracker.possibleSpyMessageDataForDebugging, null, 2)}`;
|
|
149
|
+
}
|
|
150
|
+
tracker.promiseReject(new Error(message));
|
|
151
|
+
}, paramsW?.timoutMs || 10000);
|
|
152
|
+
promise.finally(() => {
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
});
|
|
155
|
+
if (!this.resolveTrackerInOldMessages(tracker)) {
|
|
156
|
+
this.trackers.push(tracker);
|
|
157
|
+
}
|
|
158
|
+
return promise;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
createProxy() {
|
|
162
|
+
const spyListener = {};
|
|
163
|
+
spyListener.stop = async () => {
|
|
164
|
+
await this.stop();
|
|
165
|
+
};
|
|
166
|
+
const proxy = new Proxy(spyListener, {
|
|
167
|
+
get: (target, objectKey) => {
|
|
168
|
+
if (target.hasOwnProperty(objectKey)) {
|
|
169
|
+
return target[objectKey];
|
|
170
|
+
}
|
|
171
|
+
else if (typeof objectKey === 'string' &&
|
|
172
|
+
objectKey.startsWith(this.functionPrefix)) {
|
|
173
|
+
const serviceKeyForFunction = objectKey.substring(this.functionPrefix.length);
|
|
174
|
+
return this.createWaitForXXXFunc(serviceKeyForFunction);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
return proxy;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV3NMaXN0ZW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpc3RlbmVyL1dzTGlzdGVuZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFRNUQsTUFBTSxPQUFPLFVBQVU7SUFBdkI7UUFDVSxhQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUNuQyxhQUFRLEdBQWMsRUFBRSxDQUFDO1FBS3pCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxtQkFBYyxHQUFHLFNBQVMsQ0FBQztJQThPckMsQ0FBQztJQTVPQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQW1DO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FDckMsTUFBTSxDQUFDLGtCQUFrQixFQUN6QixNQUFNLENBQUMsV0FBVyxDQUNuQixDQUFDO1FBRUYsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxxQkFBc0IsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBRXhCLE1BQU0sT0FB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LEVBQUU7WUFDNUIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ25DLEdBQUcsRUFBRSxDQUFDLE1BQVcsRUFBRSxTQUFpQixFQUFFLEVBQUU7Z0JBQ3RDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzFCO3FCQUFNLElBQ0wsT0FBTyxTQUFTLEtBQUssUUFBUTtvQkFDN0IsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQ3pDO29CQUNBLE1BQU0scUJBQXFCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQzNCLENBQUM7b0JBRUYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsQ0FBQztpQkFDekQ7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUEwQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdlYlNvY2tldCB9IGZyb20gJ3dzJztcbmltcG9ydCB7IGdldFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuaW1wb3J0IHsgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnQgfSBmcm9tICcuLi9jb21tb24vc3B5RXZlbnRzL0Z1bmN0aW9uUmVxdWVzdFNweUV2ZW50JztcbmltcG9ydCB7IFNweUV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9TcHlFdmVudCc7XG5pbXBvcnQgeyBTcHlNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9TcHlNZXNzYWdlJztcbmltcG9ydCB7IFNlcnZlcmxlc3NTcHlMaXN0ZW5lciB9IGZyb20gJy4vU2VydmVybGVzc1NweUxpc3RlbmVyJztcbmltcG9ydCB7IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyB9IGZyb20gJy4vU2VydmVybGVzc1NweUxpc3RlbmVyUGFyYW1zJztcbmltcG9ydCB7IFdhaXRGb3JQYXJhbXMgfSBmcm9tICcuL1dhaXRGb3JQYXJhbXMnO1xuXG5leHBvcnQgY2xhc3MgV3NMaXN0ZW5lcjxUU3B5RXZlbnRzPiB7XG4gIHByaXZhdGUgbWVzc2FnZXM6IFNweU1lc3NhZ2VTdG9yYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSB0cmFja2VyczogVHJhY2tlcltdID0gW107XG5cbiAgcHJpdmF0ZSBjb25uZWN0aW9uT3BlblJlc29sdmU/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHdhaXRGb3JDb25uZWN0aW9uPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSB3cz86IFdlYlNvY2tldDtcbiAgcHJpdmF0ZSBjbG9zZWQgPSB0cnVlO1xuICBwcml2YXRlIGZ1bmN0aW9uUHJlZml4ID0gJ3dhaXRGb3InO1xuXG4gIGFzeW5jIHN0YXJ0KHBhcmFtczogU2VydmVybGVzc1NweUxpc3RlbmVyUGFyYW1zKSB7XG4gICAgdGhpcy53YWl0Rm9yQ29ubmVjdGlvbiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25PcGVuUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB1cmxTaWduZWQgPSBhd2FpdCBnZXRXZWJTb2NrZXRVcmwoXG4gICAgICBwYXJhbXMuc2VydmVybGVzc1NweVdzVXJsLFxuICAgICAgcGFyYW1zLmNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KHVybFNpZ25lZCk7XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLndzLm9uKCdvcGVuJywgKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uT3BlblJlc29sdmUhKCk7XG4gICAgfSk7XG4gICAgdGhpcy53cy5vbignbWVzc2FnZScsIChkYXRhKSA9PiB7XG4gICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpKSBhcyBTcHlNZXNzYWdlU3RvcmFnZTtcblxuICAgICAgbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBtZXNzYWdlLnNlcnZpY2VLZXkucmVwbGFjZSgvIy9nLCAnJyk7XG5cbiAgICAgIGlmIChtZXNzYWdlLnNlcnZpY2VLZXkuc3RhcnRzV2l0aCgnRnVuY3Rpb24nKSkge1xuICAgICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9IChcbiAgICAgICAgICBtZXNzYWdlLmRhdGEgYXMgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnRcbiAgICAgICAgKS5jb250ZXh0LmF3c1JlcXVlc3RJZDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5yZXNvbHZlT2xkVHJhY2tlcldpdGhOZXdNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0pO1xuICAgIHRoaXMud3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgLy9jb25zb2xlLmxvZygnZGlzY29ubmVjdGVkICcgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yQ29ubmVjdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIHRoaXMud3MhLmNsb3NlKCk7XG4gIH1cblxuICB0cmFja2VyTWF0Y2hNZXNzYWdlKHRyYWNrZXI6IFRyYWNrZXIsIG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlKSB7XG4gICAgaWYgKHRyYWNrZXIuZmluaXNoZWQpIHJldHVybjtcblxuICAgIGlmIChcbiAgICAgICh0cmFja2VyLnNlcnZpY2VLZXkgJiYgdHJhY2tlci5zZXJ2aWNlS2V5ID09PSBtZXNzYWdlLnNlcnZpY2VLZXkpIHx8XG4gICAgICAodHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gJiZcbiAgICAgICAgdHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPT09IG1lc3NhZ2Uuc2VydmljZUtleUZvckZ1bmN0aW9uKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMudHJhY2tlck1hdGNoQ29uZGl0aW9uKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHRyYWNrZXIuZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHNweUFuZEplc3RNYXRjaGVyczogYW55ID0ge1xuICAgICAgICAgIGdldERhdGE6ICgpID0+IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSB0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbiAmJlxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5zdGFydHNXaXRoKCdGdW5jdGlvbicpICYmXG4gICAgICAgICAgKHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5lbmRzV2l0aCgnUmVxdWVzdCcpIHx8XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uZW5kc1dpdGgoJ0NvbnNvbGUnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID0gc2VydmljZUtleUZvckZ1bmN0aW9uO1xuXG4gICAgICAgICAgaWYgKHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmVuZHNXaXRoKCdSZXF1ZXN0JykpIHtcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2Uuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UubGVuZ3RoIC0gJ1JlcXVlc3QnLmxlbmd0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UuZW5kc1dpdGgoJ0NvbnNvbGUnKSkge1xuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPVxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5sZW5ndGggLSAnQ29uc29sZScubGVuZ3RoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgKz0gJ1Jlc3BvbnNlJztcblxuICAgICAgICAgIHNweUFuZEplc3RNYXRjaGVycy5mb2xsb3dlZEJ5UmVzcG9uc2UgPSAocGFyYW1zVzogV2FpdEZvclBhcmFtcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlV2FpdEZvclhYWEZ1bmMoXG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLFxuICAgICAgICAgICAgICAobWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50KS5jb250ZXh0LmF3c1JlcXVlc3RJZFxuICAgICAgICAgICAgKShwYXJhbXNXKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5QW5kSmVzdE1hdGNoZXJzLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkgIT09ICd0aGVuJykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGplc3RGdW5jdGlvblRvRXhlY3V0ZSA9IChleHBlY3QobWVzc2FnZS5kYXRhKSBhcyBhbnkpW1xuICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBqZXN0RnVuY3Rpb25Ub0V4ZWN1dGUuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0cmFja2VyLnByb21pc2VSZXNvbHZlKHByb3h5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXI6IFRyYWNrZXIpIHtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdGhpcy5tZXNzYWdlcykge1xuICAgICAgaWYgKHRoaXMudHJhY2tlck1hdGNoTWVzc2FnZSh0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPbGRUcmFja2VyV2l0aE5ld01lc3NhZ2UobWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmFja2Vycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRyYWNrZXIgPSB0aGlzLnRyYWNrZXJzW2luZGV4XTtcbiAgICAgIGlmICh0aGlzLnRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdGhpcy50cmFja2VycyA9IHRoaXMudHJhY2tlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlcjogVHJhY2tlciwgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBjb25zdCBtYXRjaENvbmRpdGlvbiA9XG4gICAgICAodHJhY2tlci5jb25kaXRpb24gJiYgdHJhY2tlci5jb25kaXRpb24obWVzc2FnZS5kYXRhKSkgfHxcbiAgICAgICF0cmFja2VyLmNvbmRpdGlvbjtcblxuICAgIGNvbnN0IG1hdGNoUmVxdWVzdElkID1cbiAgICAgICh0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCAmJlxuICAgICAgICB0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9PT1cbiAgICAgICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCkgfHxcbiAgICAgICF0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZDtcblxuICAgIGlmIChtYXRjaENvbmRpdGlvbiAmJiBtYXRjaFJlcXVlc3RJZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgIW1hdGNoQ29uZGl0aW9uICYmXG4gICAgICAgIG1hdGNoUmVxdWVzdElkICYmXG4gICAgICAgICF0cmFja2VyLnBvc3NpYmxlU3B5TWVzc2FnZURhdGFGb3JEZWJ1Z2dpbmdcbiAgICAgICkge1xuICAgICAgICB0cmFja2VyLnBvc3NpYmxlU3B5TWVzc2FnZURhdGFGb3JEZWJ1Z2dpbmcgPSBtZXNzYWdlLmRhdGE7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKFxuICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbjogc3RyaW5nLFxuICAgIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgdHJhY2tlcjogVHJhY2tlcjtcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cmFja2VyID0ge1xuICAgICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICAgIHByb21pc2VSZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICBwcm9taXNlUmVqZWN0OiByZWplY3QsXG4gICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbixcbiAgICAgICAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vd2FpdEZvclhYWEZ1bmNcbiAgICByZXR1cm4gKHBhcmFtc1c/OiBXYWl0Rm9yUGFyYW1zPFNweUV2ZW50PikgPT4ge1xuICAgICAgdHJhY2tlci5jb25kaXRpb24gPSBwYXJhbXNXPy5jb25kaXRpb247XG5cbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0cmFja2VyLmZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgIHRyYWNrZXIuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGBUaW1lb3V0IHdhaXRpbmcgZm9yIFNlcnZlcmxlc3MgU3B5IG1lc3NhZ2UgJHtzZXJ2aWNlS2V5Rm9yRnVuY3Rpb259LmA7XG5cbiAgICAgICAgaWYgKHRyYWNrZXIucG9zc2libGVTcHlNZXNzYWdlRGF0YUZvckRlYnVnZ2luZykge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYCBTaW1pbGFyIG1hdGNoaW5nIHNweSBldmVudCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdHJhY2tlci5wb3NzaWJsZVNweU1lc3NhZ2VEYXRhRm9yRGVidWdnaW5nLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFja2VyLnByb21pc2VSZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICAgIH0sIHBhcmFtc1c/LnRpbW91dE1zIHx8IDEwMDAwKTtcblxuICAgICAgcHJvbWlzZS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMucmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXIpKSB7XG4gICAgICAgIHRoaXMudHJhY2tlcnMucHVzaCh0cmFja2VyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVQcm94eSgpIHtcbiAgICBjb25zdCBzcHlMaXN0ZW5lciA9IHt9IGFzIFNlcnZlcmxlc3NTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPjtcblxuICAgIHNweUxpc3RlbmVyLnN0b3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5TGlzdGVuZXIsIHtcbiAgICAgIGdldDogKHRhcmdldDogYW55LCBvYmplY3RLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W29iamVjdEtleV07XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIG9iamVjdEtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBvYmplY3RLZXkuc3RhcnRzV2l0aCh0aGlzLmZ1bmN0aW9uUHJlZml4KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBvYmplY3RLZXkuc3Vic3RyaW5nKFxuICAgICAgICAgICAgdGhpcy5mdW5jdGlvblByZWZpeC5sZW5ndGhcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlV2FpdEZvclhYWEZ1bmMoc2VydmljZUtleUZvckZ1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm94eSBhcyBTZXJ2ZXJsZXNzU3B5TGlzdGVuZXI8VFNweUV2ZW50cz47XG4gIH1cbn1cblxudHlwZSBUcmFja2VyID0ge1xuICBwcm9taXNlUmVzb2x2ZTogKGRhdGE6IGFueSkgPT4gdm9pZDtcbiAgcHJvbWlzZVJlamVjdDogKGRhdGE6IGFueSkgPT4gdm9pZDtcbiAgZmluaXNoZWQ6IGJvb2xlYW47XG4gIHNlcnZpY2VLZXk/OiBzdHJpbmc7XG4gIHNlcnZpY2VLZXlGb3JGdW5jdGlvbj86IHN0cmluZztcbiAgY29uZGl0aW9uPzogKGRhdGE6IGFueSkgPT4gYm9vbGVhbjtcbiAgdGltb3V0TXM/OiBudW1iZXI7XG4gIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZztcbiAgcG9zc2libGVTcHlNZXNzYWdlRGF0YUZvckRlYnVnZ2luZz86IGFueTtcbn07XG5cbnR5cGUgU3B5TWVzc2FnZVN0b3JhZ2UgPSBTcHlNZXNzYWdlICYge1xuICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb246IHN0cmluZztcbiAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkPzogc3RyaW5nO1xufTtcbiJdfQ==
|
|
@@ -1,13 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { SpyListener } from './SpyListener';
|
|
4
|
-
declare type ServerlessSpyListenerParams = {
|
|
5
|
-
serverlessSpyWsUrl: string;
|
|
6
|
-
credentials?: Credentials;
|
|
7
|
-
};
|
|
8
|
-
export declare function createServerlessSpyListener<TSpyEvents>(params: ServerlessSpyListenerParams): Promise<SpyListener<TSpyEvents>>;
|
|
9
|
-
export interface WaitForParams<TSpyEvent extends SpyEvent = SpyEvent> {
|
|
10
|
-
condition?: (event: TSpyEvent) => boolean;
|
|
11
|
-
timoutMs?: number;
|
|
12
|
-
}
|
|
13
|
-
export {};
|
|
1
|
+
import { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams';
|
|
2
|
+
export declare function createServerlessSpyListener<TSpyEvents>(params: ServerlessSpyListenerParams): Promise<import("./ServerlessSpyListener").ServerlessSpyListener<TSpyEvents>>;
|
|
@@ -1,169 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createServerlessSpyListener = void 0;
|
|
4
|
-
const
|
|
5
|
-
const getWebSocketUrl_1 = require("../common/getWebSocketUrl");
|
|
4
|
+
const WsListener_1 = require("./WsListener");
|
|
6
5
|
async function createServerlessSpyListener(params) {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
let trackers = [];
|
|
11
|
-
let closed = false;
|
|
12
|
-
const functionPrefix = 'waitFor';
|
|
13
|
-
let connectionOpenResolve;
|
|
14
|
-
let waitForConnection = new Promise((resolve) => {
|
|
15
|
-
connectionOpenResolve = resolve;
|
|
16
|
-
});
|
|
17
|
-
ws.on('open', () => {
|
|
18
|
-
//console.log('connected ' + new Date().toISOString());
|
|
19
|
-
connectionOpenResolve(undefined);
|
|
20
|
-
});
|
|
21
|
-
ws.on('message', (data) => {
|
|
22
|
-
if (closed)
|
|
23
|
-
return;
|
|
24
|
-
//console.log(`From server: ${data}`);
|
|
25
|
-
const message = JSON.parse(data.toString());
|
|
26
|
-
message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
|
|
27
|
-
if (message.serviceKey.startsWith('Function')) {
|
|
28
|
-
message.functionContextAwsRequestId = message.data.context.awsRequestId;
|
|
29
|
-
}
|
|
30
|
-
messages.push(message);
|
|
31
|
-
resolveOldTrackerWithNewMessage(message);
|
|
32
|
-
});
|
|
33
|
-
ws.on('close', () => {
|
|
34
|
-
closed = true;
|
|
35
|
-
// console.log("disconnected " + new Date().toISOString());
|
|
36
|
-
});
|
|
37
|
-
const trackerMatchMessage = (tracker, message) => {
|
|
38
|
-
if (tracker.finished)
|
|
39
|
-
return;
|
|
40
|
-
if ((tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||
|
|
41
|
-
(tracker.serviceKeyForFunction &&
|
|
42
|
-
tracker.serviceKeyForFunction === message.serviceKeyForFunction)) {
|
|
43
|
-
if (trackerMatchCondition(tracker, message)) {
|
|
44
|
-
tracker.finished = true;
|
|
45
|
-
const spyAndJestMatchers = {
|
|
46
|
-
getData: () => message.data,
|
|
47
|
-
};
|
|
48
|
-
const serviceKeyForFunction = tracker.serviceKeyForFunction;
|
|
49
|
-
if (serviceKeyForFunction &&
|
|
50
|
-
serviceKeyForFunction.startsWith('Function') &&
|
|
51
|
-
(serviceKeyForFunction.endsWith('Request') ||
|
|
52
|
-
serviceKeyForFunction.endsWith('Console'))) {
|
|
53
|
-
let serviceKeyForFunctionResponse = serviceKeyForFunction;
|
|
54
|
-
if (serviceKeyForFunctionResponse.endsWith('Request')) {
|
|
55
|
-
serviceKeyForFunctionResponse =
|
|
56
|
-
serviceKeyForFunctionResponse.substring(0, serviceKeyForFunctionResponse.length - 'Request'.length);
|
|
57
|
-
}
|
|
58
|
-
else if (serviceKeyForFunctionResponse.endsWith('Console')) {
|
|
59
|
-
serviceKeyForFunctionResponse =
|
|
60
|
-
serviceKeyForFunctionResponse.substring(0, serviceKeyForFunctionResponse.length - 'Console'.length);
|
|
61
|
-
}
|
|
62
|
-
serviceKeyForFunctionResponse += 'Response';
|
|
63
|
-
spyAndJestMatchers.followedByResponse = (paramsW) => {
|
|
64
|
-
return createWaitForXXXFunc(serviceKeyForFunctionResponse, paramsW, message.data.context.awsRequestId)();
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
const proxy = new Proxy(spyAndJestMatchers, {
|
|
68
|
-
get: function (target, objectKey) {
|
|
69
|
-
if (target.hasOwnProperty(objectKey)) {
|
|
70
|
-
return target[objectKey];
|
|
71
|
-
}
|
|
72
|
-
else if (objectKey !== 'then') {
|
|
73
|
-
return function () {
|
|
74
|
-
const jestFunctionToExecute = expect(message.data)[objectKey];
|
|
75
|
-
jestFunctionToExecute.apply(undefined, arguments);
|
|
76
|
-
return proxy;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
tracker.promiseResolve(proxy);
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return false;
|
|
86
|
-
};
|
|
87
|
-
const resolveTrackerInOldMessages = (tracker) => {
|
|
88
|
-
for (const message of messages) {
|
|
89
|
-
if (trackerMatchMessage(tracker, message)) {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return false;
|
|
94
|
-
};
|
|
95
|
-
const resolveOldTrackerWithNewMessage = (message) => {
|
|
96
|
-
for (let index = 0; index < trackers.length; index++) {
|
|
97
|
-
const tracker = trackers[index];
|
|
98
|
-
if (trackerMatchMessage(tracker, message)) {
|
|
99
|
-
trackers = trackers.splice(index, 1);
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return false;
|
|
104
|
-
};
|
|
105
|
-
const spyListener = {};
|
|
106
|
-
spyListener.stop = () => {
|
|
107
|
-
closed = true;
|
|
108
|
-
ws.close();
|
|
109
|
-
};
|
|
110
|
-
const proxy = new Proxy(spyListener, {
|
|
111
|
-
get: function (target, objectKey) {
|
|
112
|
-
if (target.hasOwnProperty(objectKey)) {
|
|
113
|
-
return target[objectKey];
|
|
114
|
-
}
|
|
115
|
-
else if (typeof objectKey === 'string' &&
|
|
116
|
-
objectKey.startsWith(functionPrefix)) {
|
|
117
|
-
const paramsW = arguments[0];
|
|
118
|
-
const serviceKeyForFunction = objectKey.substring(functionPrefix.length);
|
|
119
|
-
return createWaitForXXXFunc(serviceKeyForFunction, paramsW);
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
await waitForConnection;
|
|
124
|
-
return proxy;
|
|
125
|
-
function trackerMatchCondition(tracker, message) {
|
|
126
|
-
const matchCondition = (tracker.condition && tracker.condition(message.data)) ||
|
|
127
|
-
!tracker.condition;
|
|
128
|
-
const matchRequestId = (tracker.functionContextAwsRequestId &&
|
|
129
|
-
tracker.functionContextAwsRequestId ===
|
|
130
|
-
message.functionContextAwsRequestId) ||
|
|
131
|
-
!tracker.functionContextAwsRequestId;
|
|
132
|
-
// if (tracker.functionContextAwsRequestId) {
|
|
133
|
-
// console.log(
|
|
134
|
-
// `${tracker.functionContextAwsRequestId} - ${message.functionContextAwsRequestId}`
|
|
135
|
-
// );
|
|
136
|
-
// }
|
|
137
|
-
return matchCondition && matchRequestId;
|
|
138
|
-
}
|
|
139
|
-
function createWaitForXXXFunc(serviceKeyForFunction, paramsW, functionContextAwsRequestId) {
|
|
140
|
-
let tracker;
|
|
141
|
-
const promise = new Promise((resolve, reject) => {
|
|
142
|
-
tracker = {
|
|
143
|
-
finished: false,
|
|
144
|
-
promiseResolve: resolve,
|
|
145
|
-
promiseReject: reject,
|
|
146
|
-
serviceKeyForFunction,
|
|
147
|
-
functionContextAwsRequestId,
|
|
148
|
-
};
|
|
149
|
-
});
|
|
150
|
-
return function waitForXXXFunc() {
|
|
151
|
-
tracker.condition = paramsW?.condition;
|
|
152
|
-
const timer = setTimeout(() => {
|
|
153
|
-
if (tracker.finished)
|
|
154
|
-
return;
|
|
155
|
-
tracker.finished = true;
|
|
156
|
-
tracker.promiseReject(new Error(`Timeout waiting for Serverless Spy message ${serviceKeyForFunction}. Received messages so far:\n ${JSON.stringify(messages, null, 2)}`));
|
|
157
|
-
}, paramsW?.timoutMs || 10000);
|
|
158
|
-
promise.finally(() => {
|
|
159
|
-
clearTimeout(timer);
|
|
160
|
-
});
|
|
161
|
-
if (!resolveTrackerInOldMessages(tracker)) {
|
|
162
|
-
trackers.push(tracker);
|
|
163
|
-
}
|
|
164
|
-
return promise;
|
|
165
|
-
};
|
|
166
|
-
}
|
|
6
|
+
const wsListener = new WsListener_1.WsListener();
|
|
7
|
+
await wsListener.start(params);
|
|
8
|
+
return wsListener.createProxy();
|
|
167
9
|
}
|
|
168
10
|
exports.createServerlessSpyListener = createServerlessSpyListener;
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJCQUErQjtBQUMvQiwrREFBNEQ7QUFXckQsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxNQUFtQztJQUVuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsaUNBQWUsRUFDckMsTUFBTSxDQUFDLGtCQUFrQixFQUN6QixNQUFNLENBQUMsV0FBVyxDQUNuQixDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQXdCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQztJQUNqQyxJQUFJLHFCQUErQyxDQUFDO0lBRXBELElBQUksaUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM5QyxxQkFBcUIsR0FBRyxPQUFPLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDakIsdURBQXVEO1FBQ3ZELHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixJQUFJLE1BQU07WUFBRSxPQUFPO1FBRW5CLHNDQUFzQztRQUV0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBc0IsQ0FBQztRQUVqRSxPQUFP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QUM7UUFDakIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUE1T0Qsa0VBNE9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JlZGVudGlhbHMgfSBmcm9tICdAYXdzLXNkay90eXBlcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXQgfSBmcm9tICd3cyc7XG5pbXBvcnQgeyBnZXRXZWJTb2NrZXRVcmwgfSBmcm9tICcuLi9jb21tb24vZ2V0V2ViU29ja2V0VXJsJztcbmltcG9ydCB7IEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9GdW5jdGlvblJlcXVlc3RTcHlFdmVudCc7XG5pbXBvcnQgeyBTcHlFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvU3B5RXZlbnQnO1xuaW1wb3J0IHsgU3B5TWVzc2FnZSB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvU3B5TWVzc2FnZSc7XG5pbXBvcnQgeyBTcHlMaXN0ZW5lciB9IGZyb20gJy4vU3B5TGlzdGVuZXInO1xuXG50eXBlIFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyA9IHtcbiAgc2VydmVybGVzc1NweVdzVXJsOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHM7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyPFRTcHlFdmVudHM+KFxuICBwYXJhbXM6IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtc1xuKSB7XG4gIGNvbnN0IHVybFNpZ25lZCA9IGF3YWl0IGdldFdlYlNvY2tldFVybChcbiAgICBwYXJhbXMuc2VydmVybGVzc1NweVdzVXJsLFxuICAgIHBhcmFtcy5jcmVkZW50aWFsc1xuICApO1xuICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsU2lnbmVkKTtcbiAgY29uc3QgbWVzc2FnZXM6IFNweU1lc3NhZ2VTdG9yYWdlW10gPSBbXTtcbiAgbGV0IHRyYWNrZXJzOiBUcmFja2VyW10gPSBbXTtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBjb25zdCBmdW5jdGlvblByZWZpeCA9ICd3YWl0Rm9yJztcbiAgbGV0IGNvbm5lY3Rpb25PcGVuUmVzb2x2ZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuXG4gIGxldCB3YWl0Rm9yQ29ubmVjdGlvbiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29ubmVjdGlvbk9wZW5SZXNvbHZlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgd3Mub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgLy9jb25zb2xlLmxvZygnY29ubmVjdGVkICcgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICAgIGNvbm5lY3Rpb25PcGVuUmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9KTtcbiAgd3Mub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT4ge1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcblxuICAgIC8vY29uc29sZS5sb2coYEZyb20gc2VydmVyOiAke2RhdGF9YCk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpIGFzIFNweU1lc3NhZ2VTdG9yYWdlO1xuXG4gICAgbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBtZXNzYWdlLnNlcnZpY2VLZXkucmVwbGFjZSgvIy9nLCAnJyk7XG5cbiAgICBpZiAobWVzc2FnZS5zZXJ2aWNlS2V5LnN0YXJ0c1dpdGgoJ0Z1bmN0aW9uJykpIHtcbiAgICAgIG1lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkID0gKFxuICAgICAgICBtZXNzYWdlLmRhdGEgYXMgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnRcbiAgICAgICkuY29udGV4dC5hd3NSZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgbWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICByZXNvbHZlT2xkVHJhY2tlcldpdGhOZXdNZXNzYWdlKG1lc3NhZ2UpO1xuICB9KTtcbiAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgLy8gY29uc29sZS5sb2coXCJkaXNjb25uZWN0ZWQgXCIgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICB9KTtcblxuICBjb25zdCB0cmFja2VyTWF0Y2hNZXNzYWdlID0gKFxuICAgIHRyYWNrZXI6IFRyYWNrZXIsXG4gICAgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2VcbiAgKSA9PiB7XG4gICAgaWYgKHRyYWNrZXIuZmluaXNoZWQpIHJldHVybjtcblxuICAgIGlmIChcbiAgICAgICh0cmFja2VyLnNlcnZpY2VLZXkgJiYgdHJhY2tlci5zZXJ2aWNlS2V5ID09PSBtZXNzYWdlLnNlcnZpY2VLZXkpIHx8XG4gICAgICAodHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gJiZcbiAgICAgICAgdHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPT09IG1lc3NhZ2Uuc2VydmljZUtleUZvckZ1bmN0aW9uKVxuICAgICkge1xuICAgICAgaWYgKHRyYWNrZXJNYXRjaENvbmRpdGlvbih0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICB0cmFja2VyLmZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBzcHlBbmRKZXN0TWF0Y2hlcnM6IGFueSA9IHtcbiAgICAgICAgICBnZXREYXRhOiAoKSA9PiBtZXNzYWdlLmRhdGEsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2VydmljZUtleUZvckZ1bmN0aW9uID0gdHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb247XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gJiZcbiAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uc3RhcnRzV2l0aCgnRnVuY3Rpb24nKSAmJlxuICAgICAgICAgIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uZW5kc1dpdGgoJ1JlcXVlc3QnKSB8fFxuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLmVuZHNXaXRoKCdDb25zb2xlJykpXG4gICAgICAgICkge1xuICAgICAgICAgIGxldCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSA9IHNlcnZpY2VLZXlGb3JGdW5jdGlvbjtcblxuICAgICAgICAgIGlmIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5lbmRzV2l0aCgnUmVxdWVzdCcpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSA9XG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmxlbmd0aCAtICdSZXF1ZXN0Jy5sZW5ndGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmVuZHNXaXRoKCdDb25zb2xlJykpIHtcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2Uuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UubGVuZ3RoIC0gJ0NvbnNvbGUnLmxlbmd0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlICs9ICdSZXNwb25zZSc7XG5cbiAgICAgICAgICBzcHlBbmRKZXN0TWF0Y2hlcnMuZm9sbG93ZWRCeVJlc3BvbnNlID0gKHBhcmFtc1c6IFdhaXRGb3JQYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhcbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UsXG4gICAgICAgICAgICAgIHBhcmFtc1csXG4gICAgICAgICAgICAgIChtZXNzYWdlLmRhdGEgYXMgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnQpLmNvbnRleHQuYXdzUmVxdWVzdElkXG4gICAgICAgICAgICApKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHNweUFuZEplc3RNYXRjaGVycywge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKHRhcmdldDogYW55LCBvYmplY3RLZXk6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShvYmplY3RLZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbb2JqZWN0S2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0S2V5ICE9PSAndGhlbicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqZXN0RnVuY3Rpb25Ub0V4ZWN1dGUgPSAoZXhwZWN0KG1lc3NhZ2UuZGF0YSkgYXMgYW55KVtcbiAgICAgICAgICAgICAgICAgIG9iamVjdEtleVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgamVzdEZ1bmN0aW9uVG9FeGVjdXRlLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2tlci5wcm9taXNlUmVzb2x2ZShwcm94eSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzID0gKHRyYWNrZXI6IFRyYWNrZXIpID0+IHtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICAgIGlmICh0cmFja2VyTWF0Y2hNZXNzYWdlKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCByZXNvbHZlT2xkVHJhY2tlcldpdGhOZXdNZXNzYWdlID0gKG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlKSA9PiB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdHJhY2tlciA9IHRyYWNrZXJzW2luZGV4XTtcbiAgICAgIGlmICh0cmFja2VyTWF0Y2hNZXNzYWdlKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHRyYWNrZXJzID0gdHJhY2tlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHNweUxpc3RlbmVyID0ge30gYXMgU3B5TGlzdGVuZXI8VFNweUV2ZW50cz47XG5cbiAgc3B5TGlzdGVuZXIuc3RvcCA9ICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIHdzLmNsb3NlKCk7XG4gIH07XG5cbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5TGlzdGVuZXIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwgb2JqZWN0S2V5OiBzdHJpbmcpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkob2JqZWN0S2V5KSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0W29iamVjdEtleV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2Ygb2JqZWN0S2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBvYmplY3RLZXkuc3RhcnRzV2l0aChmdW5jdGlvblByZWZpeClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwYXJhbXNXID0gYXJndW1lbnRzWzBdIGFzIFdhaXRGb3JQYXJhbXM7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IG9iamVjdEtleS5zdWJzdHJpbmcoXG4gICAgICAgICAgZnVuY3Rpb25QcmVmaXgubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKHNlcnZpY2VLZXlGb3JGdW5jdGlvbiwgcGFyYW1zVyk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgYXdhaXQgd2FpdEZvckNvbm5lY3Rpb247XG5cbiAgcmV0dXJuIHByb3h5IGFzIFNweUxpc3RlbmVyPFRTcHlFdmVudHM+O1xuXG4gIGZ1bmN0aW9uIHRyYWNrZXJNYXRjaENvbmRpdGlvbih0cmFja2VyOiBUcmFja2VyLCBtZXNzYWdlOiBTcHlNZXNzYWdlU3RvcmFnZSkge1xuICAgIGNvbnN0IG1hdGNoQ29uZGl0aW9uID1cbiAgICAgICh0cmFja2VyLmNvbmRpdGlvbiAmJiB0cmFja2VyLmNvbmRpdGlvbihtZXNzYWdlLmRhdGEpKSB8fFxuICAgICAgIXRyYWNrZXIuY29uZGl0aW9uO1xuXG4gICAgY29uc3QgbWF0Y2hSZXF1ZXN0SWQgPVxuICAgICAgKHRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkICYmXG4gICAgICAgIHRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkID09PVxuICAgICAgICAgIG1lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkKSB8fFxuICAgICAgIXRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkO1xuXG4gICAgLy8gaWYgKHRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAvLyAgICAgYCR7dHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWR9IC0gJHttZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZH1gXG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBtYXRjaENvbmRpdGlvbiAmJiBtYXRjaFJlcXVlc3RJZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKFxuICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbjogc3RyaW5nLFxuICAgIHBhcmFtc1c6IFdhaXRGb3JQYXJhbXM8U3B5RXZlbnQ+LFxuICAgIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgdHJhY2tlcjogVHJhY2tlcjtcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cmFja2VyID0ge1xuICAgICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICAgIHByb21pc2VSZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICBwcm9taXNlUmVqZWN0OiByZWplY3QsXG4gICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbixcbiAgICAgICAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB3YWl0Rm9yWFhYRnVuYygpIHtcbiAgICAgIHRyYWNrZXIuY29uZGl0aW9uID0gcGFyYW1zVz8uY29uZGl0aW9uO1xuXG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodHJhY2tlci5maW5pc2hlZCkgcmV0dXJuO1xuICAgICAgICB0cmFja2VyLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdHJhY2tlci5wcm9taXNlUmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaW1lb3V0IHdhaXRpbmcgZm9yIFNlcnZlcmxlc3MgU3B5IG1lc3NhZ2UgJHtzZXJ2aWNlS2V5Rm9yRnVuY3Rpb259LiBSZWNlaXZlZCBtZXNzYWdlcyBzbyBmYXI6XFxuICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9LCBwYXJhbXNXPy50aW1vdXRNcyB8fCAxMDAwMCk7XG5cbiAgICAgIHByb21pc2UuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNvbHZlVHJhY2tlckluT2xkTWVzc2FnZXModHJhY2tlcikpIHtcbiAgICAgICAgdHJhY2tlcnMucHVzaCh0cmFja2VyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRGb3JQYXJhbXM8VFNweUV2ZW50IGV4dGVuZHMgU3B5RXZlbnQgPSBTcHlFdmVudD4ge1xuICBjb25kaXRpb24/OiAoZXZlbnQ6IFRTcHlFdmVudCkgPT4gYm9vbGVhbjtcbiAgdGltb3V0TXM/OiBudW1iZXI7XG59XG5cbnR5cGUgVHJhY2tlciA9IHtcbiAgcHJvbWlzZVJlc29sdmU6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIHByb21pc2VSZWplY3Q6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIGZpbmlzaGVkOiBib29sZWFuO1xuICBzZXJ2aWNlS2V5Pzogc3RyaW5nO1xuICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24/OiBzdHJpbmc7XG4gIGNvbmRpdGlvbj86IChkYXRhOiBhbnkpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIFNweU1lc3NhZ2VTdG9yYWdlID0gU3B5TWVzc2FnZSAmIHtcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZztcbn07XG4iXX0=
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDZDQUEwQztBQUVuQyxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLE1BQW1DO0lBRW5DLE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQVUsRUFBYyxDQUFDO0lBQ2hELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvQixPQUFPLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBUEQsa0VBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXJ2ZXJsZXNzU3B5TGlzdGVuZXJQYXJhbXMgfSBmcm9tICcuL1NlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyc7XG5pbXBvcnQgeyBXc0xpc3RlbmVyIH0gZnJvbSAnLi9Xc0xpc3RlbmVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcmxlc3NTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPihcbiAgcGFyYW1zOiBTZXJ2ZXJsZXNzU3B5TGlzdGVuZXJQYXJhbXNcbikge1xuICBjb25zdCB3c0xpc3RlbmVyID0gbmV3IFdzTGlzdGVuZXI8VFNweUV2ZW50cz4oKTtcbiAgYXdhaXQgd3NMaXN0ZW5lci5zdGFydChwYXJhbXMpO1xuXG4gIHJldHVybiB3c0xpc3RlbmVyLmNyZWF0ZVByb3h5KCk7XG59XG4iXX0=
|