lambda-live-debugger 0.0.104 → 0.0.107

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.
@@ -0,0 +1 @@
1
+ npm run typecheck && npm run prettier && npm run lint
@@ -0,0 +1,6 @@
1
+ .lldebugger
2
+ dist
3
+ cdk.out
4
+ .serverless
5
+ .aws-sam
6
+ src/extension/aws
package/.prettierrc ADDED
@@ -0,0 +1 @@
1
+ {}
package/LICENSE.md CHANGED
@@ -24,7 +24,7 @@
24
24
  thereof.
25
25
 
26
26
  1.5. “Incompatible With Secondary Licenses”
27
- means
27
+ means
28
28
 
29
29
  a. that the initial Contributor has attached the notice described in
30
30
  Exhibit B to the Covered Software; or
@@ -89,7 +89,6 @@
89
89
  otherwise, or (b) ownership of more than fifty percent (50%) of the
90
90
  outstanding shares or beneficial ownership of such entity.
91
91
 
92
-
93
92
  2. License Grants and Conditions
94
93
 
95
94
  2.1. Grants
@@ -157,7 +156,6 @@
157
156
  Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
158
157
  Section 2.1.
159
158
 
160
-
161
159
  3. Responsibilities
162
160
 
163
161
  3.1. Distribution of Source Form
@@ -232,29 +230,29 @@
232
230
  5. Termination
233
231
 
234
232
  5.1. The rights granted under this License will terminate automatically if You
235
- fail to comply with any of its terms. However, if You become compliant,
236
- then the rights granted under this License from a particular Contributor
237
- are reinstated (a) provisionally, unless and until such Contributor
238
- explicitly and finally terminates Your grants, and (b) on an ongoing basis,
239
- if such Contributor fails to notify You of the non-compliance by some
240
- reasonable means prior to 60 days after You have come back into compliance.
241
- Moreover, Your grants from a particular Contributor are reinstated on an
242
- ongoing basis if such Contributor notifies You of the non-compliance by
243
- some reasonable means, this is the first time You have received notice of
244
- non-compliance with this License from such Contributor, and You become
245
- compliant prior to 30 days after Your receipt of the notice.
233
+ fail to comply with any of its terms. However, if You become compliant,
234
+ then the rights granted under this License from a particular Contributor
235
+ are reinstated (a) provisionally, unless and until such Contributor
236
+ explicitly and finally terminates Your grants, and (b) on an ongoing basis,
237
+ if such Contributor fails to notify You of the non-compliance by some
238
+ reasonable means prior to 60 days after You have come back into compliance.
239
+ Moreover, Your grants from a particular Contributor are reinstated on an
240
+ ongoing basis if such Contributor notifies You of the non-compliance by
241
+ some reasonable means, this is the first time You have received notice of
242
+ non-compliance with this License from such Contributor, and You become
243
+ compliant prior to 30 days after Your receipt of the notice.
246
244
 
247
245
  5.2. If You initiate litigation against any entity by asserting a patent
248
- infringement claim (excluding declaratory judgment actions, counter-claims,
249
- and cross-claims) alleging that a Contributor Version directly or
250
- indirectly infringes any patent, then the rights granted to You by any and
251
- all Contributors for the Covered Software under Section 2.1 of this License
252
- shall terminate.
246
+ infringement claim (excluding declaratory judgment actions, counter-claims,
247
+ and cross-claims) alleging that a Contributor Version directly or
248
+ indirectly infringes any patent, then the rights granted to You by any and
249
+ all Contributors for the Covered Software under Section 2.1 of this License
250
+ shall terminate.
253
251
 
254
252
  5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
255
- license agreements (excluding distributors and resellers) which have been
256
- validly granted by You or Your distributors under this License prior to
257
- termination shall survive termination.
253
+ license agreements (excluding distributors and resellers) which have been
254
+ validly granted by You or Your distributors under this License prior to
255
+ termination shall survive termination.
258
256
 
259
257
  6. Disclaimer of Warranty
260
258
 
@@ -266,7 +264,7 @@
266
264
  Should any Covered Software prove defective in any respect, You (not any
267
265
  Contributor) assume the cost of any necessary servicing, repair, or
268
266
  correction. This disclaimer of warranty constitutes an essential part of this
269
- License. No use of any Covered Software is authorized under this License
267
+ License. No use of any Covered Software is authorized under this License
270
268
  except under this disclaimer.
271
269
 
272
270
  7. Limitation of Liability
@@ -301,7 +299,6 @@
301
299
  contract shall be construed against the drafter shall not be used to construe
302
300
  this License against a Contributor.
303
301
 
304
-
305
302
  10. Versions of the License
306
303
 
307
304
  10.1. New Versions
@@ -327,9 +324,9 @@
327
324
  modified license differs from this License).
328
325
 
329
326
  10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
330
- If You choose to distribute Source Code Form that is Incompatible With
331
- Secondary Licenses under the terms of this version of the License, the
332
- notice described in Exhibit B of this License must be attached.
327
+ If You choose to distribute Source Code Form that is Incompatible With
328
+ Secondary Licenses under the terms of this version of the License, the
329
+ notice described in Exhibit B of this License must be attached.
333
330
 
334
331
  Exhibit A - Source Code Form License Notice
335
332
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![Logo](logo.png)
4
4
 
5
- Lambda Live Debugger is an indispensable tool for debugging AWS Lambda functions from your computer, even though they are deployed in the cloud. It supports Lambdas written in JavaScript or TypeScript.
5
+ Lambda Live Debugger ([GitHub](https://github.com/ServerlessLife/lambda-live-debugger)) is an indispensable tool for debugging AWS Lambda functions from your computer, even though they are deployed in the cloud. It supports Lambdas written in JavaScript or TypeScript.
6
6
 
7
7
  This tool offers similar functionality to [SST](https://sst.dev/) and [Serverless Framework v4](https://www.serverless.com/blog/serverless-framework-v4-general-availability), with the addition of an Observability Mode.
8
8
 
@@ -19,20 +19,25 @@ It supports the following frameworks:
19
19
 
20
20
  **This project is in the early alpha stage. Your feedback is incredibly valuable. Please let me know if it works for you or if you encounter any issues. I've tested many scenarios, but people can configure their projects and TypeScript settings in numerous ways. The tool is flexible and can be adjusted to fit your setup in most cases without needing additional features. If you need help, please let me know. Any suggestions for improvements are welcome.**
21
21
 
22
+ If the tool is working well for you, please fill out the general [FEEDBACK FORM](https://forms.gle/v6ekZtuB45Rv3EyW9). This helps me understand how extensively the tool has been tested and whether there is a general interest in its further development.
23
+
24
+ If you've encountered a bug, need help, or would like to request additional features, please create an issue on [GitHub Issue](https://github.com/ServerlessLife/lambda-live-debugger/issues).
25
+
22
26
  Contact me via:
23
27
 
28
+ - [Feedback Form](https://forms.gle/v6ekZtuB45Rv3EyW9)
24
29
  - [GitHub Issues](https://github.com/ServerlessLife/lambda-live-debugger/issues)
25
30
  - [LinkedIn](http://www.linkedin.com/in/marko-serverlesslife)
26
31
 
27
32
  ## The Problem Statement
28
33
 
29
- Serverless is amazing and solves many issues with traditional systems. However, writing code for Lambda functions can be challenging. The cycle of writing, deploying, running, fixing, and redeploying is time-consuming and tedious. While local testing tools and unit/integration tests exist, they often don't replicate the actual environment closely enough.
34
+ Serverless is amazing and solves many issues with traditional systems. However, writing code for Lambda functions can be challenging. The cycle of writing, deploying, running, fixing, and redeploying is time-consuming and tedious. You could use tools to run Lambda locally or use unit/integration tests; those approaches often don't replicate the actual environment closely enough.
30
35
 
31
36
  ## How It Works
32
37
 
33
- Lambda Live Debugger connects to your deployed Lambda, routes requests to your computer, and sends responses back to the Lambda. This allows you to debug locally, but the system behaves as if the code is running in the cloud with the same permissions.
38
+ Lambda Live Debugger connects to your deployed Lambda, routes requests to your computer, and sends responses back to the deployed Lambda. This allows you to debug locally, but the system behaves as if the code is running in the cloud with the same permissions.
34
39
 
35
- The tool attaches Lambda Extensions (via a Layer) to intercept and relay calls to AWS IoT, transferring messages between your Lambda and local machine. If the Lambda is written in TypeScript, it's transpiled to JavaScript. The code is executed via Node Worker Thread.
40
+ The tool attaches Lambda Extensions (via a Layer), intercepts, and relays calls to AWS IoT. AWS IoT transfers messages between your Lambda and local machine. If the Lambda is written in TypeScript, it's transpiled to JavaScript. The code is executed via the Node Worker Thread.
36
41
 
37
42
  ![Architecture](./architecture.drawio.png)
38
43
 
@@ -40,7 +45,7 @@ The tool attaches Lambda Extensions (via a Layer) to intercept and relay calls t
40
45
 
41
46
  Lambda Live Debugger makes the following changes to your AWS infrastructure:
42
47
 
43
- - Adds Lambda Layer
48
+ - Deploys Lambda Layer
44
49
  - Attaches the Layer to each Lambda you're debugging
45
50
  - Adds a policy to the Lambda Role for AWS IoT access
46
51
 
@@ -71,7 +76,7 @@ _(On Linux and Mac: `sudo npm install lambda-live-debugger -g`)_
71
76
  or locally
72
77
 
73
78
  ```
74
- npm install lambda-live-debugger -g
79
+ npm install lambda-live-debugger
75
80
  ```
76
81
 
77
82
  _(If installed locally, you must prefix all commands with `npx`, if they are not part of `scripts` in `package.json`.)_
@@ -90,7 +95,7 @@ You probably need to tweak some settings. You can do it via CLI parameters or, b
90
95
  lld -w
91
96
  ```
92
97
 
93
- The configuration is saved to `lldebugger.config.ts`
98
+ The configuration is saved to `lldebugger.config.ts`.
94
99
 
95
100
  ### CLI Parameters
96
101
 
@@ -114,6 +119,37 @@ The configuration is saved to `lldebugger.config.ts`
114
119
  -h, --help display help for command
115
120
  ```
116
121
 
122
+ ## Configuration file lldebugger.config.ts
123
+
124
+ Example `lldebugger.config.ts`:
125
+
126
+ ```typescript
127
+ import { type LldConfigTs } from "lambda-live-debugger";
128
+
129
+ export default {
130
+ framework: "cdk",
131
+ context: ["environment=development"],
132
+ region: "eu-central-1",
133
+ observable: false,
134
+ verbose: false,
135
+ //getLambdas: async (foundLambdas) => {
136
+ // you can customize the list of lambdas here or create your own
137
+ // return foundLambdas;
138
+ //},
139
+ } satisfies LldConfigTs;
140
+ ```
141
+
142
+ The setting are the same as for CLI parameters.
143
+
144
+ ### Custom framework implementation and adjustment
145
+
146
+ ```typescript
147
+ getLambdas: async (foundLambdas) => {
148
+ //you can customize the list of lambdas here or create your own
149
+ //return foundLambdas;
150
+ },
151
+ ```
152
+
117
153
  ### Debugging
118
154
 
119
155
  You might want to configure your development tool for debugging. The wizard automatically configures for VsCode in `.vscode/launch.json`. Here is an example:
@@ -142,13 +178,6 @@ For other tools, please send documentation to include here. WebStorm instruction
142
178
 
143
179
  Set the `subfolder` parameter if your framework is in a subfolder.
144
180
 
145
- ## Custom Configuration
146
-
147
- getLambdas: async (foundLambdas) => {
148
- //you can customize the list of lambdas here or create your own
149
- //return foundLambdas;
150
- },
151
-
152
181
  ## Removing
153
182
 
154
183
  To remove Lambda Live Debugger from your AWS account
@@ -187,18 +216,19 @@ I am not a Terraform developer, so I only know the basics. Please provide a samp
187
216
 
188
217
  ## Know issues
189
218
 
190
- ...
219
+ Check the [GitHub issues](https://github.com/ServerlessLife/lambda-live-debugger/issues).
191
220
 
192
221
  ## Missing Features
193
222
 
194
- Check the [open issues](https://github.com/ServerlessLife/lambda-live-debugger/issues). The biggest missing feature right now is MFA authentication and more Terraform configurations.
223
+ Check the [GitHub issues](https://github.com/ServerlessLife/lambda-live-debugger/issues). The biggest missing feature right now is MFA authentication and more Terraform configurations.
195
224
 
196
225
  ## Reporting an Issue
197
226
 
198
- - Make sure the bug hasn't already been reported. Add a "+1" comment so I know there are multiple users struggling with the same issue. If possible, add some additional info.
199
- - Use descriptive titles with prefixes like "bug:", "help:", "feature:", or "discussion:". Please also add the matching label and, if needed, set priority via a label.
227
+ - Make sure the bug hasn't already been reported. If you fount if, add a "+1" comment so I know there are multiple users struggling with the same issue. If possible, add some additional info.
228
+ - Use descriptive titles with prefixes like "bug:", "help:", "feature:", or "discussion:".
200
229
  - Enable verbose logging and provide the full log.
201
230
  - Describe your setup in detail, or better yet, provide a sample project.
231
+ - Specify exact framework version (CDK, SLS, SAM ...) and exact version of Lambda Live Debugger version.
202
232
 
203
233
  ## Authors:
204
234
 
@@ -207,7 +237,7 @@ Check the [open issues](https://github.com/ServerlessLife/lambda-live-debugger/i
207
237
 
208
238
  ## Contributors (alphabetical)
209
239
 
210
- - ⭐ Your name here for smaller code/documentation contributions or sample projects as part of bug reports
240
+ - ⭐ Your name here for documentation contributions, minor code additions, or sample projects submitted with bug reports.
211
241
 
212
242
  ## Declarment
213
243
 
@@ -76,12 +76,12 @@ async function getCloudFormationResources(stackName, awsConfiguration) {
76
76
  async function getLambdasInStack(stackName, awsConfiguration) {
77
77
  const response = await getCloudFormationResources(stackName, awsConfiguration);
78
78
  const lambdaResources = response.StackResourceSummaries?.filter((resource) => resource.ResourceType === "AWS::Lambda::Function");
79
- return lambdaResources?.map((resource) => {
79
+ return (lambdaResources?.map((resource) => {
80
80
  return {
81
81
  lambdaName: resource.PhysicalResourceId,
82
82
  logicalId: resource.LogicalResourceId,
83
83
  };
84
- });
84
+ }) ?? []);
85
85
  }
86
86
  export const CloudFormation = {
87
87
  getCloudFormationStackTemplate,
@@ -11,10 +11,7 @@ export async function getConfigFromCliArgs(supportedFrameworks = []) {
11
11
  const version = await getVersion();
12
12
  const program = new Command();
13
13
  program.name("lld").description("Lambda Live Debugger").version(version);
14
- program.option("-r, --remove [option]", "Remove Lambda Live Debugger infrastructure. Options: 'keep-layer' (default), 'remove-all'. The latest also removes the Lambda Layer"
15
- //validateRemoveOption,
16
- //"keep-layer"
17
- );
14
+ program.option("-r, --remove [option]", "Remove Lambda Live Debugger infrastructure. Options: 'keep-layer' (default), 'remove-all'. The latest also removes the Lambda Layer");
18
15
  program.option("-w, --wizard", "Program interactively asks for each parameter and saves it to lldebugger.config.ts");
19
16
  program.option("-v, --verbose", "Verbose logs");
20
17
  program.option("-c, --context <context>", "AWS CDK context", (value, previous) => previous.concat(value), []);
@@ -14,7 +14,7 @@ export async function getConfigTsFromConfigFile(configFile) {
14
14
  try {
15
15
  await fs.stat(configFile);
16
16
  }
17
- catch (err) {
17
+ catch {
18
18
  return undefined;
19
19
  }
20
20
  try {
@@ -89,7 +89,6 @@ export async function getConfigFromWizard({ configFromCliArgs, supportedFramewor
89
89
  ]);
90
90
  answers = { ...answers, ...samAnswers };
91
91
  }
92
- answers.framework === currentFramework ? undefined : answers.framework;
93
92
  // monorepo subfolder
94
93
  const answersSubfolder = await inquirer.prompt([
95
94
  {
Binary file
@@ -49727,57 +49727,62 @@ async function handler(event, context) {
49727
49727
  }
49728
49728
  }
49729
49729
  async function regularMode(context, event) {
49730
- return new Promise(async (resolve, reject) => {
49731
- const timeout = setTimeout(() => {
49732
- resolve({
49733
- statusCode: 500,
49734
- body: "The function's in live debug mode but it hasn't heard back from your machine yet. If this is the first time you're trying out Lambda Live Debugger on this AWS account, AWS might need around 10 minutes to get everything ready. Hang tight and check back in a bit!"
49735
- });
49736
- }, 5 * 1e3);
49737
- const ioTService = await IoTService.connect({
49738
- onMessage: async (message) => {
49739
- Logger.log("IoT message", message);
49740
- if (message.type === "PING") {
49741
- if (message.data.workerId === workerId) {
49742
- Logger.log("Pinged by the debugger");
49743
- clearTimeout(timeout);
49744
- }
49745
- }
49746
- if (["SUCCESS", "ERROR"].includes(message.type)) {
49747
- if (message.data.workerId === workerId) {
49748
- clearTimeout(timeout);
49749
- }
49750
- }
49751
- if (message.type === "SUCCESS") {
49752
- resolve(message.data.body);
49730
+ let promiseResolve;
49731
+ let promiseReject;
49732
+ const promise = new Promise((resolve, reject) => {
49733
+ promiseResolve = resolve;
49734
+ promiseReject = reject;
49735
+ });
49736
+ const timeout = setTimeout(() => {
49737
+ promiseResolve({
49738
+ statusCode: 500,
49739
+ body: "The function's in live debug mode but it hasn't heard back from your machine yet. If this is the first time you're trying out Lambda Live Debugger on this AWS account, AWS might need around 10 minutes to get everything ready. Hang tight and check back in a bit!"
49740
+ });
49741
+ }, 5 * 1e3);
49742
+ const ioTService = await IoTService.connect({
49743
+ onMessage: async (message) => {
49744
+ Logger.log("IoT message", message);
49745
+ if (message.type === "PING") {
49746
+ if (message.data.workerId === workerId) {
49747
+ Logger.log("Pinged by the debugger");
49748
+ clearTimeout(timeout);
49753
49749
  }
49754
- if (message.type === "ERROR") {
49755
- const error = new Error(message.data.errorMessage);
49756
- error.stack = message.data.trace;
49757
- reject(error);
49750
+ }
49751
+ if (["SUCCESS", "ERROR"].includes(message.type)) {
49752
+ if (message.data.workerId === workerId) {
49753
+ clearTimeout(timeout);
49758
49754
  }
49759
- },
49760
- topic
49761
- });
49762
- const payload = {
49763
- type: "INVOKE",
49764
- data: {
49765
- workerId,
49766
- requestId: context.awsRequestId,
49767
- functionId: process.env.LLD_FUNCTION_ID,
49768
- deadline: context.getRemainingTimeInMillis(),
49769
- event,
49770
- context,
49771
- env: process.env
49772
49755
  }
49773
- };
49774
- Logger.log(
49775
- "Publishing to IoT",
49776
- `${process.env.LLD_DEBUGGER_ID}/events`,
49777
- payload
49778
- );
49779
- await ioTService.publish(payload, `${process.env.LLD_DEBUGGER_ID}/events`);
49756
+ if (message.type === "SUCCESS") {
49757
+ promiseResolve(message.data.body);
49758
+ }
49759
+ if (message.type === "ERROR") {
49760
+ const error = new Error(message.data.errorMessage);
49761
+ error.stack = message.data.trace;
49762
+ promiseReject(error);
49763
+ }
49764
+ },
49765
+ topic
49780
49766
  });
49767
+ const payload = {
49768
+ type: "INVOKE",
49769
+ data: {
49770
+ workerId,
49771
+ requestId: context.awsRequestId,
49772
+ functionId: process.env.LLD_FUNCTION_ID,
49773
+ deadline: context.getRemainingTimeInMillis(),
49774
+ event,
49775
+ context,
49776
+ env: process.env
49777
+ }
49778
+ };
49779
+ Logger.log(
49780
+ "Publishing to IoT",
49781
+ `${process.env.LLD_DEBUGGER_ID}/events`,
49782
+ payload
49783
+ );
49784
+ await ioTService.publish(payload, `${process.env.LLD_DEBUGGER_ID}/events`);
49785
+ return promise;
49781
49786
  }
49782
49787
  async function observableMode(context, event) {
49783
49788
  const regularHandler = async () => {