@bywaretech/bysentinel-aws-lambda 0.1.0

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 (55) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +184 -0
  3. package/dist/capture.d.ts +16 -0
  4. package/dist/capture.d.ts.map +1 -0
  5. package/dist/capture.js +77 -0
  6. package/dist/capture.js.map +1 -0
  7. package/dist/context.d.ts +27 -0
  8. package/dist/context.d.ts.map +1 -0
  9. package/dist/context.js +57 -0
  10. package/dist/context.js.map +1 -0
  11. package/dist/dedupe.d.ts +3 -0
  12. package/dist/dedupe.d.ts.map +1 -0
  13. package/dist/dedupe.js +25 -0
  14. package/dist/dedupe.js.map +1 -0
  15. package/dist/event.d.ts +21 -0
  16. package/dist/event.d.ts.map +1 -0
  17. package/dist/event.js +72 -0
  18. package/dist/event.js.map +1 -0
  19. package/dist/git.d.ts +8 -0
  20. package/dist/git.d.ts.map +1 -0
  21. package/dist/git.js +31 -0
  22. package/dist/git.js.map +1 -0
  23. package/dist/index.d.ts +9 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +6 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/options.d.ts +4 -0
  28. package/dist/options.d.ts.map +1 -0
  29. package/dist/options.js +48 -0
  30. package/dist/options.js.map +1 -0
  31. package/dist/request.d.ts +12 -0
  32. package/dist/request.d.ts.map +1 -0
  33. package/dist/request.js +67 -0
  34. package/dist/request.js.map +1 -0
  35. package/dist/runtime.d.ts +22 -0
  36. package/dist/runtime.d.ts.map +1 -0
  37. package/dist/runtime.js +29 -0
  38. package/dist/runtime.js.map +1 -0
  39. package/dist/scope.d.ts +14 -0
  40. package/dist/scope.d.ts.map +1 -0
  41. package/dist/scope.js +9 -0
  42. package/dist/scope.js.map +1 -0
  43. package/dist/transport.d.ts +19 -0
  44. package/dist/transport.d.ts.map +1 -0
  45. package/dist/transport.js +101 -0
  46. package/dist/transport.js.map +1 -0
  47. package/dist/types.d.ts +62 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/withBySentinel.d.ts +13 -0
  52. package/dist/withBySentinel.d.ts.map +1 -0
  53. package/dist/withBySentinel.js +78 -0
  54. package/dist/withBySentinel.js.map +1 -0
  55. package/package.json +60 -0
@@ -0,0 +1,78 @@
1
+ import { consumeColdStart, finishPerf, startPerf } from "./context.js";
2
+ import { isCaptured } from "./dedupe.js";
3
+ import { buildEvent } from "./event.js";
4
+ import { resolveOptions } from "./options.js";
5
+ import { runWithScope } from "./scope.js";
6
+ import { deliver } from "./transport.js";
7
+ /**
8
+ * Wrap a Lambda handler with BySentinel. On an unhandled exception it captures
9
+ * a sanitized event, then re-throws so the Lambda still fails as expected. On
10
+ * success it optionally reports performance metadata (timeout risk / memory).
11
+ *
12
+ * The wrapper never changes the handler's return value and never swallows the
13
+ * business error.
14
+ */
15
+ export function withBySentinel(handler, options) {
16
+ const resolved = resolveOptions(options);
17
+ return async function bySentinelHandler(event, context) {
18
+ const coldStart = consumeColdStart();
19
+ const probe = startPerf(context);
20
+ const scope = {
21
+ options: resolved,
22
+ lambdaEvent: event,
23
+ lambdaContext: context,
24
+ coldStart,
25
+ };
26
+ return runWithScope(scope, async () => {
27
+ try {
28
+ const result = await handler(event, context);
29
+ // Success path: only emit an event when performance capture is on and a
30
+ // risk was detected, to avoid flooding the collector with healthy runs.
31
+ if (resolved.capture.performance) {
32
+ const performance = finishPerf(probe, context, context?.memoryLimitInMB);
33
+ if (performance.timeoutRisk) {
34
+ const perfEvent = buildEvent({
35
+ options: resolved,
36
+ lambdaEvent: event,
37
+ lambdaContext: context,
38
+ coldStart,
39
+ performance,
40
+ timeline: scope.timeline?.hasSteps ? scope.timeline.finish() : undefined,
41
+ customContext: { kind: "performance-warning" },
42
+ });
43
+ await deliver(resolved, perfEvent);
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ catch (error) {
49
+ // Already reported by a manual captureException in the handler — don't
50
+ // double-count. Re-throw so the Lambda still fails.
51
+ if (isCaptured(error))
52
+ throw error;
53
+ const performance = resolved.capture.performance
54
+ ? finishPerf(probe, context, context?.memoryLimitInMB)
55
+ : undefined;
56
+ // Finalize the timeline as aborted so the failed step is visible.
57
+ const timeline = scope.timeline?.hasSteps
58
+ ? (scope.timeline.fail(), scope.timeline.toJSON(true))
59
+ : undefined;
60
+ const errorEvent = buildEvent({
61
+ options: resolved,
62
+ lambdaEvent: event,
63
+ lambdaContext: context,
64
+ coldStart,
65
+ error,
66
+ performance,
67
+ timeline,
68
+ });
69
+ // Bounded, fail-silent delivery. We await so the event actually leaves
70
+ // the container before Lambda freezes it, but delivery is time-capped.
71
+ await deliver(resolved, errorEvent);
72
+ // Never swallow the business error.
73
+ throw error;
74
+ }
75
+ });
76
+ };
77
+ }
78
+ //# sourceMappingURL=withBySentinel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withBySentinel.js","sourceRoot":"","sources":["../src/withBySentinel.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@bywaretech/bysentinel-aws-lambda",
3
+ "version": "0.1.0",
4
+ "description": "AI Runtime Monitoring SDK for AWS Lambda",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/bywaretech/bysentinel.git",
9
+ "directory": "packages/aws-lambda"
10
+ },
11
+ "homepage": "https://github.com/bywaretech/bysentinel/tree/main/packages/aws-lambda#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/bywaretech/bysentinel/issues"
14
+ },
15
+ "keywords": [
16
+ "bysentinel",
17
+ "aws-lambda",
18
+ "lambda",
19
+ "serverless",
20
+ "observability",
21
+ "ai-debugging",
22
+ "error-tracking",
23
+ "security"
24
+ ],
25
+ "type": "module",
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "sideEffects": false,
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "dependencies": {
44
+ "@bywaretech/bysentinel-core": "0.1.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/aws-lambda": "^8.10.140",
48
+ "typescript": "^5.5.0",
49
+ "vitest": "^2.0.0"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.json",
53
+ "dev": "tsc -p tsconfig.json --watch",
54
+ "test": "vitest run",
55
+ "test:watch": "vitest",
56
+ "typecheck": "tsc -p tsconfig.json --noEmit",
57
+ "lint": "tsc -p tsconfig.json --noEmit",
58
+ "clean": "rm -rf dist .turbo coverage"
59
+ }
60
+ }