@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.
- package/README.md +1 -1
- package/dist/config/env.d.ts +62 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +98 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/secrets.d.ts +67 -0
- package/dist/config/secrets.d.ts.map +1 -0
- package/dist/config/secrets.js +132 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/handler/adapter.d.ts.map +1 -0
- package/dist/{adapter.js → handler/adapter.js} +5 -44
- package/dist/handler/adapter.js.map +1 -0
- package/dist/{context.d.ts → handler/context.d.ts} +44 -3
- package/dist/handler/context.d.ts.map +1 -0
- package/dist/{context.js → handler/context.js} +9 -9
- package/dist/handler/context.js.map +1 -0
- package/dist/handler/errors.d.ts.map +1 -0
- package/dist/{errors.js → handler/errors.js} +11 -25
- package/dist/handler/errors.js.map +1 -0
- package/dist/{handler.d.ts → handler/handler.d.ts} +36 -3
- package/dist/handler/handler.d.ts.map +1 -0
- package/dist/{handler.js → handler/handler.js} +59 -23
- package/dist/handler/handler.js.map +1 -0
- package/dist/handler/response.d.ts.map +1 -0
- package/dist/{response.js → handler/response.js} +9 -17
- package/dist/handler/response.js.map +1 -0
- package/dist/handler/task-handler.d.ts +192 -0
- package/dist/handler/task-handler.d.ts.map +1 -0
- package/dist/handler/task-handler.js +262 -0
- package/dist/handler/task-handler.js.map +1 -0
- package/dist/index.d.ts +33 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -48
- package/dist/index.js.map +1 -1
- package/dist/{logger.d.ts → logging/logger.d.ts} +1 -1
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/{logger.js → logging/logger.js} +8 -16
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/tracing.d.ts +51 -0
- package/dist/logging/tracing.d.ts.map +1 -0
- package/dist/logging/tracing.js +77 -0
- package/dist/logging/tracing.js.map +1 -0
- package/dist/middleware/middleware.d.ts +120 -0
- package/dist/middleware/middleware.d.ts.map +1 -0
- package/dist/middleware/middleware.js +270 -0
- package/dist/middleware/middleware.js.map +1 -0
- package/dist/middleware/rate-limit-store.d.ts +153 -0
- package/dist/middleware/rate-limit-store.d.ts.map +1 -0
- package/dist/middleware/rate-limit-store.js +182 -0
- package/dist/middleware/rate-limit-store.js.map +1 -0
- package/dist/openapi/openapi.d.ts +147 -0
- package/dist/openapi/openapi.d.ts.map +1 -0
- package/dist/openapi/openapi.js +235 -0
- package/dist/openapi/openapi.js.map +1 -0
- package/dist/openapi.d.ts +10 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +9 -0
- package/dist/openapi.js.map +1 -0
- package/dist/patterns/circuit-breaker.d.ts +78 -0
- package/dist/patterns/circuit-breaker.d.ts.map +1 -0
- package/dist/patterns/circuit-breaker.js +113 -0
- package/dist/patterns/circuit-breaker.js.map +1 -0
- package/dist/patterns/idempotency.d.ts +175 -0
- package/dist/patterns/idempotency.d.ts.map +1 -0
- package/dist/patterns/idempotency.js +305 -0
- package/dist/patterns/idempotency.js.map +1 -0
- package/dist/patterns/invoke.d.ts +279 -0
- package/dist/patterns/invoke.d.ts.map +1 -0
- package/dist/patterns/invoke.js +581 -0
- package/dist/patterns/invoke.js.map +1 -0
- package/dist/patterns/saga.d.ts +391 -0
- package/dist/patterns/saga.d.ts.map +1 -0
- package/dist/patterns/saga.js +556 -0
- package/dist/patterns/saga.js.map +1 -0
- package/dist/patterns.d.ts +17 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +17 -0
- package/dist/patterns.js.map +1 -0
- package/dist/rate-limit.d.ts +16 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +15 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/secrets.d.ts +11 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +10 -0
- package/dist/secrets.js.map +1 -0
- package/dist/testing/test-utils.d.ts +99 -0
- package/dist/testing/test-utils.d.ts.map +1 -0
- package/dist/testing/test-utils.js +153 -0
- package/dist/testing/test-utils.js.map +1 -0
- package/dist/testing.d.ts +10 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +9 -0
- package/dist/testing.js.map +1 -0
- package/dist/ws/ws.d.ts +139 -0
- package/dist/ws/ws.d.ts.map +1 -0
- package/dist/ws/ws.js +294 -0
- package/dist/ws/ws.js.map +1 -0
- package/dist/ws.d.ts +5 -133
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +4 -291
- package/dist/ws.js.map +1 -1
- package/package.json +47 -5
- package/dist/adapter.d.ts.map +0 -1
- package/dist/adapter.js.map +0 -1
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/handler.d.ts.map +0 -1
- package/dist/handler.js.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/middleware.d.ts +0 -47
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -147
- package/dist/middleware.js.map +0 -1
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js.map +0 -1
- /package/dist/{adapter.d.ts → handler/adapter.d.ts} +0 -0
- /package/dist/{errors.d.ts → handler/errors.d.ts} +0 -0
- /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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"}
|