@venturekit/runtime 0.0.0-dev.20260307234057

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,176 @@
1
+ "use strict";
2
+ /**
3
+ * VentureKit Handler
4
+ *
5
+ * Single unified Lambda handler that adapts to context:
6
+ * - No scopes = public endpoint
7
+ * - With scopes = authenticated + scope check
8
+ * - Status code auto-detected from HTTP method or explicitly set
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.handler = handler;
45
+ const context_1 = require("./context");
46
+ const logger_1 = require("./logger");
47
+ const response_1 = require("./response");
48
+ const middleware_1 = require("./middleware");
49
+ const errors_1 = require("./errors");
50
+ /**
51
+ * Parse request body
52
+ */
53
+ function parseBody(event) {
54
+ if (!event.body)
55
+ return null;
56
+ try {
57
+ const body = event.isBase64Encoded
58
+ ? Buffer.from(event.body, 'base64').toString('utf-8')
59
+ : event.body;
60
+ return JSON.parse(body);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * Auto-detect status code from HTTP method
68
+ */
69
+ function getStatusCode(method, explicit) {
70
+ if (explicit !== undefined)
71
+ return explicit;
72
+ switch (method.toUpperCase()) {
73
+ case 'POST':
74
+ return 201;
75
+ case 'DELETE':
76
+ return 204;
77
+ default:
78
+ return 200;
79
+ }
80
+ }
81
+ /**
82
+ * VentureKit unified handler
83
+ *
84
+ * Adapts to context with smart defaults:
85
+ * - No scopes = public endpoint
86
+ * - With scopes = authenticated + scope check
87
+ * - Status: GET/PUT → 200, POST → 201, DELETE → 204 (or set explicitly)
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * // Public endpoint
92
+ * export const main = handler(async (body, ctx, log) => {
93
+ * return { status: 'ok' };
94
+ * });
95
+ *
96
+ * // Authenticated endpoint
97
+ * export const main = handler(async (body, ctx, log) => {
98
+ * return { id: '123' };
99
+ * }, { scopes: ['projects.write'] });
100
+ * ```
101
+ */
102
+ function handler(fn, config = {}) {
103
+ const { scopes = [], status, middleware = [], logLevel = 'info', } = config;
104
+ const requiresAuth = scopes.length > 0;
105
+ const logger = (0, logger_1.createLogger)({ minLevel: logLevel });
106
+ // Build middleware stack
107
+ const middlewareStack = [
108
+ // Error boundary (outermost)
109
+ (0, middleware_1.errorBoundaryMiddleware)((error, ctx) => (0, response_1.errorResponse)(error, { requestId: ctx.requestId })),
110
+ // Logging
111
+ (0, middleware_1.loggingMiddleware)(logger),
112
+ // Custom middleware
113
+ ...middleware,
114
+ ];
115
+ const composedMiddleware = (0, middleware_1.compose)(middlewareStack);
116
+ return async (event, _context) => {
117
+ // Build request context
118
+ const ctx = (0, context_1.buildContext)(event, { supportedLocales: ['en'], defaultLocale: 'en' });
119
+ logger.setContext(ctx);
120
+ // Run through middleware and handler
121
+ return composedMiddleware(ctx, async () => {
122
+ // Auth check (only if scopes provided)
123
+ if (requiresAuth) {
124
+ if (!ctx.user) {
125
+ throw new errors_1.UnauthorizedError();
126
+ }
127
+ // Scope check
128
+ const hasAllScopes = scopes.every(scope => ctx.user.scopes.includes(scope));
129
+ if (!hasAllScopes) {
130
+ throw new errors_1.ForbiddenError('Insufficient permissions');
131
+ }
132
+ }
133
+ // Parse body
134
+ const body = parseBody(event);
135
+ // Transaction support
136
+ if (config.transactional) {
137
+ const data = await Promise.resolve().then(() => __importStar(require('@venturekit/data')));
138
+ const tx = await data.beginTransaction();
139
+ ctx.tx = tx;
140
+ try {
141
+ const result = await fn(body, ctx, logger);
142
+ await tx.commit();
143
+ const statusCode = getStatusCode(event.requestContext.http.method, status);
144
+ if (statusCode === 204) {
145
+ return (0, response_1.noContent)({ requestId: ctx.requestId });
146
+ }
147
+ else if (statusCode === 201) {
148
+ return (0, response_1.created)(result, { requestId: ctx.requestId });
149
+ }
150
+ else {
151
+ return (0, response_1.success)(result, { requestId: ctx.requestId });
152
+ }
153
+ }
154
+ catch (txError) {
155
+ await tx.rollback();
156
+ throw txError;
157
+ }
158
+ }
159
+ // Execute handler (non-transactional)
160
+ const result = await fn(body, ctx, logger);
161
+ // Determine status code
162
+ const statusCode = getStatusCode(event.requestContext.http.method, status);
163
+ // Return response based on status
164
+ if (statusCode === 204) {
165
+ return (0, response_1.noContent)({ requestId: ctx.requestId });
166
+ }
167
+ else if (statusCode === 201) {
168
+ return (0, response_1.created)(result, { requestId: ctx.requestId });
169
+ }
170
+ else {
171
+ return (0, response_1.success)(result, { requestId: ctx.requestId });
172
+ }
173
+ });
174
+ };
175
+ }
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThHSCwwQkF1RkM7QUFsTUQsdUNBQXlEO0FBQ3pELHFDQUFnRDtBQUNoRCx5Q0FBd0U7QUFDeEUsNkNBQStGO0FBQy9GLHFDQUE2RDtBQWtEN0Q7O0dBRUc7QUFDSCxTQUFTLFNBQVMsQ0FBSSxLQUE2QjtJQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUU3QixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsZUFBZTtZQUNoQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFNLENBQUM7SUFDL0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLE1BQWMsRUFBRSxRQUFxQjtJQUMxRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFNUMsUUFBUSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU07WUFDVCxPQUFPLEdBQUcsQ0FBQztRQUNiLEtBQUssUUFBUTtZQUNYLE9BQU8sR0FBRyxDQUFDO1FBQ2I7WUFDRSxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FB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QUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVudHVyZUtpdCBIYW5kbGVyXG4gKiBcbiAqIFNpbmdsZSB1bmlmaWVkIExhbWJkYSBoYW5kbGVyIHRoYXQgYWRhcHRzIHRvIGNvbnRleHQ6XG4gKiAtIE5vIHNjb3BlcyA9IHB1YmxpYyBlbmRwb2ludFxuICogLSBXaXRoIHNjb3BlcyA9IGF1dGhlbnRpY2F0ZWQgKyBzY29wZSBjaGVja1xuICogLSBTdGF0dXMgY29kZSBhdXRvLWRldGVjdGVkIGZyb20gSFRUUCBtZXRob2Qgb3IgZXhwbGljaXRseSBzZXRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFQSUdhdGV3YXlQcm94eUV2ZW50VjIsIEFQSUdhdGV3YXlQcm94eVJlc3VsdFYyLCBDb250ZXh0IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCwgYnVpbGRDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IExvZ2dlciwgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc3VjY2VzcywgY3JlYXRlZCwgbm9Db250ZW50LCBlcnJvclJlc3BvbnNlIH0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBjb21wb3NlLCBNaWRkbGV3YXJlLCBsb2dnaW5nTWlkZGxld2FyZSwgZXJyb3JCb3VuZGFyeU1pZGRsZXdhcmUgfSBmcm9tICcuL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgVW5hdXRob3JpemVkRXJyb3IsIEZvcmJpZGRlbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vKipcbiAqIEhhbmRsZXIgZnVuY3Rpb24gc2lnbmF0dXJlXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJGbjxUQm9keSA9IHVua25vd24sIFRSZXN1bHQgPSB1bmtub3duPiA9IChcbiAgYm9keTogVEJvZHksXG4gIGN0eDogUmVxdWVzdENvbnRleHQsXG4gIGxvZ2dlcjogTG9nZ2VyXG4pID0+IFByb21pc2U8VFJlc3VsdD47XG5cbi8qKlxuICogSFRUUCBTdGF0dXMgY29kZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3RhdHVzQ29kZSA9IDIwMCB8IDIwMSB8IDIwNDtcblxuLyoqXG4gKiBIYW5kbGVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyQ29uZmlnIHtcbiAgLyoqIFxuICAgKiBSZXF1aXJlZCBPQXV0aCBzY29wZXNcbiAgICogLSBFbXB0eSBhcnJheSBvciB1bmRlZmluZWQgPSBwdWJsaWMgZW5kcG9pbnQgKG5vIGF1dGgpXG4gICAqIC0gTm9uLWVtcHR5IGFycmF5ID0gYXV0aGVudGljYXRlZCArIHNjb3BlIGNoZWNrXG4gICAqL1xuICBzY29wZXM/OiBzdHJpbmdbXTtcbiAgXG4gIC8qKiBcbiAgICogUmVzcG9uc2Ugc3RhdHVzIGNvZGVcbiAgICogLSB1bmRlZmluZWQgPSBhdXRvLWRldGVjdCBmcm9tIEhUVFAgbWV0aG9kIChHRVQvUFVUPTIwMCwgUE9TVD0yMDEsIERFTEVURT0yMDQpXG4gICAqIC0gbnVtYmVyID0gZXhwbGljaXQgc3RhdHVzIGNvZGVcbiAgICovXG4gIHN0YXR1cz86IFN0YXR1c0NvZGU7XG4gIFxuICAvKiogQ3VzdG9tIG1pZGRsZXdhcmUgdG8gYXBwbHkgKi9cbiAgbWlkZGxld2FyZT86IE1pZGRsZXdhcmVbXTtcbiAgXG4gIC8qKiBMb2cgbGV2ZWwgKi9cbiAgbG9nTGV2ZWw/OiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJztcblxuICAvKipcbiAgICogV3JhcCB0aGUgZW50aXJlIGhhbmRsZXIgZXhlY3V0aW9uIGluIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24uXG4gICAqIFdoZW4gdHJ1ZSwgYSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJlZm9yZSB0aGUgaGFuZGxlciBydW5zXG4gICAqIGFuZCBpcyBhdmFpbGFibGUgdmlhIGN0eC50eC4gSXQgYXV0by1jb21taXRzIG9uIHN1Y2Nlc3NcbiAgICogYW5kIGF1dG8tcm9sbHMtYmFjayBvbiBlcnJvci5cbiAgICogUmVxdWlyZXMgQHZlbnR1cmVraXQvZGF0YSB0byBiZSBpbnN0YWxsZWQuXG4gICAqL1xuICB0cmFuc2FjdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJzZSByZXF1ZXN0IGJvZHlcbiAqL1xuZnVuY3Rpb24gcGFyc2VCb2R5PFQ+KGV2ZW50OiBBUElHYXRld2F5UHJveHlFdmVudFYyKTogVCB8IG51bGwge1xuICBpZiAoIWV2ZW50LmJvZHkpIHJldHVybiBudWxsO1xuICBcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gZXZlbnQuaXNCYXNlNjRFbmNvZGVkXG4gICAgICA/IEJ1ZmZlci5mcm9tKGV2ZW50LmJvZHksICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKVxuICAgICAgOiBldmVudC5ib2R5O1xuICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkpIGFzIFQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQXV0by1kZXRlY3Qgc3RhdHVzIGNvZGUgZnJvbSBIVFRQIG1ldGhvZFxuICovXG5mdW5jdGlvbiBnZXRTdGF0dXNDb2RlKG1ldGhvZDogc3RyaW5nLCBleHBsaWNpdD86IFN0YXR1c0NvZGUpOiBTdGF0dXNDb2RlIHtcbiAgaWYgKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQpIHJldHVybiBleHBsaWNpdDtcbiAgXG4gIHN3aXRjaCAobWV0aG9kLnRvVXBwZXJDYXNlKCkpIHtcbiAgICBjYXNlICdQT1NUJzpcbiAgICAgIHJldHVybiAyMDE7XG4gICAgY2FzZSAnREVMRVRFJzpcbiAgICAgIHJldHVybiAyMDQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAyMDA7XG4gIH1cbn1cblxuLyoqXG4gKiBWZW50dXJlS2l0IHVuaWZpZWQgaGFuZGxlclxuICogXG4gKiBBZGFwdHMgdG8gY29udGV4dCB3aXRoIHNtYXJ0IGRlZmF1bHRzOlxuICogLSBObyBzY29wZXMgPSBwdWJsaWMgZW5kcG9pbnRcbiAqIC0gV2l0aCBzY29wZXMgPSBhdXRoZW50aWNhdGVkICsgc2NvcGUgY2hlY2tcbiAqIC0gU3RhdHVzOiBHRVQvUFVUIOKGkiAyMDAsIFBPU1Qg4oaSIDIwMSwgREVMRVRFIOKGkiAyMDQgKG9yIHNldCBleHBsaWNpdGx5KVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUHVibGljIGVuZHBvaW50XG4gKiBleHBvcnQgY29uc3QgbWFpbiA9IGhhbmRsZXIoYXN5bmMgKGJvZHksIGN0eCwgbG9nKSA9PiB7XG4gKiAgIHJldHVybiB7IHN0YXR1czogJ29rJyB9O1xuICogfSk7XG4gKiBcbiAqIC8vIEF1dGhlbnRpY2F0ZWQgZW5kcG9pbnRcbiAqIGV4cG9ydCBjb25zdCBtYWluID0gaGFuZGxlcihhc3luYyAoYm9keSwgY3R4LCBsb2cpID0+IHtcbiAqICAgcmV0dXJuIHsgaWQ6ICcxMjMnIH07XG4gKiB9LCB7IHNjb3BlczogWydwcm9qZWN0cy53cml0ZSddIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVyPFRCb2R5ID0gdW5rbm93biwgVFJlc3VsdCA9IHVua25vd24+KFxuICBmbjogSGFuZGxlckZuPFRCb2R5LCBUUmVzdWx0PixcbiAgY29uZmlnOiBIYW5kbGVyQ29uZmlnID0ge31cbik6IChldmVudDogQVBJR2F0ZXdheVByb3h5RXZlbnRWMiwgY29udGV4dDogQ29udGV4dCkgPT4gUHJvbWlzZTxBUElHYXRld2F5UHJveHlSZXN1bHRWMj4ge1xuICBjb25zdCB7XG4gICAgc2NvcGVzID0gW10sXG4gICAgc3RhdHVzLFxuICAgIG1pZGRsZXdhcmUgPSBbXSxcbiAgICBsb2dMZXZlbCA9ICdpbmZvJyxcbiAgfSA9IGNvbmZpZztcblxuICBjb25zdCByZXF1aXJlc0F1dGggPSBzY29wZXMubGVuZ3RoID4gMDtcbiAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHsgbWluTGV2ZWw6IGxvZ0xldmVsIH0pO1xuXG4gIC8vIEJ1aWxkIG1pZGRsZXdhcmUgc3RhY2tcbiAgY29uc3QgbWlkZGxld2FyZVN0YWNrOiBNaWRkbGV3YXJlW10gPSBbXG4gICAgLy8gRXJyb3IgYm91bmRhcnkgKG91dGVybW9zdClcbiAgICBlcnJvckJvdW5kYXJ5TWlkZGxld2FyZSgoZXJyb3IsIGN0eCkgPT4gZXJyb3JSZXNwb25zZShlcnJvciwgeyByZXF1ZXN0SWQ6IGN0eC5yZXF1ZXN0SWQgfSkpLFxuICAgIC8vIExvZ2dpbmdcbiAgICBsb2dnaW5nTWlkZGxld2FyZShsb2dnZXIpLFxuICAgIC8vIEN1c3RvbSBtaWRkbGV3YXJlXG4gICAgLi4ubWlkZGxld2FyZSxcbiAgXTtcblxuICBjb25zdCBjb21wb3NlZE1pZGRsZXdhcmUgPSBjb21wb3NlKG1pZGRsZXdhcmVTdGFjayk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogQVBJR2F0ZXdheVByb3h5RXZlbnRWMiwgX2NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPEFQSUdhdGV3YXlQcm94eVJlc3VsdFYyPiA9PiB7XG4gICAgLy8gQnVpbGQgcmVxdWVzdCBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gYnVpbGRDb250ZXh0KGV2ZW50LCB7IHN1cHBvcnRlZExvY2FsZXM6IFsnZW4nXSwgZGVmYXVsdExvY2FsZTogJ2VuJyB9KTtcbiAgICBsb2dnZXIuc2V0Q29udGV4dChjdHgpO1xuXG4gICAgLy8gUnVuIHRocm91Z2ggbWlkZGxld2FyZSBhbmQgaGFuZGxlclxuICAgIHJldHVybiBjb21wb3NlZE1pZGRsZXdhcmUoY3R4LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBdXRoIGNoZWNrIChvbmx5IGlmIHNjb3BlcyBwcm92aWRlZClcbiAgICAgIGlmIChyZXF1aXJlc0F1dGgpIHtcbiAgICAgICAgaWYgKCFjdHgudXNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBVbmF1dGhvcml6ZWRFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2NvcGUgY2hlY2tcbiAgICAgICAgY29uc3QgaGFzQWxsU2NvcGVzID0gc2NvcGVzLmV2ZXJ5KHNjb3BlID0+IGN0eC51c2VyIS5zY29wZXMuaW5jbHVkZXMoc2NvcGUpKTtcbiAgICAgICAgaWYgKCFoYXNBbGxTY29wZXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXJyb3IoJ0luc3VmZmljaWVudCBwZXJtaXNzaW9ucycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIGJvZHlcbiAgICAgIGNvbnN0IGJvZHkgPSBwYXJzZUJvZHk8VEJvZHk+KGV2ZW50KTtcblxuICAgICAgLy8gVHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgICAgaWYgKGNvbmZpZy50cmFuc2FjdGlvbmFsKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBpbXBvcnQoJ0B2ZW50dXJla2l0L2RhdGEnKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBkYXRhLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAgICAgICAgY3R4LnR4ID0gdHg7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oYm9keSBhcyBUQm9keSwgY3R4LCBsb2dnZXIpO1xuICAgICAgICAgIGF3YWl0IHR4LmNvbW1pdCgpO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSBnZXRTdGF0dXNDb2RlKGV2ZW50LnJlcXVlc3RDb250ZXh0Lmh0dHAubWV0aG9kLCBzdGF0dXMpO1xuICAgICAgICAgIGlmIChzdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBub0NvbnRlbnQoeyByZXF1ZXN0SWQ6IGN0eC5yZXF1ZXN0SWQgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNDb2RlID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVkKHJlc3VsdCwgeyByZXF1ZXN0SWQ6IGN0eC5yZXF1ZXN0SWQgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZXNzKHJlc3VsdCwgeyByZXF1ZXN0SWQ6IGN0eC5yZXF1ZXN0SWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoICh0eEVycm9yKSB7XG4gICAgICAgICAgYXdhaXQgdHgucm9sbGJhY2soKTtcbiAgICAgICAgICB0aHJvdyB0eEVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4ZWN1dGUgaGFuZGxlciAobm9uLXRyYW5zYWN0aW9uYWwpXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihib2R5IGFzIFRCb2R5LCBjdHgsIGxvZ2dlcik7XG5cbiAgICAgIC8vIERldGVybWluZSBzdGF0dXMgY29kZVxuICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IGdldFN0YXR1c0NvZGUoZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5tZXRob2QsIHN0YXR1cyk7XG5cbiAgICAgIC8vIFJldHVybiByZXNwb25zZSBiYXNlZCBvbiBzdGF0dXNcbiAgICAgIGlmIChzdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgICAgcmV0dXJuIG5vQ29udGVudCh7IHJlcXVlc3RJZDogY3R4LnJlcXVlc3RJZCB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PT0gMjAxKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVkKHJlc3VsdCwgeyByZXF1ZXN0SWQ6IGN0eC5yZXF1ZXN0SWQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3VjY2VzcyhyZXN1bHQsIHsgcmVxdWVzdElkOiBjdHgucmVxdWVzdElkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufVxuXG4iXX0=
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @venturekit/runtime
3
+ *
4
+ * Runtime utilities for VentureKit Lambda functions.
5
+ */
6
+ export { handler } from './handler';
7
+ export type { HandlerFn, HandlerConfig, StatusCode } from './handler';
8
+ export { buildContext, extractUserContext, extractLocale, } from './context';
9
+ export type { RequestContext, UserContext, TenantContext } from './context';
10
+ export { success, created, noContent, error, errorResponse, redirect, } from './response';
11
+ export type { SuccessResponse, ErrorResponse } from './response';
12
+ export { VentureError, BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, ConflictError, ValidationError, RateLimitError, InternalError, ServiceUnavailableError, isVentureError, } from './errors';
13
+ export { Logger, createLogger, logger, } from './logger';
14
+ export type { LogLevel, LogEntry, LoggerConfig } from './logger';
15
+ export { compose, loggingMiddleware, corsMiddleware, timeoutMiddleware, errorBoundaryMiddleware, } from './middleware';
16
+ export type { MiddlewareFn, Middleware } from './middleware';
17
+ export { connectionStore } from './ws';
18
+ export type { ConnectionRecord, ConnectionMetadata } from './ws';
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * @venturekit/runtime
4
+ *
5
+ * Runtime utilities for VentureKit Lambda functions.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.connectionStore = exports.errorBoundaryMiddleware = exports.timeoutMiddleware = exports.corsMiddleware = exports.loggingMiddleware = exports.compose = exports.logger = exports.createLogger = exports.Logger = exports.isVentureError = exports.ServiceUnavailableError = exports.InternalError = exports.RateLimitError = exports.ValidationError = exports.ConflictError = exports.NotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.BadRequestError = exports.VentureError = exports.redirect = exports.errorResponse = exports.error = exports.noContent = exports.created = exports.success = exports.extractLocale = exports.extractUserContext = exports.buildContext = exports.handler = void 0;
9
+ // Handler
10
+ var handler_1 = require("./handler");
11
+ Object.defineProperty(exports, "handler", { enumerable: true, get: function () { return handler_1.handler; } });
12
+ // Context
13
+ var context_1 = require("./context");
14
+ Object.defineProperty(exports, "buildContext", { enumerable: true, get: function () { return context_1.buildContext; } });
15
+ Object.defineProperty(exports, "extractUserContext", { enumerable: true, get: function () { return context_1.extractUserContext; } });
16
+ Object.defineProperty(exports, "extractLocale", { enumerable: true, get: function () { return context_1.extractLocale; } });
17
+ // Response utilities
18
+ var response_1 = require("./response");
19
+ Object.defineProperty(exports, "success", { enumerable: true, get: function () { return response_1.success; } });
20
+ Object.defineProperty(exports, "created", { enumerable: true, get: function () { return response_1.created; } });
21
+ Object.defineProperty(exports, "noContent", { enumerable: true, get: function () { return response_1.noContent; } });
22
+ Object.defineProperty(exports, "error", { enumerable: true, get: function () { return response_1.error; } });
23
+ Object.defineProperty(exports, "errorResponse", { enumerable: true, get: function () { return response_1.errorResponse; } });
24
+ Object.defineProperty(exports, "redirect", { enumerable: true, get: function () { return response_1.redirect; } });
25
+ // Errors
26
+ var errors_1 = require("./errors");
27
+ Object.defineProperty(exports, "VentureError", { enumerable: true, get: function () { return errors_1.VentureError; } });
28
+ Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return errors_1.BadRequestError; } });
29
+ Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return errors_1.UnauthorizedError; } });
30
+ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return errors_1.ForbiddenError; } });
31
+ Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return errors_1.NotFoundError; } });
32
+ Object.defineProperty(exports, "ConflictError", { enumerable: true, get: function () { return errors_1.ConflictError; } });
33
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
34
+ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
35
+ Object.defineProperty(exports, "InternalError", { enumerable: true, get: function () { return errors_1.InternalError; } });
36
+ Object.defineProperty(exports, "ServiceUnavailableError", { enumerable: true, get: function () { return errors_1.ServiceUnavailableError; } });
37
+ Object.defineProperty(exports, "isVentureError", { enumerable: true, get: function () { return errors_1.isVentureError; } });
38
+ // Logger
39
+ var logger_1 = require("./logger");
40
+ Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
41
+ Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
42
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
43
+ // Middleware
44
+ var middleware_1 = require("./middleware");
45
+ Object.defineProperty(exports, "compose", { enumerable: true, get: function () { return middleware_1.compose; } });
46
+ Object.defineProperty(exports, "loggingMiddleware", { enumerable: true, get: function () { return middleware_1.loggingMiddleware; } });
47
+ Object.defineProperty(exports, "corsMiddleware", { enumerable: true, get: function () { return middleware_1.corsMiddleware; } });
48
+ Object.defineProperty(exports, "timeoutMiddleware", { enumerable: true, get: function () { return middleware_1.timeoutMiddleware; } });
49
+ Object.defineProperty(exports, "errorBoundaryMiddleware", { enumerable: true, get: function () { return middleware_1.errorBoundaryMiddleware; } });
50
+ // WebSocket connection store
51
+ var ws_1 = require("./ws");
52
+ Object.defineProperty(exports, "connectionStore", { enumerable: true, get: function () { return ws_1.connectionStore; } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILFVBQVU7QUFDVixxQ0FBb0M7QUFBM0Isa0dBQUEsT0FBTyxPQUFBO0FBR2hCLFVBQVU7QUFDVixxQ0FJbUI7QUFIakIsdUdBQUEsWUFBWSxPQUFBO0FBQ1osNkdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsd0dBQUEsYUFBYSxPQUFBO0FBSWYscUJBQXFCO0FBQ3JCLHVDQU9vQjtBQU5sQixtR0FBQSxPQUFPLE9BQUE7QUFDUCxtR0FBQSxPQUFPLE9BQUE7QUFDUCxxR0FBQSxTQUFTLE9BQUE7QUFDVCxpR0FBQSxLQUFLLE9BQUE7QUFDTCx5R0FBQSxhQUFhLE9BQUE7QUFDYixvR0FBQSxRQUFRLE9BQUE7QUFJVixTQUFTO0FBQ1QsbUNBWWtCO0FBWGhCLHNHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDJHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLHdHQUFBLGNBQWMsT0FBQTtBQUNkLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHlHQUFBLGVBQWUsT0FBQTtBQUNmLHdHQUFBLGNBQWMsT0FBQTtBQUNkLHVHQUFBLGFBQWEsT0FBQTtBQUNiLGlIQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLHdHQUFBLGNBQWMsT0FBQTtBQUdoQixTQUFTO0FBQ1QsbUNBSWtCO0FBSGhCLGdHQUFBLE1BQU0sT0FBQTtBQUNOLHNHQUFBLFlBQVksT0FBQTtBQUNaLGdHQUFBLE1BQU0sT0FBQTtBQUlSLGFBQWE7QUFDYiwyQ0FNc0I7QUFMcEIscUdBQUEsT0FBTyxPQUFBO0FBQ1AsK0dBQUEsaUJBQWlCLE9BQUE7QUFDakIsNEdBQUEsY0FBYyxPQUFBO0FBQ2QsK0dBQUEsaUJBQWlCLE9BQUE7QUFDakIscUhBQUEsdUJBQXVCLE9BQUE7QUFJekIsNkJBQTZCO0FBQzdCLDJCQUF1QztBQUE5QixxR0FBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEB2ZW50dXJla2l0L3J1bnRpbWVcbiAqIFxuICogUnVudGltZSB1dGlsaXRpZXMgZm9yIFZlbnR1cmVLaXQgTGFtYmRhIGZ1bmN0aW9ucy5cbiAqL1xuXG4vLyBIYW5kbGVyXG5leHBvcnQgeyBoYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVyJztcbmV4cG9ydCB0eXBlIHsgSGFuZGxlckZuLCBIYW5kbGVyQ29uZmlnLCBTdGF0dXNDb2RlIH0gZnJvbSAnLi9oYW5kbGVyJztcblxuLy8gQ29udGV4dFxuZXhwb3J0IHtcbiAgYnVpbGRDb250ZXh0LFxuICBleHRyYWN0VXNlckNvbnRleHQsXG4gIGV4dHJhY3RMb2NhbGUsXG59IGZyb20gJy4vY29udGV4dCc7XG5leHBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0LCBVc2VyQ29udGV4dCwgVGVuYW50Q29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG5cbi8vIFJlc3BvbnNlIHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgc3VjY2VzcyxcbiAgY3JlYXRlZCxcbiAgbm9Db250ZW50LFxuICBlcnJvcixcbiAgZXJyb3JSZXNwb25zZSxcbiAgcmVkaXJlY3QsXG59IGZyb20gJy4vcmVzcG9uc2UnO1xuZXhwb3J0IHR5cGUgeyBTdWNjZXNzUmVzcG9uc2UsIEVycm9yUmVzcG9uc2UgfSBmcm9tICcuL3Jlc3BvbnNlJztcblxuLy8gRXJyb3JzXG5leHBvcnQge1xuICBWZW50dXJlRXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgVW5hdXRob3JpemVkRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIFJhdGVMaW1pdEVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcixcbiAgaXNWZW50dXJlRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcblxuLy8gTG9nZ2VyXG5leHBvcnQge1xuICBMb2dnZXIsXG4gIGNyZWF0ZUxvZ2dlcixcbiAgbG9nZ2VyLFxufSBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgdHlwZSB7IExvZ0xldmVsLCBMb2dFbnRyeSwgTG9nZ2VyQ29uZmlnIH0gZnJvbSAnLi9sb2dnZXInO1xuXG4vLyBNaWRkbGV3YXJlXG5leHBvcnQge1xuICBjb21wb3NlLFxuICBsb2dnaW5nTWlkZGxld2FyZSxcbiAgY29yc01pZGRsZXdhcmUsXG4gIHRpbWVvdXRNaWRkbGV3YXJlLFxuICBlcnJvckJvdW5kYXJ5TWlkZGxld2FyZSxcbn0gZnJvbSAnLi9taWRkbGV3YXJlJztcbmV4cG9ydCB0eXBlIHsgTWlkZGxld2FyZUZuLCBNaWRkbGV3YXJlIH0gZnJvbSAnLi9taWRkbGV3YXJlJztcblxuLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gc3RvcmVcbmV4cG9ydCB7IGNvbm5lY3Rpb25TdG9yZSB9IGZyb20gJy4vd3MnO1xuZXhwb3J0IHR5cGUgeyBDb25uZWN0aW9uUmVjb3JkLCBDb25uZWN0aW9uTWV0YWRhdGEgfSBmcm9tICcuL3dzJztcbiJdfQ==
@@ -0,0 +1,72 @@
1
+ /**
2
+ * VentureKit Logger
3
+ *
4
+ * Structured logging for Lambda functions, powered by pino.
5
+ * Outputs JSON for CloudWatch Logs Insights queries.
6
+ *
7
+ * Uses pino under the hood for:
8
+ * - Fast structured JSON serialization
9
+ * - Automatic level filtering
10
+ * - Child logger support with bound fields
11
+ * - Lambda-optimized (no worker threads, synchronous output)
12
+ */
13
+ import { RequestContext } from './context';
14
+ /**
15
+ * Log levels
16
+ */
17
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
18
+ /**
19
+ * Structured log entry (for type compatibility)
20
+ */
21
+ export interface LogEntry {
22
+ level: LogLevel;
23
+ message: string;
24
+ timestamp: string;
25
+ requestId?: string;
26
+ userId?: string;
27
+ tenantId?: string;
28
+ duration?: number;
29
+ [key: string]: unknown;
30
+ }
31
+ /**
32
+ * Logger configuration
33
+ */
34
+ export interface LoggerConfig {
35
+ /** Minimum log level to output */
36
+ minLevel: LogLevel;
37
+ /** Include request context in all logs */
38
+ includeContext: boolean;
39
+ }
40
+ /**
41
+ * Logger instance — thin wrapper over pino
42
+ */
43
+ export declare class Logger {
44
+ private pinoLogger;
45
+ private context;
46
+ private config;
47
+ constructor(config?: Partial<LoggerConfig>);
48
+ /**
49
+ * Set request context for all subsequent logs
50
+ */
51
+ setContext(context: RequestContext): void;
52
+ /**
53
+ * Clear request context
54
+ */
55
+ clearContext(): void;
56
+ /**
57
+ * Create a child logger with additional default fields
58
+ */
59
+ child(fields: Record<string, unknown>): Logger;
60
+ debug(message: string, data?: Record<string, unknown>): void;
61
+ info(message: string, data?: Record<string, unknown>): void;
62
+ warn(message: string, data?: Record<string, unknown>): void;
63
+ error(message: string, data?: Record<string, unknown>): void;
64
+ }
65
+ /**
66
+ * Default logger instance
67
+ */
68
+ export declare const logger: Logger;
69
+ /**
70
+ * Create a new logger with custom config
71
+ */
72
+ export declare function createLogger(config?: Partial<LoggerConfig>): Logger;
package/dist/logger.js ADDED
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * VentureKit Logger
4
+ *
5
+ * Structured logging for Lambda functions, powered by pino.
6
+ * Outputs JSON for CloudWatch Logs Insights queries.
7
+ *
8
+ * Uses pino under the hood for:
9
+ * - Fast structured JSON serialization
10
+ * - Automatic level filtering
11
+ * - Child logger support with bound fields
12
+ * - Lambda-optimized (no worker threads, synchronous output)
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.logger = exports.Logger = void 0;
19
+ exports.createLogger = createLogger;
20
+ const pino_1 = __importDefault(require("pino"));
21
+ /**
22
+ * Logger instance — thin wrapper over pino
23
+ */
24
+ class Logger {
25
+ pinoLogger;
26
+ context = null;
27
+ config;
28
+ constructor(config = {}) {
29
+ this.config = {
30
+ minLevel: config.minLevel ?? 'info',
31
+ includeContext: config.includeContext ?? true,
32
+ };
33
+ this.pinoLogger = (0, pino_1.default)({
34
+ level: this.config.minLevel,
35
+ // Lambda-friendly: no worker threads, flat JSON, fast
36
+ transport: undefined,
37
+ timestamp: pino_1.default.stdTimeFunctions.isoTime,
38
+ formatters: {
39
+ level(label) {
40
+ return { level: label };
41
+ },
42
+ },
43
+ });
44
+ }
45
+ /**
46
+ * Set request context for all subsequent logs
47
+ */
48
+ setContext(context) {
49
+ this.context = context;
50
+ // Rebind pino child with request-scoped fields
51
+ this.pinoLogger = this.pinoLogger.child({
52
+ requestId: context.requestId,
53
+ ...(context.user?.id && { userId: context.user.id }),
54
+ ...(context.tenant?.id && { tenantId: context.tenant.id }),
55
+ });
56
+ }
57
+ /**
58
+ * Clear request context
59
+ */
60
+ clearContext() {
61
+ this.context = null;
62
+ this.pinoLogger = (0, pino_1.default)({
63
+ level: this.config.minLevel,
64
+ timestamp: pino_1.default.stdTimeFunctions.isoTime,
65
+ formatters: {
66
+ level(label) {
67
+ return { level: label };
68
+ },
69
+ },
70
+ });
71
+ }
72
+ /**
73
+ * Create a child logger with additional default fields
74
+ */
75
+ child(fields) {
76
+ const childLogger = new Logger(this.config);
77
+ childLogger.pinoLogger = this.pinoLogger.child(fields);
78
+ childLogger.context = this.context;
79
+ return childLogger;
80
+ }
81
+ debug(message, data) {
82
+ data ? this.pinoLogger.debug(data, message) : this.pinoLogger.debug(message);
83
+ }
84
+ info(message, data) {
85
+ data ? this.pinoLogger.info(data, message) : this.pinoLogger.info(message);
86
+ }
87
+ warn(message, data) {
88
+ data ? this.pinoLogger.warn(data, message) : this.pinoLogger.warn(message);
89
+ }
90
+ error(message, data) {
91
+ data ? this.pinoLogger.error(data, message) : this.pinoLogger.error(message);
92
+ }
93
+ }
94
+ exports.Logger = Logger;
95
+ /**
96
+ * Default logger instance
97
+ */
98
+ exports.logger = new Logger();
99
+ /**
100
+ * Create a new logger with custom config
101
+ */
102
+ function createLogger(config) {
103
+ return new Logger(config);
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7Ozs7OztBQTZISCxvQ0FFQztBQTdIRCxnREFBd0I7QUFnQ3hCOztHQUVHO0FBQ0gsTUFBYSxNQUFNO0lBQ1QsVUFBVSxDQUFjO0lBQ3hCLE9BQU8sR0FBMEIsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sQ0FBZTtJQUU3QixZQUFZLFNBQWdDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU07WUFDbkMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSTtTQUM5QyxDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFBLGNBQUksRUFBQztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQzNCLHNEQUFzRDtZQUN0RCxTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsY0FBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU87WUFDeEMsVUFBVSxFQUFFO2dCQUNWLEtBQUssQ0FBQyxLQUFhO29CQUNqQixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUMxQixDQUFDO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBdUI7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BELEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQzNELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUEsY0FBSSxFQUFDO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDM0IsU0FBUyxFQUFFLGNBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPO1lBQ3hDLFVBQVUsRUFBRTtnQkFDVixLQUFLLENBQUMsS0FBYTtvQkFDakIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQzthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQStCO1FBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNuQyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQWUsRUFBRSxJQUE4QjtRQUNuRCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFlLEVBQUUsSUFBOEI7UUFDbEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBZSxFQUFFLElBQThCO1FBQ2xELElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQWUsRUFBRSxJQUE4QjtRQUNuRCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0UsQ0FBQztDQUNGO0FBOUVELHdCQThFQztBQUVEOztHQUVHO0FBQ1UsUUFBQSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUVuQzs7R0FFRztBQUNILFNBQWdCLFlBQVksQ0FBQyxNQUE4QjtJQUN6RCxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZlbnR1cmVLaXQgTG9nZ2VyXG4gKiBcbiAqIFN0cnVjdHVyZWQgbG9nZ2luZyBmb3IgTGFtYmRhIGZ1bmN0aW9ucywgcG93ZXJlZCBieSBwaW5vLlxuICogT3V0cHV0cyBKU09OIGZvciBDbG91ZFdhdGNoIExvZ3MgSW5zaWdodHMgcXVlcmllcy5cbiAqIFxuICogVXNlcyBwaW5vIHVuZGVyIHRoZSBob29kIGZvcjpcbiAqIC0gRmFzdCBzdHJ1Y3R1cmVkIEpTT04gc2VyaWFsaXphdGlvblxuICogLSBBdXRvbWF0aWMgbGV2ZWwgZmlsdGVyaW5nXG4gKiAtIENoaWxkIGxvZ2dlciBzdXBwb3J0IHdpdGggYm91bmQgZmllbGRzXG4gKiAtIExhbWJkYS1vcHRpbWl6ZWQgKG5vIHdvcmtlciB0aHJlYWRzLCBzeW5jaHJvbm91cyBvdXRwdXQpXG4gKi9cblxuaW1wb3J0IHBpbm8gZnJvbSAncGlubyc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG5cbi8qKlxuICogTG9nIGxldmVsc1xuICovXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQgbG9nIGVudHJ5IChmb3IgdHlwZSBjb21wYXRpYmlsaXR5KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0VudHJ5IHtcbiAgbGV2ZWw6IExvZ0xldmVsO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uPzogbnVtYmVyO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIExvZ2dlciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyQ29uZmlnIHtcbiAgLyoqIE1pbmltdW0gbG9nIGxldmVsIHRvIG91dHB1dCAqL1xuICBtaW5MZXZlbDogTG9nTGV2ZWw7XG4gIC8qKiBJbmNsdWRlIHJlcXVlc3QgY29udGV4dCBpbiBhbGwgbG9ncyAqL1xuICBpbmNsdWRlQ29udGV4dDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBMb2dnZXIgaW5zdGFuY2Ug4oCUIHRoaW4gd3JhcHBlciBvdmVyIHBpbm9cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHByaXZhdGUgcGlub0xvZ2dlcjogcGluby5Mb2dnZXI7XG4gIHByaXZhdGUgY29udGV4dDogUmVxdWVzdENvbnRleHQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWc6IExvZ2dlckNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8TG9nZ2VyQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBtaW5MZXZlbDogY29uZmlnLm1pbkxldmVsID8/ICdpbmZvJyxcbiAgICAgIGluY2x1ZGVDb250ZXh0OiBjb25maWcuaW5jbHVkZUNvbnRleHQgPz8gdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5waW5vTG9nZ2VyID0gcGlubyh7XG4gICAgICBsZXZlbDogdGhpcy5jb25maWcubWluTGV2ZWwsXG4gICAgICAvLyBMYW1iZGEtZnJpZW5kbHk6IG5vIHdvcmtlciB0aHJlYWRzLCBmbGF0IEpTT04sIGZhc3RcbiAgICAgIHRyYW5zcG9ydDogdW5kZWZpbmVkLFxuICAgICAgdGltZXN0YW1wOiBwaW5vLnN0ZFRpbWVGdW5jdGlvbnMuaXNvVGltZSxcbiAgICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgbGV2ZWwobGFiZWw6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiB7IGxldmVsOiBsYWJlbCB9O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVxdWVzdCBjb250ZXh0IGZvciBhbGwgc3Vic2VxdWVudCBsb2dzXG4gICAqL1xuICBzZXRDb250ZXh0KGNvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAvLyBSZWJpbmQgcGlubyBjaGlsZCB3aXRoIHJlcXVlc3Qtc2NvcGVkIGZpZWxkc1xuICAgIHRoaXMucGlub0xvZ2dlciA9IHRoaXMucGlub0xvZ2dlci5jaGlsZCh7XG4gICAgICByZXF1ZXN0SWQ6IGNvbnRleHQucmVxdWVzdElkLFxuICAgICAgLi4uKGNvbnRleHQudXNlcj8uaWQgJiYgeyB1c2VySWQ6IGNvbnRleHQudXNlci5pZCB9KSxcbiAgICAgIC4uLihjb250ZXh0LnRlbmFudD8uaWQgJiYgeyB0ZW5hbnRJZDogY29udGV4dC50ZW5hbnQuaWQgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgcmVxdWVzdCBjb250ZXh0XG4gICAqL1xuICBjbGVhckNvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLnBpbm9Mb2dnZXIgPSBwaW5vKHtcbiAgICAgIGxldmVsOiB0aGlzLmNvbmZpZy5taW5MZXZlbCxcbiAgICAgIHRpbWVzdGFtcDogcGluby5zdGRUaW1lRnVuY3Rpb25zLmlzb1RpbWUsXG4gICAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIGxldmVsKGxhYmVsOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4geyBsZXZlbDogbGFiZWwgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2hpbGQgbG9nZ2VyIHdpdGggYWRkaXRpb25hbCBkZWZhdWx0IGZpZWxkc1xuICAgKi9cbiAgY2hpbGQoZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IExvZ2dlciB7XG4gICAgY29uc3QgY2hpbGRMb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMuY29uZmlnKTtcbiAgICBjaGlsZExvZ2dlci5waW5vTG9nZ2VyID0gdGhpcy5waW5vTG9nZ2VyLmNoaWxkKGZpZWxkcyk7XG4gICAgY2hpbGRMb2dnZXIuY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICByZXR1cm4gY2hpbGRMb2dnZXI7XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGRhdGEgPyB0aGlzLnBpbm9Mb2dnZXIuZGVidWcoZGF0YSwgbWVzc2FnZSkgOiB0aGlzLnBpbm9Mb2dnZXIuZGVidWcobWVzc2FnZSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgZGF0YSA/IHRoaXMucGlub0xvZ2dlci5pbmZvKGRhdGEsIG1lc3NhZ2UpIDogdGhpcy5waW5vTG9nZ2VyLmluZm8obWVzc2FnZSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgZGF0YSA/IHRoaXMucGlub0xvZ2dlci53YXJuKGRhdGEsIG1lc3NhZ2UpIDogdGhpcy5waW5vTG9nZ2VyLndhcm4obWVzc2FnZSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGRhdGEgPyB0aGlzLnBpbm9Mb2dnZXIuZXJyb3IoZGF0YSwgbWVzc2FnZSkgOiB0aGlzLnBpbm9Mb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IGxvZ2dlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBsb2dnZXIgd2l0aCBjdXN0b20gY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIoY29uZmlnPzogUGFydGlhbDxMb2dnZXJDb25maWc+KTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIoY29uZmlnKTtcbn1cbiJdfQ==
@@ -0,0 +1,46 @@
1
+ /**
2
+ * VentureKit Middleware
3
+ *
4
+ * Composable middleware for request processing.
5
+ * Extensible for auth, tenancy, rate limiting, etc.
6
+ */
7
+ import type { APIGatewayProxyResultV2 } from 'aws-lambda';
8
+ import { RequestContext } from './context';
9
+ import { Logger } from './logger';
10
+ /**
11
+ * Middleware function signature
12
+ */
13
+ export type MiddlewareFn = (ctx: RequestContext, next: () => Promise<APIGatewayProxyResultV2>) => Promise<APIGatewayProxyResultV2>;
14
+ /**
15
+ * Middleware with configuration
16
+ */
17
+ export interface Middleware {
18
+ name: string;
19
+ fn: MiddlewareFn;
20
+ }
21
+ /**
22
+ * Compose multiple middleware into a single function
23
+ */
24
+ export declare function compose(middlewares: Middleware[]): MiddlewareFn;
25
+ /**
26
+ * Logging middleware - logs request/response
27
+ */
28
+ export declare function loggingMiddleware(logger: Logger): Middleware;
29
+ /**
30
+ * CORS middleware - adds CORS headers
31
+ */
32
+ export declare function corsMiddleware(options: {
33
+ allowOrigins: string[];
34
+ allowMethods: string[];
35
+ allowHeaders: string[];
36
+ allowCredentials: boolean;
37
+ maxAge: number;
38
+ }): Middleware;
39
+ /**
40
+ * Timeout middleware - enforces request timeout
41
+ */
42
+ export declare function timeoutMiddleware(timeoutMs: number): Middleware;
43
+ /**
44
+ * Error boundary middleware - catches and formats errors
45
+ */
46
+ export declare function errorBoundaryMiddleware(errorHandler: (error: unknown, ctx: RequestContext) => APIGatewayProxyResultV2): Middleware;