serverless-spy 0.0.35 → 0.0.37

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