serverless-spy 2.3.11 → 2.3.16
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 +2 -2
- package/dist/releasetag.txt +1 -1
- package/lib/_virtual/rolldown_runtime.mjs +1 -0
- package/lib/cli/cli.mjs +1 -1
- package/lib/cli/sampleData.mjs +1 -0
- package/lib/cli/sampleData.mjs.map +1 -1
- package/lib/common/SpyEventSender.mjs +1 -0
- package/lib/common/SpyEventSender.mjs.map +1 -1
- package/lib/common/getWebSocketUrl.mjs +1 -0
- package/lib/common/getWebSocketUrl.mjs.map +1 -1
- package/lib/common/spyEvents/DynamoDBSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/EventBridgeBaseSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/EventBridgeRuleSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/EventBridgeSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/FunctionBaseSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/FunctionConsole.mjs +1 -0
- package/lib/common/spyEvents/FunctionConsoleSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/FunctionContext.mjs +1 -0
- package/lib/common/spyEvents/FunctionErrorSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/FunctionRequestSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/FunctionResponseSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/S3SpyEvent.mjs +1 -0
- package/lib/common/spyEvents/SnsSpyEventBase.mjs +1 -0
- package/lib/common/spyEvents/SnsSubscriptionSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/SnsTopicSpyEvent.mjs +1 -0
- package/lib/common/spyEvents/SpyEvent.mjs +1 -0
- package/lib/common/spyEvents/SpyMessage.mjs +1 -0
- package/lib/common/spyEvents/SqsSpyEvent.mjs +1 -0
- package/lib/functions/onConnect.mjs +1 -0
- package/lib/functions/onConnect.mjs.map +1 -1
- package/lib/functions/onDisconnect.mjs +1 -0
- package/lib/functions/onDisconnect.mjs.map +1 -1
- package/lib/functions/sendMessage.mjs +1 -0
- package/lib/functions/sendMessage.mjs.map +1 -1
- package/lib/functions/sqsSubscriptionAndDropAllMessages.mjs +1 -0
- package/lib/functions/sqsSubscriptionAndDropAllMessages.mjs.map +1 -1
- package/lib/index.mjs +1 -0
- package/lib/listener/PrettifyForDisplay.mjs +1 -0
- package/lib/listener/RecursivePartial.mjs +1 -0
- package/lib/listener/ServerlessSpyListener.mjs +1 -0
- package/lib/listener/ServerlessSpyListenerParams.mjs +1 -0
- package/lib/listener/SpyHandlers.ts.mjs +1 -0
- package/lib/listener/WaitForParams.mjs +1 -0
- package/lib/listener/WsListener.mjs +1 -0
- package/lib/listener/WsListener.mjs.map +1 -1
- package/lib/listener/createServerlessSpyListener.mjs +1 -0
- package/lib/listener/createServerlessSpyListener.mjs.map +1 -1
- package/lib/listener/index.mjs +1 -0
- package/lib/listener/iot-connection.mjs +1 -0
- package/lib/listener/iot-connection.mjs.map +1 -1
- package/lib/listener/matchers.mjs +1 -0
- package/lib/listener/setup.mjs +1 -0
- package/lib/listener/topic.mjs +1 -0
- package/lib/listener/topic.mjs.map +1 -1
- package/lib/node_modules/uuid/dist/esm-node/native.mjs +1 -0
- package/lib/node_modules/uuid/dist/esm-node/native.mjs.map +1 -1
- package/lib/node_modules/uuid/dist/esm-node/rng.mjs +1 -0
- package/lib/node_modules/uuid/dist/esm-node/rng.mjs.map +1 -1
- package/lib/node_modules/uuid/dist/esm-node/stringify.mjs +1 -0
- package/lib/node_modules/uuid/dist/esm-node/stringify.mjs.map +1 -1
- package/lib/node_modules/uuid/dist/esm-node/v4.mjs +1 -0
- package/lib/node_modules/uuid/dist/esm-node/v4.mjs.map +1 -1
- package/lib/src/ServerlessSpy.js +1 -1
- package/lib/src/ServerlessSpy.mjs +1 -1
- package/lib/src/common/envVariableNames.mjs +1 -0
- package/lib/src/common/envVariableNames.mjs.map +1 -1
- package/lib/src/index.mjs +1 -0
- package/package.json +1 -1
- package/tsdown.config.ts +6 -1
- package/lib/node_modules/tsdown/esm-shims.mjs +0 -11
- package/lib/node_modules/tsdown/esm-shims.mjs.map +0 -1
package/.jsii
CHANGED
|
@@ -4346,6 +4346,6 @@
|
|
|
4346
4346
|
"symbolId": "src/ServerlessSpy:SpyFilter"
|
|
4347
4347
|
}
|
|
4348
4348
|
},
|
|
4349
|
-
"version": "2.3.
|
|
4350
|
-
"fingerprint": "
|
|
4349
|
+
"version": "2.3.16",
|
|
4350
|
+
"fingerprint": "CqVX/HY+A01BfbFscff+4t3wZHRXnJ8yEBFxYNk2bvM="
|
|
4351
4351
|
}
|
package/dist/releasetag.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v2.3.
|
|
1
|
+
v2.3.16
|
package/lib/cli/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
const __dirname = import.meta.dirname;
|
|
3
3
|
import { getConnection } from "../listener/iot-connection.mjs";
|
|
4
4
|
import { getTopic } from "../listener/topic.mjs";
|
|
5
5
|
import * as fs from "fs";
|
package/lib/cli/sampleData.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampleData.mjs","names":[],"sources":["../../cli/sampleData.ts"],"sourcesContent":["export const sampleData = [\n {\n timestamp: '2022-09-20T09:46:04.610Z',\n serviceKey: 'Function#ToSnsAndDynamoDb#Request',\n data: {\n request: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n context: {\n functionName: 'ServerlessSpyE2e-ToSnsAndDynamoDb13696817-sagu3HTK25K6',\n awsRequestId: 'ba4d4569-416a-407b-9842-0ee38a83b97c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.674Z',\n serviceKey: 'Function#ToSnsAndDynamoDb#Response',\n data: {\n request: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n response: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n context: {\n functionName: 'ServerlessSpyE2e-ToSnsAndDynamoDb13696817-sagu3HTK25K6',\n awsRequestId: 'ba4d4569-416a-407b-9842-0ee38a83b97c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.751Z',\n serviceKey: 'Function#ReceiveSqs#Response',\n data: {\n request: {\n Records: [\n {\n messageId: 'b1dd1d88-0560-43de-a406-394ca4bb7cec',\n receiptHandle:\n 'AQEBivlgjdhylhmB95VJL1K1OGeZpzOmbZAiaNUT/EnlDN/Bmlo7o/Aby9zveOanusGVdsBwF5VAbQEPc17y1sNa/mA3gN54I13/vm9K0rmLlmMG77yp4e/VhbK9qx8xG+w87JCDC1iw8alEea+zqiBqWFalEUL0SAT8lkkS/plq4AA1B40ytuVZm4HGnTc+4SltCFmmbxFMDblSZ5fzQ6jyQAnh8Hb5kDQTwbKu7eRI14XvNC39tlb1kGGYHQa7jOqC6KAjqozwTeZjcEgUzjNoqyqzNXL4lWpucxO/YgFEqi7aRiPQZZO2UY9mgWPgNp17P5LGOu4Kh48hFs6vvfQMkqAOskN3KWzj9o/N4QC3pvKRE3r9cFgYh6UdwQwBI/P7c+QBBqt1JG89DklJBobmzcLjI+agJaP5RWb6tBwhOzCC3CbOwqfr/myLfcPF3ZZj',\n body: '{\\n \"Type\" : \"Notification\",\\n \"MessageId\" : \"f2a02b45-0ecb-566c-9616-70e680d73f8c\",\\n \"TopicArn\" : \"arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF\",\\n \"Message\" : \"{\\\\\"id\\\\\":\\\\\"057f544b-7f90-496c-8006-3043dec54620\\\\\",\\\\\"message\\\\\":\\\\\"Hello\\\\\"}\",\\n \"Timestamp\" : \"2022-09-20T09:46:04.607Z\",\\n \"SignatureVersion\" : \"1\",\\n \"Signature\" : \"dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==\",\\n \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem\",\\n \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6\",\\n \"MessageAttributes\" : {\\n \"test\" : {\"Type\":\"String\",\"Value\":\"test\"}\\n }\\n}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=24c04ec26b26310a;Sampled=0',\n SentTimestamp: '1663667164636',\n SenderId: 'AIDAISMY7JYY5F7RTT6AO',\n ApproximateFirstReceiveTimestamp: '1663667164641',\n },\n messageAttributes: {},\n md5OfBody: 'af6bd3f6989ac11fa4a33798c0cf87cc',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo154EF6659-jvYNz1YlvYdQ',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n response: {\n Records: [\n {\n messageId: 'b1dd1d88-0560-43de-a406-394ca4bb7cec',\n receiptHandle:\n 'AQEBivlgjdhylhmB95VJL1K1OGeZpzOmbZAiaNUT/EnlDN/Bmlo7o/Aby9zveOanusGVdsBwF5VAbQEPc17y1sNa/mA3gN54I13/vm9K0rmLlmMG77yp4e/VhbK9qx8xG+w87JCDC1iw8alEea+zqiBqWFalEUL0SAT8lkkS/plq4AA1B40ytuVZm4HGnTc+4SltCFmmbxFMDblSZ5fzQ6jyQAnh8Hb5kDQTwbKu7eRI14XvNC39tlb1kGGYHQa7jOqC6KAjqozwTeZjcEgUzjNoqyqzNXL4lWpucxO/YgFEqi7aRiPQZZO2UY9mgWPgNp17P5LGOu4Kh48hFs6vvfQMkqAOskN3KWzj9o/N4QC3pvKRE3r9cFgYh6UdwQwBI/P7c+QBBqt1JG89DklJBobmzcLjI+agJaP5RWb6tBwhOzCC3CbOwqfr/myLfcPF3ZZj',\n body: '{\\n \"Type\" : \"Notification\",\\n \"MessageId\" : \"f2a02b45-0ecb-566c-9616-70e680d73f8c\",\\n \"TopicArn\" : \"arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF\",\\n \"Message\" : \"{\\\\\"id\\\\\":\\\\\"057f544b-7f90-496c-8006-3043dec54620\\\\\",\\\\\"message\\\\\":\\\\\"Hello\\\\\"}\",\\n \"Timestamp\" : \"2022-09-20T09:46:04.607Z\",\\n \"SignatureVersion\" : \"1\",\\n \"Signature\" : \"dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==\",\\n \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem\",\\n \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6\",\\n \"MessageAttributes\" : {\\n \"test\" : {\"Type\":\"String\",\"Value\":\"test\"}\\n }\\n}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=24c04ec26b26310a;Sampled=0',\n SentTimestamp: '1663667164636',\n SenderId: 'AIDAISMY7JYY5F7RTT6AO',\n ApproximateFirstReceiveTimestamp: '1663667164641',\n },\n messageAttributes: {},\n md5OfBody: 'af6bd3f6989ac11fa4a33798c0cf87cc',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo154EF6659-jvYNz1YlvYdQ',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n context: {\n functionName: 'ServerlessSpyE2e-ReceiveSqs09F03F56-XeqiZ0cUjJl4',\n awsRequestId: '23672a4d-68be-5ad1-a139-71eee6b20c4c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.755Z',\n serviceKey: 'Function#ReceiveSqs#Request',\n data: {\n request: {\n Records: [\n {\n messageId: 'b1dd1d88-0560-43de-a406-394ca4bb7cec',\n receiptHandle:\n 'AQEBivlgjdhylhmB95VJL1K1OGeZpzOmbZAiaNUT/EnlDN/Bmlo7o/Aby9zveOanusGVdsBwF5VAbQEPc17y1sNa/mA3gN54I13/vm9K0rmLlmMG77yp4e/VhbK9qx8xG+w87JCDC1iw8alEea+zqiBqWFalEUL0SAT8lkkS/plq4AA1B40ytuVZm4HGnTc+4SltCFmmbxFMDblSZ5fzQ6jyQAnh8Hb5kDQTwbKu7eRI14XvNC39tlb1kGGYHQa7jOqC6KAjqozwTeZjcEgUzjNoqyqzNXL4lWpucxO/YgFEqi7aRiPQZZO2UY9mgWPgNp17P5LGOu4Kh48hFs6vvfQMkqAOskN3KWzj9o/N4QC3pvKRE3r9cFgYh6UdwQwBI/P7c+QBBqt1JG89DklJBobmzcLjI+agJaP5RWb6tBwhOzCC3CbOwqfr/myLfcPF3ZZj',\n body: '{\\n \"Type\" : \"Notification\",\\n \"MessageId\" : \"f2a02b45-0ecb-566c-9616-70e680d73f8c\",\\n \"TopicArn\" : \"arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF\",\\n \"Message\" : \"{\\\\\"id\\\\\":\\\\\"057f544b-7f90-496c-8006-3043dec54620\\\\\",\\\\\"message\\\\\":\\\\\"Hello\\\\\"}\",\\n \"Timestamp\" : \"2022-09-20T09:46:04.607Z\",\\n \"SignatureVersion\" : \"1\",\\n \"Signature\" : \"dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==\",\\n \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem\",\\n \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6\",\\n \"MessageAttributes\" : {\\n \"test\" : {\"Type\":\"String\",\"Value\":\"test\"}\\n }\\n}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=24c04ec26b26310a;Sampled=0',\n SentTimestamp: '1663667164636',\n SenderId: 'AIDAISMY7JYY5F7RTT6AO',\n ApproximateFirstReceiveTimestamp: '1663667164641',\n },\n messageAttributes: {},\n md5OfBody: 'af6bd3f6989ac11fa4a33798c0cf87cc',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo154EF6659-jvYNz1YlvYdQ',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n context: {\n functionName: 'ServerlessSpyE2e-ReceiveSqs09F03F56-XeqiZ0cUjJl4',\n awsRequestId: '23672a4d-68be-5ad1-a139-71eee6b20c4c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.800Z',\n serviceKey: 'SnsSubscription#MyTopicNo1#MyQueueNo1',\n data: {\n spyEventType: 'SnsSubscription',\n message: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n subject: null,\n timestamp: '2022-09-20T09:46:04.607Z',\n topicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n messageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n messageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.802Z',\n serviceKey: 'SnsTopic#MyTopicNo1',\n data: {\n spyEventType: 'SnsTopic',\n message: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n subject: null,\n timestamp: '2022-09-20T09:46:04.607Z',\n topicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n messageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n messageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.771Z',\n serviceKey: 'Sqs#MyQueueNo1',\n data: {\n spyEventType: 'Sqs',\n body: {\n Type: 'Notification',\n MessageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n TopicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n Message:\n '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n Timestamp: '2022-09-20T09:46:04.607Z',\n SignatureVersion: '1',\n Signature:\n 'dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==',\n SigningCertURL:\n 'https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem',\n UnsubscribeURL:\n 'https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6',\n MessageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n messageAttributes: {},\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.808Z',\n serviceKey: 'SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3',\n data: {\n spyEventType: 'SnsSubscription',\n message: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n subject: null,\n timestamp: '2022-09-20T09:46:04.607Z',\n topicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n messageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n messageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.903Z',\n serviceKey: 'Function#FromSnsToSqsAndS3#Request',\n data: {\n request: {\n Records: [\n {\n EventSource: 'aws:sns',\n EventVersion: '1.0',\n EventSubscriptionArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n Sns: {\n Type: 'Notification',\n MessageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n TopicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n Subject: null,\n Message:\n '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n Timestamp: '2022-09-20T09:46:04.607Z',\n SignatureVersion: '1',\n Signature:\n 'dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==',\n SigningCertUrl:\n 'https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem',\n UnsubscribeUrl:\n 'https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n MessageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n ],\n },\n context: {\n functionName: 'ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n awsRequestId: '9323981d-674b-427e-b639-4cc26158c69f',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.942Z',\n serviceKey: 'Function#FromSnsToSqsAndS3#Response',\n data: {\n request: {\n Records: [\n {\n EventSource: 'aws:sns',\n EventVersion: '1.0',\n EventSubscriptionArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n Sns: {\n Type: 'Notification',\n MessageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n TopicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n Subject: null,\n Message:\n '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n Timestamp: '2022-09-20T09:46:04.607Z',\n SignatureVersion: '1',\n Signature:\n 'dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==',\n SigningCertUrl:\n 'https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem',\n UnsubscribeUrl:\n 'https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n MessageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n ],\n },\n response: { message: 'Hello undefined' },\n context: {\n functionName: 'ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n awsRequestId: '9323981d-674b-427e-b639-4cc26158c69f',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.088Z',\n serviceKey: 'Sqs#MyQueueNo2',\n data: {\n spyEventType: 'Sqs',\n body: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n messageAttributes: {\n WeeksOn: {\n stringValue: '6',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'Number',\n },\n Author: {\n stringValue: 'John Grisham',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n Title: {\n stringValue: 'The Whistler',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.107Z',\n serviceKey: 'Function#FromSqsToEventBridge#Request',\n data: {\n request: {\n Records: [\n {\n messageId: '6297232e-203b-4776-a811-c5816ee24404',\n receiptHandle:\n 'AQEBNeroB8TFlND6RVnj+vUPAqep/xWY4u7EI4tJURkfPfQPFWmW3g7OtbxLbYXwPVie0ccukt7QP6VB8sFjwSA/oPc3W1pcydJn19GFfrNDeXtZJUPwolV6Ng6D/5Kq9YGBm4G5cnRPg8OXlVZTwjPp4atFRrNh2BSIe2dTURJNK7Okdz+gza5JWwZ/6Lbjw61NAJuMiqCw7ZjN1n3KYvD/cT0DcOWUCnZRoiovYw7mQ+hbm5Vas1WArdF31o6TukwYuA0begjbAbje+udaVjOW6ThjLyvOTWsoxg0CfbVZK4ZaWYWgd7xyd8WOGf1QOKVNMv9elCQi0olC5MAMv/f9B3Kudd6l1RIiQIKaj0LZjf7pn3wsv3TPc85Z+9p3k9hSc++zSsPxN9g8hymZW/rviQlRTzEqSPggJvBr9/nzKcAn3+w20zxquodAJnlobRCY',\n body: '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=34ad705e0750956d;Sampled=0',\n SentTimestamp: '1663667164855',\n SenderId:\n 'AROARDVHBDXRVFXDSOJAT:ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n ApproximateFirstReceiveTimestamp: '1663667164856',\n },\n messageAttributes: {\n WeeksOn: {\n stringValue: '6',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'Number',\n },\n Author: {\n stringValue: 'John Grisham',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n Title: {\n stringValue: 'The Whistler',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n },\n md5OfMessageAttributes: 'd25a6aea97eb8f585bfa92d314504a92',\n md5OfBody: 'c64b00e6b5eb62c5f39cf4e7b1f4bbd7',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo27A959A93-MwJqK7Urit97',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n context: {\n functionName:\n 'ServerlessSpyE2e-FromSqsToEventBridgeE78842BE-VAz1SGd6qaR6',\n awsRequestId: 'e0868330-80ce-59a7-8d77-d8930ec34d78',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.131Z',\n serviceKey: 'Function#FromSqsToEventBridge#Response',\n data: {\n request: {\n Records: [\n {\n messageId: '6297232e-203b-4776-a811-c5816ee24404',\n receiptHandle:\n 'AQEBNeroB8TFlND6RVnj+vUPAqep/xWY4u7EI4tJURkfPfQPFWmW3g7OtbxLbYXwPVie0ccukt7QP6VB8sFjwSA/oPc3W1pcydJn19GFfrNDeXtZJUPwolV6Ng6D/5Kq9YGBm4G5cnRPg8OXlVZTwjPp4atFRrNh2BSIe2dTURJNK7Okdz+gza5JWwZ/6Lbjw61NAJuMiqCw7ZjN1n3KYvD/cT0DcOWUCnZRoiovYw7mQ+hbm5Vas1WArdF31o6TukwYuA0begjbAbje+udaVjOW6ThjLyvOTWsoxg0CfbVZK4ZaWYWgd7xyd8WOGf1QOKVNMv9elCQi0olC5MAMv/f9B3Kudd6l1RIiQIKaj0LZjf7pn3wsv3TPc85Z+9p3k9hSc++zSsPxN9g8hymZW/rviQlRTzEqSPggJvBr9/nzKcAn3+w20zxquodAJnlobRCY',\n body: '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=34ad705e0750956d;Sampled=0',\n SentTimestamp: '1663667164855',\n SenderId:\n 'AROARDVHBDXRVFXDSOJAT:ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n ApproximateFirstReceiveTimestamp: '1663667164856',\n },\n messageAttributes: {\n WeeksOn: {\n stringValue: '6',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'Number',\n },\n Author: {\n stringValue: 'John Grisham',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n Title: {\n stringValue: 'The Whistler',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n },\n md5OfMessageAttributes: 'd25a6aea97eb8f585bfa92d314504a92',\n md5OfBody: 'c64b00e6b5eb62c5f39cf4e7b1f4bbd7',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo27A959A93-MwJqK7Urit97',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n response: { message: 'Hello undefined' },\n context: {\n functionName:\n 'ServerlessSpyE2e-FromSqsToEventBridgeE78842BE-VAz1SGd6qaR6',\n awsRequestId: 'e0868330-80ce-59a7-8d77-d8930ec34d78',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.319Z',\n serviceKey: 'EventBridgeRule#MyEventBus#MyEventBridge',\n data: {\n spyEventType: 'EventBridgeRule',\n detail: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n detailType: 'test',\n source: 'test-source',\n time: '2022-09-20T09:46:05Z',\n account: '123456789012',\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.379Z',\n serviceKey: 'EventBridge#MyEventBus',\n data: {\n spyEventType: 'EventBridge',\n detail: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n detailType: 'test',\n source: 'test-source',\n time: '2022-09-20T09:46:05Z',\n account: '123456789012',\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.504Z',\n serviceKey: 'Function#ReceiveEventBridge#Request',\n data: {\n request: {\n version: '0',\n id: '33549074-e48f-2857-f67c-263c621cde5c',\n 'detail-type': 'test',\n source: 'test-source',\n account: '123456789012',\n time: '2022-09-20T09:46:05Z',\n region: 'eu-west-1',\n resources: [],\n detail: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n },\n context: {\n functionName:\n 'ServerlessSpyE2e-ReceiveEventBridge1A8F9A7B-1x4KLKDymCCn',\n awsRequestId: '32814437-2efb-4384-9cb5-a04ac9639345',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.543Z',\n serviceKey: 'DynamoDB#MyTable',\n data: {\n spyEventType: 'DynamoDB',\n eventName: 'INSERT',\n newImage: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n pk: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n keys: { pk: '057f544b-7f90-496c-8006-3043dec54620' },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.541Z',\n serviceKey: 'Function#ReceiveEventBridge#Response',\n data: {\n request: {\n version: '0',\n id: '33549074-e48f-2857-f67c-263c621cde5c',\n 'detail-type': 'test',\n source: 'test-source',\n account: '123456789012',\n time: '2022-09-20T09:46:05Z',\n region: 'eu-west-1',\n resources: [],\n detail: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n },\n response: {\n version: '0',\n id: '33549074-e48f-2857-f67c-263c621cde5c',\n 'detail-type': 'test',\n source: 'test-source',\n account: '123456789012',\n time: '2022-09-20T09:46:05Z',\n region: 'eu-west-1',\n resources: [],\n detail: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n },\n context: {\n functionName:\n 'ServerlessSpyE2e-ReceiveEventBridge1A8F9A7B-1x4KLKDymCCn',\n awsRequestId: '32814437-2efb-4384-9cb5-a04ac9639345',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:06.313Z',\n serviceKey: 'S3#MyBucket',\n data: {\n spyEventType: 'S3',\n eventName: 'ObjectCreated:Put',\n eventTime: '2022-09-20T09:46:04.914Z',\n bucket: 'serverlessspye2e-mybucketf68f3ff0-fl5cf0ojrgtc',\n key: '057f544b-7f90-496c-8006-3043dec54620.json',\n },\n },\n];\n"],"mappings":";AAAA,MAAa,aAAa;CACxB;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,UAAU;IACR,IAAI;IACJ,SAAS;IACV;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UAAU;KACV,kCAAkC;KACnC;IACD,mBAAmB,EAAE;IACrB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,UAAU,EACR,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UAAU;KACV,kCAAkC;KACnC;IACD,mBAAmB,EAAE;IACrB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UAAU;KACV,kCAAkC;KACnC;IACD,mBAAmB,EAAE;IACrB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;GACT,WAAW;GACX,UACE;GACF,WAAW;GACX,mBAAmB,EAAE,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,EAAE;GAC/D;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;GACT,WAAW;GACX,UACE;GACF,WAAW;GACX,mBAAmB,EAAE,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,EAAE;GAC/D;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,MAAM;IACJ,MAAM;IACN,WAAW;IACX,UACE;IACF,SACE;IACF,WAAW;IACX,kBAAkB;IAClB,WACE;IACF,gBACE;IACF,gBACE;IACF,mBAAmB,EAAE,MAAM;KAAE,MAAM;KAAU,OAAO;KAAQ,EAAE;IAC/D;GACD,mBAAmB,EAAE;GACtB;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;GACT,WAAW;GACX,UACE;GACF,WAAW;GACX,mBAAmB,EAAE,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,EAAE;GAC/D;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,aAAa;IACb,cAAc;IACd,sBACE;IACF,KAAK;KACH,MAAM;KACN,WAAW;KACX,UACE;KACF,SAAS;KACT,SACE;KACF,WAAW;KACX,kBAAkB;KAClB,WACE;KACF,gBACE;KACF,gBACE;KACF,mBAAmB,EAAE,MAAM;MAAE,MAAM;MAAU,OAAO;MAAQ,EAAE;KAC/D;IACF,CACF,EACF;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,aAAa;IACb,cAAc;IACd,sBACE;IACF,KAAK;KACH,MAAM;KACN,WAAW;KACX,UACE;KACF,SAAS;KACT,SACE;KACF,WAAW;KACX,kBAAkB;KAClB,WACE;KACF,gBACE;KACF,gBACE;KACF,mBAAmB,EAAE,MAAM;MAAE,MAAM;MAAU,OAAO;MAAQ,EAAE;KAC/D;IACF,CACF,EACF;GACD,UAAU,EAAE,SAAS,mBAAmB;GACxC,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,MAAM;IAAE,IAAI;IAAwC,SAAS;IAAS;GACtE,mBAAmB;IACjB,SAAS;KACP,aAAa;KACb,kBAAkB,EAAE;KACpB,kBAAkB,EAAE;KACpB,UAAU;KACX;IACD,QAAQ;KACN,aAAa;KACb,kBAAkB,EAAE;KACpB,kBAAkB,EAAE;KACpB,UAAU;KACX;IACD,OAAO;KACL,aAAa;KACb,kBAAkB,EAAE;KACpB,kBAAkB,EAAE;KACpB,UAAU;KACX;IACF;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UACE;KACF,kCAAkC;KACnC;IACD,mBAAmB;KACjB,SAAS;MACP,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,QAAQ;MACN,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,OAAO;MACL,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACF;IACD,wBAAwB;IACxB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UACE;KACF,kCAAkC;KACnC;IACD,mBAAmB;KACjB,SAAS;MACP,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,QAAQ;MACN,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,OAAO;MACL,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACF;IACD,wBAAwB;IACxB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,UAAU,EAAE,SAAS,mBAAmB;GACxC,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,QAAQ;IAAE,IAAI;IAAwC,SAAS;IAAS;GACxE,YAAY;GACZ,QAAQ;GACR,MAAM;GACN,SAAS;GACV;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,QAAQ;IAAE,IAAI;IAAwC,SAAS;IAAS;GACxE,YAAY;GACZ,QAAQ;GACR,MAAM;GACN,SAAS;GACV;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IACP,SAAS;IACT,IAAI;IACJ,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW,EAAE;IACb,QAAQ;KACN,IAAI;KACJ,SAAS;KACV;IACF;GACD,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,WAAW;GACX,UAAU;IACR,IAAI;IACJ,IAAI;IACJ,SAAS;IACV;GACD,MAAM,EAAE,IAAI,wCAAwC;GACrD;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IACP,SAAS;IACT,IAAI;IACJ,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW,EAAE;IACb,QAAQ;KACN,IAAI;KACJ,SAAS;KACV;IACF;GACD,UAAU;IACR,SAAS;IACT,IAAI;IACJ,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW,EAAE;IACb,QAAQ;KACN,IAAI;KACJ,SAAS;KACV;IACF;GACD,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,WAAW;GACX,WAAW;GACX,QAAQ;GACR,KAAK;GACN;EACF;CACF"}
|
|
1
|
+
{"version":3,"file":"sampleData.mjs","names":[],"sources":["../../cli/sampleData.ts"],"sourcesContent":["export const sampleData = [\n {\n timestamp: '2022-09-20T09:46:04.610Z',\n serviceKey: 'Function#ToSnsAndDynamoDb#Request',\n data: {\n request: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n context: {\n functionName: 'ServerlessSpyE2e-ToSnsAndDynamoDb13696817-sagu3HTK25K6',\n awsRequestId: 'ba4d4569-416a-407b-9842-0ee38a83b97c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.674Z',\n serviceKey: 'Function#ToSnsAndDynamoDb#Response',\n data: {\n request: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n response: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n context: {\n functionName: 'ServerlessSpyE2e-ToSnsAndDynamoDb13696817-sagu3HTK25K6',\n awsRequestId: 'ba4d4569-416a-407b-9842-0ee38a83b97c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.751Z',\n serviceKey: 'Function#ReceiveSqs#Response',\n data: {\n request: {\n Records: [\n {\n messageId: 'b1dd1d88-0560-43de-a406-394ca4bb7cec',\n receiptHandle:\n 'AQEBivlgjdhylhmB95VJL1K1OGeZpzOmbZAiaNUT/EnlDN/Bmlo7o/Aby9zveOanusGVdsBwF5VAbQEPc17y1sNa/mA3gN54I13/vm9K0rmLlmMG77yp4e/VhbK9qx8xG+w87JCDC1iw8alEea+zqiBqWFalEUL0SAT8lkkS/plq4AA1B40ytuVZm4HGnTc+4SltCFmmbxFMDblSZ5fzQ6jyQAnh8Hb5kDQTwbKu7eRI14XvNC39tlb1kGGYHQa7jOqC6KAjqozwTeZjcEgUzjNoqyqzNXL4lWpucxO/YgFEqi7aRiPQZZO2UY9mgWPgNp17P5LGOu4Kh48hFs6vvfQMkqAOskN3KWzj9o/N4QC3pvKRE3r9cFgYh6UdwQwBI/P7c+QBBqt1JG89DklJBobmzcLjI+agJaP5RWb6tBwhOzCC3CbOwqfr/myLfcPF3ZZj',\n body: '{\\n \"Type\" : \"Notification\",\\n \"MessageId\" : \"f2a02b45-0ecb-566c-9616-70e680d73f8c\",\\n \"TopicArn\" : \"arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF\",\\n \"Message\" : \"{\\\\\"id\\\\\":\\\\\"057f544b-7f90-496c-8006-3043dec54620\\\\\",\\\\\"message\\\\\":\\\\\"Hello\\\\\"}\",\\n \"Timestamp\" : \"2022-09-20T09:46:04.607Z\",\\n \"SignatureVersion\" : \"1\",\\n \"Signature\" : \"dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==\",\\n \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem\",\\n \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6\",\\n \"MessageAttributes\" : {\\n \"test\" : {\"Type\":\"String\",\"Value\":\"test\"}\\n }\\n}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=24c04ec26b26310a;Sampled=0',\n SentTimestamp: '1663667164636',\n SenderId: 'AIDAISMY7JYY5F7RTT6AO',\n ApproximateFirstReceiveTimestamp: '1663667164641',\n },\n messageAttributes: {},\n md5OfBody: 'af6bd3f6989ac11fa4a33798c0cf87cc',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo154EF6659-jvYNz1YlvYdQ',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n response: {\n Records: [\n {\n messageId: 'b1dd1d88-0560-43de-a406-394ca4bb7cec',\n receiptHandle:\n 'AQEBivlgjdhylhmB95VJL1K1OGeZpzOmbZAiaNUT/EnlDN/Bmlo7o/Aby9zveOanusGVdsBwF5VAbQEPc17y1sNa/mA3gN54I13/vm9K0rmLlmMG77yp4e/VhbK9qx8xG+w87JCDC1iw8alEea+zqiBqWFalEUL0SAT8lkkS/plq4AA1B40ytuVZm4HGnTc+4SltCFmmbxFMDblSZ5fzQ6jyQAnh8Hb5kDQTwbKu7eRI14XvNC39tlb1kGGYHQa7jOqC6KAjqozwTeZjcEgUzjNoqyqzNXL4lWpucxO/YgFEqi7aRiPQZZO2UY9mgWPgNp17P5LGOu4Kh48hFs6vvfQMkqAOskN3KWzj9o/N4QC3pvKRE3r9cFgYh6UdwQwBI/P7c+QBBqt1JG89DklJBobmzcLjI+agJaP5RWb6tBwhOzCC3CbOwqfr/myLfcPF3ZZj',\n body: '{\\n \"Type\" : \"Notification\",\\n \"MessageId\" : \"f2a02b45-0ecb-566c-9616-70e680d73f8c\",\\n \"TopicArn\" : \"arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF\",\\n \"Message\" : \"{\\\\\"id\\\\\":\\\\\"057f544b-7f90-496c-8006-3043dec54620\\\\\",\\\\\"message\\\\\":\\\\\"Hello\\\\\"}\",\\n \"Timestamp\" : \"2022-09-20T09:46:04.607Z\",\\n \"SignatureVersion\" : \"1\",\\n \"Signature\" : \"dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==\",\\n \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem\",\\n \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6\",\\n \"MessageAttributes\" : {\\n \"test\" : {\"Type\":\"String\",\"Value\":\"test\"}\\n }\\n}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=24c04ec26b26310a;Sampled=0',\n SentTimestamp: '1663667164636',\n SenderId: 'AIDAISMY7JYY5F7RTT6AO',\n ApproximateFirstReceiveTimestamp: '1663667164641',\n },\n messageAttributes: {},\n md5OfBody: 'af6bd3f6989ac11fa4a33798c0cf87cc',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo154EF6659-jvYNz1YlvYdQ',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n context: {\n functionName: 'ServerlessSpyE2e-ReceiveSqs09F03F56-XeqiZ0cUjJl4',\n awsRequestId: '23672a4d-68be-5ad1-a139-71eee6b20c4c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.755Z',\n serviceKey: 'Function#ReceiveSqs#Request',\n data: {\n request: {\n Records: [\n {\n messageId: 'b1dd1d88-0560-43de-a406-394ca4bb7cec',\n receiptHandle:\n 'AQEBivlgjdhylhmB95VJL1K1OGeZpzOmbZAiaNUT/EnlDN/Bmlo7o/Aby9zveOanusGVdsBwF5VAbQEPc17y1sNa/mA3gN54I13/vm9K0rmLlmMG77yp4e/VhbK9qx8xG+w87JCDC1iw8alEea+zqiBqWFalEUL0SAT8lkkS/plq4AA1B40ytuVZm4HGnTc+4SltCFmmbxFMDblSZ5fzQ6jyQAnh8Hb5kDQTwbKu7eRI14XvNC39tlb1kGGYHQa7jOqC6KAjqozwTeZjcEgUzjNoqyqzNXL4lWpucxO/YgFEqi7aRiPQZZO2UY9mgWPgNp17P5LGOu4Kh48hFs6vvfQMkqAOskN3KWzj9o/N4QC3pvKRE3r9cFgYh6UdwQwBI/P7c+QBBqt1JG89DklJBobmzcLjI+agJaP5RWb6tBwhOzCC3CbOwqfr/myLfcPF3ZZj',\n body: '{\\n \"Type\" : \"Notification\",\\n \"MessageId\" : \"f2a02b45-0ecb-566c-9616-70e680d73f8c\",\\n \"TopicArn\" : \"arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF\",\\n \"Message\" : \"{\\\\\"id\\\\\":\\\\\"057f544b-7f90-496c-8006-3043dec54620\\\\\",\\\\\"message\\\\\":\\\\\"Hello\\\\\"}\",\\n \"Timestamp\" : \"2022-09-20T09:46:04.607Z\",\\n \"SignatureVersion\" : \"1\",\\n \"Signature\" : \"dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==\",\\n \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem\",\\n \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6\",\\n \"MessageAttributes\" : {\\n \"test\" : {\"Type\":\"String\",\"Value\":\"test\"}\\n }\\n}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=24c04ec26b26310a;Sampled=0',\n SentTimestamp: '1663667164636',\n SenderId: 'AIDAISMY7JYY5F7RTT6AO',\n ApproximateFirstReceiveTimestamp: '1663667164641',\n },\n messageAttributes: {},\n md5OfBody: 'af6bd3f6989ac11fa4a33798c0cf87cc',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo154EF6659-jvYNz1YlvYdQ',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n context: {\n functionName: 'ServerlessSpyE2e-ReceiveSqs09F03F56-XeqiZ0cUjJl4',\n awsRequestId: '23672a4d-68be-5ad1-a139-71eee6b20c4c',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.800Z',\n serviceKey: 'SnsSubscription#MyTopicNo1#MyQueueNo1',\n data: {\n spyEventType: 'SnsSubscription',\n message: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n subject: null,\n timestamp: '2022-09-20T09:46:04.607Z',\n topicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n messageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n messageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.802Z',\n serviceKey: 'SnsTopic#MyTopicNo1',\n data: {\n spyEventType: 'SnsTopic',\n message: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n subject: null,\n timestamp: '2022-09-20T09:46:04.607Z',\n topicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n messageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n messageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.771Z',\n serviceKey: 'Sqs#MyQueueNo1',\n data: {\n spyEventType: 'Sqs',\n body: {\n Type: 'Notification',\n MessageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n TopicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n Message:\n '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n Timestamp: '2022-09-20T09:46:04.607Z',\n SignatureVersion: '1',\n Signature:\n 'dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==',\n SigningCertURL:\n 'https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem',\n UnsubscribeURL:\n 'https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:ecf2a422-1e24-4a64-9f6d-715d91ae36d6',\n MessageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n messageAttributes: {},\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.808Z',\n serviceKey: 'SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3',\n data: {\n spyEventType: 'SnsSubscription',\n message: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n subject: null,\n timestamp: '2022-09-20T09:46:04.607Z',\n topicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n messageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n messageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.903Z',\n serviceKey: 'Function#FromSnsToSqsAndS3#Request',\n data: {\n request: {\n Records: [\n {\n EventSource: 'aws:sns',\n EventVersion: '1.0',\n EventSubscriptionArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n Sns: {\n Type: 'Notification',\n MessageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n TopicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n Subject: null,\n Message:\n '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n Timestamp: '2022-09-20T09:46:04.607Z',\n SignatureVersion: '1',\n Signature:\n 'dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==',\n SigningCertUrl:\n 'https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem',\n UnsubscribeUrl:\n 'https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n MessageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n ],\n },\n context: {\n functionName: 'ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n awsRequestId: '9323981d-674b-427e-b639-4cc26158c69f',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:04.942Z',\n serviceKey: 'Function#FromSnsToSqsAndS3#Response',\n data: {\n request: {\n Records: [\n {\n EventSource: 'aws:sns',\n EventVersion: '1.0',\n EventSubscriptionArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n Sns: {\n Type: 'Notification',\n MessageId: 'f2a02b45-0ecb-566c-9616-70e680d73f8c',\n TopicArn:\n 'arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF',\n Subject: null,\n Message:\n '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n Timestamp: '2022-09-20T09:46:04.607Z',\n SignatureVersion: '1',\n Signature:\n 'dB6sX7MUHevj080Rr0k08FT2sVUbA/osH6AFznOb+sva3Z7xJ0vzQh2brpy2tiBsiuAliYeJGc1GZxjmL1HCN4QiytiBzfdX71KeiSgeC8p4gW5lbrNpcyzHTOJSxOrBDfdxoh5JRZK6DymFrlmbC8pc0Y7y+4a2cCMUwjk4MnxG4a6H0uqVvVfnl7l6T4GzGTFkLjdqKNU8DNg+b7TPgs2mmlMivPAP1oYsrlBgUgmBLmfKfgr5BwngA+c4cIAi3fT89aWqUStY4P/tT/xPVRb2vyykenwFcoEPuautieXFXjAFg64N9JtNyxqRKL5XxnYl8mMmZsc7assV342d/g==',\n SigningCertUrl:\n 'https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-56e67fcb41f6fec09b0196692625d385.pem',\n UnsubscribeUrl:\n 'https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:ServerlessSpyE2e-MyTopicNo10D152776-7m3nZGQCdxUF:29430bee-0503-4b1f-8c7e-3a115b049679',\n MessageAttributes: { test: { Type: 'String', Value: 'test' } },\n },\n },\n ],\n },\n response: { message: 'Hello undefined' },\n context: {\n functionName: 'ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n awsRequestId: '9323981d-674b-427e-b639-4cc26158c69f',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.088Z',\n serviceKey: 'Sqs#MyQueueNo2',\n data: {\n spyEventType: 'Sqs',\n body: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n messageAttributes: {\n WeeksOn: {\n stringValue: '6',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'Number',\n },\n Author: {\n stringValue: 'John Grisham',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n Title: {\n stringValue: 'The Whistler',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.107Z',\n serviceKey: 'Function#FromSqsToEventBridge#Request',\n data: {\n request: {\n Records: [\n {\n messageId: '6297232e-203b-4776-a811-c5816ee24404',\n receiptHandle:\n 'AQEBNeroB8TFlND6RVnj+vUPAqep/xWY4u7EI4tJURkfPfQPFWmW3g7OtbxLbYXwPVie0ccukt7QP6VB8sFjwSA/oPc3W1pcydJn19GFfrNDeXtZJUPwolV6Ng6D/5Kq9YGBm4G5cnRPg8OXlVZTwjPp4atFRrNh2BSIe2dTURJNK7Okdz+gza5JWwZ/6Lbjw61NAJuMiqCw7ZjN1n3KYvD/cT0DcOWUCnZRoiovYw7mQ+hbm5Vas1WArdF31o6TukwYuA0begjbAbje+udaVjOW6ThjLyvOTWsoxg0CfbVZK4ZaWYWgd7xyd8WOGf1QOKVNMv9elCQi0olC5MAMv/f9B3Kudd6l1RIiQIKaj0LZjf7pn3wsv3TPc85Z+9p3k9hSc++zSsPxN9g8hymZW/rviQlRTzEqSPggJvBr9/nzKcAn3+w20zxquodAJnlobRCY',\n body: '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=34ad705e0750956d;Sampled=0',\n SentTimestamp: '1663667164855',\n SenderId:\n 'AROARDVHBDXRVFXDSOJAT:ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n ApproximateFirstReceiveTimestamp: '1663667164856',\n },\n messageAttributes: {\n WeeksOn: {\n stringValue: '6',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'Number',\n },\n Author: {\n stringValue: 'John Grisham',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n Title: {\n stringValue: 'The Whistler',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n },\n md5OfMessageAttributes: 'd25a6aea97eb8f585bfa92d314504a92',\n md5OfBody: 'c64b00e6b5eb62c5f39cf4e7b1f4bbd7',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo27A959A93-MwJqK7Urit97',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n context: {\n functionName:\n 'ServerlessSpyE2e-FromSqsToEventBridgeE78842BE-VAz1SGd6qaR6',\n awsRequestId: 'e0868330-80ce-59a7-8d77-d8930ec34d78',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.131Z',\n serviceKey: 'Function#FromSqsToEventBridge#Response',\n data: {\n request: {\n Records: [\n {\n messageId: '6297232e-203b-4776-a811-c5816ee24404',\n receiptHandle:\n 'AQEBNeroB8TFlND6RVnj+vUPAqep/xWY4u7EI4tJURkfPfQPFWmW3g7OtbxLbYXwPVie0ccukt7QP6VB8sFjwSA/oPc3W1pcydJn19GFfrNDeXtZJUPwolV6Ng6D/5Kq9YGBm4G5cnRPg8OXlVZTwjPp4atFRrNh2BSIe2dTURJNK7Okdz+gza5JWwZ/6Lbjw61NAJuMiqCw7ZjN1n3KYvD/cT0DcOWUCnZRoiovYw7mQ+hbm5Vas1WArdF31o6TukwYuA0begjbAbje+udaVjOW6ThjLyvOTWsoxg0CfbVZK4ZaWYWgd7xyd8WOGf1QOKVNMv9elCQi0olC5MAMv/f9B3Kudd6l1RIiQIKaj0LZjf7pn3wsv3TPc85Z+9p3k9hSc++zSsPxN9g8hymZW/rviQlRTzEqSPggJvBr9/nzKcAn3+w20zxquodAJnlobRCY',\n body: '{\"id\":\"057f544b-7f90-496c-8006-3043dec54620\",\"message\":\"Hello\"}',\n attributes: {\n ApproximateReceiveCount: '1',\n AWSTraceHeader:\n 'Root=1-63298bdc-40943faf493e196b4e07459c;Parent=34ad705e0750956d;Sampled=0',\n SentTimestamp: '1663667164855',\n SenderId:\n 'AROARDVHBDXRVFXDSOJAT:ServerlessSpyE2e-FromSnsToSqsAndS3DD1CDB48-mT1kC5fqYXBj',\n ApproximateFirstReceiveTimestamp: '1663667164856',\n },\n messageAttributes: {\n WeeksOn: {\n stringValue: '6',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'Number',\n },\n Author: {\n stringValue: 'John Grisham',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n Title: {\n stringValue: 'The Whistler',\n stringListValues: [],\n binaryListValues: [],\n dataType: 'String',\n },\n },\n md5OfMessageAttributes: 'd25a6aea97eb8f585bfa92d314504a92',\n md5OfBody: 'c64b00e6b5eb62c5f39cf4e7b1f4bbd7',\n eventSource: 'aws:sqs',\n eventSourceARN:\n 'arn:aws:sqs:eu-west-1:123456789012:ServerlessSpyE2e-MyQueueNo27A959A93-MwJqK7Urit97',\n awsRegion: 'eu-west-1',\n },\n ],\n },\n response: { message: 'Hello undefined' },\n context: {\n functionName:\n 'ServerlessSpyE2e-FromSqsToEventBridgeE78842BE-VAz1SGd6qaR6',\n awsRequestId: 'e0868330-80ce-59a7-8d77-d8930ec34d78',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.319Z',\n serviceKey: 'EventBridgeRule#MyEventBus#MyEventBridge',\n data: {\n spyEventType: 'EventBridgeRule',\n detail: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n detailType: 'test',\n source: 'test-source',\n time: '2022-09-20T09:46:05Z',\n account: '123456789012',\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.379Z',\n serviceKey: 'EventBridge#MyEventBus',\n data: {\n spyEventType: 'EventBridge',\n detail: { id: '057f544b-7f90-496c-8006-3043dec54620', message: 'Hello' },\n detailType: 'test',\n source: 'test-source',\n time: '2022-09-20T09:46:05Z',\n account: '123456789012',\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.504Z',\n serviceKey: 'Function#ReceiveEventBridge#Request',\n data: {\n request: {\n version: '0',\n id: '33549074-e48f-2857-f67c-263c621cde5c',\n 'detail-type': 'test',\n source: 'test-source',\n account: '123456789012',\n time: '2022-09-20T09:46:05Z',\n region: 'eu-west-1',\n resources: [],\n detail: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n },\n context: {\n functionName:\n 'ServerlessSpyE2e-ReceiveEventBridge1A8F9A7B-1x4KLKDymCCn',\n awsRequestId: '32814437-2efb-4384-9cb5-a04ac9639345',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.543Z',\n serviceKey: 'DynamoDB#MyTable',\n data: {\n spyEventType: 'DynamoDB',\n eventName: 'INSERT',\n newImage: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n pk: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n keys: { pk: '057f544b-7f90-496c-8006-3043dec54620' },\n },\n },\n {\n timestamp: '2022-09-20T09:46:05.541Z',\n serviceKey: 'Function#ReceiveEventBridge#Response',\n data: {\n request: {\n version: '0',\n id: '33549074-e48f-2857-f67c-263c621cde5c',\n 'detail-type': 'test',\n source: 'test-source',\n account: '123456789012',\n time: '2022-09-20T09:46:05Z',\n region: 'eu-west-1',\n resources: [],\n detail: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n },\n response: {\n version: '0',\n id: '33549074-e48f-2857-f67c-263c621cde5c',\n 'detail-type': 'test',\n source: 'test-source',\n account: '123456789012',\n time: '2022-09-20T09:46:05Z',\n region: 'eu-west-1',\n resources: [],\n detail: {\n id: '057f544b-7f90-496c-8006-3043dec54620',\n message: 'Hello',\n },\n },\n context: {\n functionName:\n 'ServerlessSpyE2e-ReceiveEventBridge1A8F9A7B-1x4KLKDymCCn',\n awsRequestId: '32814437-2efb-4384-9cb5-a04ac9639345',\n },\n },\n },\n {\n timestamp: '2022-09-20T09:46:06.313Z',\n serviceKey: 'S3#MyBucket',\n data: {\n spyEventType: 'S3',\n eventName: 'ObjectCreated:Put',\n eventTime: '2022-09-20T09:46:04.914Z',\n bucket: 'serverlessspye2e-mybucketf68f3ff0-fl5cf0ojrgtc',\n key: '057f544b-7f90-496c-8006-3043dec54620.json',\n },\n },\n];\n"],"mappings":";;AAAA,MAAa,aAAa;CACxB;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,UAAU;IACR,IAAI;IACJ,SAAS;IACV;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UAAU;KACV,kCAAkC;KACnC;IACD,mBAAmB,EAAE;IACrB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,UAAU,EACR,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UAAU;KACV,kCAAkC;KACnC;IACD,mBAAmB,EAAE;IACrB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UAAU;KACV,kCAAkC;KACnC;IACD,mBAAmB,EAAE;IACrB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;GACT,WAAW;GACX,UACE;GACF,WAAW;GACX,mBAAmB,EAAE,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,EAAE;GAC/D;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;GACT,WAAW;GACX,UACE;GACF,WAAW;GACX,mBAAmB,EAAE,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,EAAE;GAC/D;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,MAAM;IACJ,MAAM;IACN,WAAW;IACX,UACE;IACF,SACE;IACF,WAAW;IACX,kBAAkB;IAClB,WACE;IACF,gBACE;IACF,gBACE;IACF,mBAAmB,EAAE,MAAM;KAAE,MAAM;KAAU,OAAO;KAAQ,EAAE;IAC/D;GACD,mBAAmB,EAAE;GACtB;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,SAAS;IAAE,IAAI;IAAwC,SAAS;IAAS;GACzE,SAAS;GACT,WAAW;GACX,UACE;GACF,WAAW;GACX,mBAAmB,EAAE,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,EAAE;GAC/D;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,aAAa;IACb,cAAc;IACd,sBACE;IACF,KAAK;KACH,MAAM;KACN,WAAW;KACX,UACE;KACF,SAAS;KACT,SACE;KACF,WAAW;KACX,kBAAkB;KAClB,WACE;KACF,gBACE;KACF,gBACE;KACF,mBAAmB,EAAE,MAAM;MAAE,MAAM;MAAU,OAAO;MAAQ,EAAE;KAC/D;IACF,CACF,EACF;GACD,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,aAAa;IACb,cAAc;IACd,sBACE;IACF,KAAK;KACH,MAAM;KACN,WAAW;KACX,UACE;KACF,SAAS;KACT,SACE;KACF,WAAW;KACX,kBAAkB;KAClB,WACE;KACF,gBACE;KACF,gBACE;KACF,mBAAmB,EAAE,MAAM;MAAE,MAAM;MAAU,OAAO;MAAQ,EAAE;KAC/D;IACF,CACF,EACF;GACD,UAAU,EAAE,SAAS,mBAAmB;GACxC,SAAS;IACP,cAAc;IACd,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,MAAM;IAAE,IAAI;IAAwC,SAAS;IAAS;GACtE,mBAAmB;IACjB,SAAS;KACP,aAAa;KACb,kBAAkB,EAAE;KACpB,kBAAkB,EAAE;KACpB,UAAU;KACX;IACD,QAAQ;KACN,aAAa;KACb,kBAAkB,EAAE;KACpB,kBAAkB,EAAE;KACpB,UAAU;KACX;IACD,OAAO;KACL,aAAa;KACb,kBAAkB,EAAE;KACpB,kBAAkB,EAAE;KACpB,UAAU;KACX;IACF;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UACE;KACF,kCAAkC;KACnC;IACD,mBAAmB;KACjB,SAAS;MACP,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,QAAQ;MACN,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,OAAO;MACL,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACF;IACD,wBAAwB;IACxB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS,EACP,SAAS,CACP;IACE,WAAW;IACX,eACE;IACF,MAAM;IACN,YAAY;KACV,yBAAyB;KACzB,gBACE;KACF,eAAe;KACf,UACE;KACF,kCAAkC;KACnC;IACD,mBAAmB;KACjB,SAAS;MACP,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,QAAQ;MACN,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACD,OAAO;MACL,aAAa;MACb,kBAAkB,EAAE;MACpB,kBAAkB,EAAE;MACpB,UAAU;MACX;KACF;IACD,wBAAwB;IACxB,WAAW;IACX,aAAa;IACb,gBACE;IACF,WAAW;IACZ,CACF,EACF;GACD,UAAU,EAAE,SAAS,mBAAmB;GACxC,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,QAAQ;IAAE,IAAI;IAAwC,SAAS;IAAS;GACxE,YAAY;GACZ,QAAQ;GACR,MAAM;GACN,SAAS;GACV;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,QAAQ;IAAE,IAAI;IAAwC,SAAS;IAAS;GACxE,YAAY;GACZ,QAAQ;GACR,MAAM;GACN,SAAS;GACV;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IACP,SAAS;IACT,IAAI;IACJ,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW,EAAE;IACb,QAAQ;KACN,IAAI;KACJ,SAAS;KACV;IACF;GACD,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,WAAW;GACX,UAAU;IACR,IAAI;IACJ,IAAI;IACJ,SAAS;IACV;GACD,MAAM,EAAE,IAAI,wCAAwC;GACrD;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,SAAS;IACP,SAAS;IACT,IAAI;IACJ,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW,EAAE;IACb,QAAQ;KACN,IAAI;KACJ,SAAS;KACV;IACF;GACD,UAAU;IACR,SAAS;IACT,IAAI;IACJ,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW,EAAE;IACb,QAAQ;KACN,IAAI;KACJ,SAAS;KACV;IACF;GACD,SAAS;IACP,cACE;IACF,cAAc;IACf;GACF;EACF;CACD;EACE,WAAW;EACX,YAAY;EACZ,MAAM;GACJ,cAAc;GACd,WAAW;GACX,WAAW;GACX,QAAQ;GACR,KAAK;GACN;EACF;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpyEventSender.mjs","names":["postDataPromises: Promise<any>[]","serviceKey: string","message: string","fluentEvent: Omit<SpyMessage, 'timestamp'>","body: string","v4"],"sources":["../../common/SpyEventSender.ts"],"sourcesContent":["import { unmarshall } from '@aws-sdk/util-dynamodb';\nimport iot from 'aws-iot-device-sdk';\nimport {\n DynamoDBStreamEvent,\n S3Event,\n SNSEvent,\n EventBridgeEvent,\n SQSEvent,\n} from 'aws-lambda';\nimport { v4 } from 'uuid';\nimport { DynamoDBSpyEvent } from './spyEvents/DynamoDBSpyEvent';\nimport { EventBridgeRuleSpyEvent } from './spyEvents/EventBridgeRuleSpyEvent';\nimport { EventBridgeSpyEvent } from './spyEvents/EventBridgeSpyEvent';\nimport { S3SpyEvent } from './spyEvents/S3SpyEvent';\nimport { SnsSubscriptionSpyEvent } from './spyEvents/SnsSubscriptionSpyEvent';\nimport { SnsTopicSpyEvent } from './spyEvents/SnsTopicSpyEvent';\nimport { SpyMessage } from './spyEvents/SpyMessage';\nimport { SqsSpyEvent } from './spyEvents/SqsSpyEvent';\nimport { fragment, getConnection } from '../listener/iot-connection';\nimport { getTopic } from '../listener/topic';\nimport { envVariableNames } from '../src/common/envVariableNames';\n\nexport class SpyEventSender {\n debugMode = process.env[envVariableNames.SSPY_DEBUG] === 'true';\n connection: iot.device | undefined;\n scope: string;\n iotEndpoint: string;\n\n constructor(params: {\n log?: (message: string, ...optionalParams: any[]) => void;\n logError?: (message: string, ...optionalParams: any[]) => void;\n scope: string;\n iotEndpoint: string;\n }) {\n if (params.log) {\n this.log = params.log;\n }\n\n if (params.logError) {\n this.logError = params.logError;\n }\n\n this.scope = params.scope;\n this.iotEndpoint = params.iotEndpoint;\n }\n\n public async close() {\n this.connection?.end();\n }\n\n public async connect() {\n this.connection = await getConnection(this.debugMode, this.iotEndpoint);\n }\n\n public async publishSpyEvent(event: any) {\n this.log('Event', JSON.stringify(event));\n\n const mapping = JSON.parse(\n process.env[envVariableNames.SSPY_INFRA_MAPPING]!\n );\n this.log('ARN to names mapping', JSON.stringify(mapping));\n\n const postDataPromises: Promise<any>[] = [];\n\n if (event?.Records && event.Records[0]?.Sns) {\n //console.log('*** SNS ***');\n const eventSns = event as SNSEvent;\n for (const record of eventSns.Records) {\n const subscriptionArn = record.EventSubscriptionArn;\n\n let serviceKey: string;\n if (mapping[subscriptionArn]) {\n // subscription event that could contain filter based on existing subscription\n serviceKey = mapping[subscriptionArn];\n } else {\n // catch all subscription\n const topicArn = record.Sns.TopicArn;\n serviceKey = mapping[topicArn];\n }\n\n let message: string;\n\n try {\n message = JSON.parse(record.Sns.Message);\n } catch {\n message = record.Sns.Message;\n }\n\n const spyEventType = this.getSpyEventType(serviceKey) as\n | 'FunctionSnsTopic'\n | 'FunctionSnsSubscription';\n\n const data: SnsTopicSpyEvent | SnsSubscriptionSpyEvent = {\n spyEventType,\n message,\n subject: record.Sns.Subject,\n timestamp: record.Sns.Timestamp,\n topicArn: record.Sns.TopicArn,\n messageId: record.Sns.MessageId,\n messageAttributes: record.Sns.MessageAttributes,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey,\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (event?.Records && event.Records[0]?.eventSource === 'aws:sqs') {\n //console.log('*** SQS ***');\n const eventSqs = event as SQSEvent;\n for (const record of eventSqs.Records) {\n const subscriptionArn = record.eventSourceARN;\n\n const serviceKey = mapping[subscriptionArn];\n let body: string;\n\n try {\n body = JSON.parse(record.body);\n } catch {\n body = record.body;\n }\n\n const data: SqsSpyEvent = {\n spyEventType: 'Sqs',\n body,\n messageAttributes: record.messageAttributes,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey,\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (event?.Records && event.Records[0]?.s3) {\n //console.log('*** S3 ***');\n const eventS3 = event as S3Event;\n for (const record of eventS3.Records) {\n const bucketArn = record.s3.bucket.arn;\n\n const data: S3SpyEvent = {\n spyEventType: 'S3',\n eventName: record.eventName,\n eventTime: record.eventTime,\n bucket: record.s3.bucket.name,\n key: record.s3.object.key,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey: mapping[bucketArn],\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (event.Records && event.Records[0]?.dynamodb) {\n //console.log('*** DYNAMODB ***');\n const eventDynamoDB = event as DynamoDBStreamEvent;\n for (const record of eventDynamoDB.Records) {\n let arn = record.eventSourceARN!;\n arn = arn.substring(0, arn.indexOf('/stream/'));\n\n const data: DynamoDBSpyEvent = {\n spyEventType: 'DynamoDB',\n eventName: record.eventName,\n newImage: record.dynamodb?.NewImage\n ? unmarshall(record.dynamodb?.NewImage as any)\n : undefined,\n keys: unmarshall(record.dynamodb?.Keys as any),\n oldImage: record.dynamodb?.OldImage\n ? unmarshall(record.dynamodb?.OldImage as any)\n : undefined,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey: mapping[arn],\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (\n event.detail &&\n event['detail-type'] &&\n event.version &&\n event.source\n ) {\n //console.log('*** EventBridge ***');\n const eventEb = event as EventBridgeEvent<any, any>;\n\n const serviceKey = mapping.eventBridge; // the is new lambda for each subscription\n\n const spyEventType = this.getSpyEventType(serviceKey) as\n | 'EventBridge'\n | 'EventBridgeRule';\n\n const message = eventEb.detail;\n\n const data: EventBridgeSpyEvent | EventBridgeRuleSpyEvent = {\n spyEventType,\n detail: message,\n detailType: eventEb['detail-type'],\n eventBridgeId: eventEb['id'],\n source: eventEb.source,\n time: eventEb.time,\n account: eventEb.account,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey,\n };\n postDataPromises.push(this.postData(fluentEvent));\n } else {\n //console.log('*** OTHER ***');\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = event;\n postDataPromises.push(this.postData(fluentEvent));\n }\n\n await Promise.all(postDataPromises);\n }\n\n private encode(input: any): fragment[] {\n const payload = JSON.stringify(input);\n const parts = payload.match(/.{1,50000}/g);\n if (!parts) return [];\n this.log(`Encoded iot message, ${parts.length}`);\n const id = v4();\n return parts.map((part, index) => ({\n id,\n index,\n count: parts.length,\n data: part,\n }));\n }\n\n private async postData(\n spyMessage: Omit<SpyMessage, 'timestamp'> & { timestamp?: string }\n ) {\n if (this.connection === undefined) {\n throw new Error(\n 'No IoT connection created yet, did you forget to call connect()?'\n );\n }\n\n const withTimeStamp = {\n ...spyMessage,\n timestamp: spyMessage.timestamp || new Date().toISOString(),\n };\n\n this.log('Post spy message', JSON.stringify(withTimeStamp));\n\n const connection = this.connection;\n const topic = getTopic(this.scope);\n\n try {\n for (const fragment of this.encode(withTimeStamp)) {\n await new Promise<void>((resolve) => {\n connection.publish(\n topic,\n JSON.stringify(fragment),\n {\n qos: 1,\n },\n () => {\n this.log('Publishing finished');\n resolve();\n }\n );\n });\n this.log(\n `Published fragment ${fragment.index} out of ${fragment.count} to topic ${topic}`\n );\n }\n } catch (e) {\n this.logError(`Failed to send payload to iot: ${e}`);\n }\n\n this.log('Send spy message finish');\n }\n\n private getSpyEventType(serviceKey: string) {\n if (!serviceKey) {\n throw new Error('Missing serviceKey');\n }\n\n return serviceKey.substring(0, serviceKey.indexOf('#'));\n }\n\n private log(message: string, ...optionalParams: any[]) {\n if (this.debugMode) {\n console.debug('SSPY EXTENSION', message, ...optionalParams);\n }\n }\n\n private logError(message: string, ...optionalParams: any[]) {\n if (this.debugMode) {\n console.error('SSPY EXTENSION', message, ...optionalParams);\n }\n }\n}\n"],"mappings":";;;;;;;uBAoBkE;AAElE,IAAa,iBAAb,MAA4B;CAM1B,YAAY,QAKT;mBAVS,QAAQ,IAAI,iBAAiB,gBAAgB;AAWvD,MAAI,OAAO,IACT,MAAK,MAAM,OAAO;AAGpB,MAAI,OAAO,SACT,MAAK,WAAW,OAAO;AAGzB,OAAK,QAAQ,OAAO;AACpB,OAAK,cAAc,OAAO;;CAG5B,MAAa,QAAQ;AACnB,OAAK,YAAY,KAAK;;CAGxB,MAAa,UAAU;AACrB,OAAK,aAAa,MAAM,cAAc,KAAK,WAAW,KAAK,YAAY;;CAGzE,MAAa,gBAAgB,OAAY;AACvC,OAAK,IAAI,SAAS,KAAK,UAAU,MAAM,CAAC;EAExC,MAAM,UAAU,KAAK,MACnB,QAAQ,IAAI,iBAAiB,oBAC9B;AACD,OAAK,IAAI,wBAAwB,KAAK,UAAU,QAAQ,CAAC;EAEzD,MAAMA,mBAAmC,EAAE;AAE3C,MAAI,OAAO,WAAW,MAAM,QAAQ,IAAI,KAAK;GAE3C,MAAM,WAAW;AACjB,QAAK,MAAM,UAAU,SAAS,SAAS;IACrC,MAAM,kBAAkB,OAAO;IAE/B,IAAIC;AACJ,QAAI,QAAQ,iBAEV,cAAa,QAAQ;QAIrB,cAAa,QADI,OAAO,IAAI;IAI9B,IAAIC;AAEJ,QAAI;AACF,eAAU,KAAK,MAAM,OAAO,IAAI,QAAQ;YAClC;AACN,eAAU,OAAO,IAAI;;IAiBvB,MAAMC,cAA6C;KACjD,MAXuD;MACvD,cALmB,KAAK,gBAAgB,WAAW;MAMnD;MACA,SAAS,OAAO,IAAI;MACpB,WAAW,OAAO,IAAI;MACtB,UAAU,OAAO,IAAI;MACrB,WAAW,OAAO,IAAI;MACtB,mBAAmB,OAAO,IAAI;MAC/B;KAIC;KACD;AACD,qBAAiB,KAAK,KAAK,SAAS,YAAY,CAAC;;aAE1C,OAAO,WAAW,MAAM,QAAQ,IAAI,gBAAgB,WAAW;GAExE,MAAM,WAAW;AACjB,QAAK,MAAM,UAAU,SAAS,SAAS;IAGrC,MAAM,aAAa,QAFK,OAAO;IAG/B,IAAIC;AAEJ,QAAI;AACF,YAAO,KAAK,MAAM,OAAO,KAAK;YACxB;AACN,YAAO,OAAO;;IAShB,MAAMD,cAA6C;KACjD,MAPwB;MACxB,cAAc;MACd;MACA,mBAAmB,OAAO;MAC3B;KAIC;KACD;AACD,qBAAiB,KAAK,KAAK,SAAS,YAAY,CAAC;;aAE1C,OAAO,WAAW,MAAM,QAAQ,IAAI,IAAI;GAEjD,MAAM,UAAU;AAChB,QAAK,MAAM,UAAU,QAAQ,SAAS;IACpC,MAAM,YAAY,OAAO,GAAG,OAAO;IAUnC,MAAMA,cAA6C;KACjD,MATuB;MACvB,cAAc;MACd,WAAW,OAAO;MAClB,WAAW,OAAO;MAClB,QAAQ,OAAO,GAAG,OAAO;MACzB,KAAK,OAAO,GAAG,OAAO;MACvB;KAIC,YAAY,QAAQ;KACrB;AACD,qBAAiB,KAAK,KAAK,SAAS,YAAY,CAAC;;aAE1C,MAAM,WAAW,MAAM,QAAQ,IAAI,UAAU;GAEtD,MAAM,gBAAgB;AACtB,QAAK,MAAM,UAAU,cAAc,SAAS;IAC1C,IAAI,MAAM,OAAO;AACjB,UAAM,IAAI,UAAU,GAAG,IAAI,QAAQ,WAAW,CAAC;IAc/C,MAAMA,cAA6C;KACjD,MAb6B;MAC7B,cAAc;MACd,WAAW,OAAO;MAClB,UAAU,OAAO,UAAU,WACvB,WAAW,OAAO,UAAU,SAAgB,GAC5C;MACJ,MAAM,WAAW,OAAO,UAAU,KAAY;MAC9C,UAAU,OAAO,UAAU,WACvB,WAAW,OAAO,UAAU,SAAgB,GAC5C;MACL;KAIC,YAAY,QAAQ;KACrB;AACD,qBAAiB,KAAK,KAAK,SAAS,YAAY,CAAC;;aAGnD,MAAM,UACN,MAAM,kBACN,MAAM,WACN,MAAM,QACN;GAEA,MAAM,UAAU;GAEhB,MAAM,aAAa,QAAQ;GAkB3B,MAAMA,cAA6C;IACjD,MAX0D;KAC1D,cAPmB,KAAK,gBAAgB,WAAW;KAQnD,QAJc,QAAQ;KAKtB,YAAY,QAAQ;KACpB,eAAe,QAAQ;KACvB,QAAQ,QAAQ;KAChB,MAAM,QAAQ;KACd,SAAS,QAAQ;KAClB;IAIC;IACD;AACD,oBAAiB,KAAK,KAAK,SAAS,YAAY,CAAC;SAC5C;GAEL,MAAMA,cAA6C;AACnD,oBAAiB,KAAK,KAAK,SAAS,YAAY,CAAC;;AAGnD,QAAM,QAAQ,IAAI,iBAAiB;;CAGrC,AAAQ,OAAO,OAAwB;EAErC,MAAM,QADU,KAAK,UAAU,MAAM,CACf,MAAM,cAAc;AAC1C,MAAI,CAAC,MAAO,QAAO,EAAE;AACrB,OAAK,IAAI,wBAAwB,MAAM,SAAS;EAChD,MAAM,KAAKE,YAAI;AACf,SAAO,MAAM,KAAK,MAAM,WAAW;GACjC;GACA;GACA,OAAO,MAAM;GACb,MAAM;GACP,EAAE;;CAGL,MAAc,SACZ,YACA;AACA,MAAI,KAAK,eAAe,OACtB,OAAM,IAAI,MACR,mEACD;EAGH,MAAM,gBAAgB;GACpB,GAAG;GACH,WAAW,WAAW,8BAAa,IAAI,MAAM,EAAC,aAAa;GAC5D;AAED,OAAK,IAAI,oBAAoB,KAAK,UAAU,cAAc,CAAC;EAE3D,MAAM,aAAa,KAAK;EACxB,MAAM,QAAQ,SAAS,KAAK,MAAM;AAElC,MAAI;AACF,QAAK,MAAM,YAAY,KAAK,OAAO,cAAc,EAAE;AACjD,UAAM,IAAI,SAAe,YAAY;AACnC,gBAAW,QACT,OACA,KAAK,UAAU,SAAS,EACxB,EACE,KAAK,GACN,QACK;AACJ,WAAK,IAAI,sBAAsB;AAC/B,eAAS;OAEZ;MACD;AACF,SAAK,IACH,sBAAsB,SAAS,MAAM,UAAU,SAAS,MAAM,YAAY,QAC3E;;WAEI,GAAG;AACV,QAAK,SAAS,kCAAkC,IAAI;;AAGtD,OAAK,IAAI,0BAA0B;;CAGrC,AAAQ,gBAAgB,YAAoB;AAC1C,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,qBAAqB;AAGvC,SAAO,WAAW,UAAU,GAAG,WAAW,QAAQ,IAAI,CAAC;;CAGzD,AAAQ,IAAI,SAAiB,GAAG,gBAAuB;AACrD,MAAI,KAAK,UACP,SAAQ,MAAM,kBAAkB,SAAS,GAAG,eAAe;;CAI/D,AAAQ,SAAS,SAAiB,GAAG,gBAAuB;AAC1D,MAAI,KAAK,UACP,SAAQ,MAAM,kBAAkB,SAAS,GAAG,eAAe"}
|
|
1
|
+
{"version":3,"file":"SpyEventSender.mjs","names":["postDataPromises: Promise<any>[]","serviceKey: string","message: string","fluentEvent: Omit<SpyMessage, 'timestamp'>","body: string","v4"],"sources":["../../common/SpyEventSender.ts"],"sourcesContent":["import { unmarshall } from '@aws-sdk/util-dynamodb';\nimport iot from 'aws-iot-device-sdk';\nimport {\n DynamoDBStreamEvent,\n S3Event,\n SNSEvent,\n EventBridgeEvent,\n SQSEvent,\n} from 'aws-lambda';\nimport { v4 } from 'uuid';\nimport { DynamoDBSpyEvent } from './spyEvents/DynamoDBSpyEvent';\nimport { EventBridgeRuleSpyEvent } from './spyEvents/EventBridgeRuleSpyEvent';\nimport { EventBridgeSpyEvent } from './spyEvents/EventBridgeSpyEvent';\nimport { S3SpyEvent } from './spyEvents/S3SpyEvent';\nimport { SnsSubscriptionSpyEvent } from './spyEvents/SnsSubscriptionSpyEvent';\nimport { SnsTopicSpyEvent } from './spyEvents/SnsTopicSpyEvent';\nimport { SpyMessage } from './spyEvents/SpyMessage';\nimport { SqsSpyEvent } from './spyEvents/SqsSpyEvent';\nimport { fragment, getConnection } from '../listener/iot-connection';\nimport { getTopic } from '../listener/topic';\nimport { envVariableNames } from '../src/common/envVariableNames';\n\nexport class SpyEventSender {\n debugMode = process.env[envVariableNames.SSPY_DEBUG] === 'true';\n connection: iot.device | undefined;\n scope: string;\n iotEndpoint: string;\n\n constructor(params: {\n log?: (message: string, ...optionalParams: any[]) => void;\n logError?: (message: string, ...optionalParams: any[]) => void;\n scope: string;\n iotEndpoint: string;\n }) {\n if (params.log) {\n this.log = params.log;\n }\n\n if (params.logError) {\n this.logError = params.logError;\n }\n\n this.scope = params.scope;\n this.iotEndpoint = params.iotEndpoint;\n }\n\n public async close() {\n this.connection?.end();\n }\n\n public async connect() {\n this.connection = await getConnection(this.debugMode, this.iotEndpoint);\n }\n\n public async publishSpyEvent(event: any) {\n this.log('Event', JSON.stringify(event));\n\n const mapping = JSON.parse(\n process.env[envVariableNames.SSPY_INFRA_MAPPING]!\n );\n this.log('ARN to names mapping', JSON.stringify(mapping));\n\n const postDataPromises: Promise<any>[] = [];\n\n if (event?.Records && event.Records[0]?.Sns) {\n //console.log('*** SNS ***');\n const eventSns = event as SNSEvent;\n for (const record of eventSns.Records) {\n const subscriptionArn = record.EventSubscriptionArn;\n\n let serviceKey: string;\n if (mapping[subscriptionArn]) {\n // subscription event that could contain filter based on existing subscription\n serviceKey = mapping[subscriptionArn];\n } else {\n // catch all subscription\n const topicArn = record.Sns.TopicArn;\n serviceKey = mapping[topicArn];\n }\n\n let message: string;\n\n try {\n message = JSON.parse(record.Sns.Message);\n } catch {\n message = record.Sns.Message;\n }\n\n const spyEventType = this.getSpyEventType(serviceKey) as\n | 'FunctionSnsTopic'\n | 'FunctionSnsSubscription';\n\n const data: SnsTopicSpyEvent | SnsSubscriptionSpyEvent = {\n spyEventType,\n message,\n subject: record.Sns.Subject,\n timestamp: record.Sns.Timestamp,\n topicArn: record.Sns.TopicArn,\n messageId: record.Sns.MessageId,\n messageAttributes: record.Sns.MessageAttributes,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey,\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (event?.Records && event.Records[0]?.eventSource === 'aws:sqs') {\n //console.log('*** SQS ***');\n const eventSqs = event as SQSEvent;\n for (const record of eventSqs.Records) {\n const subscriptionArn = record.eventSourceARN;\n\n const serviceKey = mapping[subscriptionArn];\n let body: string;\n\n try {\n body = JSON.parse(record.body);\n } catch {\n body = record.body;\n }\n\n const data: SqsSpyEvent = {\n spyEventType: 'Sqs',\n body,\n messageAttributes: record.messageAttributes,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey,\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (event?.Records && event.Records[0]?.s3) {\n //console.log('*** S3 ***');\n const eventS3 = event as S3Event;\n for (const record of eventS3.Records) {\n const bucketArn = record.s3.bucket.arn;\n\n const data: S3SpyEvent = {\n spyEventType: 'S3',\n eventName: record.eventName,\n eventTime: record.eventTime,\n bucket: record.s3.bucket.name,\n key: record.s3.object.key,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey: mapping[bucketArn],\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (event.Records && event.Records[0]?.dynamodb) {\n //console.log('*** DYNAMODB ***');\n const eventDynamoDB = event as DynamoDBStreamEvent;\n for (const record of eventDynamoDB.Records) {\n let arn = record.eventSourceARN!;\n arn = arn.substring(0, arn.indexOf('/stream/'));\n\n const data: DynamoDBSpyEvent = {\n spyEventType: 'DynamoDB',\n eventName: record.eventName,\n newImage: record.dynamodb?.NewImage\n ? unmarshall(record.dynamodb?.NewImage as any)\n : undefined,\n keys: unmarshall(record.dynamodb?.Keys as any),\n oldImage: record.dynamodb?.OldImage\n ? unmarshall(record.dynamodb?.OldImage as any)\n : undefined,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey: mapping[arn],\n };\n postDataPromises.push(this.postData(fluentEvent));\n }\n } else if (\n event.detail &&\n event['detail-type'] &&\n event.version &&\n event.source\n ) {\n //console.log('*** EventBridge ***');\n const eventEb = event as EventBridgeEvent<any, any>;\n\n const serviceKey = mapping.eventBridge; // the is new lambda for each subscription\n\n const spyEventType = this.getSpyEventType(serviceKey) as\n | 'EventBridge'\n | 'EventBridgeRule';\n\n const message = eventEb.detail;\n\n const data: EventBridgeSpyEvent | EventBridgeRuleSpyEvent = {\n spyEventType,\n detail: message,\n detailType: eventEb['detail-type'],\n eventBridgeId: eventEb['id'],\n source: eventEb.source,\n time: eventEb.time,\n account: eventEb.account,\n };\n\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = {\n data,\n serviceKey,\n };\n postDataPromises.push(this.postData(fluentEvent));\n } else {\n //console.log('*** OTHER ***');\n const fluentEvent: Omit<SpyMessage, 'timestamp'> = event;\n postDataPromises.push(this.postData(fluentEvent));\n }\n\n await Promise.all(postDataPromises);\n }\n\n private encode(input: any): fragment[] {\n const payload = JSON.stringify(input);\n const parts = payload.match(/.{1,50000}/g);\n if (!parts) return [];\n this.log(`Encoded iot message, ${parts.length}`);\n const id = v4();\n return parts.map((part, index) => ({\n id,\n index,\n count: parts.length,\n data: part,\n }));\n }\n\n private async postData(\n spyMessage: Omit<SpyMessage, 'timestamp'> & { timestamp?: string }\n ) {\n if (this.connection === undefined) {\n throw new Error(\n 'No IoT connection created yet, did you forget to call connect()?'\n );\n }\n\n const withTimeStamp = {\n ...spyMessage,\n timestamp: spyMessage.timestamp || new Date().toISOString(),\n };\n\n this.log('Post spy message', JSON.stringify(withTimeStamp));\n\n const connection = this.connection;\n const topic = getTopic(this.scope);\n\n try {\n for (const fragment of this.encode(withTimeStamp)) {\n await new Promise<void>((resolve) => {\n connection.publish(\n topic,\n JSON.stringify(fragment),\n {\n qos: 1,\n },\n () => {\n this.log('Publishing finished');\n resolve();\n }\n );\n });\n this.log(\n `Published fragment ${fragment.index} out of ${fragment.count} to topic ${topic}`\n );\n }\n } catch (e) {\n this.logError(`Failed to send payload to iot: ${e}`);\n }\n\n this.log('Send spy message finish');\n }\n\n private getSpyEventType(serviceKey: string) {\n if (!serviceKey) {\n throw new Error('Missing serviceKey');\n }\n\n return serviceKey.substring(0, serviceKey.indexOf('#'));\n }\n\n private log(message: string, ...optionalParams: any[]) {\n if (this.debugMode) {\n console.debug('SSPY EXTENSION', message, ...optionalParams);\n }\n }\n\n private logError(message: string, ...optionalParams: any[]) {\n if (this.debugMode) {\n console.error('SSPY EXTENSION', message, ...optionalParams);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getWebSocketUrl.mjs","names":["hostParts: string[]","pathname: string"],"sources":["../../common/getWebSocketUrl.ts"],"sourcesContent":["import { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { Credentials } from '@aws-sdk/types';\nimport * as aws4 from 'aws4';\n\n// \"\"wss://m6g3w6ttdh.execute-api.eu-west-1.amazonaws.com/prod\";\"\n\nexport async function getSignedWebSocketUrl(\n url: string,\n credentials?: Credentials\n) {\n let hostParts: string[];\n let pathname: string;\n\n if (!url) {\n throw new Error(`Missing websocket URL`);\n }\n\n try {\n new URL(url); //validate URL\n\n const urlParsed = parseUrl(url);\n pathname = urlParsed!.pathname!;\n hostParts = urlParsed!.host.split('.');\n } catch {\n throw new Error(`Invalid websocket URL ${url}`);\n }\n\n if (!credentials) {\n const credentialsProvider = fromNodeProviderChain();\n credentials = await credentialsProvider();\n }\n\n const AWS_REGION = hostParts[2]; // The region of your API-gateway\n const SOCKET_HOST = hostParts[0]; // Your API-gateway ID\n const ENV = pathname.replace(/^\\//, ''); // The stage of your target deployment\n const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss!\n // const AWS_REGION = \"eu-west-1\"; // The region of your API-gateway\n // const SOCKET_HOST = \"m6g3w6ttdh\"; // Your API-gateway ID\n // const ENV = \"prod\"; // The stage of your target deployment\n // const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss!\n\n // Get a signed path\n const { path } = aws4.sign(\n {\n method: 'GET',\n host: WEBSOCKET_URL,\n // path: `/${ENV}?X-Amz-Security-Token=${encodeURIComponent(\n // credentials!.SessionToken!\n // )}`,\n path: `/${ENV}`,\n service: 'execute-api',\n region: AWS_REGION,\n signQuery: true,\n },\n {\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n }\n );\n\n const url2 = `wss://${WEBSOCKET_URL}${path}`;\n return url2;\n}\n\nfunction parseUrl(href: string) {\n const match = href.match(\n /^(wss?:)\\/\\/(([^:/?#]*)(?::([0-9]+))?)([/]{0,1}[^?#]*)(\\?[^#]*|)(#.*|)$/\n );\n return (\n match && {\n href,\n protocol: match[1],\n host: match[2],\n hostname: match[3],\n port: match[4],\n pathname: match[5],\n search: match[6],\n hash: match[7],\n }\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"getWebSocketUrl.mjs","names":["hostParts: string[]","pathname: string"],"sources":["../../common/getWebSocketUrl.ts"],"sourcesContent":["import { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { Credentials } from '@aws-sdk/types';\nimport * as aws4 from 'aws4';\n\n// \"\"wss://m6g3w6ttdh.execute-api.eu-west-1.amazonaws.com/prod\";\"\n\nexport async function getSignedWebSocketUrl(\n url: string,\n credentials?: Credentials\n) {\n let hostParts: string[];\n let pathname: string;\n\n if (!url) {\n throw new Error(`Missing websocket URL`);\n }\n\n try {\n new URL(url); //validate URL\n\n const urlParsed = parseUrl(url);\n pathname = urlParsed!.pathname!;\n hostParts = urlParsed!.host.split('.');\n } catch {\n throw new Error(`Invalid websocket URL ${url}`);\n }\n\n if (!credentials) {\n const credentialsProvider = fromNodeProviderChain();\n credentials = await credentialsProvider();\n }\n\n const AWS_REGION = hostParts[2]; // The region of your API-gateway\n const SOCKET_HOST = hostParts[0]; // Your API-gateway ID\n const ENV = pathname.replace(/^\\//, ''); // The stage of your target deployment\n const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss!\n // const AWS_REGION = \"eu-west-1\"; // The region of your API-gateway\n // const SOCKET_HOST = \"m6g3w6ttdh\"; // Your API-gateway ID\n // const ENV = \"prod\"; // The stage of your target deployment\n // const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss!\n\n // Get a signed path\n const { path } = aws4.sign(\n {\n method: 'GET',\n host: WEBSOCKET_URL,\n // path: `/${ENV}?X-Amz-Security-Token=${encodeURIComponent(\n // credentials!.SessionToken!\n // )}`,\n path: `/${ENV}`,\n service: 'execute-api',\n region: AWS_REGION,\n signQuery: true,\n },\n {\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n }\n );\n\n const url2 = `wss://${WEBSOCKET_URL}${path}`;\n return url2;\n}\n\nfunction parseUrl(href: string) {\n const match = href.match(\n /^(wss?:)\\/\\/(([^:/?#]*)(?::([0-9]+))?)([/]{0,1}[^?#]*)(\\?[^#]*|)(#.*|)$/\n );\n return (\n match && {\n href,\n protocol: match[1],\n host: match[2],\n hostname: match[3],\n port: match[4],\n pathname: match[5],\n search: match[6],\n hash: match[7],\n }\n );\n}\n"],"mappings":";;;;;AAMA,eAAsB,sBACpB,KACA,aACA;CACA,IAAIA;CACJ,IAAIC;AAEJ,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,KAAI;AACF,MAAI,IAAI,IAAI;EAEZ,MAAM,YAAY,SAAS,IAAI;AAC/B,aAAW,UAAW;AACtB,cAAY,UAAW,KAAK,MAAM,IAAI;SAChC;AACN,QAAM,IAAI,MAAM,yBAAyB,MAAM;;AAGjD,KAAI,CAAC,YAEH,eAAc,MADc,uBAAuB,EACV;CAG3C,MAAM,aAAa,UAAU;CAC7B,MAAM,cAAc,UAAU;CAC9B,MAAM,MAAM,SAAS,QAAQ,OAAO,GAAG;CACvC,MAAM,gBAAgB,GAAG,YAAY,eAAe,WAAW;CAO/D,MAAM,EAAE,SAAS,KAAK,KACpB;EACE,QAAQ;EACR,MAAM;EAIN,MAAM,IAAI;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACZ,EACD;EACE,aAAa,YAAY;EACzB,iBAAiB,YAAY;EAC7B,cAAc,YAAY;EAC3B,CACF;AAGD,QADa,SAAS,gBAAgB;;AAIxC,SAAS,SAAS,MAAc;CAC9B,MAAM,QAAQ,KAAK,MACjB,0EACD;AACD,QACE,SAAS;EACP;EACA,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,MAAM,MAAM;EACb"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const __dirname = import.meta.dirname;
|
|
1
2
|
import { __commonJS } from "../_virtual/rolldown_runtime.mjs";
|
|
2
3
|
import { envVariableNames, init_envVariableNames } from "../src/common/envVariableNames.mjs";
|
|
3
4
|
import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onConnect.mjs","names":[],"sources":["../../functions/onConnect.ts"],"sourcesContent":["import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb';\nimport { APIGatewayEvent } from 'aws-lambda';\nimport { envVariableNames } from '../src/common/envVariableNames';\n\nconst ddb = new DynamoDBClient({\n region: process.env.AWS_REGION,\n});\n\nexports.handler = async (event: APIGatewayEvent) => {\n console.log('EVENT', JSON.stringify(event));\n\n const putParams = new PutItemCommand({\n TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME] as string,\n Item: {\n connectionId: { S: event.requestContext.connectionId! },\n },\n });\n\n try {\n await ddb.send(putParams);\n } catch (err) {\n console.error(err);\n return {\n statusCode: 500,\n body: 'Failed to connect: ' + JSON.stringify(err),\n };\n }\n\n return { statusCode: 200, body: 'Connected.' };\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"onConnect.mjs","names":[],"sources":["../../functions/onConnect.ts"],"sourcesContent":["import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb';\nimport { APIGatewayEvent } from 'aws-lambda';\nimport { envVariableNames } from '../src/common/envVariableNames';\n\nconst ddb = new DynamoDBClient({\n region: process.env.AWS_REGION,\n});\n\nexports.handler = async (event: APIGatewayEvent) => {\n console.log('EVENT', JSON.stringify(event));\n\n const putParams = new PutItemCommand({\n TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME] as string,\n Item: {\n connectionId: { S: event.requestContext.connectionId! },\n },\n });\n\n try {\n await ddb.send(putParams);\n } catch (err) {\n console.error(err);\n return {\n statusCode: 500,\n body: 'Failed to connect: ' + JSON.stringify(err),\n };\n }\n\n return { statusCode: 200, body: 'Connected.' };\n};\n"],"mappings":";;;;;;;wBAEkE;CAElE,MAAM,MAAM,IAAI,eAAe,EAC7B,QAAQ,QAAQ,IAAI,YACrB,CAAC;AAEF,SAAQ,UAAU,OAAO,UAA2B;AAClD,UAAQ,IAAI,SAAS,KAAK,UAAU,MAAM,CAAC;EAE3C,MAAM,YAAY,IAAI,eAAe;GACnC,WAAW,QAAQ,IAAI,iBAAiB;GACxC,MAAM,EACJ,cAAc,EAAE,GAAG,MAAM,eAAe,cAAe,EACxD;GACF,CAAC;AAEF,MAAI;AACF,SAAM,IAAI,KAAK,UAAU;WAClB,KAAK;AACZ,WAAQ,MAAM,IAAI;AAClB,UAAO;IACL,YAAY;IACZ,MAAM,wBAAwB,KAAK,UAAU,IAAI;IAClD;;AAGH,SAAO;GAAE,YAAY;GAAK,MAAM;GAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onDisconnect.mjs","names":[],"sources":["../../functions/onDisconnect.ts"],"sourcesContent":["import { DeleteItemCommand, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { APIGatewayEvent } from 'aws-lambda';\nimport { envVariableNames } from '../src/common/envVariableNames';\n\nconst ddb = new DynamoDBClient({\n region: process.env.AWS_REGION,\n});\nexport const handler = async (event: APIGatewayEvent) => {\n console.log('EVENT', JSON.stringify(event));\n\n const deleteParams = new DeleteItemCommand({\n TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME],\n Key: {\n connectionId: { S: event.requestContext.connectionId! },\n },\n });\n\n try {\n await ddb.send(deleteParams);\n } catch (err) {\n console.error(err);\n return {\n statusCode: 500,\n body: 'Failed to disconnect: ' + JSON.stringify(err),\n };\n }\n\n return { statusCode: 200, body: 'Disconnected.' };\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"onDisconnect.mjs","names":[],"sources":["../../functions/onDisconnect.ts"],"sourcesContent":["import { DeleteItemCommand, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { APIGatewayEvent } from 'aws-lambda';\nimport { envVariableNames } from '../src/common/envVariableNames';\n\nconst ddb = new DynamoDBClient({\n region: process.env.AWS_REGION,\n});\nexport const handler = async (event: APIGatewayEvent) => {\n console.log('EVENT', JSON.stringify(event));\n\n const deleteParams = new DeleteItemCommand({\n TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME],\n Key: {\n connectionId: { S: event.requestContext.connectionId! },\n },\n });\n\n try {\n await ddb.send(deleteParams);\n } catch (err) {\n console.error(err);\n return {\n statusCode: 500,\n body: 'Failed to disconnect: ' + JSON.stringify(err),\n };\n }\n\n return { statusCode: 200, body: 'Disconnected.' };\n};\n"],"mappings":";;;;;uBAEkE;AAElE,MAAM,MAAM,IAAI,eAAe,EAC7B,QAAQ,QAAQ,IAAI,YACrB,CAAC;AACF,MAAa,UAAU,OAAO,UAA2B;AACvD,SAAQ,IAAI,SAAS,KAAK,UAAU,MAAM,CAAC;CAE3C,MAAM,eAAe,IAAI,kBAAkB;EACzC,WAAW,QAAQ,IAAI,iBAAiB;EACxC,KAAK,EACH,cAAc,EAAE,GAAG,MAAM,eAAe,cAAe,EACxD;EACF,CAAC;AAEF,KAAI;AACF,QAAM,IAAI,KAAK,aAAa;UACrB,KAAK;AACZ,UAAQ,MAAM,IAAI;AAClB,SAAO;GACL,YAAY;GACZ,MAAM,2BAA2B,KAAK,UAAU,IAAI;GACrD;;AAGH,QAAO;EAAE,YAAY;EAAK,MAAM;EAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sendMessage.mjs","names":[],"sources":["../../functions/sendMessage.ts"],"sourcesContent":["import { SpyEventSender } from '../common/SpyEventSender';\n\nexport const handler = async (event: any) => {\n const spyEventSender = new SpyEventSender({\n scope: process.env['SSPY_ROOT_STACK']!,\n iotEndpoint: process.env['SSPY_IOT_ENDPOINT']!,\n });\n try {\n await spyEventSender.connect();\n await spyEventSender.publishSpyEvent(event);\n } catch (e) {\n console.error(e);\n return { statusCode: 500, body: (e as Error)?.stack };\n } finally {\n await spyEventSender.close();\n }\n\n return { statusCode: 200, body: 'Data sent.' };\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sendMessage.mjs","names":[],"sources":["../../functions/sendMessage.ts"],"sourcesContent":["import { SpyEventSender } from '../common/SpyEventSender';\n\nexport const handler = async (event: any) => {\n const spyEventSender = new SpyEventSender({\n scope: process.env['SSPY_ROOT_STACK']!,\n iotEndpoint: process.env['SSPY_IOT_ENDPOINT']!,\n });\n try {\n await spyEventSender.connect();\n await spyEventSender.publishSpyEvent(event);\n } catch (e) {\n console.error(e);\n return { statusCode: 500, body: (e as Error)?.stack };\n } finally {\n await spyEventSender.close();\n }\n\n return { statusCode: 200, body: 'Data sent.' };\n};\n"],"mappings":";;;;AAEA,MAAa,UAAU,OAAO,UAAe;CAC3C,MAAM,iBAAiB,IAAI,eAAe;EACxC,OAAO,QAAQ,IAAI;EACnB,aAAa,QAAQ,IAAI;EAC1B,CAAC;AACF,KAAI;AACF,QAAM,eAAe,SAAS;AAC9B,QAAM,eAAe,gBAAgB,MAAM;UACpC,GAAG;AACV,UAAQ,MAAM,EAAE;AAChB,SAAO;GAAE,YAAY;GAAK,MAAO,GAAa;GAAO;WAC7C;AACR,QAAM,eAAe,OAAO;;AAG9B,QAAO;EAAE,YAAY;EAAK,MAAM;EAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqsSubscriptionAndDropAllMessages.mjs","names":[],"sources":["../../functions/sqsSubscriptionAndDropAllMessages.ts"],"sourcesContent":["export const handler = async (event: any) => {\n return event;\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqsSubscriptionAndDropAllMessages.mjs","names":[],"sources":["../../functions/sqsSubscriptionAndDropAllMessages.ts"],"sourcesContent":["export const handler = async (event: any) => {\n return event;\n};\n"],"mappings":";;AAAA,MAAa,UAAU,OAAO,UAAe;AAC3C,QAAO"}
|
package/lib/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WsListener.mjs","names":["message: SpyMessageStorage | undefined","data","spyAndJestMatchers: any","resolve: (value: void | PromiseLike<any>) => void","tracker: Tracker","timeoutPid: NodeJS.Timeout | undefined"],"sources":["../../listener/WsListener.ts"],"sourcesContent":["import { device } from 'aws-iot-device-sdk';\nimport { fragment, getConnection } from './iot-connection';\nimport { ServerlessSpyListener } from './ServerlessSpyListener';\nimport { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams';\nimport { getTopic } from './topic';\nimport { WaitForParams } from './WaitForParams';\nimport { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';\nimport { SpyMessage } from '../common/spyEvents/SpyMessage';\n\nexport class WsListener<TSpyEvents> {\n private messages: SpyMessageStorage[] = [];\n private trackers: Tracker[] = [];\n\n private connectionOpenResolve?: () => void;\n private connectionOpenReject?: (reason?: any) => void;\n private closed = true;\n private functionPrefix = 'waitFor';\n private debugMode = false;\n private connection: device | undefined;\n\n private fragments = new Map<string, Map<number, fragment>>();\n\n public async start(params: ServerlessSpyListenerParams) {\n this.debugMode = !!params.debugMode;\n try {\n this.connection = await getConnection(\n this.debugMode,\n params.serverlessSpyWsUrl\n );\n this.closed = false;\n const topic = getTopic(params.scope || '#');\n this.log(`Subscribing to topic ${topic}`);\n const connectionOpenResolve =\n this.connectionOpenResolve || params.connectionOpenResolve;\n const localConnection = this.connection;\n this.connection.on('connect', () => {\n this.closed = false;\n this.log('Connection opened');\n localConnection.subscribe(topic);\n if (connectionOpenResolve) {\n connectionOpenResolve();\n }\n });\n this.connection.on('message', (_topic: string, data: Buffer) => {\n if (this.closed) return;\n\n this.log('Message received', data.toString());\n const fragment = JSON.parse(data.toString());\n let message: SpyMessageStorage | undefined = undefined;\n if (!fragment.id) {\n message = JSON.parse(fragment.data) as SpyMessageStorage;\n }\n\n let pending = this.fragments.get(fragment.id);\n if (!pending) {\n pending = new Map();\n this.fragments.set(fragment.id, pending);\n }\n pending.set(fragment.index, fragment);\n\n if (pending.size === fragment.count) {\n const data = [...pending.values()]\n .sort((a, b) => a.index - b.index)\n .map((item) => item.data)\n .join('');\n this.fragments.delete(fragment.id);\n message = JSON.parse(data) as SpyMessageStorage;\n }\n\n if (message) {\n message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');\n\n if (message.serviceKey.startsWith('Function')) {\n message.functionContextAwsRequestId = (\n message.data as FunctionRequestSpyEvent\n ).context.awsRequestId;\n }\n\n this.messages.push(message);\n this.resolveOldTrackerWithNewMessage(message);\n }\n });\n this.connection.on('close', () => {\n this.log('Connection closed');\n\n this.closed = true;\n });\n\n const connectionOpenReject =\n this.connectionOpenReject || params.connectionOpenReject;\n this.connection.on('error', (error) => {\n this.log('Connection error:', error);\n connectionOpenReject?.(error);\n });\n } catch (e) {\n console.error('Failed to get connection', e);\n throw e;\n }\n }\n\n public async stop() {\n this.closed = true;\n this.connection!.end(true);\n }\n\n private trackerMatchMessage(tracker: Tracker, message: SpyMessageStorage) {\n if (tracker.finished) return;\n\n if (\n (tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||\n (tracker.serviceKeyForFunction &&\n tracker.serviceKeyForFunction === message.serviceKeyForFunction)\n ) {\n if (this.trackerMatchCondition(tracker, message)) {\n tracker.finished = true;\n\n const spyAndJestMatchers: any = {\n getData: () => message.data,\n };\n\n const serviceKeyForFunction = tracker.serviceKeyForFunction;\n if (\n serviceKeyForFunction &&\n serviceKeyForFunction.startsWith('Function') &&\n (serviceKeyForFunction.endsWith('Request') ||\n serviceKeyForFunction.endsWith('Console'))\n ) {\n let serviceKeyForFunctionChain = serviceKeyForFunction;\n\n if (serviceKeyForFunctionChain.endsWith('Request')) {\n serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(\n 0,\n serviceKeyForFunctionChain.length - 'Request'.length\n );\n } else if (serviceKeyForFunctionChain.endsWith('Console')) {\n serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(\n 0,\n serviceKeyForFunctionChain.length - 'Console'.length\n );\n }\n\n spyAndJestMatchers.followedByConsole = (paramsW: WaitForParams) => {\n return this.createWaitForXXXFunc(\n `${serviceKeyForFunctionChain}Console`,\n (message.data as FunctionRequestSpyEvent).context.awsRequestId\n )(paramsW);\n };\n\n spyAndJestMatchers.followedByResponse = (paramsW: WaitForParams) => {\n return this.createWaitForXXXFunc(\n `${serviceKeyForFunctionChain}Response`,\n (message.data as FunctionRequestSpyEvent).context.awsRequestId\n )(paramsW);\n };\n }\n\n const proxy = new Proxy(spyAndJestMatchers, {\n get: function (target: any, objectKey: string) {\n if (target.hasOwnProperty(objectKey)) {\n return target[objectKey];\n } else if (objectKey !== 'then') {\n return function () {\n const jestFunctionToExecute = (expect(message.data) as any)[\n objectKey\n ];\n jestFunctionToExecute.apply(undefined, arguments);\n return proxy;\n };\n }\n },\n });\n\n tracker.promiseResolve(proxy);\n return true;\n }\n }\n return false;\n }\n\n private resolveTrackerInOldMessages(tracker: Tracker) {\n for (const message of this.messages) {\n if (this.trackerMatchMessage(tracker, message)) {\n return true;\n }\n }\n\n return false;\n }\n\n private resolveOldTrackerWithNewMessage(message: SpyMessageStorage) {\n for (let index = 0; index < this.trackers.length; index++) {\n const tracker = this.trackers[index];\n if (this.trackerMatchMessage(tracker, message)) {\n this.trackers = this.trackers.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n private trackerMatchCondition(tracker: Tracker, message: SpyMessageStorage) {\n const matchCondition =\n (tracker.condition && tracker.condition(message.data)) ||\n !tracker.condition;\n\n const matchRequestId =\n (tracker.functionContextAwsRequestId &&\n tracker.functionContextAwsRequestId ===\n message.functionContextAwsRequestId) ||\n !tracker.functionContextAwsRequestId;\n\n if (matchCondition && matchRequestId) {\n return true;\n } else {\n if (\n !matchCondition &&\n matchRequestId &&\n !tracker.possibleSpyMessageDataForDebugging\n ) {\n tracker.possibleSpyMessageDataForDebugging = message.data;\n }\n return false;\n }\n }\n\n private createWaitForXXXFunc(\n serviceKeyForFunction: string,\n functionContextAwsRequestId?: string\n ) {\n return (paramsW?: WaitForParams) => {\n let resolve: (value: void | PromiseLike<any>) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n const tracker: Tracker = {\n finished: false,\n // @ts-ignore\n promiseResolve: resolve,\n serviceKeyForFunction,\n functionContextAwsRequestId,\n };\n\n tracker.condition = paramsW?.condition;\n\n let timeoutPid: NodeJS.Timeout | undefined;\n const timer = new Promise((_, reject) => {\n timeoutPid = setTimeout(() => {\n if (tracker.finished) return;\n tracker.finished = true;\n let message = `Timeout waiting for Serverless Spy message ${serviceKeyForFunction}.`;\n\n if (tracker.possibleSpyMessageDataForDebugging) {\n message += ` Similar matching spy event data: ${JSON.stringify(\n tracker.possibleSpyMessageDataForDebugging,\n null,\n 2\n )}`;\n }\n\n reject(new Error(message));\n }, paramsW?.timoutMs || 10000);\n });\n\n if (!this.resolveTrackerInOldMessages(tracker)) {\n this.trackers.push(tracker);\n }\n\n return Promise.race([promise, timer]).finally(() => {\n if (!!timeoutPid) {\n clearTimeout(timeoutPid);\n }\n });\n };\n }\n\n public createProxy() {\n const spyListener = {} as ServerlessSpyListener<TSpyEvents>;\n\n spyListener.stop = async () => {\n await this.stop();\n };\n\n return new Proxy<ServerlessSpyListener<TSpyEvents>>(spyListener, {\n get: (target: any, objectKey: string) => {\n if (target.hasOwnProperty(objectKey)) {\n return target[objectKey].bind(target);\n } else if (\n typeof objectKey === 'string' &&\n objectKey.startsWith(this.functionPrefix)\n ) {\n const serviceKeyForFunction = objectKey.substring(\n this.functionPrefix.length\n );\n\n return this.createWaitForXXXFunc(serviceKeyForFunction);\n }\n },\n });\n }\n\n private log(message: string, ...optionalParams: any[]) {\n if (this.debugMode && !this.closed) {\n console.debug(\n 'SSPY',\n message,\n new Date().toISOString(),\n ...optionalParams\n );\n }\n }\n}\n\ntype Tracker = {\n promiseResolve: (data: any) => void;\n finished: boolean;\n serviceKey?: string;\n serviceKeyForFunction?: string;\n condition?: (data: any) => boolean;\n timoutMs?: number;\n functionContextAwsRequestId?: string;\n possibleSpyMessageDataForDebugging?: any;\n};\n\ntype SpyMessageStorage = SpyMessage & {\n serviceKeyForFunction: string;\n functionContextAwsRequestId?: string;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WsListener.mjs","names":["message: SpyMessageStorage | undefined","data","spyAndJestMatchers: any","resolve: (value: void | PromiseLike<any>) => void","tracker: Tracker","timeoutPid: NodeJS.Timeout | undefined"],"sources":["../../listener/WsListener.ts"],"sourcesContent":["import { device } from 'aws-iot-device-sdk';\nimport { fragment, getConnection } from './iot-connection';\nimport { ServerlessSpyListener } from './ServerlessSpyListener';\nimport { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams';\nimport { getTopic } from './topic';\nimport { WaitForParams } from './WaitForParams';\nimport { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';\nimport { SpyMessage } from '../common/spyEvents/SpyMessage';\n\nexport class WsListener<TSpyEvents> {\n private messages: SpyMessageStorage[] = [];\n private trackers: Tracker[] = [];\n\n private connectionOpenResolve?: () => void;\n private connectionOpenReject?: (reason?: any) => void;\n private closed = true;\n private functionPrefix = 'waitFor';\n private debugMode = false;\n private connection: device | undefined;\n\n private fragments = new Map<string, Map<number, fragment>>();\n\n public async start(params: ServerlessSpyListenerParams) {\n this.debugMode = !!params.debugMode;\n try {\n this.connection = await getConnection(\n this.debugMode,\n params.serverlessSpyWsUrl\n );\n this.closed = false;\n const topic = getTopic(params.scope || '#');\n this.log(`Subscribing to topic ${topic}`);\n const connectionOpenResolve =\n this.connectionOpenResolve || params.connectionOpenResolve;\n const localConnection = this.connection;\n this.connection.on('connect', () => {\n this.closed = false;\n this.log('Connection opened');\n localConnection.subscribe(topic);\n if (connectionOpenResolve) {\n connectionOpenResolve();\n }\n });\n this.connection.on('message', (_topic: string, data: Buffer) => {\n if (this.closed) return;\n\n this.log('Message received', data.toString());\n const fragment = JSON.parse(data.toString());\n let message: SpyMessageStorage | undefined = undefined;\n if (!fragment.id) {\n message = JSON.parse(fragment.data) as SpyMessageStorage;\n }\n\n let pending = this.fragments.get(fragment.id);\n if (!pending) {\n pending = new Map();\n this.fragments.set(fragment.id, pending);\n }\n pending.set(fragment.index, fragment);\n\n if (pending.size === fragment.count) {\n const data = [...pending.values()]\n .sort((a, b) => a.index - b.index)\n .map((item) => item.data)\n .join('');\n this.fragments.delete(fragment.id);\n message = JSON.parse(data) as SpyMessageStorage;\n }\n\n if (message) {\n message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');\n\n if (message.serviceKey.startsWith('Function')) {\n message.functionContextAwsRequestId = (\n message.data as FunctionRequestSpyEvent\n ).context.awsRequestId;\n }\n\n this.messages.push(message);\n this.resolveOldTrackerWithNewMessage(message);\n }\n });\n this.connection.on('close', () => {\n this.log('Connection closed');\n\n this.closed = true;\n });\n\n const connectionOpenReject =\n this.connectionOpenReject || params.connectionOpenReject;\n this.connection.on('error', (error) => {\n this.log('Connection error:', error);\n connectionOpenReject?.(error);\n });\n } catch (e) {\n console.error('Failed to get connection', e);\n throw e;\n }\n }\n\n public async stop() {\n this.closed = true;\n this.connection!.end(true);\n }\n\n private trackerMatchMessage(tracker: Tracker, message: SpyMessageStorage) {\n if (tracker.finished) return;\n\n if (\n (tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||\n (tracker.serviceKeyForFunction &&\n tracker.serviceKeyForFunction === message.serviceKeyForFunction)\n ) {\n if (this.trackerMatchCondition(tracker, message)) {\n tracker.finished = true;\n\n const spyAndJestMatchers: any = {\n getData: () => message.data,\n };\n\n const serviceKeyForFunction = tracker.serviceKeyForFunction;\n if (\n serviceKeyForFunction &&\n serviceKeyForFunction.startsWith('Function') &&\n (serviceKeyForFunction.endsWith('Request') ||\n serviceKeyForFunction.endsWith('Console'))\n ) {\n let serviceKeyForFunctionChain = serviceKeyForFunction;\n\n if (serviceKeyForFunctionChain.endsWith('Request')) {\n serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(\n 0,\n serviceKeyForFunctionChain.length - 'Request'.length\n );\n } else if (serviceKeyForFunctionChain.endsWith('Console')) {\n serviceKeyForFunctionChain = serviceKeyForFunctionChain.substring(\n 0,\n serviceKeyForFunctionChain.length - 'Console'.length\n );\n }\n\n spyAndJestMatchers.followedByConsole = (paramsW: WaitForParams) => {\n return this.createWaitForXXXFunc(\n `${serviceKeyForFunctionChain}Console`,\n (message.data as FunctionRequestSpyEvent).context.awsRequestId\n )(paramsW);\n };\n\n spyAndJestMatchers.followedByResponse = (paramsW: WaitForParams) => {\n return this.createWaitForXXXFunc(\n `${serviceKeyForFunctionChain}Response`,\n (message.data as FunctionRequestSpyEvent).context.awsRequestId\n )(paramsW);\n };\n }\n\n const proxy = new Proxy(spyAndJestMatchers, {\n get: function (target: any, objectKey: string) {\n if (target.hasOwnProperty(objectKey)) {\n return target[objectKey];\n } else if (objectKey !== 'then') {\n return function () {\n const jestFunctionToExecute = (expect(message.data) as any)[\n objectKey\n ];\n jestFunctionToExecute.apply(undefined, arguments);\n return proxy;\n };\n }\n },\n });\n\n tracker.promiseResolve(proxy);\n return true;\n }\n }\n return false;\n }\n\n private resolveTrackerInOldMessages(tracker: Tracker) {\n for (const message of this.messages) {\n if (this.trackerMatchMessage(tracker, message)) {\n return true;\n }\n }\n\n return false;\n }\n\n private resolveOldTrackerWithNewMessage(message: SpyMessageStorage) {\n for (let index = 0; index < this.trackers.length; index++) {\n const tracker = this.trackers[index];\n if (this.trackerMatchMessage(tracker, message)) {\n this.trackers = this.trackers.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n private trackerMatchCondition(tracker: Tracker, message: SpyMessageStorage) {\n const matchCondition =\n (tracker.condition && tracker.condition(message.data)) ||\n !tracker.condition;\n\n const matchRequestId =\n (tracker.functionContextAwsRequestId &&\n tracker.functionContextAwsRequestId ===\n message.functionContextAwsRequestId) ||\n !tracker.functionContextAwsRequestId;\n\n if (matchCondition && matchRequestId) {\n return true;\n } else {\n if (\n !matchCondition &&\n matchRequestId &&\n !tracker.possibleSpyMessageDataForDebugging\n ) {\n tracker.possibleSpyMessageDataForDebugging = message.data;\n }\n return false;\n }\n }\n\n private createWaitForXXXFunc(\n serviceKeyForFunction: string,\n functionContextAwsRequestId?: string\n ) {\n return (paramsW?: WaitForParams) => {\n let resolve: (value: void | PromiseLike<any>) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n const tracker: Tracker = {\n finished: false,\n // @ts-ignore\n promiseResolve: resolve,\n serviceKeyForFunction,\n functionContextAwsRequestId,\n };\n\n tracker.condition = paramsW?.condition;\n\n let timeoutPid: NodeJS.Timeout | undefined;\n const timer = new Promise((_, reject) => {\n timeoutPid = setTimeout(() => {\n if (tracker.finished) return;\n tracker.finished = true;\n let message = `Timeout waiting for Serverless Spy message ${serviceKeyForFunction}.`;\n\n if (tracker.possibleSpyMessageDataForDebugging) {\n message += ` Similar matching spy event data: ${JSON.stringify(\n tracker.possibleSpyMessageDataForDebugging,\n null,\n 2\n )}`;\n }\n\n reject(new Error(message));\n }, paramsW?.timoutMs || 10000);\n });\n\n if (!this.resolveTrackerInOldMessages(tracker)) {\n this.trackers.push(tracker);\n }\n\n return Promise.race([promise, timer]).finally(() => {\n if (!!timeoutPid) {\n clearTimeout(timeoutPid);\n }\n });\n };\n }\n\n public createProxy() {\n const spyListener = {} as ServerlessSpyListener<TSpyEvents>;\n\n spyListener.stop = async () => {\n await this.stop();\n };\n\n return new Proxy<ServerlessSpyListener<TSpyEvents>>(spyListener, {\n get: (target: any, objectKey: string) => {\n if (target.hasOwnProperty(objectKey)) {\n return target[objectKey].bind(target);\n } else if (\n typeof objectKey === 'string' &&\n objectKey.startsWith(this.functionPrefix)\n ) {\n const serviceKeyForFunction = objectKey.substring(\n this.functionPrefix.length\n );\n\n return this.createWaitForXXXFunc(serviceKeyForFunction);\n }\n },\n });\n }\n\n private log(message: string, ...optionalParams: any[]) {\n if (this.debugMode && !this.closed) {\n console.debug(\n 'SSPY',\n message,\n new Date().toISOString(),\n ...optionalParams\n );\n }\n }\n}\n\ntype Tracker = {\n promiseResolve: (data: any) => void;\n finished: boolean;\n serviceKey?: string;\n serviceKeyForFunction?: string;\n condition?: (data: any) => boolean;\n timoutMs?: number;\n functionContextAwsRequestId?: string;\n possibleSpyMessageDataForDebugging?: any;\n};\n\ntype SpyMessageStorage = SpyMessage & {\n serviceKeyForFunction: string;\n functionContextAwsRequestId?: string;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServerlessSpyListener.mjs","names":["reject: ((value: void | PromiseLike<void>) => void) | undefined"],"sources":["../../listener/createServerlessSpyListener.ts"],"sourcesContent":["import { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams';\nimport { WsListener } from './WsListener';\n\nexport async function createServerlessSpyListener<TSpyEvents>(\n params: Omit<ServerlessSpyListenerParams, 'scope'>\n) {\n const wsListener = new WsListener<TSpyEvents>();\n let resolve, reject: ((value: void | PromiseLike<void>) => void) | undefined;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const [serverlessSpyWsUrl, scope] = params.serverlessSpyWsUrl.split('/');\n if (!scope) {\n throw Error(\n `ServerlessSpyWsUrl was missing rootStack: ${params.serverlessSpyWsUrl}`\n );\n }\n await wsListener.start({\n ...params,\n serverlessSpyWsUrl,\n scope,\n connectionOpenResolve: params.connectionOpenResolve || resolve,\n connectionOpenReject: params.connectionOpenReject || reject,\n });\n\n const proxy = wsListener.createProxy();\n await promise;\n return proxy;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"createServerlessSpyListener.mjs","names":["reject: ((value: void | PromiseLike<void>) => void) | undefined"],"sources":["../../listener/createServerlessSpyListener.ts"],"sourcesContent":["import { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams';\nimport { WsListener } from './WsListener';\n\nexport async function createServerlessSpyListener<TSpyEvents>(\n params: Omit<ServerlessSpyListenerParams, 'scope'>\n) {\n const wsListener = new WsListener<TSpyEvents>();\n let resolve, reject: ((value: void | PromiseLike<void>) => void) | undefined;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const [serverlessSpyWsUrl, scope] = params.serverlessSpyWsUrl.split('/');\n if (!scope) {\n throw Error(\n `ServerlessSpyWsUrl was missing rootStack: ${params.serverlessSpyWsUrl}`\n );\n }\n await wsListener.start({\n ...params,\n serverlessSpyWsUrl,\n scope,\n connectionOpenResolve: params.connectionOpenResolve || resolve,\n connectionOpenReject: params.connectionOpenReject || reject,\n });\n\n const proxy = wsListener.createProxy();\n await promise;\n return proxy;\n}\n"],"mappings":";;;;AAGA,eAAsB,4BACpB,QACA;CACA,MAAM,aAAa,IAAI,YAAwB;CAC/C,IAAI,SAASA;CACb,MAAM,UAAU,IAAI,SAAe,KAAK,QAAQ;AAC9C,YAAU;AACV,WAAS;GACT;CACF,MAAM,CAAC,oBAAoB,SAAS,OAAO,mBAAmB,MAAM,IAAI;AACxE,KAAI,CAAC,MACH,OAAM,MACJ,6CAA6C,OAAO,qBACrD;AAEH,OAAM,WAAW,MAAM;EACrB,GAAG;EACH;EACA;EACA,uBAAuB,OAAO,yBAAyB;EACvD,sBAAsB,OAAO,wBAAwB;EACtD,CAAC;CAEF,MAAM,QAAQ,WAAW,aAAa;AACtC,OAAM;AACN,QAAO"}
|
package/lib/listener/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iot-connection.mjs","names":[],"sources":["../../listener/iot-connection.ts"],"sourcesContent":["import { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { device } from 'aws-iot-device-sdk';\n\nexport type fragment = { id: string; index: number; count: number; data: any };\n\nfunction createLog(debugMode: boolean) {\n return (message: string, ...optionalParams: any[]) => {\n if (debugMode) {\n console.debug('SSPY', message, ...optionalParams);\n }\n };\n}\n\nfunction createErrorLog() {\n return (message: string, ...optionalParams: any[]) => {\n console.error('SSPY', message, ...optionalParams);\n };\n}\n\nexport async function getConnection(\n debugMode: boolean,\n iotEndpoint: string\n): Promise<device> {\n const log = createLog(debugMode);\n const logError = createErrorLog();\n log('Using IoT endpoint:', iotEndpoint);\n\n if (!iotEndpoint) {\n logError('No IoT endpoint could be found');\n throw new Error('IoT Endpoint address not found');\n }\n const region = iotEndpoint.split('.')[2];\n\n const provider = fromNodeProviderChain();\n const credentials = await provider();\n const connection = new device({\n protocol: 'wss',\n host: iotEndpoint,\n region,\n reconnectPeriod: 1,\n accessKeyId: credentials.accessKeyId,\n secretKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n });\n\n connection.on('connect', () => {\n log('IoT connected');\n });\n\n connection.on('error', (err) => {\n logError('IoT error', err);\n });\n\n connection.on('close', () => {\n log('IoT closed');\n });\n\n connection.on('reconnect', () => {\n log('IoT reconnected');\n });\n\n return connection;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"iot-connection.mjs","names":[],"sources":["../../listener/iot-connection.ts"],"sourcesContent":["import { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { device } from 'aws-iot-device-sdk';\n\nexport type fragment = { id: string; index: number; count: number; data: any };\n\nfunction createLog(debugMode: boolean) {\n return (message: string, ...optionalParams: any[]) => {\n if (debugMode) {\n console.debug('SSPY', message, ...optionalParams);\n }\n };\n}\n\nfunction createErrorLog() {\n return (message: string, ...optionalParams: any[]) => {\n console.error('SSPY', message, ...optionalParams);\n };\n}\n\nexport async function getConnection(\n debugMode: boolean,\n iotEndpoint: string\n): Promise<device> {\n const log = createLog(debugMode);\n const logError = createErrorLog();\n log('Using IoT endpoint:', iotEndpoint);\n\n if (!iotEndpoint) {\n logError('No IoT endpoint could be found');\n throw new Error('IoT Endpoint address not found');\n }\n const region = iotEndpoint.split('.')[2];\n\n const provider = fromNodeProviderChain();\n const credentials = await provider();\n const connection = new device({\n protocol: 'wss',\n host: iotEndpoint,\n region,\n reconnectPeriod: 1,\n accessKeyId: credentials.accessKeyId,\n secretKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n });\n\n connection.on('connect', () => {\n log('IoT connected');\n });\n\n connection.on('error', (err) => {\n logError('IoT error', err);\n });\n\n connection.on('close', () => {\n log('IoT closed');\n });\n\n connection.on('reconnect', () => {\n log('IoT reconnected');\n });\n\n return connection;\n}\n"],"mappings":";;;;;AAKA,SAAS,UAAU,WAAoB;AACrC,SAAQ,SAAiB,GAAG,mBAA0B;AACpD,MAAI,UACF,SAAQ,MAAM,QAAQ,SAAS,GAAG,eAAe;;;AAKvD,SAAS,iBAAiB;AACxB,SAAQ,SAAiB,GAAG,mBAA0B;AACpD,UAAQ,MAAM,QAAQ,SAAS,GAAG,eAAe;;;AAIrD,eAAsB,cACpB,WACA,aACiB;CACjB,MAAM,MAAM,UAAU,UAAU;CAChC,MAAM,WAAW,gBAAgB;AACjC,KAAI,uBAAuB,YAAY;AAEvC,KAAI,CAAC,aAAa;AAChB,WAAS,iCAAiC;AAC1C,QAAM,IAAI,MAAM,iCAAiC;;CAEnD,MAAM,SAAS,YAAY,MAAM,IAAI,CAAC;CAGtC,MAAM,cAAc,MADH,uBAAuB,EACJ;CACpC,MAAM,aAAa,IAAI,OAAO;EAC5B,UAAU;EACV,MAAM;EACN;EACA,iBAAiB;EACjB,aAAa,YAAY;EACzB,WAAW,YAAY;EACvB,cAAc,YAAY;EAC3B,CAAC;AAEF,YAAW,GAAG,iBAAiB;AAC7B,MAAI,gBAAgB;GACpB;AAEF,YAAW,GAAG,UAAU,QAAQ;AAC9B,WAAS,aAAa,IAAI;GAC1B;AAEF,YAAW,GAAG,eAAe;AAC3B,MAAI,aAAa;GACjB;AAEF,YAAW,GAAG,mBAAmB;AAC/B,MAAI,kBAAkB;GACtB;AAEF,QAAO"}
|
package/lib/listener/setup.mjs
CHANGED
package/lib/listener/topic.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic.mjs","names":[],"sources":["../../listener/topic.ts"],"sourcesContent":["export const SSPY_TOPIC = 'sspy';\n\nexport function getTopic(scope: string) {\n return `${SSPY_TOPIC}/${scope}`;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"topic.mjs","names":[],"sources":["../../listener/topic.ts"],"sourcesContent":["export const SSPY_TOPIC = 'sspy';\n\nexport function getTopic(scope: string) {\n return `${SSPY_TOPIC}/${scope}`;\n}\n"],"mappings":";;AAAA,MAAa,aAAa;AAE1B,SAAgB,SAAS,OAAe;AACtC,QAAO,GAAG,WAAW,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":[],"sources":["../../../../../node_modules/uuid/dist/esm-node/native.js"],"sourcesContent":["import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};"],"x_google_ignoreList":[0],"mappings":"
|
|
1
|
+
{"version":3,"file":"native.mjs","names":[],"sources":["../../../../../node_modules/uuid/dist/esm-node/native.js"],"sourcesContent":["import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};"],"x_google_ignoreList":[0],"mappings":";;;;AACA,qBAAe,EACb,YAAY,OAAO,YACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rng.mjs","names":[],"sources":["../../../../../node_modules/uuid/dist/esm-node/rng.js"],"sourcesContent":["import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}"],"x_google_ignoreList":[0],"mappings":"
|
|
1
|
+
{"version":3,"file":"rng.mjs","names":[],"sources":["../../../../../node_modules/uuid/dist/esm-node/rng.js"],"sourcesContent":["import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}"],"x_google_ignoreList":[0],"mappings":";;;;AACA,MAAM,YAAY,IAAI,WAAW,IAAI;AAErC,IAAI,UAAU,UAAU;AACxB,SAAwB,MAAM;AAC5B,KAAI,UAAU,UAAU,SAAS,IAAI;AACnC,SAAO,eAAe,UAAU;AAChC,YAAU;;AAGZ,QAAO,UAAU,MAAM,SAAS,WAAW,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringify.mjs","names":[],"sources":["../../../../../node_modules/uuid/dist/esm-node/stringify.js"],"sourcesContent":["import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;"],"x_google_ignoreList":[0],"mappings":"
|
|
1
|
+
{"version":3,"file":"stringify.mjs","names":[],"sources":["../../../../../node_modules/uuid/dist/esm-node/stringify.js"],"sourcesContent":["import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;"],"x_google_ignoreList":[0],"mappings":";;;;;;AAMA,MAAM,YAAY,EAAE;AAEpB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,EAAE,EACzB,WAAU,MAAM,IAAI,KAAO,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC;AAGnD,SAAgB,gBAAgB,KAAK,SAAS,GAAG;AAG/C,QAAO,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,MAAM,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,MAAM,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,MAAM,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,MAAM,UAAU,IAAI,SAAS,OAAO,UAAU,IAAI,SAAS,OAAO,UAAU,IAAI,SAAS,OAAO,UAAU,IAAI,SAAS,OAAO,UAAU,IAAI,SAAS,OAAO,UAAU,IAAI,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v4.mjs","names":["native"],"sources":["../../../../../node_modules/uuid/dist/esm-node/v4.js"],"sourcesContent":["import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;"],"x_google_ignoreList":[0],"mappings":"
|
|
1
|
+
{"version":3,"file":"v4.mjs","names":["native"],"sources":["../../../../../node_modules/uuid/dist/esm-node/v4.js"],"sourcesContent":["import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;"],"x_google_ignoreList":[0],"mappings":";;;;;;AAIA,SAAS,GAAG,SAAS,KAAK,QAAQ;AAChC,KAAIA,eAAO,cAAc,CAAC,OAAO,CAAC,QAChC,QAAOA,eAAO,YAAY;AAG5B,WAAU,WAAW,EAAE;CACvB,MAAM,OAAO,QAAQ,WAAW,QAAQ,OAAO,MAAM;AAErD,MAAK,KAAK,KAAK,KAAK,KAAO;AAC3B,MAAK,KAAK,KAAK,KAAK,KAAO;AAE3B,KAAI,KAAK;AACP,WAAS,UAAU;AAEnB,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,EACxB,KAAI,SAAS,KAAK,KAAK;AAGzB,SAAO;;AAGT,QAAO,gBAAgB,KAAK;;AAG9B,iBAAe"}
|
package/lib/src/ServerlessSpy.js
CHANGED
|
@@ -622,5 +622,5 @@ class ServerlessSpy extends constructs_1.Construct {
|
|
|
622
622
|
}
|
|
623
623
|
exports.ServerlessSpy = ServerlessSpy;
|
|
624
624
|
_a = JSII_RTTI_SYMBOL_1;
|
|
625
|
-
ServerlessSpy[_a] = { fqn: "serverless-spy.ServerlessSpy", version: "2.3.
|
|
625
|
+
ServerlessSpy[_a] = { fqn: "serverless-spy.ServerlessSpy", version: "2.3.16" };
|
|
626
626
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw4RUFBc0U7QUFDdEUsNkNBUXFCO0FBQ3JCLHFEQUFxRDtBQUNyRCxpREFBaUQ7QUFDakQsMERBQTBEO0FBQzFELGlEQUE2QztBQUM3QyxpREFBaUQ7QUFDakQsdURBSWdDO0FBQ2hDLHVFQUF1RTtBQUN2RSxtRkFBc0U7QUFDdEUsNERBQTREO0FBQzVELHFFQUErRDtBQUMvRCx5Q0FBeUM7QUFDekMsNERBQTREO0FBQzVELDJDQUEyQztBQUMzQyw2REFBNkQ7QUFDN0QsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQUNuRCxnRUFBNkQ7QUFtQjdELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFnQixFQUEyQixFQUFFLENBQ3JFLGNBQWMsSUFBSSxJQUFJLElBQUksYUFBYSxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDO0FBRXZFLE1BQU0sb0NBQW9DLEdBQUcsMEJBQTBCLENBQUM7QUFFeEUsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFVMUMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ0YsS0FBMEI7UUFFbEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUZULFVBQUssR0FBTCxLQUFLLENBQXFCO1FBWjVCLDJCQUFzQixHQUFpQixFQUFFLENBQUM7UUFDMUMsMkJBQXNCLEdBQXlCLEVBQUUsQ0FBQztRQUVsRCxpQkFBWSxHQUFrQixFQUFFLENBQUM7UUFDbEMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDMUIsZUFBVSxHQUFpQixFQUFFLENBQUM7UUFDOUIsYUFBUSxHQUEyQyxFQUFFLENBQUM7UUFVNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDOUIsSUFBSSxDQUFDLGFBQWEsQ0FB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O1FBRTNELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxHQUFHLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7O0FBNXpCSCxzQ0E2ekJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFB5dGhvbkxheWVyVmVyc2lvbiB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJztcbmltcG9ydCB7XG4gIGF3c19pYW0sXG4gIEJ1bmRsaW5nRmlsZUFjY2VzcyxcbiAgQ2ZuT3V0cHV0LFxuICBjdXN0b21fcmVzb3VyY2VzLFxuICBEdXJhdGlvbixcbiAgTmVzdGVkU3RhY2ssXG4gIFN0YWNrLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIElMYXllclZlcnNpb24sXG4gIFNpbmdsZXRvbkZ1bmN0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiU3RyZWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlcyc7XG5pbXBvcnQgeyBTcXNFdmVudFNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlcyc7XG5pbXBvcnQgKiBhcyBsYW1iZGFOb2RlIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzbm90aWYgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLW5vdGlmaWNhdGlvbnMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgc25zU3VicyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zLXN1YnNjcmlwdGlvbnMnO1xuaW1wb3J0ICogYXMgc3FzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zcXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBlbnZWYXJpYWJsZU5hbWVzIH0gZnJvbSAnLi9jb21tb24vZW52VmFyaWFibGVOYW1lcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVybGVzc1NweVByb3BzIHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVTcHlFdmVudHNGaWxlTG9jYXRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNweVNxc1dpdGhOb1N1YnNjcmlwdGlvbkFuZERyb3BBbGxNZXNzYWdlcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRlYnVnTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3B5RmlsdGVyIHtcbiAgcmVhZG9ubHkgc3B5TGFtYmRhPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3B5U3FzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3B5U25zVG9waWM/OiBib29sZWFuO1xuICByZWFkb25seSBzcHlTbnNTdWJzcmlwdGlvbj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNweUV2ZW50QnJpZGdlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3B5RXZlbnRCcmlkZ2VSdWxlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3B5UzM/OiBib29sZWFuO1xuICByZWFkb25seSBzcHlEeW5hbW9EQj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGlzTGFtYmRhRnVuY3Rpb24gPSAobm9kZTogSUNvbnN0cnVjdCk6IG5vZGUgaXMgbGFtYmRhLkZ1bmN0aW9uID0+XG4gICdmdW5jdGlvbk5hbWUnIGluIG5vZGUgJiYgJ2Z1bmN0aW9uQXJuJyBpbiBub2RlICYmICdydW50aW1lJyBpbiBub2RlO1xuXG5jb25zdCBzZXJ2ZXJsZXNzU3B5SW90RW5kcG9pbnRDck5hbWVQcmVmaXggPSAnU2VydmVybGVzc1NweUlvdEVuZHBvaW50JztcblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGNyZWF0ZWRSZXNvdXJjZXNCeVNTcHk6IElDb25zdHJ1Y3RbXSA9IFtdO1xuICBwcml2YXRlIGxhbWJkYVN1YnNjcmlwdGlvblBvb2w6IExhbWJkYVN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgbGFtYmRhU3Vic2NyaXB0aW9uTWFpbjogTGFtYmRhU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGxhbWJkYXNTcGllZDogTGFtYmRhU3BpZWRbXSA9IFtdO1xuICBwdWJsaWMgc2VydmljZUtleXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3BpZWROb2RlczogSUNvbnN0cnVjdFtdID0gW107XG4gIHByaXZhdGUgbGF5ZXJNYXA6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgSUxheWVyVmVyc2lvbj4+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgaW90RW5kcG9pbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBwcm9wcz86IFNlcnZlcmxlc3NTcHlQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgcm9vdFN0YWNrID0gdGhpcy5jbGVhbk5hbWUoXG4gICAgICB0aGlzLmZpbmRSb290U3RhY2soU3RhY2sub2YodGhpcykpLm5vZGUuaWRcbiAgICApO1xuXG4gICAgY29uc3QgZ2V0SW9URW5kcG9pbnQgPSBuZXcgY3VzdG9tX3Jlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZShcbiAgICAgIHRoaXMsXG4gICAgICBzZXJ2ZXJsZXNzU3B5SW90RW5kcG9pbnRDck5hbWVQcmVmaXgsXG4gICAgICB7XG4gICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogJ0lvdCcsXG4gICAgICAgICAgYWN0aW9uOiAnZGVzY3JpYmVFbmRwb2ludCcsXG4gICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOlxuICAgICAgICAgICAgY3VzdG9tX3Jlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQuZnJvbVJlc3BvbnNlKCdlbmRwb2ludEFkZHJlc3MnKSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBlbmRwb2ludFR5cGU6ICdpb3Q6RGF0YS1BVFMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogJ0lvdCcsXG4gICAgICAgICAgYWN0aW9uOiAnZGVzY3JpYmVFbmRwb2ludCcsXG4gICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOlxuICAgICAgICAgICAgY3VzdG9tX3Jlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQuZnJvbVJlc3BvbnNlKCdlbmRwb2ludEFkZHJlc3MnKSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBlbmRwb2ludFR5cGU6ICdpb3Q6RGF0YS1BVFMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGluc3RhbGxMYXRlc3RBd3NTZGs6IGZhbHNlLFxuICAgICAgICBwb2xpY3k6IGN1c3RvbV9yZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgICByZXNvdXJjZXM6IGN1c3RvbV9yZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuQU5ZX1JFU09VUkNFLFxuICAgICAgICB9KSxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBzZXJ2ZXJsZXNzU3B5SW90RW5kcG9pbnRDck5hbWVQcmVmaXggKyByb290U3RhY2ssXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmlvdEVuZHBvaW50ID0gZ2V0SW9URW5kcG9pbnQuZ2V0UmVzcG9uc2VGaWVsZCgnZW5kcG9pbnRBZGRyZXNzJyk7XG5cbiAgICB0aGlzLmNyZWF0ZWRSZXNvdXJjZXNCeVNTcHkucHVzaChnZXRJb1RFbmRwb2ludCk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsICdTZXJ2ZXJsZXNzU3B5SW9URW5kcG9pbnQnLCB7XG4gICAgICBrZXk6ICdTZXJ2ZXJsZXNzU3B5V3NVcmwnLFxuICAgICAgdmFsdWU6IGAke3RoaXMuaW90RW5kcG9pbnR9LyR7cm9vdFN0YWNrfWAsXG4gICAgfSk7XG5cbiAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvbk1haW4gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0TGFtYmRhRW52aXJvbm1lbnRWYXJpYWJsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRhbGl6ZSBzcHlpbmcgb24gcmVzb3VyY2VzIGdpdmVuIGFzIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIG5vZGVzIFdoaWNoIHJlb3VyY2VzIGFuZCB0aGVpciBjaGlsZHJlbiB0byBzcHkgb24uXG4gICAqL1xuICBwdWJsaWMgc3B5Tm9kZXMobm9kZXM6IElDb25zdHJ1Y3RbXSkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgbGV0IG5zID0gdGhpcy5nZXRBbGxOb2Rlcyhub2RlKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlOb2Rlcyhucyk7XG4gICAgfVxuXG4gICAgdGhpcy5maW5hbGl6ZVNweSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRhbGl6ZSBzcHlpbmcgb24gcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gZmlsdGVyIExpbWl0IHdoaWNoIHJlc291cmNlcyB0byBzcHkgb24uXG4gICAqL1xuICBwdWJsaWMgc3B5KGZpbHRlcj86IFNweUZpbHRlcikge1xuICAgIGxldCBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoU3RhY2sub2YodGhpcykpO1xuXG4gICAgY29uc3QgZmlsdGVyV2l0aERlZmF1bHRzOiBSZXF1aXJlZDxTcHlGaWx0ZXI+ID0ge1xuICAgICAgc3B5TGFtYmRhOiB0cnVlLFxuICAgICAgc3B5U3FzOiB0cnVlLFxuICAgICAgc3B5U25zVG9waWM6IHRydWUsXG4gICAgICBzcHlTbnNTdWJzcmlwdGlvbjogdHJ1ZSxcbiAgICAgIHNweUV2ZW50QnJpZGdlOiB0cnVlLFxuICAgICAgc3B5RXZlbnRCcmlkZ2VSdWxlOiB0cnVlLFxuICAgICAgc3B5UzM6IHRydWUsXG4gICAgICBzcHlEeW5hbW9EQjogdHJ1ZSxcbiAgICAgIC4uLmZpbHRlcixcbiAgICB9O1xuXG4gICAgY29uc3QgQ1JJRCA9XG4gICAgICAnQVdTJyArXG4gICAgICBjdXN0b21fcmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlLlBST1ZJREVSX0ZVTkNUSU9OX1VVSUQucmVwbGFjZShcbiAgICAgICAgLy0vZ2ksXG4gICAgICAgICcnXG4gICAgICApLnN1YnN0cmluZygwLCAxNik7XG5cbiAgICBub2RlcyA9IG5vZGVzLmZpbHRlcigobm9kZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBJZ25vcmUgdGhlIGN1c3RvbSByZXNvdXJjZSBhbmQgdGhlIFByb3ZpZGVyIChhcyB3ZWxsIGFzIGFueSBvdGhlciBQcm92aWRlcnMgdXNpbmcgdGhlIHNhbWUgcHJvdmlkZXIgZnVuY3Rpb24pLCBvdGhlcndpc2Ugd2UgY2F1c2VcbiAgICAgICAgLy8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gICAgICAgIG5vZGUubm9kZS5pZC5zdGFydHNXaXRoKENSSUQpIHx8XG4gICAgICAgIG5vZGUubm9kZS5pZCA9PT0gJ1Byb3ZpZGVyJyB8fFxuICAgICAgICAvLyBJZ25vcmUgc2luZ2xldG9uIGZ1bmN0aW9ucyBhcyB0aGV5IGNhbiBjYXVzZSB2ZXJ5IG9kZCBiZWhhdmlvciBhbmQgY3Jhc2hlc1xuICAgICAgICBub2RlIGluc3RhbmNlb2YgU2luZ2xldG9uRnVuY3Rpb25cbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcz8uZGVidWdNb2RlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwcGluZyAke25vZGUubm9kZS5pZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5TGFtYmRhICYmXG4gICAgICAgIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uIHx8XG4gICAgICAgICAgbm9kZSBpbnN0YW5jZW9mIE5vZGVqc0Z1bmN0aW9uIHx8XG4gICAgICAgICAgaXNMYW1iZGFGdW5jdGlvbihub2RlKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyV2l0aERlZmF1bHRzLnNweVNuc1RvcGljICYmIG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5U25zU3Vic3JpcHRpb24gJiZcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIHNucy5TdWJzY3JpcHRpb25cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyV2l0aERlZmF1bHRzLnNweVMzICYmIG5vZGUgaW5zdGFuY2VvZiBzMy5CdWNrZXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5RHluYW1vREIgJiZcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGR5bmFtb0RiLlRhYmxlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5RHluYW1vREIgJiZcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGR5bmFtb0RiLlRhYmxlVjJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZpbHRlcldpdGhEZWZhdWx0cy5zcHlFdmVudEJyaWRnZSAmJlxuICAgICAgICBub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5RXZlbnRCcmlkZ2VSdWxlICYmXG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZmlsdGVyV2l0aERlZmF1bHRzLnNweVNxcyAmJlxuICAgICAgICBub2RlIGluc3RhbmNlb2YgbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZmlsdGVyV2l0aERlZmF1bHRzLnNweVNxcyAmJlxuICAgICAgICB0aGlzLnByb3BzPy5zcHlTcXNXaXRoTm9TdWJzY3JpcHRpb25BbmREcm9wQWxsTWVzc2FnZXMgJiZcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIHNxcy5RdWV1ZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLmludGVybmFsU3B5Tm9kZXMobm9kZXMpO1xuICAgIHRoaXMuZmluYWxpemVTcHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlOb2Rlcyhub2RlczogSUNvbnN0cnVjdFtdKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5Tm9kZShub2RlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmFsaXplU3B5KCkge1xuICAgIC8vc2V0IG1hcHBpbmcgcHJvcGVydHkgZm9yIGFsbCBmdW5jdGlvbnMgd2UgY3JlYXRlZFxuICAgIGZvciAoY29uc3QgZnVuYyBvZiB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvblBvb2wpIHtcbiAgICAgIGZ1bmMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICAgIGVudlZhcmlhYmxlTmFtZXMuU1NQWV9JTkZSQV9NQVBQSU5HLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShmdW5jLm1hcHBpbmcpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vc2V0IG1hcHBpbmcgcHJvcGVydHkgZm9yIGFsbCBmdW5jdGlvbnMgd2Ugc3B5IG9uXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMubGFtYmRhc1NwaWVkKSB7XG4gICAgICBmdW5jLmZ1bmN0aW9uLmFkZEVudmlyb25tZW50KFxuICAgICAgICBlbnZWYXJpYWJsZU5hbWVzLlNTUFlfSU5GUkFfTUFQUElORyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcz8uZ2VuZXJhdGVTcHlFdmVudHNGaWxlTG9jYXRpb24pIHtcbiAgICAgIHRoaXMud3JpdGVTcHlFdmVudHNDbGFzcyh0aGlzLnByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHRlbnNpb25Bc3NldExvY2F0aW9uKCkge1xuICAgIGxldCBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gcGF0aC5qb2luKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgJy4uL2V4dGVuc2lvbi9kaXN0L2xheWVyJ1xuICAgICk7XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0ID0gcGF0aC5qb2luKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgJy4uL2xpYi9leHRlbnNpb24vZGlzdC9sYXllcidcbiAgICApO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb24pKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGb2xkZXIgd2l0aCBhc3NldHMgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgYXQgJHtleHRlbnNpb25Bc3NldExvY2F0aW9ufSBvciBhdCAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHR9IGBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24gPSBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25XcmFwcGVyID0gcGF0aC5qb2luKFxuICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbixcbiAgICAgICdzcHktd3JhcHBlcidcbiAgICApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uV3JhcHBlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdyYXBwZXIgc2NyaXB0IGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlID0gcGF0aC5qb2luKFxuICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbixcbiAgICAgIGBub2RlanMvbm9kZV9tb2R1bGVzL2ludGVyY2VwdG9yLmpzYFxuICAgICk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29kZSBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25Bc3NldExvY2F0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYW5ndWFnZUV4dGVuc2lvbkFzc2V0TG9jYXRpb24obGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IHJvb3REaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcblxuICAgIGxldCBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gcGF0aC5qb2luKHJvb3REaXIsIGBleHRlbnNpb25zLyR7bGFuZ3VhZ2V9YCk7XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0ID0gcGF0aC5qb2luKFxuICAgICAgcm9vdERpcixcbiAgICAgIGBsaWIvZXh0ZW5zaW9ucy8ke2xhbmd1YWdlfWBcbiAgICApO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb24pKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGb2xkZXIgd2l0aCBhc3NldHMgZm9yIGV4dGVuc2lvbiBmb3IgJHtsYW5ndWFnZX0gZG9lcyBub3QgZXhpc3RzIGF0ICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbn0gb3IgYXQgJHtleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0fSBgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uV3JhcHBlciA9IHBhdGguam9pbihcbiAgICAgIC8vIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24uc3Vic3RyaW5nKFxuICAgICAgLy8gICAwLFxuICAgICAgLy8gICBleHRlbnNpb25Bc3NldExvY2F0aW9uLmxhc3RJbmRleE9mKHBhdGguc2VwKVxuICAgICAgLy8gKSxcbiAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24sXG4gICAgICAnc3B5LXdyYXBwZXInXG4gICAgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbldyYXBwZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXcmFwcGVyIHNjcmlwdCBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyBhdCAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25XcmFwcGVyfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dGVuc2lvbkFzc2V0TG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgU3B5RXZlbnRzIGNsYXNzLCB3aGljaCBoZWxwcyB3aXRoIHdyaXRpbmcgdGhlIGNvZGUgZm9yIHRlc3RzLlxuICAgKiBAcGFyYW0gZmlsZUxvY2F0aW9uXG4gICAqL1xuICBwcml2YXRlIHdyaXRlU3B5RXZlbnRzQ2xhc3MoZmlsZUxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVMb2NhdGlvbiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuc2VydmljZUtleXNcbiAgICAgIC5tYXAoKHNrKSA9PiBgICAke3NrLnJlcGxhY2UoLyMvZywgJycpfTogJyR7c2t9JyA9ICcke3NrfSc7XFxuYClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvZGUgPSBgLyogZXNsaW50LWRpc2FibGUgKi9cXG5leHBvcnQgY2xhc3MgU2VydmVybGVzc1NweUV2ZW50cyB7XFxuJHtwcm9wZXJ0aWVzfX1cXG5gO1xuXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlTG9jYXRpb24sIGNvZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxOb2RlcyhwYXJlbnQ6IElDb25zdHJ1Y3QpIHtcbiAgICBjb25zdCBub2RlczogSUNvbnN0cnVjdFtdID0gW107XG4gICAgbm9kZXMucHVzaChwYXJlbnQpO1xuICAgIHRoaXMuZ2V0QWxsTm9kZXNSZWN1cnNpdmUocGFyZW50LCBub2Rlcyk7XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxOb2Rlc1JlY3Vyc2l2ZShwYXJlbnQ6IElDb25zdHJ1Y3QsIG5vZGVzOiBJQ29uc3RydWN0W10pIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB0aGlzLmdldEFsbE5vZGVzUmVjdXJzaXZlKG5vZGUsIG5vZGVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGludGVybmFsU3B5Tm9kZShub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgaWYgKHRoaXMuc3BpZWROb2Rlcy5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3BpZWROb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgaWYgKHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxhbWJkYVN1YnNjcmlwdGlvblBvb2wuZmluZCgocykgPT4gcy5mdW5jdGlvbiA9PT0gbm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcz8uZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1NweSBvbiBub2RlJywgdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKG5vZGUpKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uIHx8XG4gICAgICBub2RlIGluc3RhbmNlb2YgTm9kZWpzRnVuY3Rpb24gfHxcbiAgICAgIGlzTGFtYmRhRnVuY3Rpb24obm9kZSlcbiAgICApIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlMYW1iZGEobm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygc25zLlRvcGljKSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5U25zVG9waWMobm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygc25zLlN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbnRlcm5hbFNweVNuc1N1YnNjcmlwdGlvbihub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzMy5CdWNrZXQpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlTMyhub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZSkge1xuICAgICAgdGhpcy5pbnRlcm5hbFNweUR5bmFtb2RiKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGR5bmFtb0RiLlRhYmxlVjIpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlEeW5hbW9kYihub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuRXZlbnRCdXMpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlFdmVudEJ1cyhub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgdGhpcy5pbnRlcm5hbFNweUV2ZW50QnVzUnVsZShub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuQ2ZuRXZlbnRTb3VyY2VNYXBwaW5nKSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5U3FzKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHNxcy5RdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucHJvcHM/LnNweVNxc1dpdGhOb1N1YnNjcmlwdGlvbkFuZERyb3BBbGxNZXNzYWdlcykge1xuICAgICAgICB0aGlzLmludGVybmFsU3B5U3B5U3FzV2l0aE5vU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXh0ZW5zaW9uRm9yUnVudGltZShcbiAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZSxcbiAgICBhcmNoaXRlY3R1cmU6IGxhbWJkYS5BcmNoaXRlY3R1cmVcbiAgKTogeyBsYXllcjogbGFtYmRhLklMYXllclZlcnNpb247IHNweVdyYXBwZXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGF5ZXJLZXkgPVxuICAgICAgYHNzcHlfZXh0ZW5zaW9uXyR7cnVudGltZS50b1N0cmluZygpfV8ke2FyY2hpdGVjdHVyZS5uYW1lLnRvU3RyaW5nKCl9YC5yZXBsYWNlKFxuICAgICAgICAvXFwuL2csXG4gICAgICAgICdfJ1xuICAgICAgKTtcblxuICAgIGxldCBsYXllciA9IHRoaXMubGF5ZXJNYXBbbGF5ZXJLZXldO1xuICAgIGxldCBzcHlXcmFwcGVyUGF0aCA9ICcvb3B0L3NweS13cmFwcGVyJztcblxuICAgIHN3aXRjaCAocnVudGltZS5uYW1lKSB7XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzgubmFtZTpcbiAgICAgIGNhc2UgbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfOS5uYW1lOlxuICAgICAgY2FzZSBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMC5uYW1lOlxuICAgICAgY2FzZSBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMS5uYW1lOlxuICAgICAgY2FzZSBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMi5uYW1lOlxuICAgICAgICBzcHlXcmFwcGVyUGF0aCA9ICcvb3B0L3B5dGhvbi9zcHktd3JhcHBlcic7XG4gICAgICAgIGxheWVyID1cbiAgICAgICAgICBsYXllciB8fFxuICAgICAgICAgIG5ldyBQeXRob25MYXllclZlcnNpb24odGhpcywgbGF5ZXJLZXksIHtcbiAgICAgICAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW3J1bnRpbWVdLFxuICAgICAgICAgICAgY29tcGF0aWJsZUFyY2hpdGVjdHVyZXM6IFthcmNoaXRlY3R1cmVdLFxuICAgICAgICAgICAgZW50cnk6IHRoaXMuZ2V0TGFuZ3VhZ2VFeHRlbnNpb25Bc3NldExvY2F0aW9uKCdweXRob24nKSxcbiAgICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICAgIGJ1bmRsaW5nRmlsZUFjY2VzczogQnVuZGxpbmdGaWxlQWNjZXNzLlZPTFVNRV9DT1BZLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLk5PREVKU18xMl9YLm5hbWU6XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLm5hbWU6XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLm5hbWU6XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLk5PREVKU18xOF9YLm5hbWU6XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLk5PREVKU18yMF9YLm5hbWU6XG4gICAgICBjYXNlIGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLm5hbWU6XG4gICAgICAgIGxheWVyID1cbiAgICAgICAgICBsYXllciB8fFxuICAgICAgICAgIG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsIGxheWVyS2V5LCB7XG4gICAgICAgICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtydW50aW1lXSxcbiAgICAgICAgICAgIGNvbXBhdGlibGVBcmNoaXRlY3R1cmVzOiBbYXJjaGl0ZWN0dXJlXSxcbiAgICAgICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldCh0aGlzLmdldEV4dGVuc2lvbkFzc2V0TG9jYXRpb24oKSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5sb2coYE5vIGV4dGVuc2lvbnMgYXZhaWxhYmxlIGZvciAke3J1bnRpbWUudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmxheWVyTWFwW2xheWVyS2V5XSA9IGxheWVyO1xuICAgIHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5wdXNoKGxheWVyKTtcbiAgICByZXR1cm4geyBsYXllciwgc3B5V3JhcHBlclBhdGggfTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlTcHlTcXNXaXRoTm9TdWJzY3JpcHRpb24ocXVldWU6IHNxcy5RdWV1ZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZmluZEVsZW1lbnQ8bGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZz4oXG4gICAgICAobjogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbiBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcgJiZcbiAgICAgICAgKG4gYXMgbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZykuZXZlbnRTb3VyY2VBcm4gPT09IHF1ZXVlLnF1ZXVlQXJuXG4gICAgKTtcblxuICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybjsgLy9hbHJlYWR5IGhhdmUgc3Vic2NyaXB0aW9uXG4gICAgfVxuXG4gICAgY29uc3QgcXVldWVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHF1ZXVlKTtcbiAgICBjb25zdCBmdW5jID0gbmV3IE5vZGVqc0Z1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3F1ZXVlTmFtZX1TcXNTdWJzY3JpcHRpb25BbmREcm9wQWxsTWVzc2FnZXNgLFxuICAgICAge1xuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGVudHJ5OiB0aGlzLmdldEFzc2V0TG9jYXRpb24oXG4gICAgICAgICAgJ2Z1bmN0aW9ucy9zcXNTdWJzY3JpcHRpb25BbmREcm9wQWxsTWVzc2FnZXMuanMnXG4gICAgICAgICksXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmdldERlZmF1bHRMYW1iZGFFbnZpcm9ubWVudFZhcmlhYmxlcygpLFxuICAgICAgfVxuICAgICk7XG4gICAgZnVuYy5hZGRFdmVudFNvdXJjZShuZXcgU3FzRXZlbnRTb3VyY2UocXVldWUpKTtcbiAgICB0aGlzLnNldHVwRm9ySW9UKGZ1bmMpO1xuICAgIGNvbnN0IHsgbGF5ZXIsIHNweVdyYXBwZXJQYXRoIH0gPSB0aGlzLmdldEV4dGVuc2lvbkZvclJ1bnRpbWUoXG4gICAgICBmdW5jLnJ1bnRpbWUsXG4gICAgICBmdW5jLmFyY2hpdGVjdHVyZVxuICAgICkhO1xuICAgIGZ1bmMuYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoJ0FXU19MQU1CREFfRVhFQ19XUkFQUEVSJywgc3B5V3JhcHBlclBhdGgpO1xuXG4gICAgaWYgKHRoaXMucHJvcHM/LmRlYnVnTW9kZSkge1xuICAgICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLlNTUFlfREVCVUcsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goZnVuYyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFNxcyMke3F1ZXVlTmFtZX1gO1xuXG4gICAgdGhpcy5hZGRNYXBwaW5nVG9GdW5jdGlvbihmdW5jLCB7XG4gICAgICBrZXk6IHF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgdmFsdWU6IHNlcnZpY2VLZXksXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLlNTUFlfU1VCU0NSSUJFRF9UT19TUVMsICd0cnVlJyk7XG4gIH1cblxuICBwcml2YXRlIGludGVybmFsU3B5U3FzKG5vZGU6IGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMuZmluZEVsZW1lbnQ8c3FzLlF1ZXVlPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2Ygc3FzLlF1ZXVlICYmXG4gICAgICAgIChuIGFzIHNxcy5RdWV1ZSkucXVldWVBcm4gPT09IG5vZGUuZXZlbnRTb3VyY2VBcm5cbiAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHRoaXMuZmluZEVsZW1lbnQ8bGFtYmRhLkZ1bmN0aW9uPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uICYmXG4gICAgICAgIChuIGFzIGxhbWJkYS5GdW5jdGlvbikuZnVuY3Rpb25OYW1lID09PSBub2RlLmZ1bmN0aW9uTmFtZVxuICAgICk7XG5cbiAgICBpZiAocXVldWUgJiYgZnVuYykge1xuICAgICAgY29uc3QgcXVldWVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHF1ZXVlKTtcblxuICAgICAgY29uc3Qgc2VydmljZUtleSA9IGBTcXMjJHtxdWV1ZU5hbWV9YDtcblxuICAgICAgdGhpcy5hZGRNYXBwaW5nVG9GdW5jdGlvbihmdW5jLCB7XG4gICAgICAgIGtleTogcXVldWUucXVldWVBcm4sXG4gICAgICAgIHZhbHVlOiBzZXJ2aWNlS2V5LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5TU1BZX1NVQlNDUklCRURfVE9fU1FTLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZ1bmMgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCBgU3Vic2NyaXB0aW9uJHtpbmRleH1gLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogdGhpcy5nZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvc2VuZE1lc3NhZ2UuanMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5zZXR1cEZvcklvVChmdW5jKTtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlTMyhzM0J1Y2tldDogczMuQnVja2V0KSB7XG4gICAgczNCdWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUFVULFxuICAgICAgbmV3IHMzbm90aWYuTGFtYmRhRGVzdGluYXRpb24odGhpcy5sYW1iZGFTdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uKVxuICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHMzQnVja2V0KTtcblxuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgUzMjJHtuYW1lfWA7XG4gICAgdGhpcy5sYW1iZGFTdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbczNCdWNrZXQuYnVja2V0QXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNweUR5bmFtb2RiKHRhYmxlOiBkeW5hbW9EYi5UYWJsZSB8IGR5bmFtb0RiLlRhYmxlVjIpIHtcbiAgICAvLyBlbmFibGUgRHluYW1vREIgc3RyZWFtcyB3aXRoIGEgaGFja1xuICAgICh0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZSkuc3RyZWFtU3BlY2lmaWNhdGlvbiA9IHtcbiAgICAgIHN0cmVhbVZpZXdUeXBlOiBkeW5hbW9EYi5TdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMsXG4gICAgfTtcbiAgICAodGFibGUgYXMgYW55KS50YWJsZVN0cmVhbUFybiA9IChcbiAgICAgIHRhYmxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGR5bmFtb0RiLkNmblRhYmxlXG4gICAgKS5hdHRyU3RyZWFtQXJuO1xuXG4gICAgdGhpcy5sYW1iZGFTdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmFkZEV2ZW50U291cmNlKFxuICAgICAgbmV3IGR5bmFtb0RiU3RyZWFtLkR5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb246IGxhbWJkYS5TdGFydGluZ1Bvc2l0aW9uLkxBVEVTVCxcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0YWJsZSk7XG5cbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYER5bmFtb0RCIyR7bmFtZX1gO1xuICAgIHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3RhYmxlLnRhYmxlQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNweUV2ZW50QnVzUnVsZShydWxlOiBldmVudHMuUnVsZSkge1xuICAgIGNvbnN0IHsgZXZlbnRCdXNOYW1lIH0gPSBydWxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGV2ZW50cy5DZm5SdWxlO1xuICAgIGxldCBicmlkZ2VOYW1lID0gJ0RlZmF1bHQnO1xuICAgIGlmICghIWV2ZW50QnVzTmFtZSkge1xuICAgICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmdldEV2ZW50QnJpZGdlKGV2ZW50QnVzTmFtZSk7XG5cbiAgICAgIGlmICghZXZlbnRCcmlkZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgRXZlbnRCcmlkZ2Ugd2l0aCBuYW1lIFwiJHtldmVudEJ1c05hbWV9XCJgKTtcbiAgICAgIH1cbiAgICAgIGJyaWRnZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZXZlbnRCcmlkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgcnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pKTtcblxuICAgIGNvbnN0IHJ1bGVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2VSdWxlIyR7YnJpZGdlTmFtZX0jJHtydWxlTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlFdmVudEJ1cyhldmVudEJ1czogZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy51c2VkRm9yRXZlbnRCcmlkZ2VcbiAgICApO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnVzZWRGb3JFdmVudEJyaWRnZSA9IHRydWU7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnVzKTtcbiAgICBjb25zdCBydWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsIGBSdWxlQWxsJHticmlkZ2VOYW1lfWAsIHtcbiAgICAgIGV2ZW50QnVzLFxuICAgICAgZXZlbnRQYXR0ZXJuOiB7IHZlcnNpb246IFsnMCddIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXSxcbiAgICB9KTtcblxuICAgIHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5wdXNoKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZy5ldmVudEJyaWRnZSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNweVNuc1RvcGljKHRvcGljOiBzbnMuVG9waWMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICBjb25zdCB0b3BpY05hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodG9waWMpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU25zVG9waWMjJHt0b3BpY05hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlTbnNTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uOiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb24ubm9kZS5zY29wZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcGljID0gdGhpcy5nZXRUb3BpYyhcbiAgICAgIChzdWJzY3JpcHRpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikudG9waWNBcm5cbiAgICApO1xuXG4gICAgaWYgKCF0b3BpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgVG9waWMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgY29uc3QgeyBmaWx0ZXJQb2xpY3kgfSA9IHN1YnNjcmlwdGlvbi5ub2RlXG4gICAgICAuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb247XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25DbG9uZSA9IHRvcGljLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIG5ldyBzbnNTdWJzLkxhbWJkYVN1YnNjcmlwdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbilcbiAgICApO1xuICAgIChzdWJzY3JpcHRpb25DbG9uZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uKS5maWx0ZXJQb2xpY3kgPVxuICAgICAgZmlsdGVyUG9saWN5O1xuXG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goc3Vic2NyaXB0aW9uQ2xvbmUpO1xuXG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKTtcblxuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFNuc1N1YnNjcmlwdGlvbiMke3RvcGljTmFtZX0jJHt0YXJnZXROYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZ1t0b3BpYy50b3BpY0Fybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgIGZpbHRlckZ1bmN0aW9uPzogKHN1YnNjcmlwdGlvbjogTGFtYmRhU3Vic2NyaXB0aW9uKSA9PiBib29sZWFuXG4gICkge1xuICAgIGxldCBmdW5jdGlvblN1YnNjcmlwdGlvbjogTGFtYmRhU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5maW5kKGZpbHRlckZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbFswXTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bmN0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgc3Vic3JpYmVkVG9waWNzOiBbXSxcbiAgICAgICAgdXNlZEZvckV2ZW50QnJpZGdlOiBmYWxzZSxcbiAgICAgICAgbWFwcGluZzoge30sXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGhcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvblBvb2wucHVzaChmdW5jdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGb3JJb1QoZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgIGVudlZhcmlhYmxlTmFtZXMuU1NQWV9ST09UX1NUQUNLLFxuICAgICAgdGhpcy5jbGVhbk5hbWUodGhpcy5maW5kUm9vdFN0YWNrKFN0YWNrLm9mKHRoaXMpKS5ub2RlLmlkKVxuICAgICk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLlNTUFlfSU9UX0VORFBPSU5ULCB0aGlzLmlvdEVuZHBvaW50KTtcblxuICAgIGZ1bmMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGF3c19pYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydpb3Q6KiddLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlMYW1iZGEoZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgY29uc3QgeyBsYXllciwgc3B5V3JhcHBlclBhdGggfSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRm9yUnVudGltZShcbiAgICAgIGZ1bmMucnVudGltZSxcbiAgICAgIGZ1bmMuYXJjaGl0ZWN0dXJlIHx8IEFyY2hpdGVjdHVyZS5YODZfNjRcbiAgICApITtcbiAgICBpZiAoIWxheWVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmMuYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShmdW5jKTtcblxuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5TU1BZX0ZVTkNUSU9OX05BTUUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudCgnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInLCBzcHlXcmFwcGVyUGF0aCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcz8uZGVidWdNb2RlKSB7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuU1NQWV9ERUJVRywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldHVwRm9ySW9UKGZ1bmMpO1xuXG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jUmVxdWVzdGApO1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChgRnVuY3Rpb24jJHtmdW5jdGlvbk5hbWV9I0Vycm9yYCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jQ29uc29sZWApO1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChgRnVuY3Rpb24jJHtmdW5jdGlvbk5hbWV9I1Jlc3BvbnNlYCk7XG5cbiAgICB0aGlzLmFkZE1hcHBpbmdUb0Z1bmN0aW9uKGZ1bmMpO1xuICB9XG5cbiAgcHVibGljIGdldENvbnN0cnVjdE5hbWUoY29uc3RydWN0OiBJQ29uc3RydWN0KSB7XG4gICAgbGV0IGNvbnN0cnVjdE5hbWUgPSBjb25zdHJ1Y3Qubm9kZS5wYXRoO1xuICAgIGNvbnN0IHsgbm9kZSB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICBpZiAoY29uc3RydWN0TmFtZS5zdGFydHNXaXRoKG5vZGUuaWQpKSB7XG4gICAgICBjb25zdHJ1Y3ROYW1lID0gY29uc3RydWN0TmFtZS5zdWJzdHJpbmcobm9kZS5pZC5sZW5ndGggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbGVhbk5hbWUoY29uc3RydWN0TmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAvL3NuYWtlIGNhc2UgdG8gY2FtZWwgY2FzZSBpbmNsdWRpbmcgZGFzaCBhbmQgZmlyc3QgbGV0dGVyIHRvIHVwcGVyIGNhc2VcbiAgICByZXR1cm4gbmFtZVxuICAgICAgLnJlcGxhY2UoL1stX10rL2csICcgJylcbiAgICAgIC5yZXBsYWNlKC9bXlxcd1xcc10vZywgJycpXG4gICAgICAucmVwbGFjZSgvXFxzKC4pL2csICgkMSkgPT4gJDEudG9VcHBlckNhc2UoKSlcbiAgICAgIC5yZXBsYWNlKC9cXHMvZywgJycpXG4gICAgICAucmVwbGFjZSgvXiguKS8sICgkMSkgPT4gJDEudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRvcGljKHRvcGljQXJuOiBzdHJpbmcpOiBzbnMuVG9waWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRvcGljID0gdGhpcy5maW5kRWxlbWVudDxzbnMuVG9waWM+KFxuICAgICAgKG5vZGU6IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMgJiYgKG5vZGUgYXMgc25zLlRvcGljKS50b3BpY0FybiA9PT0gdG9waWNBcm5cbiAgICApO1xuXG4gICAgcmV0dXJuIHRvcGljO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudEJyaWRnZShldmVudEJ1c05hbWU6IHN0cmluZyk6IGV2ZW50cy5JRXZlbnRCdXMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGV2ZW50QnJpZGdlID0gdGhpcy5maW5kRWxlbWVudDxldmVudHMuSUV2ZW50QnVzPihcbiAgICAgIChub2RlOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICAobm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5FdmVudEJ1cyB8fFxuICAgICAgICAgIG5vZGUuY29uc3RydWN0b3IubmFtZSA9PT0gJ0ltcG9ydGVkRXZlbnRCdXMnKSAmJlxuICAgICAgICAobm9kZSBhcyBldmVudHMuSUV2ZW50QnVzKS5ldmVudEJ1c05hbWUgPT09IGV2ZW50QnVzTmFtZVxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRCcmlkZ2U7XG4gIH1cblxuICBwcml2YXRlIGZpbmRSb290U3RhY2soc3RhY2s6IFN0YWNrKTogU3RhY2sge1xuICAgIGlmIChzdGFjay5uZXN0ZWQpIHtcbiAgICAgIGNvbnN0IHBhcmVudFN0YWNrID0gKHN0YWNrIGFzIE5lc3RlZFN0YWNrKS5uZXN0ZWRTdGFja1BhcmVudDtcbiAgICAgIGlmIChwYXJlbnRTdGFjaykgcmV0dXJuIHRoaXMuZmluZFJvb3RTdGFjayhwYXJlbnRTdGFjayk7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRFbGVtZW50PFQgZXh0ZW5kcyBJQ29uc3RydWN0ID0gSUNvbnN0cnVjdD4oXG4gICAgZmlsdGVyRnVuYzogKG5vZGU6IElDb25zdHJ1Y3QpID0+IGJvb2xlYW4sXG4gICAgcGFyZW50PzogSUNvbnN0cnVjdFxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcGFyZW50ID0gdGhpcy5maW5kUm9vdFN0YWNrKFN0YWNrLm9mKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChmaWx0ZXJGdW5jKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlIGFzIFQ7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50Rm91bmRJbkNoaWxkID0gdGhpcy5maW5kRWxlbWVudDxUPihmaWx0ZXJGdW5jLCBub2RlKTtcbiAgICAgIGlmIChlbGVtZW50Rm91bmRJbkNoaWxkKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Rm91bmRJbkNoaWxkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFkZE1hcHBpbmdUb0Z1bmN0aW9uKFxuICAgIGZ1bmM6IGxhbWJkYS5GdW5jdGlvbixcbiAgICBrZXlWYWx1ZT86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVxuICApIHtcbiAgICBmb3IgKGNvbnN0IGZzIG9mIHRoaXMubGFtYmRhc1NwaWVkKSB7XG4gICAgICBpZiAoZnMuZnVuY3Rpb24gPT09IGZ1bmMpIHtcbiAgICAgICAgaWYgKGtleVZhbHVlKSB7XG4gICAgICAgICAgZnMubWFwcGluZ1trZXlWYWx1ZS5rZXldID0ga2V5VmFsdWUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZzOiBMYW1iZGFTcGllZCA9IHtcbiAgICAgIGZ1bmN0aW9uOiBmdW5jLFxuICAgICAgbWFwcGluZzoge30sXG4gICAgfTtcblxuICAgIGlmIChrZXlWYWx1ZSkge1xuICAgICAgZnMubWFwcGluZ1trZXlWYWx1ZS5rZXldID0ga2V5VmFsdWUudmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5sYW1iZGFzU3BpZWQucHVzaChmcyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2V0TG9jYXRpb24obG9jYXRpb246IHN0cmluZykge1xuICAgIGNvbnN0IGxvYyA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9saWIvJyArIGxvY2F0aW9uKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvYykpIHtcbiAgICAgIHJldHVybiBsb2M7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jMiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9saWIvJyArIGxvY2F0aW9uKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvYzIpKSB7XG4gICAgICByZXR1cm4gbG9jMjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYExvY2F0aW9uICR7bG9jfSBhbmQgJHtsb2MyfSBkb2VzIG5vdCBleGlzdHMuYCk7XG4gIH1cbn1cblxudHlwZSBMYW1iZGFTdWJzY3JpcHRpb24gPSB7XG4gIHN1YnNyaWJlZFRvcGljczogc25zLlRvcGljW107XG4gIHVzZWRGb3JFdmVudEJyaWRnZTogYm9vbGVhbjtcbiAgZnVuY3Rpb246IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb247XG4gIG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG50eXBlIExhbWJkYVNwaWVkID0ge1xuICBmdW5jdGlvbjogbGFtYmRhLkZ1bmN0aW9uO1xuICBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envVariableNames.mjs","names":[],"sources":["../../../src/common/envVariableNames.ts"],"sourcesContent":["//this file is not under root -> common folder because jsii does not allow\n//changing tsconfing.json to remove rootDir property\n\nexport enum envVariableNames {\n /**\n * Note that the function is subscribed to SQS, so we need to send spy events as it comes from SQS.\n */\n SSPY_SUBSCRIBED_TO_SQS = 'SSPY_SUBSCRIBED_TO_SQS',\n\n /**\n * Mapping of resource ARNs to service keys\n */\n SSPY_INFRA_MAPPING = 'SSPY_INFRA_MAPPING',\n\n /**\n * Web socket endpoint for sending and receiving spy events.\n */\n SSPY_WS_ENDPOINT = 'SSPY_WS_ENDPOINT',\n\n SSPY_FUNCTION_NAME = 'SSPY_FUNCTION_NAME',\n\n /**\n * DynamoDB table name that stores active websocket connections.\n */\n SSPY_WS_TABLE_NAME = 'SSPY_WS_TABLE_NAME',\n\n /**\n * Log debugging details.\n */\n SSPY_DEBUG = 'SSPY_DEBUG',\n\n /**\n * The root stack\n */\n SSPY_ROOT_STACK = 'SSPY_ROOT_STACK',\n\n /**\n * The endpoint url for AWS IoT for the account\n */\n SSPY_IOT_ENDPOINT = 'SSPY_IOT_ENDPOINT',\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"envVariableNames.mjs","names":[],"sources":["../../../src/common/envVariableNames.ts"],"sourcesContent":["//this file is not under root -> common folder because jsii does not allow\n//changing tsconfing.json to remove rootDir property\n\nexport enum envVariableNames {\n /**\n * Note that the function is subscribed to SQS, so we need to send spy events as it comes from SQS.\n */\n SSPY_SUBSCRIBED_TO_SQS = 'SSPY_SUBSCRIBED_TO_SQS',\n\n /**\n * Mapping of resource ARNs to service keys\n */\n SSPY_INFRA_MAPPING = 'SSPY_INFRA_MAPPING',\n\n /**\n * Web socket endpoint for sending and receiving spy events.\n */\n SSPY_WS_ENDPOINT = 'SSPY_WS_ENDPOINT',\n\n SSPY_FUNCTION_NAME = 'SSPY_FUNCTION_NAME',\n\n /**\n * DynamoDB table name that stores active websocket connections.\n */\n SSPY_WS_TABLE_NAME = 'SSPY_WS_TABLE_NAME',\n\n /**\n * Log debugging details.\n */\n SSPY_DEBUG = 'SSPY_DEBUG',\n\n /**\n * The root stack\n */\n SSPY_ROOT_STACK = 'SSPY_ROOT_STACK',\n\n /**\n * The endpoint url for AWS IoT for the account\n */\n SSPY_IOT_ENDPOINT = 'SSPY_IOT_ENDPOINT',\n}\n"],"mappings":";;;;;;CAGY,gEAAL;;;;AAIL;;;;AAKA;;;;AAKA;AAEA;;;;AAKA;;;;AAKA;;;;AAKA;;;;AAKA"}
|
package/lib/src/index.mjs
CHANGED
package/package.json
CHANGED
package/tsdown.config.ts
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
|
-
|
|
4
|
-
//#region node_modules/tsdown/esm-shims.js
|
|
5
|
-
const getFilename = () => fileURLToPath(import.meta.url);
|
|
6
|
-
const getDirname = () => path.dirname(getFilename());
|
|
7
|
-
const __dirname = /* @__PURE__ */ getDirname();
|
|
8
|
-
|
|
9
|
-
//#endregion
|
|
10
|
-
export { __dirname };
|
|
11
|
-
//# sourceMappingURL=esm-shims.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"esm-shims.mjs","names":[],"sources":["../../../node_modules/tsdown/esm-shims.js"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n"],"x_google_ignoreList":[0],"mappings":";;;;AAIA,MAAM,oBAAoB,cAAc,OAAO,KAAK,IAAI;AACxD,MAAM,mBAAmB,KAAK,QAAQ,aAAa,CAAC;AAEpD,MAAa,YAA4B,4BAAY"}
|