serverless-spy 0.0.11 → 0.0.12
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 +3 -3
- package/lib/{cjs/cli → cli}/cli.d.ts +0 -0
- package/lib/cli/cli.js +87 -0
- package/lib/cli/cli.mjs +85 -0
- package/lib/{cjs/cli → cli}/ws.d.ts +0 -0
- package/lib/cli/ws.js +68 -0
- package/lib/cli/ws.mjs +66 -0
- package/lib/{cjs/common → common}/getWebSocketUrl.d.ts +0 -0
- package/lib/common/getWebSocketUrl.js +57 -0
- package/lib/common/getWebSocketUrl.mjs +53 -0
- package/lib/common/spyEvents/DynamoDBSpyEvent.d.ts +10 -0
- package/lib/common/spyEvents/DynamoDBSpyEvent.js +3 -0
- package/lib/common/spyEvents/DynamoDBSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.d.ts +9 -0
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.js +3 -0
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/EventBridgeSpyEvent.d.ts +9 -0
- package/lib/common/spyEvents/EventBridgeSpyEvent.js +3 -0
- package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.d.ts +10 -0
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.js +3 -0
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/FunctionContext.d.ts +7 -0
- package/lib/common/spyEvents/FunctionContext.js +3 -0
- package/lib/common/spyEvents/FunctionContext.mjs +2 -0
- package/lib/common/spyEvents/FunctionErrorSpyEvent.d.ts +8 -0
- package/lib/common/spyEvents/FunctionErrorSpyEvent.js +3 -0
- package/lib/common/spyEvents/FunctionErrorSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/FunctionRequestSpyEvent.d.ts +7 -0
- package/lib/common/spyEvents/FunctionRequestSpyEvent.js +3 -0
- package/lib/common/spyEvents/FunctionRequestSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/FunctionResponseSpyEvent.d.ts +8 -0
- package/lib/common/spyEvents/FunctionResponseSpyEvent.js +3 -0
- package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/S3SpyEvent.d.ts +8 -0
- package/lib/common/spyEvents/S3SpyEvent.js +3 -0
- package/lib/common/spyEvents/S3SpyEvent.mjs +2 -0
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.d.ts +11 -0
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.js +3 -0
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/SnsTopicSpyEvent.d.ts +11 -0
- package/lib/common/spyEvents/SnsTopicSpyEvent.js +3 -0
- package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +2 -0
- package/lib/common/spyEvents/SpyEvent.d.ts +3 -0
- package/lib/common/spyEvents/SpyEvent.js +3 -0
- package/lib/common/spyEvents/SpyEvent.mjs +2 -0
- package/lib/common/spyEvents/SpyMessage.d.ts +6 -0
- package/lib/common/spyEvents/SpyMessage.js +3 -0
- package/lib/common/spyEvents/SpyMessage.mjs +2 -0
- package/lib/common/spyEvents/SqsSpyEvent.d.ts +7 -0
- package/lib/common/spyEvents/SqsSpyEvent.js +3 -0
- package/lib/common/spyEvents/SqsSpyEvent.mjs +2 -0
- package/lib/{cjs/index.d.ts → index.d.ts} +0 -0
- package/lib/{cjs/index.js → index.js} +1 -1
- package/lib/index.mjs +3 -0
- package/lib/{cjs/listener → listener}/PrettifyForDisplay.d.ts +0 -0
- package/lib/listener/PrettifyForDisplay.js +3 -0
- package/lib/listener/PrettifyForDisplay.mjs +2 -0
- package/lib/{cjs/listener → listener}/RecursivePartial.d.ts +0 -0
- package/lib/listener/RecursivePartial.js +3 -0
- package/lib/listener/RecursivePartial.mjs +2 -0
- package/lib/{cjs/listener → listener}/SpyHandlers.ts.d.ts +0 -0
- package/lib/listener/SpyHandlers.ts.js +3 -0
- package/lib/listener/SpyHandlers.ts.mjs +2 -0
- package/lib/{cjs/listener → listener}/SpyListener.d.ts +0 -0
- package/lib/listener/SpyListener.js +3 -0
- package/lib/listener/SpyListener.mjs +2 -0
- package/lib/{cjs/listener → listener}/createServerlessSpyListener.d.ts +0 -0
- package/lib/listener/createServerlessSpyListener.js +167 -0
- package/lib/listener/createServerlessSpyListener.mjs +163 -0
- package/lib/{cjs/listener → listener}/index.d.ts +0 -0
- package/lib/{cjs/listener → listener}/index.js +1 -1
- package/lib/listener/index.mjs +3 -0
- package/lib/{cjs/listener → listener}/matchers.d.ts +0 -0
- package/lib/listener/matchers.js +55 -0
- package/lib/listener/matchers.mjs +55 -0
- package/lib/{cjs/listener → listener}/setup.d.ts +0 -0
- package/lib/listener/setup.js +21 -0
- package/lib/listener/setup.mjs +21 -0
- package/lib/{cjs/src → src}/ServerlessSpy.d.ts +0 -0
- package/lib/{cjs/src → src}/ServerlessSpy.js +1 -1
- package/lib/src/ServerlessSpy.mjs +293 -0
- package/lib/{cjs/src → src}/index.d.ts +0 -0
- package/lib/{cjs/src → src}/index.js +0 -0
- package/lib/src/index.mjs +2 -0
- package/package.json +5 -5
- package/tsconfig.npm.json +1 -0
- package/lib/cjs/cli/cli.js +0 -87
- package/lib/cjs/cli/ws.js +0 -68
- package/lib/cjs/common/getWebSocketUrl.js +0 -57
- package/lib/cjs/listener/PrettifyForDisplay.js +0 -3
- package/lib/cjs/listener/RecursivePartial.js +0 -3
- package/lib/cjs/listener/SpyHandlers.ts.js +0 -3
- package/lib/cjs/listener/SpyListener.js +0 -3
- package/lib/cjs/listener/createServerlessSpyListener.js +0 -167
- package/lib/cjs/listener/matchers.js +0 -55
- package/lib/cjs/listener/setup.js +0 -21
- package/lib/mjs/cli/cli.d.ts +0 -1
- package/lib/mjs/cli/cli.js +0 -85
- package/lib/mjs/cli/ws.d.ts +0 -1
- package/lib/mjs/cli/ws.js +0 -66
- package/lib/mjs/common/getWebSocketUrl.d.ts +0 -2
- package/lib/mjs/common/getWebSocketUrl.js +0 -53
- package/lib/mjs/index.d.ts +0 -2
- package/lib/mjs/index.js +0 -3
- package/lib/mjs/listener/PrettifyForDisplay.d.ts +0 -3
- package/lib/mjs/listener/PrettifyForDisplay.js +0 -2
- package/lib/mjs/listener/RecursivePartial.d.ts +0 -4
- package/lib/mjs/listener/RecursivePartial.js +0 -2
- package/lib/mjs/listener/SpyHandlers.ts.d.ts +0 -109
- package/lib/mjs/listener/SpyHandlers.ts.js +0 -2
- package/lib/mjs/listener/SpyListener.d.ts +0 -40
- package/lib/mjs/listener/SpyListener.js +0 -2
- package/lib/mjs/listener/createServerlessSpyListener.d.ts +0 -13
- package/lib/mjs/listener/createServerlessSpyListener.js +0 -163
- package/lib/mjs/listener/index.d.ts +0 -2
- package/lib/mjs/listener/index.js +0 -3
- package/lib/mjs/listener/matchers.d.ts +0 -0
- package/lib/mjs/listener/matchers.js +0 -55
- package/lib/mjs/listener/setup.d.ts +0 -0
- package/lib/mjs/listener/setup.js +0 -21
- package/lib/mjs/src/ServerlessSpy.d.ts +0 -27
- package/lib/mjs/src/ServerlessSpy.js +0 -293
- package/lib/mjs/src/index.d.ts +0 -1
- package/lib/mjs/src/index.js +0 -2
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as apiGwV2 from '@aws-cdk/aws-apigatewayv2-alpha';
|
|
3
|
+
import * as apiGwV2Int from '@aws-cdk/aws-apigatewayv2-integrations-alpha';
|
|
4
|
+
import { Duration, Stack } from 'aws-cdk-lib';
|
|
5
|
+
import * as dynamoDb from 'aws-cdk-lib/aws-dynamodb';
|
|
6
|
+
import * as events from 'aws-cdk-lib/aws-events';
|
|
7
|
+
import * as targets from 'aws-cdk-lib/aws-events-targets';
|
|
8
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
9
|
+
import * as dynamoDbStream from 'aws-cdk-lib/aws-lambda-event-sources';
|
|
10
|
+
import * as lambdaNode from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
11
|
+
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
12
|
+
import * as s3notif from 'aws-cdk-lib/aws-s3-notifications';
|
|
13
|
+
import * as sns from 'aws-cdk-lib/aws-sns';
|
|
14
|
+
import * as snsSubs from 'aws-cdk-lib/aws-sns-subscriptions';
|
|
15
|
+
import * as sqs from 'aws-cdk-lib/aws-sqs';
|
|
16
|
+
import { Construct } from 'constructs';
|
|
17
|
+
export class ServerlessSpy extends Construct {
|
|
18
|
+
constructor(scope, id) {
|
|
19
|
+
super(scope, id);
|
|
20
|
+
this.ownContructs = [];
|
|
21
|
+
this.functionSubscriptionPool = [];
|
|
22
|
+
this.extensionLayer = new lambda.LayerVersion(this, 'Extension', {
|
|
23
|
+
compatibleRuntimes: [
|
|
24
|
+
lambda.Runtime.NODEJS_12_X,
|
|
25
|
+
lambda.Runtime.NODEJS_14_X,
|
|
26
|
+
lambda.Runtime.NODEJS_16_X,
|
|
27
|
+
],
|
|
28
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '../lambda-extension/dist/layer')),
|
|
29
|
+
});
|
|
30
|
+
this.ownContructs.push(this.extensionLayer);
|
|
31
|
+
this.table = new dynamoDb.Table(this, 'WebSocket', {
|
|
32
|
+
partitionKey: {
|
|
33
|
+
name: 'connectionId',
|
|
34
|
+
type: dynamoDb.AttributeType.STRING,
|
|
35
|
+
},
|
|
36
|
+
billingMode: dynamoDb.BillingMode.PAY_PER_REQUEST,
|
|
37
|
+
});
|
|
38
|
+
this.ownContructs.push(this.table);
|
|
39
|
+
const functionOnConnect = new lambdaNode.NodejsFunction(this, 'OnConnect', {
|
|
40
|
+
memorySize: 512,
|
|
41
|
+
timeout: Duration.seconds(5),
|
|
42
|
+
runtime: lambda.Runtime.NODEJS_16_X,
|
|
43
|
+
handler: 'handler',
|
|
44
|
+
entry: path.join(__dirname, '../functions/onConnect.ts'),
|
|
45
|
+
environment: {
|
|
46
|
+
TABLE_NAME: this.table.tableName,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
this.table.grantWriteData(functionOnConnect);
|
|
50
|
+
this.ownContructs.push(functionOnConnect);
|
|
51
|
+
const functionOnDisconnect = new lambdaNode.NodejsFunction(this, 'OnDisconnect', {
|
|
52
|
+
memorySize: 512,
|
|
53
|
+
timeout: Duration.seconds(5),
|
|
54
|
+
runtime: lambda.Runtime.NODEJS_16_X,
|
|
55
|
+
handler: 'handler',
|
|
56
|
+
entry: path.join(__dirname, '../functions/onDisconnect.ts'),
|
|
57
|
+
environment: {
|
|
58
|
+
TABLE_NAME: this.table.tableName,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
this.table.grantWriteData(functionOnDisconnect);
|
|
62
|
+
this.ownContructs.push(functionOnDisconnect);
|
|
63
|
+
this.webSocketApi = new apiGwV2.WebSocketApi(this, 'ApiGwWebSocket');
|
|
64
|
+
this.ownContructs.push(this.webSocketApi);
|
|
65
|
+
this.webSocketStage = new apiGwV2.WebSocketStage(this, 'ApiGwWebSocketStage', {
|
|
66
|
+
webSocketApi: this.webSocketApi,
|
|
67
|
+
stageName: 'prod',
|
|
68
|
+
autoDeploy: true,
|
|
69
|
+
});
|
|
70
|
+
this.ownContructs.push(this.webSocketStage);
|
|
71
|
+
const webSocketApiRoute = this.webSocketApi.addRoute('$connect', {
|
|
72
|
+
integration: new apiGwV2Int.WebSocketLambdaIntegration('$connect', functionOnConnect),
|
|
73
|
+
});
|
|
74
|
+
webSocketApiRoute.node.defaultChild.authorizationType =
|
|
75
|
+
'AWS_IAM';
|
|
76
|
+
this.webSocketApi.addRoute('$disconnect', {
|
|
77
|
+
integration: new apiGwV2Int.WebSocketLambdaIntegration('$disconnect', functionOnDisconnect),
|
|
78
|
+
});
|
|
79
|
+
this.functionSubscriptionMain = this.provideFunctionForSubscription();
|
|
80
|
+
this.webSocketApi.addRoute('sendmessage', {
|
|
81
|
+
integration: new apiGwV2Int.WebSocketLambdaIntegration('SendMessage', this.functionSubscriptionMain.function),
|
|
82
|
+
});
|
|
83
|
+
this.iterateAllElements(Stack.of(this));
|
|
84
|
+
for (const func of this.functionSubscriptionPool) {
|
|
85
|
+
func.function.addEnvironment('INFRA_MAPPING', JSON.stringify(func.mapping));
|
|
86
|
+
}
|
|
87
|
+
// new CfnOutput(this, "API_URL", {
|
|
88
|
+
// value: `wss://${this.webSocketApi.apiId}.execute-api.${
|
|
89
|
+
// Stack.of(scope).region
|
|
90
|
+
// }.amazonaws.com/${this.webSocketStage.stageName}`,
|
|
91
|
+
// });
|
|
92
|
+
this.wsUrl = `wss://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`;
|
|
93
|
+
// new CfnOutput(this, "API_URL", {
|
|
94
|
+
// value: this.wsUrl,
|
|
95
|
+
// });
|
|
96
|
+
}
|
|
97
|
+
iterateAllElements(parent) {
|
|
98
|
+
for (const node of parent.node.children) {
|
|
99
|
+
if (this.ownContructs.includes(node)) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (this.functionSubscriptionPool.find((s) => s.function === node)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
console.log('NODE', node.constructor.name);
|
|
106
|
+
if (node instanceof lambda.Function) {
|
|
107
|
+
this.interceptFunction(node);
|
|
108
|
+
}
|
|
109
|
+
else if (node instanceof sns.Topic) {
|
|
110
|
+
console.log('interceptSnsTopic');
|
|
111
|
+
this.interceptSnsTopic(node);
|
|
112
|
+
}
|
|
113
|
+
else if (node instanceof sns.Subscription) {
|
|
114
|
+
this.interceptSnsSubscription(node);
|
|
115
|
+
}
|
|
116
|
+
else if (node instanceof s3.Bucket) {
|
|
117
|
+
this.interceptS3(node);
|
|
118
|
+
}
|
|
119
|
+
else if (node instanceof dynamoDb.Table) {
|
|
120
|
+
this.interceptDynamodb(node);
|
|
121
|
+
}
|
|
122
|
+
else if (node instanceof events.EventBus) {
|
|
123
|
+
this.interceptEventBus(node);
|
|
124
|
+
}
|
|
125
|
+
else if (node instanceof events.Rule) {
|
|
126
|
+
this.interceptEventBusRule(node);
|
|
127
|
+
}
|
|
128
|
+
else if (node instanceof lambda.CfnEventSourceMapping) {
|
|
129
|
+
this.interceptSqs(node);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// console.log('NO MATCH', node);
|
|
133
|
+
}
|
|
134
|
+
this.iterateAllElements(node);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
interceptSqs(node) {
|
|
138
|
+
const queue = this.findElement((n) => n instanceof sqs.Queue &&
|
|
139
|
+
n.queueArn === node.eventSourceArn);
|
|
140
|
+
const func = this.findElement((n) => n instanceof lambda.Function &&
|
|
141
|
+
n.functionName === node.functionName);
|
|
142
|
+
if (queue && func) {
|
|
143
|
+
const queueName = this.getConstructName(queue);
|
|
144
|
+
this.functionSubscriptionMain.mapping[queue.queueArn] = `Sqs#${queueName}`;
|
|
145
|
+
func.addEnvironment('FLUENT_TEST_SUBSCRIBED_TO_SQS', 'true');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
createFunctionForSubscription(index) {
|
|
149
|
+
const func = new lambdaNode.NodejsFunction(this, `Subscription${index}`, {
|
|
150
|
+
memorySize: 512,
|
|
151
|
+
timeout: Duration.seconds(5),
|
|
152
|
+
runtime: lambda.Runtime.NODEJS_16_X,
|
|
153
|
+
handler: 'handler',
|
|
154
|
+
entry: path.join(__dirname, '../functions/sendMessage.ts'),
|
|
155
|
+
environment: {
|
|
156
|
+
TABLE_NAME: this.table.tableName,
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
this.table.grantWriteData(func);
|
|
160
|
+
this.table.grantReadData(func);
|
|
161
|
+
func.addEnvironment('WS_ENDPOINT', `https://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`);
|
|
162
|
+
this.webSocketApi.grantManageConnections(func);
|
|
163
|
+
return func;
|
|
164
|
+
}
|
|
165
|
+
interceptS3(s3Bucket) {
|
|
166
|
+
s3Bucket.addEventNotification(s3.EventType.OBJECT_CREATED_PUT, new s3notif.LambdaDestination(this.functionSubscriptionMain.function));
|
|
167
|
+
const name = this.getConstructName(s3Bucket);
|
|
168
|
+
this.functionSubscriptionMain.mapping[s3Bucket.bucketArn] = `S3#${name}`;
|
|
169
|
+
}
|
|
170
|
+
interceptDynamodb(table) {
|
|
171
|
+
// enable DynamoDB streams with a hack
|
|
172
|
+
table.node.defaultChild.streamSpecification = {
|
|
173
|
+
streamViewType: dynamoDb.StreamViewType.NEW_AND_OLD_IMAGES,
|
|
174
|
+
};
|
|
175
|
+
table.tableStreamArn = table.node.defaultChild.attrStreamArn;
|
|
176
|
+
this.functionSubscriptionMain.function.addEventSource(new dynamoDbStream.DynamoEventSource(table, {
|
|
177
|
+
startingPosition: lambda.StartingPosition.LATEST,
|
|
178
|
+
batchSize: 1,
|
|
179
|
+
retryAttempts: 0,
|
|
180
|
+
}));
|
|
181
|
+
const name = this.getConstructName(table);
|
|
182
|
+
this.functionSubscriptionMain.mapping[table.tableArn] = `DynamoDB#${name}`;
|
|
183
|
+
}
|
|
184
|
+
interceptEventBusRule(rule) {
|
|
185
|
+
const { eventBusName } = rule.node.defaultChild;
|
|
186
|
+
const eventBridge = this.getEventBridge(rule.node.defaultChild.eventBusName);
|
|
187
|
+
if (!eventBridge) {
|
|
188
|
+
throw new Error(`Can not find EventBridge with name "${eventBusName}"`);
|
|
189
|
+
}
|
|
190
|
+
const functionSubscription = this.provideFunctionForSubscription((s) => !s.usedForEventBridge);
|
|
191
|
+
functionSubscription.usedForEventBridge = true;
|
|
192
|
+
rule.addTarget(new targets.LambdaFunction(functionSubscription.function));
|
|
193
|
+
const bridgeName = this.getConstructName(eventBridge);
|
|
194
|
+
const ruleName = this.getConstructName(rule);
|
|
195
|
+
functionSubscription.mapping.eventBridge = `EventBridgeRule#${bridgeName}#${ruleName}`;
|
|
196
|
+
}
|
|
197
|
+
interceptEventBus(eventBus) {
|
|
198
|
+
const functionSubscription = this.provideFunctionForSubscription((s) => !s.usedForEventBridge);
|
|
199
|
+
functionSubscription.usedForEventBridge = true;
|
|
200
|
+
const bridgeName = this.getConstructName(eventBus);
|
|
201
|
+
const rule = new events.Rule(this, `RuleAll${bridgeName}`, {
|
|
202
|
+
eventBus,
|
|
203
|
+
eventPattern: { version: ['0'] },
|
|
204
|
+
targets: [new targets.LambdaFunction(functionSubscription.function)],
|
|
205
|
+
});
|
|
206
|
+
this.ownContructs.push(rule);
|
|
207
|
+
functionSubscription.mapping.eventBridge = `EventBridge#${bridgeName}`;
|
|
208
|
+
}
|
|
209
|
+
interceptSnsTopic(topic) {
|
|
210
|
+
const functionSubscription = this.provideFunctionForSubscription((s) => !s.subsribedTopics.includes(topic));
|
|
211
|
+
topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
|
|
212
|
+
const topicName = this.getConstructName(topic);
|
|
213
|
+
functionSubscription.mapping[topic.topicArn] = `SnsTopic#${topicName}`;
|
|
214
|
+
functionSubscription.subsribedTopics.push(topic);
|
|
215
|
+
}
|
|
216
|
+
interceptSnsSubscription(subscription) {
|
|
217
|
+
if (!subscription.node.scope) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const topic = this.getTopic(subscription.node.defaultChild.topicArn);
|
|
221
|
+
if (!topic) {
|
|
222
|
+
throw new Error('Can not find Topic');
|
|
223
|
+
}
|
|
224
|
+
const functionSubscription = this.provideFunctionForSubscription((s) => !s.subsribedTopics.includes(topic));
|
|
225
|
+
const { filterPolicy } = subscription.node
|
|
226
|
+
.defaultChild;
|
|
227
|
+
const subscriptionClone = topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
|
|
228
|
+
subscriptionClone.node.defaultChild.filterPolicy =
|
|
229
|
+
filterPolicy;
|
|
230
|
+
this.ownContructs.push(subscriptionClone);
|
|
231
|
+
const topicName = this.getConstructName(topic);
|
|
232
|
+
const targetName = this.getConstructName(subscription.node.scope);
|
|
233
|
+
functionSubscription.subsribedTopics.push(topic);
|
|
234
|
+
functionSubscription.mapping[topic.topicArn] = `SnsSubscription#${topicName}#${targetName}`;
|
|
235
|
+
}
|
|
236
|
+
provideFunctionForSubscription(filterFunction) {
|
|
237
|
+
let functionSubscription;
|
|
238
|
+
if (filterFunction) {
|
|
239
|
+
functionSubscription = this.functionSubscriptionPool.find(filterFunction);
|
|
240
|
+
}
|
|
241
|
+
else if (this.functionSubscriptionPool.length > 0) {
|
|
242
|
+
functionSubscription = this.functionSubscriptionPool[0];
|
|
243
|
+
}
|
|
244
|
+
if (!functionSubscription) {
|
|
245
|
+
functionSubscription = {
|
|
246
|
+
subsribedTopics: [],
|
|
247
|
+
usedForEventBridge: false,
|
|
248
|
+
mapping: {},
|
|
249
|
+
function: this.createFunctionForSubscription(this.functionSubscriptionPool.length),
|
|
250
|
+
};
|
|
251
|
+
this.functionSubscriptionPool.push(functionSubscription);
|
|
252
|
+
}
|
|
253
|
+
return functionSubscription;
|
|
254
|
+
}
|
|
255
|
+
interceptFunction(func) {
|
|
256
|
+
func.addLayers(this.extensionLayer);
|
|
257
|
+
this.functionSubscriptionMain.function.grantInvoke(func);
|
|
258
|
+
const functionName = this.getConstructName(func);
|
|
259
|
+
func.addEnvironment('FUNCTION_NAME', functionName);
|
|
260
|
+
func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper');
|
|
261
|
+
func.addEnvironment('FLUENT_TEST_SEND_FUNCTION_NAME', this.functionSubscriptionMain.function.functionName);
|
|
262
|
+
}
|
|
263
|
+
getConstructName(construct) {
|
|
264
|
+
let functionName = construct.node.path;
|
|
265
|
+
const { stackName } = Stack.of(this);
|
|
266
|
+
if (functionName.startsWith(stackName)) {
|
|
267
|
+
functionName = functionName.substring(stackName.length + 1);
|
|
268
|
+
}
|
|
269
|
+
return functionName;
|
|
270
|
+
}
|
|
271
|
+
getTopic(topicArn) {
|
|
272
|
+
const topic = this.findElement((node) => node instanceof sns.Topic && node.topicArn === topicArn);
|
|
273
|
+
return topic;
|
|
274
|
+
}
|
|
275
|
+
getEventBridge(eventBusName) {
|
|
276
|
+
const eventBridge = this.findElement((node) => node instanceof events.EventBus &&
|
|
277
|
+
node.eventBusName === eventBusName);
|
|
278
|
+
return eventBridge;
|
|
279
|
+
}
|
|
280
|
+
findElement(filterFunc, parent) {
|
|
281
|
+
if (!parent) {
|
|
282
|
+
parent = Stack.of(this);
|
|
283
|
+
}
|
|
284
|
+
for (const node of parent.node.children) {
|
|
285
|
+
if (filterFunc(node)) {
|
|
286
|
+
return node;
|
|
287
|
+
}
|
|
288
|
+
this.findElement(filterFunc, node);
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxLQUFLLFVBQVUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxPQUFPLEtBQUssUUFBUSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxLQUFLLE9BQU8sTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRCxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxjQUFjLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxLQUFLLFVBQVUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0NBQWtDLENBQUM7QUFDNUQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssT0FBTyxNQUFNLG1DQUFtQyxDQUFDO0FBQzdELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLFlBQVksQ0FBQztBQUVuRCxNQUFNLE9BQU8sYUFBYyxTQUFRLFNBQVM7SUFpQjFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFYWCxpQkFBWSxHQUFpQixFQUFFLENBQUM7UUFFaEMsNkJBQXdCLEdBQTJCLEVBQUUsQ0FBQztRQVc1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QUMsU0FBUyxDQUFDLEVBQUU7WUFDdEMsWUFBWSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3RDtRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxRQUFRLENBQUMsUUFBZ0I7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDNUIsQ0FBQyxJQUFnQixFQUFFLEVBQUUsQ0FDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxLQUFLLElBQUssSUFBa0IsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUN6RSxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYyxDQUFDLFlBQW9CO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQ2xDLENBQUMsSUFBZ0IsRUFBRSxFQUFFLENBQ25CLElBQUksWUFBWSxNQUFNLENBQUMsUUFBUTtZQUM5QixJQUF3QixDQUFDLFlBQVksS0FBSyxZQUFZLENBQzFELENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sV0FBVyxDQUNqQixVQUF5QyxFQUN6QyxNQUFtQjtRQUVuQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNwQixPQUFPLElBQVMsQ0FBQzthQUNsQjtZQUNELElBQUksQ0FBQyxXQUFXLENBQUksVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaUd3VjIgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYSc7XG5pbXBvcnQgKiBhcyBhcGlHd1YySW50IGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNub3RpZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGV4dGVuc2lvbkxheWVyOiBsYW1iZGEuTGF5ZXJWZXJzaW9uO1xuXG4gIHByaXZhdGUgdGFibGU6IGR5bmFtb0RiLlRhYmxlO1xuXG4gIHByaXZhdGUgd2ViU29ja2V0QXBpOiBhcGlHd1YyLldlYlNvY2tldEFwaTtcblxuICBwcml2YXRlIG93bkNvbnRydWN0czogSUNvbnN0cnVjdFtdID0gW107XG5cbiAgcHJpdmF0ZSBmdW5jdGlvblN1YnNjcmlwdGlvblBvb2w6IEZ1bmN0aW9uU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIGZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbjogRnVuY3Rpb25TdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSB3ZWJTb2NrZXRTdGFnZTogYXBpR3dWMi5XZWJTb2NrZXRTdGFnZTtcblxuICB3c1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5leHRlbnNpb25MYXllciA9IG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsICdFeHRlbnNpb24nLCB7XG4gICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIF0sXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9sYW1iZGEtZXh0ZW5zaW9uL2Rpc3QvbGF5ZXInKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBkeW5hbW9EYi5UYWJsZSh0aGlzLCAnV2ViU29ja2V0Jywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0aW9uSWQnLFxuICAgICAgICB0eXBlOiBkeW5hbW9EYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBiaWxsaW5nTW9kZTogZHluYW1vRGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgIH0pO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy50YWJsZSk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk9uQ29ubmVjdCA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdPbkNvbm5lY3QnLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Z1bmN0aW9ucy9vbkNvbm5lY3QudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFRBQkxFX05BTUU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25Db25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25Db25uZWN0KTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uT25EaXNjb25uZWN0ID0gbmV3IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgJ09uRGlzY29ubmVjdCcsXG4gICAgICB7XG4gICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9mdW5jdGlvbnMvb25EaXNjb25uZWN0LnRzJyksXG4gICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgVEFCTEVfTkFNRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25EaXNjb25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25EaXNjb25uZWN0KTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0QXBpKHRoaXMsICdBcGlHd1dlYlNvY2tldCcpO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRBcGkpO1xuICAgIHRoaXMud2ViU29ja2V0U3RhZ2UgPSBuZXcgYXBpR3dWMi5XZWJTb2NrZXRTdGFnZShcbiAgICAgIHRoaXMsXG4gICAgICAnQXBpR3dXZWJTb2NrZXRTdGFnZScsXG4gICAgICB7XG4gICAgICAgIHdlYlNvY2tldEFwaTogdGhpcy53ZWJTb2NrZXRBcGksXG4gICAgICAgIHN0YWdlTmFtZTogJ3Byb2QnLFxuICAgICAgICBhdXRvRGVwbG95OiB0cnVlLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaCh0aGlzLndlYlNvY2tldFN0YWdlKTtcbiAgICBjb25zdCB3ZWJTb2NrZXRBcGlSb3V0ZSA9IHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkNvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG4gICAgKHdlYlNvY2tldEFwaVJvdXRlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGFndy5DZm5Sb3V0ZSkuYXV0aG9yaXphdGlvblR5cGUgPVxuICAgICAgJ0FXU19JQU0nO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkuYWRkUm91dGUoJyRkaXNjb25uZWN0Jywge1xuICAgICAgaW50ZWdyYXRpb246IG5ldyBhcGlHd1YySW50LldlYlNvY2tldExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICAnJGRpc2Nvbm5lY3QnLFxuICAgICAgICBmdW5jdGlvbk9uRGlzY29ubmVjdFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oKTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCdzZW5kbWVzc2FnZScsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJ1NlbmRNZXNzYWdlJyxcbiAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb25cbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLml0ZXJhdGVBbGxFbGVtZW50cyhTdGFjay5vZih0aGlzKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZ1bmMgb2YgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wpIHtcbiAgICAgIGZ1bmMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICAgICdJTkZSQV9NQVBQSU5HJyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiQVBJX1VSTFwiLCB7XG4gICAgLy8gICB2YWx1ZTogYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgLy8gICAgIFN0YWNrLm9mKHNjb3BlKS5yZWdpb25cbiAgICAvLyAgIH0uYW1hem9uYXdzLmNvbS8ke3RoaXMud2ViU29ja2V0U3RhZ2Uuc3RhZ2VOYW1lfWAsXG4gICAgLy8gfSk7XG5cbiAgICB0aGlzLndzVXJsID0gYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuXG4gICAgLy8gbmV3IENmbk91dHB1dCh0aGlzLCBcIkFQSV9VUkxcIiwge1xuICAgIC8vICAgdmFsdWU6IHRoaXMud3NVcmwsXG4gICAgLy8gfSk7XG4gIH1cblxuICBwcml2YXRlIGl0ZXJhdGVBbGxFbGVtZW50cyhwYXJlbnQ6IElDb25zdHJ1Y3QpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmICh0aGlzLm93bkNvbnRydWN0cy5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmZpbmQoKHMpID0+IHMuZnVuY3Rpb24gPT09IG5vZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygnTk9ERScsIG5vZGUuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ludGVyY2VwdFNuc1RvcGljJyk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U25zVG9waWMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0UzMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZSkge1xuICAgICAgICB0aGlzLmludGVyY2VwdER5bmFtb2RiKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RXZlbnRCdXMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgICB0aGlzLmludGVyY2VwdEV2ZW50QnVzUnVsZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRTcXMobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnTk8gTUFUQ0gnLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTcXMobm9kZTogbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZykge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5maW5kRWxlbWVudDxzcXMuUXVldWU+KFxuICAgICAgKG46IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBzcXMuUXVldWUgJiZcbiAgICAgICAgKG4gYXMgc3FzLlF1ZXVlKS5xdWV1ZUFybiA9PT0gbm9kZS5ldmVudFNvdXJjZUFyblxuICAgICk7XG5cbiAgICBjb25zdCBmdW5jID0gdGhpcy5maW5kRWxlbWVudDxsYW1iZGEuRnVuY3Rpb24+KFxuICAgICAgKG46IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24gJiZcbiAgICAgICAgKG4gYXMgbGFtYmRhLkZ1bmN0aW9uKS5mdW5jdGlvbk5hbWUgPT09IG5vZGUuZnVuY3Rpb25OYW1lXG4gICAgKTtcblxuICAgIGlmIChxdWV1ZSAmJiBmdW5jKSB7XG4gICAgICBjb25zdCBxdWV1ZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUocXVldWUpO1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1tcbiAgICAgICAgcXVldWUucXVldWVBcm5cbiAgICAgIF0gPSBgU3FzIyR7cXVldWVOYW1lfWA7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGTFVFTlRfVEVTVF9TVUJTQ1JJQkVEX1RPX1NRUycsICd0cnVlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIGBTdWJzY3JpcHRpb24ke2luZGV4fWAsIHtcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZnVuY3Rpb25zL3NlbmRNZXNzYWdlLnRzJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBUQUJMRV9OQU1FOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmMpO1xuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShmdW5jKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgJ1dTX0VORFBPSU5UJyxcbiAgICAgIGBodHRwczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnJlZ2lvblxuICAgICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YFxuICAgICk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5ncmFudE1hbmFnZUNvbm5lY3Rpb25zKGZ1bmMpO1xuICAgIHJldHVybiBmdW5jO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTMyhzM0J1Y2tldDogczMuQnVja2V0KSB7XG4gICAgczNCdWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUFVULFxuICAgICAgbmV3IHMzbm90aWYuTGFtYmRhRGVzdGluYXRpb24odGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoczNCdWNrZXQpO1xuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbczNCdWNrZXQuYnVja2V0QXJuXSA9IGBTMyMke25hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RHluYW1vZGIodGFibGU6IGR5bmFtb0RiLlRhYmxlKSB7XG4gICAgLy8gZW5hYmxlIER5bmFtb0RCIHN0cmVhbXMgd2l0aCBhIGhhY2tcbiAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGUpLnN0cmVhbVNwZWNpZmljYXRpb24gPSB7XG4gICAgICBzdHJlYW1WaWV3VHlwZTogZHluYW1vRGIuU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgIH07XG4gICAgKHRhYmxlIGFzIGFueSkudGFibGVTdHJlYW1Bcm4gPSAoXG4gICAgICB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZVxuICAgICkuYXR0clN0cmVhbUFybjtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmFkZEV2ZW50U291cmNlKFxuICAgICAgbmV3IGR5bmFtb0RiU3RyZWFtLkR5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb246IGxhbWJkYS5TdGFydGluZ1Bvc2l0aW9uLkxBVEVTVCxcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0YWJsZSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3RhYmxlLnRhYmxlQXJuXSA9IGBEeW5hbW9EQiMke25hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXNSdWxlKHJ1bGU6IGV2ZW50cy5SdWxlKSB7XG4gICAgY29uc3QgeyBldmVudEJ1c05hbWUgfSA9IHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZXZlbnRzLkNmblJ1bGU7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmdldEV2ZW50QnJpZGdlKFxuICAgICAgKHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55KS5ldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgaWYgKCFldmVudEJyaWRnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgRXZlbnRCcmlkZ2Ugd2l0aCBuYW1lIFwiJHtldmVudEJ1c05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnVzZWRGb3JFdmVudEJyaWRnZVxuICAgICk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24udXNlZEZvckV2ZW50QnJpZGdlID0gdHJ1ZTtcblxuICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKSk7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnJpZGdlKTtcbiAgICBjb25zdCBydWxlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShydWxlKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nLmV2ZW50QnJpZGdlID0gYEV2ZW50QnJpZGdlUnVsZSMke2JyaWRnZU5hbWV9IyR7cnVsZU5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXMoZXZlbnRCdXM6IGV2ZW50cy5FdmVudEJ1cykge1xuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgY29uc3QgYnJpZGdlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShldmVudEJ1cyk7XG4gICAgY29uc3QgcnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCBgUnVsZUFsbCR7YnJpZGdlTmFtZX1gLCB7XG4gICAgICBldmVudEJ1cyxcbiAgICAgIGV2ZW50UGF0dGVybjogeyB2ZXJzaW9uOiBbJzAnXSB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHJ1bGUpO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFNuc1RvcGljKHRvcGljOiBzbnMuVG9waWMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IGBTbnNUb3BpYyMke3RvcGljTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbjogc25zLlN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3Vic2NyaXB0aW9uLm5vZGUuc2NvcGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b3BpYyA9IHRoaXMuZ2V0VG9waWMoXG4gICAgICAoc3Vic2NyaXB0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb24pLnRvcGljQXJuXG4gICAgKTtcblxuICAgIGlmICghdG9waWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBmaW5kIFRvcGljJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy5zdWJzcmliZWRUb3BpY3MuaW5jbHVkZXModG9waWMpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZmlsdGVyUG9saWN5IH0gPSBzdWJzY3JpcHRpb24ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uQ2xvbmUgPSB0b3BpYy5hZGRTdWJzY3JpcHRpb24oXG4gICAgICBuZXcgc25zU3Vicy5MYW1iZGFTdWJzY3JpcHRpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXG4gICAgKTtcbiAgICAoc3Vic2NyaXB0aW9uQ2xvbmUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikuZmlsdGVyUG9saWN5ID1cbiAgICAgIGZpbHRlclBvbGljeTtcblxuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2goc3Vic2NyaXB0aW9uQ2xvbmUpO1xuXG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKTtcblxuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW1xuICAgICAgdG9waWMudG9waWNBcm5cbiAgICBdID0gYFNuc1N1YnNjcmlwdGlvbiMke3RvcGljTmFtZX0jJHt0YXJnZXROYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIHByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICBmaWx0ZXJGdW5jdGlvbj86IChzdWJzY3JpcHRpb246IEZ1bmN0aW9uU3Vic2NyaXB0aW9uKSA9PiBib29sZWFuXG4gICkge1xuICAgIGxldCBmdW5jdGlvblN1YnNjcmlwdGlvbjogRnVuY3Rpb25TdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZChmaWx0ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sWzBdO1xuICAgIH1cblxuICAgIGlmICghZnVuY3Rpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICAgICAgICBzdWJzcmliZWRUb3BpY3M6IFtdLFxuICAgICAgICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGZhbHNlLFxuICAgICAgICBtYXBwaW5nOiB7fSxcbiAgICAgICAgZnVuY3Rpb246IHRoaXMuY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wubGVuZ3RoXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wucHVzaChmdW5jdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RnVuY3Rpb24oZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgZnVuYy5hZGRMYXllcnModGhpcy5leHRlbnNpb25MYXllcik7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZ3JhbnRJbnZva2UoZnVuYyk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZnVuYyk7XG5cbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGVU5DVElPTl9OQU1FJywgZnVuY3Rpb25OYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUicsICcvb3B0L3NweS13cmFwcGVyJyk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgICdGTFVFTlRfVEVTVF9TRU5EX0ZVTkNUSU9OX05BTUUnLFxuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZnVuY3Rpb25OYW1lXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25zdHJ1Y3ROYW1lKGNvbnN0cnVjdDogSUNvbnN0cnVjdCkge1xuICAgIGxldCBmdW5jdGlvbk5hbWUgPSBjb25zdHJ1Y3Qubm9kZS5wYXRoO1xuICAgIGNvbnN0IHsgc3RhY2tOYW1lIH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgIGlmIChmdW5jdGlvbk5hbWUuc3RhcnRzV2l0aChzdGFja05hbWUpKSB7XG4gICAgICBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWUuc3Vic3RyaW5nKHN0YWNrTmFtZS5sZW5ndGggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9waWModG9waWNBcm46IHN0cmluZyk6IHNucy5Ub3BpYyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdG9waWMgPSB0aGlzLmZpbmRFbGVtZW50PHNucy5Ub3BpYz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIHNucy5Ub3BpYyAmJiAobm9kZSBhcyBzbnMuVG9waWMpLnRvcGljQXJuID09PSB0b3BpY0FyblxuICAgICk7XG5cbiAgICByZXR1cm4gdG9waWM7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50QnJpZGdlKGV2ZW50QnVzTmFtZTogc3RyaW5nKTogZXZlbnRzLkV2ZW50QnVzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBldmVudEJyaWRnZSA9IHRoaXMuZmluZEVsZW1lbnQ8ZXZlbnRzLkV2ZW50QnVzPihcbiAgICAgIChub2RlOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzICYmXG4gICAgICAgIChub2RlIGFzIGV2ZW50cy5FdmVudEJ1cykuZXZlbnRCdXNOYW1lID09PSBldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgcmV0dXJuIGV2ZW50QnJpZGdlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRWxlbWVudDxUIGV4dGVuZHMgSUNvbnN0cnVjdCA9IElDb25zdHJ1Y3Q+KFxuICAgIGZpbHRlckZ1bmM6IChub2RlOiBJQ29uc3RydWN0KSA9PiBib29sZWFuLFxuICAgIHBhcmVudD86IElDb25zdHJ1Y3RcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHBhcmVudCA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKGZpbHRlckZ1bmMobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgYXMgVDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluZEVsZW1lbnQ8VD4oZmlsdGVyRnVuYywgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIEZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICBzdWJzcmliZWRUb3BpY3M6IHNucy5Ub3BpY1tdO1xuICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGJvb2xlYW47XG4gIGZ1bmN0aW9uOiBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uO1xuICBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcbiJdfQ==
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './ServerlessSpy';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vU2VydmVybGVzc1NweSc7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -104,15 +104,15 @@
|
|
|
104
104
|
"cdk"
|
|
105
105
|
],
|
|
106
106
|
"bin": {
|
|
107
|
-
"spy": "lib/
|
|
107
|
+
"spy": "lib/cli/cli.js"
|
|
108
108
|
},
|
|
109
|
-
"main": "lib/
|
|
109
|
+
"main": "lib/index.js",
|
|
110
110
|
"exports": {
|
|
111
|
-
"import": "./lib/
|
|
112
|
-
"require": "./lib/
|
|
111
|
+
"import": "./lib/index.mjs",
|
|
112
|
+
"require": "./lib/index.js"
|
|
113
113
|
},
|
|
114
114
|
"license": "Apache-2.0",
|
|
115
|
-
"version": "0.0.
|
|
115
|
+
"version": "0.0.12",
|
|
116
116
|
"types": "lib/index.d.ts",
|
|
117
117
|
"stability": "stable",
|
|
118
118
|
"jsii": {
|
package/tsconfig.npm.json
CHANGED
package/lib/cjs/cli/cli.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
const http = require("http");
|
|
5
|
-
const path = require("path");
|
|
6
|
-
const getWebSocketUrl_1 = require("../common/getWebSocketUrl");
|
|
7
|
-
async function run() {
|
|
8
|
-
const cdkExportFileName = '../.spy/cdkExports.json';
|
|
9
|
-
let serverlessSpyWsUrl;
|
|
10
|
-
if (fs.existsSync(cdkExportFileName)) {
|
|
11
|
-
const rawdata = fs.readFileSync(cdkExportFileName);
|
|
12
|
-
const config = JSON.parse(rawdata.toString());
|
|
13
|
-
if (config && config[Object.keys(config)[0]]) {
|
|
14
|
-
// get first ServerlessSpyWsUrl
|
|
15
|
-
// {
|
|
16
|
-
// "my-stack": {
|
|
17
|
-
// "ServerlessSpyWsUrl": "xxx"
|
|
18
|
-
// }
|
|
19
|
-
// }
|
|
20
|
-
serverlessSpyWsUrl = config[Object.keys(config)[0]].ServerlessSpyWsUrl;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
serverlessSpyWsUrl =
|
|
24
|
-
'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
|
|
25
|
-
if (!serverlessSpyWsUrl) {
|
|
26
|
-
throw new Error('Missing WS url');
|
|
27
|
-
}
|
|
28
|
-
console.log('serverlessSpyWsUrl', serverlessSpyWsUrl);
|
|
29
|
-
const wsUrl = await (0, getWebSocketUrl_1.getWebSocketUrl)(serverlessSpyWsUrl);
|
|
30
|
-
// source https://developer.mozilla.org/en-US/docs/Learn/Server-side/Node_server_without_framework
|
|
31
|
-
http
|
|
32
|
-
.createServer((request, response) => {
|
|
33
|
-
console.log('request ', request.url);
|
|
34
|
-
let filePath = `.${request.url}`;
|
|
35
|
-
if (filePath === './') {
|
|
36
|
-
filePath = './index.html';
|
|
37
|
-
}
|
|
38
|
-
const extname = String(path.extname(filePath)).toLowerCase();
|
|
39
|
-
const mimeTypes = {
|
|
40
|
-
'.html': 'text/html',
|
|
41
|
-
'.js': 'text/javascript',
|
|
42
|
-
'.css': 'text/css',
|
|
43
|
-
'.json': 'application/json',
|
|
44
|
-
'.png': 'image/png',
|
|
45
|
-
'.jpg': 'image/jpg',
|
|
46
|
-
'.gif': 'image/gif',
|
|
47
|
-
'.svg': 'image/svg+xml',
|
|
48
|
-
'.wav': 'audio/wav',
|
|
49
|
-
'.mp4': 'video/mp4',
|
|
50
|
-
'.woff': 'application/font-woff',
|
|
51
|
-
'.ttf': 'application/font-ttf',
|
|
52
|
-
'.eot': 'application/vnd.ms-fontobject',
|
|
53
|
-
'.otf': 'application/font-otf',
|
|
54
|
-
'.wasm': 'application/wasm',
|
|
55
|
-
};
|
|
56
|
-
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
57
|
-
fs.readFile(filePath, (error, content) => {
|
|
58
|
-
if (error) {
|
|
59
|
-
if (error.code === 'ENOENT') {
|
|
60
|
-
fs.readFile('./404.html', (_err, cont) => {
|
|
61
|
-
response.writeHead(404, { 'Content-Type': 'text/html' });
|
|
62
|
-
response.end(cont, 'utf-8');
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
response.writeHead(500);
|
|
67
|
-
response.end(`Sorry, check with the site admin for error: ${error.code} ..\n`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
response.writeHead(200, { 'Content-Type': contentType });
|
|
72
|
-
if (request.url === '/serverlessSpy.js') {
|
|
73
|
-
const contentNew = content
|
|
74
|
-
.toString()
|
|
75
|
-
.replace('SERVERLESS_SPY_WS_URL', wsUrl);
|
|
76
|
-
response.end(contentNew, 'utf-8');
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
response.end(content, 'utf-8');
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
})
|
|
84
|
-
.listen(8125);
|
|
85
|
-
}
|
|
86
|
-
run().catch(console.error);
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY2xpL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLCtEQUE0RDtBQUU1RCxLQUFLLFVBQVUsR0FBRztJQUNoQixNQUFNLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDO0lBRXBELElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDcEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFOUMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QywrQkFBK0I7WUFDL0IsSUFBSTtZQUNKLGtCQUFrQjtZQUNsQixrQ0FBa0M7WUFDbEMsTUFBTTtZQUNOLElBQUk7WUFFSixrQkFBa0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1NBQ3hFO0tBQ0Y7SUFFRCxrQkFBa0I7UUFDaEIsMkRBQTJELENBQUM7SUFFOUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNuQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUV0RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsaUNBQWUsRUFBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXhELGtHQUFrRztJQUNsRyxJQUFJO1NBQ0QsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDckIsUUFBUSxHQUFHLGNBQWMsQ0FBQztTQUMzQjtRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQVE7WUFDckIsT0FBTyxFQUFFLFdBQVc7WUFDcEIsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixNQUFNLEVBQUUsVUFBVTtZQUNsQixPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE9BQU8sRUFBRSx1QkFBdUI7WUFDaEMsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixNQUFNLEVBQUUsK0JBQStCO1lBQ3ZDLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsT0FBTyxFQUFFLGtCQUFrQjtTQUM1QixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLDBCQUEwQixDQUFDO1FBRXJFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3ZDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQzNCLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO3dCQUN2QyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsUUFBUSxDQUFDLEdBQUcsQ0FDViwrQ0FBK0MsS0FBSyxDQUFDLElBQUksT0FBTyxDQUNqRSxDQUFDO2lCQUNIO2FBQ0Y7aUJBQU07Z0JBQ0wsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDekQsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLG1CQUFtQixFQUFFO29CQUN2QyxNQUFNLFVBQVUsR0FBRyxPQUFPO3lCQUN2QixRQUFRLEVBQUU7eUJBQ1YsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUMzQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDbkM7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ2hDO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0V2ViU29ja2V0VXJsIH0gZnJvbSAnLi4vY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgY29uc3QgY2RrRXhwb3J0RmlsZU5hbWUgPSAnLi4vLnNweS9jZGtFeHBvcnRzLmpzb24nO1xuXG4gIGxldCBzZXJ2ZXJsZXNzU3B5V3NVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrRXhwb3J0RmlsZU5hbWUpKSB7XG4gICAgY29uc3QgcmF3ZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhjZGtFeHBvcnRGaWxlTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXdkYXRhLnRvU3RyaW5nKCkpO1xuXG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWdbT2JqZWN0LmtleXMoY29uZmlnKVswXV0pIHtcbiAgICAgIC8vIGdldCBmaXJzdCBTZXJ2ZXJsZXNzU3B5V3NVcmxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgXCJteS1zdGFja1wiOiB7XG4gICAgICAvLyAgICAgXCJTZXJ2ZXJsZXNzU3B5V3NVcmxcIjogXCJ4eHhcIlxuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG5cbiAgICAgIHNlcnZlcmxlc3NTcHlXc1VybCA9IGNvbmZpZ1tPYmplY3Qua2V5cyhjb25maWcpWzBdXS5TZXJ2ZXJsZXNzU3B5V3NVcmw7XG4gICAgfVxuICB9XG5cbiAgc2VydmVybGVzc1NweVdzVXJsID1cbiAgICAnd3NzOi8vcHJlaDF4bzF4aC5leGVjdXRlLWFwaS5ldS13ZXN0LTEuYW1hem9uYXdzLmNvbS9wcm9kJztcblxuICBpZiAoIXNlcnZlcmxlc3NTcHlXc1VybCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBXUyB1cmwnKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdzZXJ2ZXJsZXNzU3B5V3NVcmwnLCBzZXJ2ZXJsZXNzU3B5V3NVcmwpO1xuXG4gIGNvbnN0IHdzVXJsID0gYXdhaXQgZ2V0V2ViU29ja2V0VXJsKHNlcnZlcmxlc3NTcHlXc1VybCk7XG5cbiAgLy8gc291cmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTGVhcm4vU2VydmVyLXNpZGUvTm9kZV9zZXJ2ZXJfd2l0aG91dF9mcmFtZXdvcmtcbiAgaHR0cFxuICAgIC5jcmVhdGVTZXJ2ZXIoKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygncmVxdWVzdCAnLCByZXF1ZXN0LnVybCk7XG5cbiAgICAgIGxldCBmaWxlUGF0aCA9IGAuJHtyZXF1ZXN0LnVybH1gO1xuICAgICAgaWYgKGZpbGVQYXRoID09PSAnLi8nKSB7XG4gICAgICAgIGZpbGVQYXRoID0gJy4vaW5kZXguaHRtbCc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dG5hbWUgPSBTdHJpbmcocGF0aC5leHRuYW1lKGZpbGVQYXRoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlczogYW55ID0ge1xuICAgICAgICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgICAgICAgJy5qcyc6ICd0ZXh0L2phdmFzY3JpcHQnLFxuICAgICAgICAnLmNzcyc6ICd0ZXh0L2NzcycsXG4gICAgICAgICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgJy5qcGcnOiAnaW1hZ2UvanBnJyxcbiAgICAgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICAgICAgICcud2F2JzogJ2F1ZGlvL3dhdicsXG4gICAgICAgICcubXA0JzogJ3ZpZGVvL21wNCcsXG4gICAgICAgICcud29mZic6ICdhcHBsaWNhdGlvbi9mb250LXdvZmYnLFxuICAgICAgICAnLnR0Zic6ICdhcHBsaWNhdGlvbi9mb250LXR0ZicsXG4gICAgICAgICcuZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICAgICAgJy5vdGYnOiAnYXBwbGljYXRpb24vZm9udC1vdGYnLFxuICAgICAgICAnLndhc20nOiAnYXBwbGljYXRpb24vd2FzbScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IG1pbWVUeXBlc1tleHRuYW1lXSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcblxuICAgICAgZnMucmVhZEZpbGUoZmlsZVBhdGgsIChlcnJvciwgY29udGVudCkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKCcuLzQwNC5odG1sJywgKF9lcnIsIGNvbnQpID0+IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcgfSk7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250LCAndXRmLTgnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChcbiAgICAgICAgICAgICAgYFNvcnJ5LCBjaGVjayB3aXRoIHRoZSBzaXRlIGFkbWluIGZvciBlcnJvcjogJHtlcnJvci5jb2RlfSAuLlxcbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgICAgIGlmIChyZXF1ZXN0LnVybCA9PT0gJy9zZXJ2ZXJsZXNzU3B5LmpzJykge1xuICAgICAgICAgICAgY29uc3QgY29udGVudE5ldyA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLnJlcGxhY2UoJ1NFUlZFUkxFU1NfU1BZX1dTX1VSTCcsIHdzVXJsKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250ZW50TmV3LCAndXRmLTgnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKGNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSlcbiAgICAubGlzdGVuKDgxMjUpO1xufVxuXG5ydW4oKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiJdfQ==
|
package/lib/cjs/cli/ws.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
const readline = require("readline");
|
|
5
|
-
const ws_1 = require("ws");
|
|
6
|
-
const getWebSocketUrl_1 = require("../common/getWebSocketUrl");
|
|
7
|
-
async function run() {
|
|
8
|
-
// var credentialsProvider = awsCp.fromTemporaryCredentials();
|
|
9
|
-
// const credentials = await credentialsProvider();
|
|
10
|
-
// const client = new STSClient({});
|
|
11
|
-
// client.send()
|
|
12
|
-
// const command = new GetSessionTokenCommand({});
|
|
13
|
-
// const { Credentials: credentials } = await client.send(command);
|
|
14
|
-
// //const credentials = s.Credentials;
|
|
15
|
-
// console.log("credentials", credentials);
|
|
16
|
-
// const url = process.argv[2];
|
|
17
|
-
const url = 'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
|
|
18
|
-
// https://medium.com/@o.bredenberg/iam-sign-your-api-gateway-websocket-connection-request-no-custom-auth-from-your-frontend-65451166757d
|
|
19
|
-
const url2 = await (0, getWebSocketUrl_1.getWebSocketUrl)(url);
|
|
20
|
-
const ws = new ws_1.default(url2);
|
|
21
|
-
const fileDescriptor = fs.openSync('spy_log.json', 'w');
|
|
22
|
-
// 📢📁⚡️💾 💽 💾 💿 📀🛢🪣📑🔊
|
|
23
|
-
ws.on('open', () => console.log(`connected ${new Date().toISOString()}`));
|
|
24
|
-
ws.on('message', (data) => {
|
|
25
|
-
// console.log(`From server: ${data}`);
|
|
26
|
-
let parsed;
|
|
27
|
-
try {
|
|
28
|
-
parsed = JSON.parse(data);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
console.error(`Can not parse ${data}`);
|
|
32
|
-
}
|
|
33
|
-
if (parsed) {
|
|
34
|
-
console.log(`\x1b[47m\x1b[34m${parsed.timestamp} \x1b[31m🍕 ${parsed.serviceKey}\x1b[0m\x1b[32m\n${JSON.stringify(parsed.data, null, 2)}\x1b[0m`);
|
|
35
|
-
}
|
|
36
|
-
fs.write(fileDescriptor, data, (error) => {
|
|
37
|
-
if (!error) {
|
|
38
|
-
// fs.close(fileDescriptor);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
console.error(error);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
fs.write(fileDescriptor, '\n', (error) => {
|
|
45
|
-
if (!error) {
|
|
46
|
-
// fs.close(fileDescriptor);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
console.error(error);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
ws.on('close', () => {
|
|
54
|
-
console.log(`disconnected ${new Date().toISOString()}`);
|
|
55
|
-
fs.close(fileDescriptor, () => undefined);
|
|
56
|
-
process.exit();
|
|
57
|
-
});
|
|
58
|
-
readline
|
|
59
|
-
.createInterface({
|
|
60
|
-
input: process.stdin,
|
|
61
|
-
output: process.stdout,
|
|
62
|
-
})
|
|
63
|
-
.on('line', (data) => {
|
|
64
|
-
ws.send(data);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
run().catch(console.error);
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jbGkvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5QkFBeUI7QUFDekIscUNBQXFDO0FBQ3JDLDJCQUEyQjtBQUMzQiwrREFBNEQ7QUFFNUQsS0FBSyxVQUFVLEdBQUc7SUFDaEIsOERBQThEO0lBQzlELG1EQUFtRDtJQUVuRCxvQ0FBb0M7SUFDcEMsZ0JBQWdCO0lBRWhCLGtEQUFrRDtJQUNsRCxtRUFBbUU7SUFDbkUsdUNBQXVDO0lBRXZDLDJDQUEyQztJQUUzQywrQkFBK0I7SUFDL0IsTUFBTSxHQUFHLEdBQUcsMkRBQTJELENBQUM7SUFFeEUseUlBQXlJO0lBQ3pJLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxpQ0FBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRS9CLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELCtCQUErQjtJQUUvQixFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO1FBQzdCLHVDQUF1QztRQUV2QyxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQUk7WUFDRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtQkFBbUIsTUFBTSxDQUFDLFNBQVMsZUFDakMsTUFBTSxDQUFDLFVBQ1Qsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDbEUsQ0FBQztTQUNIO1FBRUQsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDViw0QkFBNEI7YUFDN0I7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDViw0QkFBNEI7YUFDN0I7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUTtTQUNMLGVBQWUsQ0FBQztRQUNmLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQztTQUNELEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNuQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNELEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IGdldFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gIC8vIHZhciBjcmVkZW50aWFsc1Byb3ZpZGVyID0gYXdzQ3AuZnJvbVRlbXBvcmFyeUNyZWRlbnRpYWxzKCk7XG4gIC8vIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgY3JlZGVudGlhbHNQcm92aWRlcigpO1xuXG4gIC8vIGNvbnN0IGNsaWVudCA9IG5ldyBTVFNDbGllbnQoe30pO1xuICAvLyBjbGllbnQuc2VuZCgpXG5cbiAgLy8gY29uc3QgY29tbWFuZCA9IG5ldyBHZXRTZXNzaW9uVG9rZW5Db21tYW5kKHt9KTtcbiAgLy8gY29uc3QgeyBDcmVkZW50aWFsczogY3JlZGVudGlhbHMgfSA9IGF3YWl0IGNsaWVudC5zZW5kKGNvbW1hbmQpO1xuICAvLyAvL2NvbnN0IGNyZWRlbnRpYWxzID0gcy5DcmVkZW50aWFscztcblxuICAvLyBjb25zb2xlLmxvZyhcImNyZWRlbnRpYWxzXCIsIGNyZWRlbnRpYWxzKTtcblxuICAvLyBjb25zdCB1cmwgPSBwcm9jZXNzLmFyZ3ZbMl07XG4gIGNvbnN0IHVybCA9ICd3c3M6Ly9wcmVoMXhvMXhoLmV4ZWN1dGUtYXBpLmV1LXdlc3QtMS5hbWF6b25hd3MuY29tL3Byb2QnO1xuXG4gIC8vIGh0dHBzOi8vbWVkaXVtLmNvbS9Aby5icmVkZW5iZXJnL2lhbS1zaWduLXlvdXItYXBpLWdhdGV3YXktd2Vic29ja2V0LWNvbm5lY3Rpb24tcmVxdWVzdC1uby1jdXN0b20tYXV0aC1mcm9tLXlvdXItZnJvbnRlbmQtNjU0NTExNjY3NTdkXG4gIGNvbnN0IHVybDIgPSBhd2FpdCBnZXRXZWJTb2NrZXRVcmwodXJsKTtcblxuICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsMik7XG5cbiAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSBmcy5vcGVuU3luYygnc3B5X2xvZy5qc29uJywgJ3cnKTtcbiAgLy8g8J+TovCfk4HimqHvuI/wn5K+IPCfkr0g8J+SviDwn5K/IPCfk4Dwn5ui8J+qo/Cfk5Hwn5SKXG5cbiAgd3Mub24oJ29wZW4nLCAoKSA9PiBjb25zb2xlLmxvZyhgY29ubmVjdGVkICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApKTtcbiAgd3Mub24oJ21lc3NhZ2UnLCAoZGF0YTogYW55KSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coYEZyb20gc2VydmVyOiAke2RhdGF9YCk7XG5cbiAgICBsZXQgcGFyc2VkO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ2FuIG5vdCBwYXJzZSAke2RhdGF9YCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcXHgxYls0N21cXHgxYlszNG0ke3BhcnNlZC50aW1lc3RhbXB9IFxceDFiWzMxbfCfjZUgJHtcbiAgICAgICAgICBwYXJzZWQuc2VydmljZUtleVxuICAgICAgICB9XFx4MWJbMG1cXHgxYlszMm1cXG4ke0pTT04uc3RyaW5naWZ5KHBhcnNlZC5kYXRhLCBudWxsLCAyKX1cXHgxYlswbWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnMud3JpdGUoZmlsZURlc2NyaXB0b3IsIGRhdGEsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBmcy5jbG9zZShmaWxlRGVzY3JpcHRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmcy53cml0ZShmaWxlRGVzY3JpcHRvciwgJ1xcbicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBmcy5jbG9zZShmaWxlRGVzY3JpcHRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgZGlzY29ubmVjdGVkICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgIGZzLmNsb3NlKGZpbGVEZXNjcmlwdG9yLCAoKSA9PiB1bmRlZmluZWQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcblxuICByZWFkbGluZVxuICAgIC5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICAgIH0pXG4gICAgLm9uKCdsaW5lJywgKGRhdGEpID0+IHtcbiAgICAgIHdzLnNlbmQoZGF0YSk7XG4gICAgfSk7XG59XG5ydW4oKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiJdfQ==
|