@venturekit/runtime 0.0.0-dev.20260415182021 → 0.0.0-dev.20260427220257

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 (70) hide show
  1. package/dist/env/memo.d.ts +39 -0
  2. package/dist/env/memo.d.ts.map +1 -0
  3. package/dist/env/memo.js +85 -0
  4. package/dist/env/memo.js.map +1 -0
  5. package/dist/handler/context.d.ts.map +1 -1
  6. package/dist/handler/context.js +12 -14
  7. package/dist/handler/context.js.map +1 -1
  8. package/dist/handler/data-loader.d.ts +50 -0
  9. package/dist/handler/data-loader.d.ts.map +1 -0
  10. package/dist/handler/data-loader.js +68 -0
  11. package/dist/handler/data-loader.js.map +1 -0
  12. package/dist/handler/errors.d.ts +10 -0
  13. package/dist/handler/errors.d.ts.map +1 -1
  14. package/dist/handler/errors.js +13 -0
  15. package/dist/handler/errors.js.map +1 -1
  16. package/dist/handler/handler.d.ts +18 -0
  17. package/dist/handler/handler.d.ts.map +1 -1
  18. package/dist/handler/handler.js +56 -11
  19. package/dist/handler/handler.js.map +1 -1
  20. package/dist/handler/queue-batch.d.ts +140 -0
  21. package/dist/handler/queue-batch.d.ts.map +1 -0
  22. package/dist/handler/queue-batch.js +180 -0
  23. package/dist/handler/queue-batch.js.map +1 -0
  24. package/dist/handler/response.d.ts +8 -1
  25. package/dist/handler/response.d.ts.map +1 -1
  26. package/dist/handler/response.js +18 -4
  27. package/dist/handler/response.js.map +1 -1
  28. package/dist/handler/task-handler.d.ts.map +1 -1
  29. package/dist/handler/task-handler.js +8 -12
  30. package/dist/handler/task-handler.js.map +1 -1
  31. package/dist/index.d.ts +5 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +4 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/logging/logger.d.ts +20 -1
  36. package/dist/logging/logger.d.ts.map +1 -1
  37. package/dist/logging/logger.js +66 -23
  38. package/dist/logging/logger.js.map +1 -1
  39. package/dist/logging/metrics.d.ts +105 -0
  40. package/dist/logging/metrics.d.ts.map +1 -0
  41. package/dist/logging/metrics.js +189 -0
  42. package/dist/logging/metrics.js.map +1 -0
  43. package/dist/logging/tracing.d.ts +64 -10
  44. package/dist/logging/tracing.d.ts.map +1 -1
  45. package/dist/logging/tracing.js +197 -15
  46. package/dist/logging/tracing.js.map +1 -1
  47. package/dist/middleware/middleware.d.ts +3 -0
  48. package/dist/middleware/middleware.d.ts.map +1 -1
  49. package/dist/middleware/middleware.js +11 -2
  50. package/dist/middleware/middleware.js.map +1 -1
  51. package/dist/middleware/rate-limit-store.d.ts +18 -0
  52. package/dist/middleware/rate-limit-store.d.ts.map +1 -1
  53. package/dist/middleware/rate-limit-store.js +24 -4
  54. package/dist/middleware/rate-limit-store.js.map +1 -1
  55. package/dist/patterns/circuit-breaker.d.ts +11 -0
  56. package/dist/patterns/circuit-breaker.d.ts.map +1 -1
  57. package/dist/patterns/circuit-breaker.js +26 -2
  58. package/dist/patterns/circuit-breaker.js.map +1 -1
  59. package/dist/patterns/invoke.d.ts.map +1 -1
  60. package/dist/patterns/invoke.js +60 -31
  61. package/dist/patterns/invoke.js.map +1 -1
  62. package/dist/patterns/saga.d.ts +42 -1
  63. package/dist/patterns/saga.d.ts.map +1 -1
  64. package/dist/patterns/saga.js +78 -20
  65. package/dist/patterns/saga.js.map +1 -1
  66. package/dist/security/internal-hmac.d.ts +59 -0
  67. package/dist/security/internal-hmac.d.ts.map +1 -0
  68. package/dist/security/internal-hmac.js +117 -0
  69. package/dist/security/internal-hmac.js.map +1 -0
  70. package/package.json +4 -4
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Internal-invocation HMAC signing.
3
+ *
4
+ * VentureKit functions can mark themselves as "internal" callers (e.g. to skip
5
+ * rate limiting or public-authentication middleware). Because all handlers sit
6
+ * behind API Gateway, a plain `x-venturekit-source: internal` header is
7
+ * forgeable — any external client could set it. To prevent that, every
8
+ * `invoke()` caller signs a short-lived HMAC over `${functionName}:${timestamp}`
9
+ * and the receiver verifies the signature against the shared secret.
10
+ *
11
+ * Secret resolution order:
12
+ * 1. `VENTURE_INTERNAL_HMAC_SECRET` env var (injected by CDK on every function
13
+ * in the same project at deploy time).
14
+ * 2. `venturekit-local-dev-secret` fallback for local dev only — prints a
15
+ * `once-per-process` warning.
16
+ *
17
+ * Replay window is 5 minutes (configurable via `VENTURE_INTERNAL_HMAC_TTL_MS`).
18
+ * Signatures outside that window are rejected.
19
+ */
20
+ export declare const INTERNAL_HMAC_HEADERS: {
21
+ /** Marker that this is an internal invocation ("internal") */
22
+ readonly SOURCE: "x-venturekit-source";
23
+ /** Millisecond timestamp as a decimal string */
24
+ readonly TIMESTAMP: "x-venturekit-timestamp";
25
+ /** Hex-encoded HMAC-SHA256 signature */
26
+ readonly SIGNATURE: "x-venturekit-signature";
27
+ /** Unique invoke ID (opaque, purely for tracing) */
28
+ readonly INVOKE_ID: "x-venturekit-invoke-id";
29
+ };
30
+ /**
31
+ * Sign an internal invocation. Returns the headers that must be attached
32
+ * to the outbound Lambda payload.
33
+ *
34
+ * @param functionName - The resolved target Lambda function name.
35
+ * @param timestampMs - Caller timestamp. Defaults to `Date.now()`; pass an
36
+ * explicit value for deterministic tests.
37
+ */
38
+ export declare function signInternalCall(functionName: string, timestampMs?: number): {
39
+ timestamp: string;
40
+ signature: string;
41
+ };
42
+ export type VerifyResult = {
43
+ valid: true;
44
+ } | {
45
+ valid: false;
46
+ reason: 'missing-headers' | 'bad-timestamp' | 'expired' | 'bad-signature';
47
+ };
48
+ /**
49
+ * Verify an internal-call signature against the current function's name.
50
+ *
51
+ * @param headers - Lowercased header map from the Lambda event.
52
+ * @param functionName - Usually `process.env.AWS_LAMBDA_FUNCTION_NAME`. Callers
53
+ * may pass an explicit name for tests.
54
+ * @param nowMs - Override for "now" in tests.
55
+ */
56
+ export declare function verifyInternalCall(headers: Record<string, string | undefined> | undefined, functionName: string | undefined, nowMs?: number): VerifyResult;
57
+ /** Reset the warned-about-fallback flag. Test-only helper. */
58
+ export declare function __resetHmacWarningForTests(): void;
59
+ //# sourceMappingURL=internal-hmac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-hmac.d.ts","sourceRoot":"","sources":["../../src/security/internal-hmac.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,eAAO,MAAM,qBAAqB;IAChC,8DAA8D;;IAE9D,gDAAgD;;IAEhD,wCAAwC;;IAExC,oDAAoD;;CAE5C,CAAC;AAqCX;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,WAAW,GAAE,MAAmB,GAC/B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAI1C;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,SAAS,GAAG,eAAe,CAAA;CAAE,CAAC;AAEhG;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,EACvD,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,KAAK,GAAE,MAAmB,GACzB,YAAY,CA4Bd;AAED,8DAA8D;AAC9D,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Internal-invocation HMAC signing.
3
+ *
4
+ * VentureKit functions can mark themselves as "internal" callers (e.g. to skip
5
+ * rate limiting or public-authentication middleware). Because all handlers sit
6
+ * behind API Gateway, a plain `x-venturekit-source: internal` header is
7
+ * forgeable — any external client could set it. To prevent that, every
8
+ * `invoke()` caller signs a short-lived HMAC over `${functionName}:${timestamp}`
9
+ * and the receiver verifies the signature against the shared secret.
10
+ *
11
+ * Secret resolution order:
12
+ * 1. `VENTURE_INTERNAL_HMAC_SECRET` env var (injected by CDK on every function
13
+ * in the same project at deploy time).
14
+ * 2. `venturekit-local-dev-secret` fallback for local dev only — prints a
15
+ * `once-per-process` warning.
16
+ *
17
+ * Replay window is 5 minutes (configurable via `VENTURE_INTERNAL_HMAC_TTL_MS`).
18
+ * Signatures outside that window are rejected.
19
+ */
20
+ import { createHmac, timingSafeEqual } from 'node:crypto';
21
+ export const INTERNAL_HMAC_HEADERS = {
22
+ /** Marker that this is an internal invocation ("internal") */
23
+ SOURCE: 'x-venturekit-source',
24
+ /** Millisecond timestamp as a decimal string */
25
+ TIMESTAMP: 'x-venturekit-timestamp',
26
+ /** Hex-encoded HMAC-SHA256 signature */
27
+ SIGNATURE: 'x-venturekit-signature',
28
+ /** Unique invoke ID (opaque, purely for tracing) */
29
+ INVOKE_ID: 'x-venturekit-invoke-id',
30
+ };
31
+ const DEFAULT_TTL_MS = 5 * 60 * 1000;
32
+ const LOCAL_DEV_SECRET = 'venturekit-local-dev-secret';
33
+ let warnedAboutFallback = false;
34
+ /** Return the HMAC secret from env, falling back to a dev default. */
35
+ function getSecret() {
36
+ const secret = process.env.VENTURE_INTERNAL_HMAC_SECRET;
37
+ if (secret && secret.length > 0)
38
+ return secret;
39
+ if (!warnedAboutFallback) {
40
+ warnedAboutFallback = true;
41
+ // eslint-disable-next-line no-console
42
+ console.warn('[venturekit] VENTURE_INTERNAL_HMAC_SECRET not set — using ' +
43
+ 'insecure fallback for local development. In production, CDK injects ' +
44
+ 'a per-project secret automatically; missing it means the function ' +
45
+ 'was not deployed via `vk deploy`.');
46
+ }
47
+ return LOCAL_DEV_SECRET;
48
+ }
49
+ /** TTL window in ms beyond which signatures are rejected. */
50
+ function getTtlMs() {
51
+ const raw = process.env.VENTURE_INTERNAL_HMAC_TTL_MS;
52
+ if (!raw)
53
+ return DEFAULT_TTL_MS;
54
+ const n = Number(raw);
55
+ return Number.isFinite(n) && n > 0 ? n : DEFAULT_TTL_MS;
56
+ }
57
+ function hmacHex(secret, payload) {
58
+ return createHmac('sha256', secret).update(payload).digest('hex');
59
+ }
60
+ /**
61
+ * Sign an internal invocation. Returns the headers that must be attached
62
+ * to the outbound Lambda payload.
63
+ *
64
+ * @param functionName - The resolved target Lambda function name.
65
+ * @param timestampMs - Caller timestamp. Defaults to `Date.now()`; pass an
66
+ * explicit value for deterministic tests.
67
+ */
68
+ export function signInternalCall(functionName, timestampMs = Date.now()) {
69
+ const ts = String(timestampMs);
70
+ const signature = hmacHex(getSecret(), `${functionName}:${ts}`);
71
+ return { timestamp: ts, signature };
72
+ }
73
+ /**
74
+ * Verify an internal-call signature against the current function's name.
75
+ *
76
+ * @param headers - Lowercased header map from the Lambda event.
77
+ * @param functionName - Usually `process.env.AWS_LAMBDA_FUNCTION_NAME`. Callers
78
+ * may pass an explicit name for tests.
79
+ * @param nowMs - Override for "now" in tests.
80
+ */
81
+ export function verifyInternalCall(headers, functionName, nowMs = Date.now()) {
82
+ if (!headers || !functionName)
83
+ return { valid: false, reason: 'missing-headers' };
84
+ const source = headers[INTERNAL_HMAC_HEADERS.SOURCE];
85
+ const ts = headers[INTERNAL_HMAC_HEADERS.TIMESTAMP];
86
+ const sig = headers[INTERNAL_HMAC_HEADERS.SIGNATURE];
87
+ if (source !== 'internal' || !ts || !sig) {
88
+ return { valid: false, reason: 'missing-headers' };
89
+ }
90
+ const tsNum = Number(ts);
91
+ if (!Number.isFinite(tsNum))
92
+ return { valid: false, reason: 'bad-timestamp' };
93
+ if (Math.abs(nowMs - tsNum) > getTtlMs())
94
+ return { valid: false, reason: 'expired' };
95
+ const expected = hmacHex(getSecret(), `${functionName}:${ts}`);
96
+ // Hex strings of the same byte length → safe for timingSafeEqual after buffering.
97
+ let expectedBuf;
98
+ let actualBuf;
99
+ try {
100
+ expectedBuf = Buffer.from(expected, 'hex');
101
+ actualBuf = Buffer.from(sig, 'hex');
102
+ }
103
+ catch {
104
+ return { valid: false, reason: 'bad-signature' };
105
+ }
106
+ if (expectedBuf.length === 0 || expectedBuf.length !== actualBuf.length) {
107
+ return { valid: false, reason: 'bad-signature' };
108
+ }
109
+ return timingSafeEqual(expectedBuf, actualBuf)
110
+ ? { valid: true }
111
+ : { valid: false, reason: 'bad-signature' };
112
+ }
113
+ /** Reset the warned-about-fallback flag. Test-only helper. */
114
+ export function __resetHmacWarningForTests() {
115
+ warnedAboutFallback = false;
116
+ }
117
+ //# sourceMappingURL=internal-hmac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-hmac.js","sourceRoot":"","sources":["../../src/security/internal-hmac.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venturekit/runtime",
3
- "version": "0.0.0-dev.20260415182021",
3
+ "version": "0.0.0-dev.20260427220257",
4
4
  "description": "VentureKit runtime utilities - handlers, context, middleware, logging",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -55,11 +55,11 @@
55
55
  ],
56
56
  "license": "Apache-2.0",
57
57
  "dependencies": {
58
- "@venturekit/core": "0.0.0-dev.20260415182021",
58
+ "@venturekit/core": "0.0.0-dev.20260427220257",
59
59
  "pino": "^9.0.0"
60
60
  },
61
61
  "peerDependencies": {
62
- "@venturekit/data": "0.0.0-dev.20260415182021",
62
+ "@venturekit/data": "0.0.0-dev.20260427220257",
63
63
  "@aws-sdk/client-dynamodb": "^3.500.0",
64
64
  "@aws-sdk/lib-dynamodb": "^3.500.0",
65
65
  "@aws-sdk/client-lambda": "^3.500.0",
@@ -91,7 +91,7 @@
91
91
  }
92
92
  },
93
93
  "devDependencies": {
94
- "@venturekit/data": "0.0.0-dev.20260415182021",
94
+ "@venturekit/data": "0.0.0-dev.20260427220257",
95
95
  "@types/aws-lambda": "^8.10.131",
96
96
  "@types/node": "^20.10.0",
97
97
  "@aws-sdk/client-lambda": "^3.500.0",