@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.
- package/LICENSE +191 -0
- package/dist/context.d.ts +86 -0
- package/dist/context.js +76 -0
- package/dist/errors.d.ts +80 -0
- package/dist/errors.js +134 -0
- package/dist/handler.d.ts +71 -0
- package/dist/handler.js +176 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +53 -0
- package/dist/logger.d.ts +72 -0
- package/dist/logger.js +105 -0
- package/dist/middleware.d.ts +46 -0
- package/dist/middleware.js +147 -0
- package/dist/response.d.ts +75 -0
- package/dist/response.js +107 -0
- package/dist/ws.d.ts +138 -0
- package/dist/ws.js +277 -0
- package/package.json +61 -0
package/dist/handler.js
ADDED
|
@@ -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=
|
package/dist/index.d.ts
ADDED
|
@@ -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==
|
package/dist/logger.d.ts
ADDED
|
@@ -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;
|