@venturekit/runtime 0.0.0-dev.20260312012510 → 0.0.0-dev.20260329102450

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 (122) hide show
  1. package/README.md +1 -1
  2. package/dist/config/env.d.ts +62 -0
  3. package/dist/config/env.d.ts.map +1 -0
  4. package/dist/config/env.js +98 -0
  5. package/dist/config/env.js.map +1 -0
  6. package/dist/config/secrets.d.ts +67 -0
  7. package/dist/config/secrets.d.ts.map +1 -0
  8. package/dist/config/secrets.js +132 -0
  9. package/dist/config/secrets.js.map +1 -0
  10. package/dist/handler/adapter.d.ts.map +1 -0
  11. package/dist/{adapter.js → handler/adapter.js} +5 -44
  12. package/dist/handler/adapter.js.map +1 -0
  13. package/dist/{context.d.ts → handler/context.d.ts} +44 -3
  14. package/dist/handler/context.d.ts.map +1 -0
  15. package/dist/{context.js → handler/context.js} +9 -9
  16. package/dist/handler/context.js.map +1 -0
  17. package/dist/handler/errors.d.ts.map +1 -0
  18. package/dist/{errors.js → handler/errors.js} +11 -25
  19. package/dist/handler/errors.js.map +1 -0
  20. package/dist/{handler.d.ts → handler/handler.d.ts} +36 -3
  21. package/dist/handler/handler.d.ts.map +1 -0
  22. package/dist/{handler.js → handler/handler.js} +59 -23
  23. package/dist/handler/handler.js.map +1 -0
  24. package/dist/handler/response.d.ts.map +1 -0
  25. package/dist/{response.js → handler/response.js} +9 -17
  26. package/dist/handler/response.js.map +1 -0
  27. package/dist/handler/task-handler.d.ts +192 -0
  28. package/dist/handler/task-handler.d.ts.map +1 -0
  29. package/dist/handler/task-handler.js +262 -0
  30. package/dist/handler/task-handler.js.map +1 -0
  31. package/dist/index.d.ts +33 -14
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +30 -48
  34. package/dist/index.js.map +1 -1
  35. package/dist/{logger.d.ts → logging/logger.d.ts} +1 -1
  36. package/dist/logging/logger.d.ts.map +1 -0
  37. package/dist/{logger.js → logging/logger.js} +8 -16
  38. package/dist/logging/logger.js.map +1 -0
  39. package/dist/logging/tracing.d.ts +51 -0
  40. package/dist/logging/tracing.d.ts.map +1 -0
  41. package/dist/logging/tracing.js +77 -0
  42. package/dist/logging/tracing.js.map +1 -0
  43. package/dist/middleware/middleware.d.ts +120 -0
  44. package/dist/middleware/middleware.d.ts.map +1 -0
  45. package/dist/middleware/middleware.js +270 -0
  46. package/dist/middleware/middleware.js.map +1 -0
  47. package/dist/middleware/rate-limit-store.d.ts +153 -0
  48. package/dist/middleware/rate-limit-store.d.ts.map +1 -0
  49. package/dist/middleware/rate-limit-store.js +182 -0
  50. package/dist/middleware/rate-limit-store.js.map +1 -0
  51. package/dist/openapi/openapi.d.ts +147 -0
  52. package/dist/openapi/openapi.d.ts.map +1 -0
  53. package/dist/openapi/openapi.js +235 -0
  54. package/dist/openapi/openapi.js.map +1 -0
  55. package/dist/openapi.d.ts +10 -0
  56. package/dist/openapi.d.ts.map +1 -0
  57. package/dist/openapi.js +9 -0
  58. package/dist/openapi.js.map +1 -0
  59. package/dist/patterns/circuit-breaker.d.ts +78 -0
  60. package/dist/patterns/circuit-breaker.d.ts.map +1 -0
  61. package/dist/patterns/circuit-breaker.js +113 -0
  62. package/dist/patterns/circuit-breaker.js.map +1 -0
  63. package/dist/patterns/idempotency.d.ts +175 -0
  64. package/dist/patterns/idempotency.d.ts.map +1 -0
  65. package/dist/patterns/idempotency.js +305 -0
  66. package/dist/patterns/idempotency.js.map +1 -0
  67. package/dist/patterns/invoke.d.ts +279 -0
  68. package/dist/patterns/invoke.d.ts.map +1 -0
  69. package/dist/patterns/invoke.js +581 -0
  70. package/dist/patterns/invoke.js.map +1 -0
  71. package/dist/patterns/saga.d.ts +391 -0
  72. package/dist/patterns/saga.d.ts.map +1 -0
  73. package/dist/patterns/saga.js +556 -0
  74. package/dist/patterns/saga.js.map +1 -0
  75. package/dist/patterns.d.ts +17 -0
  76. package/dist/patterns.d.ts.map +1 -0
  77. package/dist/patterns.js +17 -0
  78. package/dist/patterns.js.map +1 -0
  79. package/dist/rate-limit.d.ts +16 -0
  80. package/dist/rate-limit.d.ts.map +1 -0
  81. package/dist/rate-limit.js +15 -0
  82. package/dist/rate-limit.js.map +1 -0
  83. package/dist/secrets.d.ts +11 -0
  84. package/dist/secrets.d.ts.map +1 -0
  85. package/dist/secrets.js +10 -0
  86. package/dist/secrets.js.map +1 -0
  87. package/dist/testing/test-utils.d.ts +99 -0
  88. package/dist/testing/test-utils.d.ts.map +1 -0
  89. package/dist/testing/test-utils.js +153 -0
  90. package/dist/testing/test-utils.js.map +1 -0
  91. package/dist/testing.d.ts +10 -0
  92. package/dist/testing.d.ts.map +1 -0
  93. package/dist/testing.js +9 -0
  94. package/dist/testing.js.map +1 -0
  95. package/dist/ws/ws.d.ts +139 -0
  96. package/dist/ws/ws.d.ts.map +1 -0
  97. package/dist/ws/ws.js +294 -0
  98. package/dist/ws/ws.js.map +1 -0
  99. package/dist/ws.d.ts +5 -133
  100. package/dist/ws.d.ts.map +1 -1
  101. package/dist/ws.js +4 -291
  102. package/dist/ws.js.map +1 -1
  103. package/package.json +47 -5
  104. package/dist/adapter.d.ts.map +0 -1
  105. package/dist/adapter.js.map +0 -1
  106. package/dist/context.d.ts.map +0 -1
  107. package/dist/context.js.map +0 -1
  108. package/dist/errors.d.ts.map +0 -1
  109. package/dist/errors.js.map +0 -1
  110. package/dist/handler.d.ts.map +0 -1
  111. package/dist/handler.js.map +0 -1
  112. package/dist/logger.d.ts.map +0 -1
  113. package/dist/logger.js.map +0 -1
  114. package/dist/middleware.d.ts +0 -47
  115. package/dist/middleware.d.ts.map +0 -1
  116. package/dist/middleware.js +0 -147
  117. package/dist/middleware.js.map +0 -1
  118. package/dist/response.d.ts.map +0 -1
  119. package/dist/response.js.map +0 -1
  120. /package/dist/{adapter.d.ts → handler/adapter.d.ts} +0 -0
  121. /package/dist/{errors.d.ts → handler/errors.d.ts} +0 -0
  122. /package/dist/{response.d.ts → handler/response.d.ts} +0 -0
@@ -0,0 +1,581 @@
1
+ /**
2
+ * VentureKit Lambda-to-Lambda Invocation
3
+ *
4
+ * Type-safe invocation of other VentureKit Lambda functions.
5
+ * Supports sync (RequestResponse) and async (Event) invocation.
6
+ * Automatically propagates trace context, tenant, and user info.
7
+ *
8
+ * ## Quick Start
9
+ *
10
+ * ```typescript
11
+ * import { invoke, invokeDirect } from '@venturekit/runtime';
12
+ *
13
+ * // Invoke another VentureKit route handler (builds API Gateway event)
14
+ * const result = await invoke('users/{id}', {
15
+ * method: 'GET',
16
+ * pathParams: { id: '42' },
17
+ * });
18
+ *
19
+ * // Invoke any Lambda function directly with a custom payload
20
+ * const result = await invokeDirect('my-worker-function', {
21
+ * task: 'processImage',
22
+ * imageUrl: 'https://...',
23
+ * });
24
+ * ```
25
+ */
26
+ import * as http from 'http';
27
+ import { injectTraceHeaders, createChildTrace, generateId, extractTraceContext } from '../logging/tracing.js';
28
+ import { createCircuitBreaker } from './circuit-breaker.js';
29
+ /**
30
+ * Default function name resolver.
31
+ * Converts 'users/get' → '{prefix}-users-get'
32
+ */
33
+ export function defaultFunctionNameResolver(prefix) {
34
+ return (route) => {
35
+ const sanitized = route.replace(/\//g, '-').replace(/^-/, '');
36
+ return `${prefix}-${sanitized}`;
37
+ };
38
+ }
39
+ /**
40
+ * Create a VentureKit service invoker
41
+ */
42
+ export function createInvoker(options) {
43
+ const { invoker, resolver } = options;
44
+ /**
45
+ * Invoke another VentureKit Lambda function
46
+ */
47
+ return async function invoke(route, invokeOptions = {}) {
48
+ const { method = 'POST', body, pathParams = {}, queryParams = {}, headers = {}, mode = 'sync', trace, tenantId, userId, } = invokeOptions;
49
+ const functionName = resolver(route);
50
+ // Build path with parameters
51
+ let path = `/${route}`;
52
+ for (const [key, value] of Object.entries(pathParams)) {
53
+ path = path.replace(`{${key}}`, value);
54
+ }
55
+ // Build query string
56
+ const rawQueryString = Object.entries(queryParams)
57
+ .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
58
+ .join('&');
59
+ // Build headers with trace propagation
60
+ const allHeaders = {
61
+ 'content-type': 'application/json',
62
+ 'x-venturekit-source': 'internal',
63
+ 'x-venturekit-invoke-id': `inv-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
64
+ ...headers,
65
+ };
66
+ // Propagate trace context
67
+ if (trace) {
68
+ const childTrace = createChildTrace(trace);
69
+ Object.assign(allHeaders, injectTraceHeaders(childTrace));
70
+ }
71
+ // Propagate tenant
72
+ if (tenantId) {
73
+ allHeaders['x-tenant-id'] = tenantId;
74
+ }
75
+ // Propagate user
76
+ if (userId) {
77
+ allHeaders['x-user-id'] = userId;
78
+ }
79
+ // Build API Gateway V2 event payload
80
+ const event = {
81
+ version: '2.0',
82
+ routeKey: `${method} ${path}`,
83
+ rawPath: path,
84
+ rawQueryString,
85
+ headers: allHeaders,
86
+ queryStringParameters: Object.keys(queryParams).length > 0 ? queryParams : undefined,
87
+ pathParameters: Object.keys(pathParams).length > 0 ? pathParams : undefined,
88
+ body: body !== undefined ? JSON.stringify(body) : undefined,
89
+ isBase64Encoded: false,
90
+ requestContext: {
91
+ accountId: 'internal',
92
+ apiId: 'internal',
93
+ domainName: 'internal',
94
+ domainPrefix: 'internal',
95
+ http: { method, path, protocol: 'HTTP/1.1', sourceIp: '127.0.0.1', userAgent: 'venturekit-invoke' },
96
+ requestId: `invoke-${Date.now()}`,
97
+ routeKey: `${method} ${path}`,
98
+ stage: '$default',
99
+ time: new Date().toISOString(),
100
+ timeEpoch: Date.now(),
101
+ },
102
+ };
103
+ const invocationType = mode === 'async' ? 'Event' : 'RequestResponse';
104
+ const result = await invoker({
105
+ functionName,
106
+ payload: JSON.stringify(event),
107
+ invocationType,
108
+ });
109
+ // Async invocations don't return a payload
110
+ if (mode === 'async') {
111
+ return {
112
+ statusCode: result.statusCode ?? 202,
113
+ data: undefined,
114
+ headers: {},
115
+ };
116
+ }
117
+ // Parse sync response
118
+ if (!result.payload) {
119
+ return { statusCode: result.statusCode ?? 200, data: undefined, headers: {} };
120
+ }
121
+ try {
122
+ const response = JSON.parse(result.payload);
123
+ const responseBody = response.body ? JSON.parse(response.body) : undefined;
124
+ return {
125
+ statusCode: response.statusCode ?? 200,
126
+ data: responseBody?.data ?? responseBody,
127
+ headers: response.headers ?? {},
128
+ };
129
+ }
130
+ catch {
131
+ return {
132
+ statusCode: result.statusCode ?? 500,
133
+ data: result.payload,
134
+ headers: {},
135
+ };
136
+ }
137
+ };
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // High-level convenience API
141
+ // ---------------------------------------------------------------------------
142
+ /**
143
+ * Check if we're running in the local dev server.
144
+ */
145
+ function isLocalDev() {
146
+ return process.env.VENTURE_LOCAL === 'true';
147
+ }
148
+ /**
149
+ * Get the local dev server URL.
150
+ */
151
+ function getLocalServerUrl() {
152
+ return process.env.VENTURE_LOCAL_URL || `http://localhost:${process.env.VENTURE_LOCAL_PORT || '3000'}`;
153
+ }
154
+ /**
155
+ * Lazy-loaded AWS Lambda client singleton.
156
+ * The SDK is only imported when the first invocation occurs.
157
+ */
158
+ let _lambdaInvokerSingleton = null;
159
+ /**
160
+ * Shared circuit breaker singleton for invoke().
161
+ * Created lazily on first use when a fallback is provided.
162
+ */
163
+ let _circuitBreaker = null;
164
+ function getCircuitBreaker() {
165
+ if (!_circuitBreaker) {
166
+ _circuitBreaker = createCircuitBreaker({
167
+ failureThreshold: 5,
168
+ resetTimeoutMs: 30_000,
169
+ });
170
+ }
171
+ return _circuitBreaker;
172
+ }
173
+ /**
174
+ * Configure the shared circuit breaker used by `invoke()`.
175
+ * Call this at startup if you need custom thresholds.
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * configureCircuitBreaker({ failureThreshold: 3, resetTimeoutMs: 60_000 });
180
+ * ```
181
+ */
182
+ export function configureCircuitBreaker(options) {
183
+ _circuitBreaker = createCircuitBreaker(options);
184
+ }
185
+ /**
186
+ * Create a LambdaInvoker backed by the AWS SDK v3.
187
+ * Lazily loads `@aws-sdk/client-lambda` to avoid hard dependency.
188
+ */
189
+ export async function createLambdaInvoker(options) {
190
+ const region = options?.region || process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION || 'us-east-1';
191
+ // Dynamic import — only loaded at runtime when actually called
192
+ const { LambdaClient, InvokeCommand } = await import('@aws-sdk/client-lambda');
193
+ const client = new LambdaClient({ region });
194
+ return async (params) => {
195
+ const command = new InvokeCommand({
196
+ FunctionName: params.functionName,
197
+ InvocationType: params.invocationType,
198
+ Payload: new TextEncoder().encode(params.payload),
199
+ });
200
+ const response = await client.send(command);
201
+ const payload = response.Payload
202
+ ? new TextDecoder().decode(response.Payload)
203
+ : undefined;
204
+ return {
205
+ statusCode: response.StatusCode,
206
+ payload,
207
+ };
208
+ };
209
+ }
210
+ /**
211
+ * Parse the local project URL registry from VENTURE_LOCAL_URLS env var.
212
+ *
213
+ * Format: comma-separated `project=url` pairs, e.g.:
214
+ * VENTURE_LOCAL_URLS="app=http://localhost:3000,billing=http://localhost:3001"
215
+ *
216
+ * When invoking a function whose resolved name starts with a known project
217
+ * prefix, the request is routed to that project's local server instead of
218
+ * the current one. This enables cross-project calls during local dev.
219
+ */
220
+ function getLocalProjectUrls() {
221
+ const raw = process.env.VENTURE_LOCAL_URLS;
222
+ if (!raw)
223
+ return {};
224
+ const map = {};
225
+ for (const entry of raw.split(',')) {
226
+ const [name, url] = entry.split('=');
227
+ if (name && url) {
228
+ map[name.trim()] = url.trim();
229
+ }
230
+ }
231
+ return map;
232
+ }
233
+ /**
234
+ * Resolve the local base URL for a given function name.
235
+ * Checks VENTURE_LOCAL_URLS registry first, then falls back to the default.
236
+ */
237
+ function resolveLocalUrl(functionName) {
238
+ const urls = getLocalProjectUrls();
239
+ // Exact project name match first (longest prefix wins)
240
+ const sorted = Object.entries(urls).sort((a, b) => b[0].length - a[0].length);
241
+ for (const [project, url] of sorted) {
242
+ if (functionName.startsWith(`${project}-`)) {
243
+ return url;
244
+ }
245
+ }
246
+ return getLocalServerUrl();
247
+ }
248
+ /**
249
+ * Create a LambdaInvoker that routes calls to the local dev server via HTTP.
250
+ * Used automatically when VENTURE_LOCAL=true.
251
+ *
252
+ * Route invocations are forwarded as real HTTP requests to localhost.
253
+ * Function invocations are forwarded to /_dev/invoke/{name}.
254
+ *
255
+ * ### Cross-project calls
256
+ *
257
+ * By default all calls go to the current project's dev server. To call
258
+ * functions in another local project, set `VENTURE_LOCAL_URLS`:
259
+ *
260
+ * ```bash
261
+ * VENTURE_LOCAL_URLS="app=http://localhost:3000,billing=http://localhost:3001"
262
+ * ```
263
+ *
264
+ * The invoker matches the function name prefix against the registry
265
+ * and routes accordingly.
266
+ */
267
+ export function createLocalInvoker() {
268
+ return async (params) => {
269
+ // Resolve the base URL — may differ per project in cross-project scenarios
270
+ const baseUrl = resolveLocalUrl(params.functionName);
271
+ // Try to parse the payload to determine if this is a route or function call
272
+ let parsed;
273
+ try {
274
+ parsed = JSON.parse(params.payload);
275
+ }
276
+ catch {
277
+ parsed = null;
278
+ }
279
+ let targetUrl;
280
+ let method;
281
+ let body;
282
+ let headers = { 'content-type': 'application/json' };
283
+ // Check if this is an API Gateway V2 event (route invocation)
284
+ if (parsed && parsed.version === '2.0' && parsed.requestContext?.http) {
285
+ // Route invocation — forward as a real HTTP request to the local server
286
+ method = parsed.requestContext.http.method || 'POST';
287
+ const path = parsed.rawPath || '/';
288
+ const qs = parsed.rawQueryString ? `?${parsed.rawQueryString}` : '';
289
+ targetUrl = `${baseUrl}${path}${qs}`;
290
+ body = parsed.body;
291
+ // Forward internal headers
292
+ if (parsed.headers) {
293
+ headers = { ...headers, ...parsed.headers };
294
+ }
295
+ }
296
+ else {
297
+ // Function invocation — POST to /_dev/invoke/{name}
298
+ // Extract the short function name from the full AWS name
299
+ const fnName = extractShortFunctionName(params.functionName);
300
+ targetUrl = `${baseUrl}/_dev/invoke/${fnName}`;
301
+ method = 'POST';
302
+ body = params.payload;
303
+ }
304
+ // Make the HTTP request to the local server
305
+ return new Promise((resolve, reject) => {
306
+ const url = new URL(targetUrl);
307
+ const reqOptions = {
308
+ hostname: url.hostname,
309
+ port: url.port,
310
+ path: url.pathname + url.search,
311
+ method,
312
+ headers,
313
+ };
314
+ const req = http.request(reqOptions, (res) => {
315
+ const chunks = [];
316
+ res.on('data', (chunk) => chunks.push(chunk));
317
+ res.on('end', () => {
318
+ const responseBody = Buffer.concat(chunks).toString('utf-8');
319
+ if (parsed && parsed.version === '2.0') {
320
+ // For route invocations, wrap back into Lambda-like response format
321
+ const responseHeaders = {};
322
+ if (res.headers) {
323
+ for (const [k, v] of Object.entries(res.headers)) {
324
+ if (typeof v === 'string')
325
+ responseHeaders[k] = v;
326
+ }
327
+ }
328
+ resolve({
329
+ statusCode: 200,
330
+ payload: JSON.stringify({
331
+ statusCode: res.statusCode,
332
+ headers: responseHeaders,
333
+ body: responseBody,
334
+ }),
335
+ });
336
+ }
337
+ else {
338
+ // For function invocations, return raw payload
339
+ resolve({
340
+ statusCode: res.statusCode,
341
+ payload: responseBody,
342
+ });
343
+ }
344
+ });
345
+ });
346
+ req.on('error', (err) => {
347
+ reject(new Error(`Local invoke failed: ${err.message}. Is the dev server running? (vk dev)`));
348
+ });
349
+ if (body) {
350
+ req.write(body);
351
+ }
352
+ req.end();
353
+ });
354
+ };
355
+ }
356
+ /**
357
+ * Extract the short function name from a full AWS Lambda name.
358
+ * e.g. 'app-dev-fn-process-orders' → 'process-orders'
359
+ */
360
+ function extractShortFunctionName(fullName) {
361
+ // Match pattern: {project}-{stage}-fn-{name}
362
+ const fnMatch = fullName.match(/-fn-(.+)$/);
363
+ if (fnMatch)
364
+ return fnMatch[1];
365
+ // Match pattern: {project}-{stage}-{route}
366
+ const prefix = getProjectPrefix();
367
+ const stage = getStage();
368
+ const routePrefix = `${prefix}-${stage}-`;
369
+ if (fullName.startsWith(routePrefix)) {
370
+ return fullName.slice(routePrefix.length);
371
+ }
372
+ return fullName;
373
+ }
374
+ /**
375
+ * Get or create the singleton invoker.
376
+ * Returns a local HTTP invoker when VENTURE_LOCAL=true,
377
+ * otherwise returns the AWS Lambda SDK invoker.
378
+ */
379
+ async function getLambdaInvoker() {
380
+ if (!_lambdaInvokerSingleton) {
381
+ if (isLocalDev()) {
382
+ _lambdaInvokerSingleton = createLocalInvoker();
383
+ }
384
+ else {
385
+ _lambdaInvokerSingleton = await createLambdaInvoker();
386
+ }
387
+ }
388
+ return _lambdaInvokerSingleton;
389
+ }
390
+ /**
391
+ * Get the project prefix for function name resolution.
392
+ * Reads from VENTURE_PROJECT_NAME env var, falls back to 'app'.
393
+ */
394
+ function getProjectPrefix() {
395
+ return process.env.VENTURE_PROJECT_NAME
396
+ || process.env.VENTURE_APP_NAME
397
+ || 'app';
398
+ }
399
+ /**
400
+ * Get the current stage for function name resolution.
401
+ * Reads from VENTURE_STAGE env var, falls back to 'dev'.
402
+ */
403
+ function getStage() {
404
+ return process.env.VENTURE_STAGE || 'dev';
405
+ }
406
+ /**
407
+ * Extract trace context from the incoming request headers.
408
+ * If no trace headers are present, generates a fresh trace context.
409
+ */
410
+ function traceContextFromHeaders(headers) {
411
+ if (headers) {
412
+ // extractTraceContext already falls back to generateId() when header is absent
413
+ return extractTraceContext(headers);
414
+ }
415
+ // No headers available at all — generate a brand-new root trace
416
+ return {
417
+ traceId: generateId(),
418
+ spanId: generateId(),
419
+ baggage: {},
420
+ };
421
+ }
422
+ /**
423
+ * Resolve a standalone function name to its full AWS Lambda name.
424
+ * Convention: `{project}-{stage}-fn-{name}`
425
+ *
426
+ * @param name - Short function name (e.g. 'process-orders')
427
+ * @param project - Target project name. Defaults to the current project.
428
+ */
429
+ export function resolveFunctionName(name, project) {
430
+ const prefix = project || getProjectPrefix();
431
+ const stage = getStage();
432
+ return `${prefix}-${stage}-fn-${name}`;
433
+ }
434
+ /**
435
+ * Invoke another VentureKit Lambda function.
436
+ *
437
+ * **Unified API** — supports both route handlers and standalone functions:
438
+ *
439
+ * ### Route invocation (string first param)
440
+ * Calls another VentureKit route handler. Builds an API Gateway V2 event,
441
+ * calls Lambda directly (skips API Gateway), and parses the response.
442
+ *
443
+ * ### Function invocation (object first param)
444
+ * Calls a standalone function (saga worker, processor, etc.) with a raw payload.
445
+ * Auto-resolves the full Lambda name from your short function name.
446
+ *
447
+ * @example Route invocation
448
+ * ```typescript
449
+ * import { invoke } from '@venturekit/runtime';
450
+ *
451
+ * // Call a route handler
452
+ * const users = await invoke<User[]>('users/list', { method: 'GET' });
453
+ *
454
+ * // POST with body
455
+ * const created = await invoke<User>('users/create', {
456
+ * body: { name: 'Alice' },
457
+ * });
458
+ *
459
+ * // Fire-and-forget
460
+ * await invoke('notifications/send', { mode: 'async', body: { userId: '42' } });
461
+ * ```
462
+ *
463
+ * @example Function invocation
464
+ * ```typescript
465
+ * import { invoke } from '@venturekit/runtime';
466
+ *
467
+ * // Call a standalone function (src/functions/process-orders.ts)
468
+ * const result = await invoke<{ jobId: string }>(
469
+ * { function: 'process-orders' },
470
+ * { payload: { orderId: 'abc', items: [...] } },
471
+ * );
472
+ *
473
+ * // Fire-and-forget
474
+ * await invoke(
475
+ * { function: 'send-email' },
476
+ * { payload: { to: 'user@example.com' }, mode: 'async' },
477
+ * );
478
+ * ```
479
+ */
480
+ export async function invoke(target, options) {
481
+ // --- Route invocation (string) ---
482
+ if (typeof target === 'string') {
483
+ const lambdaInvoker = await getLambdaInvoker();
484
+ const prefix = getProjectPrefix();
485
+ const resolver = defaultFunctionNameResolver(prefix);
486
+ const invokeOpts = options ?? {};
487
+ // Auto-propagate trace context if not explicitly provided
488
+ if (!invokeOpts.trace) {
489
+ invokeOpts.trace = traceContextFromHeaders(invokeOpts.headers);
490
+ }
491
+ // Auto-propagate tenant from env if not explicitly provided
492
+ if (!invokeOpts.tenantId && process.env._VENTURE_TENANT_ID) {
493
+ invokeOpts.tenantId = process.env._VENTURE_TENANT_ID;
494
+ }
495
+ // Auto-propagate user from env if not explicitly provided
496
+ if (!invokeOpts.userId && process.env._VENTURE_USER_ID) {
497
+ invokeOpts.userId = process.env._VENTURE_USER_ID;
498
+ }
499
+ const invokerFn = createInvoker({ invoker: lambdaInvoker, resolver });
500
+ const doInvoke = () => invokerFn(target, invokeOpts);
501
+ // Circuit breaker: wrap with fallback when provided
502
+ if (invokeOpts.fallback) {
503
+ const functionName = resolver(target);
504
+ return getCircuitBreaker().call(functionName, doInvoke, invokeOpts.fallback);
505
+ }
506
+ return doInvoke();
507
+ }
508
+ // --- Function invocation (object with { function: '...' }) ---
509
+ const fnOpts = options ?? {};
510
+ const { payload = {}, mode = 'sync' } = fnOpts;
511
+ const lambdaInvoker = await getLambdaInvoker();
512
+ const functionName = resolveFunctionName(target.function, target.project);
513
+ const invocationType = mode === 'async' ? 'Event' : 'RequestResponse';
514
+ // Auto-propagate trace context — generate a fresh trace for function invocations
515
+ let finalPayload = payload;
516
+ const activeTrace = traceContextFromHeaders();
517
+ const childTrace = createChildTrace(activeTrace);
518
+ finalPayload = {
519
+ ...(typeof payload === 'object' && payload !== null ? payload : { data: payload }),
520
+ __trace: injectTraceHeaders(childTrace),
521
+ };
522
+ const doInvoke = async () => {
523
+ const result = await lambdaInvoker({
524
+ functionName,
525
+ payload: JSON.stringify(finalPayload),
526
+ invocationType,
527
+ });
528
+ if (mode === 'async') {
529
+ return {
530
+ statusCode: result.statusCode ?? 202,
531
+ data: undefined,
532
+ headers: {},
533
+ };
534
+ }
535
+ if (!result.payload) {
536
+ return { statusCode: result.statusCode ?? 200, data: undefined, headers: {} };
537
+ }
538
+ try {
539
+ const data = JSON.parse(result.payload);
540
+ return { statusCode: result.statusCode ?? 200, data, headers: {} };
541
+ }
542
+ catch {
543
+ return { statusCode: result.statusCode ?? 500, data: result.payload, headers: {} };
544
+ }
545
+ };
546
+ // Circuit breaker: wrap with fallback when provided
547
+ if (fnOpts.fallback) {
548
+ return getCircuitBreaker().call(functionName, doInvoke, fnOpts.fallback);
549
+ }
550
+ return doInvoke();
551
+ }
552
+ /**
553
+ * Invoke any Lambda function directly with a custom payload.
554
+ *
555
+ * @deprecated Use the unified `invoke({ function: 'name' }, { payload })` API instead.
556
+ * This function requires the full AWS Lambda name; the new API auto-resolves it.
557
+ */
558
+ export async function invokeDirect(functionName, payload = {}, options = {}) {
559
+ const { mode = 'sync' } = options;
560
+ const lambdaInvoker = await getLambdaInvoker();
561
+ const invocationType = mode === 'async' ? 'Event' : 'RequestResponse';
562
+ const result = await lambdaInvoker({
563
+ functionName,
564
+ payload: JSON.stringify(payload),
565
+ invocationType,
566
+ });
567
+ if (mode === 'async') {
568
+ return { statusCode: result.statusCode ?? 202, data: undefined };
569
+ }
570
+ if (!result.payload) {
571
+ return { statusCode: result.statusCode ?? 200, data: undefined };
572
+ }
573
+ try {
574
+ const data = JSON.parse(result.payload);
575
+ return { statusCode: result.statusCode ?? 200, data };
576
+ }
577
+ catch {
578
+ return { statusCode: result.statusCode ?? 500, data: result.payload };
579
+ }
580
+ }
581
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/patterns/invoke.ts"],"names":[],"mappings":"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"}