ai.matey.http.core 0.2.0
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 +21 -0
- package/dist/cjs/auth.js +173 -0
- package/dist/cjs/auth.js.map +1 -0
- package/dist/cjs/cors.js +140 -0
- package/dist/cjs/cors.js.map +1 -0
- package/dist/cjs/error-handler.js +147 -0
- package/dist/cjs/error-handler.js.map +1 -0
- package/dist/cjs/handler.js +335 -0
- package/dist/cjs/handler.js.map +1 -0
- package/dist/cjs/health.js +218 -0
- package/dist/cjs/health.js.map +1 -0
- package/dist/cjs/index.js +83 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/rate-limiter.js +163 -0
- package/dist/cjs/rate-limiter.js.map +1 -0
- package/dist/cjs/request-parser.js +141 -0
- package/dist/cjs/request-parser.js.map +1 -0
- package/dist/cjs/response-formatter.js +218 -0
- package/dist/cjs/response-formatter.js.map +1 -0
- package/dist/cjs/route-matcher.js +178 -0
- package/dist/cjs/route-matcher.js.map +1 -0
- package/dist/cjs/streaming-handler.js +120 -0
- package/dist/cjs/streaming-handler.js.map +1 -0
- package/dist/cjs/types.js +11 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/auth.js +163 -0
- package/dist/esm/auth.js.map +1 -0
- package/dist/esm/cors.js +134 -0
- package/dist/esm/cors.js.map +1 -0
- package/dist/esm/error-handler.js +137 -0
- package/dist/esm/error-handler.js.map +1 -0
- package/dist/esm/handler.js +331 -0
- package/dist/esm/handler.js.map +1 -0
- package/dist/esm/health.js +210 -0
- package/dist/esm/health.js.map +1 -0
- package/dist/esm/index.js +30 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/rate-limiter.js +156 -0
- package/dist/esm/rate-limiter.js.map +1 -0
- package/dist/esm/request-parser.js +136 -0
- package/dist/esm/request-parser.js.map +1 -0
- package/dist/esm/response-formatter.js +206 -0
- package/dist/esm/response-formatter.js.map +1 -0
- package/dist/esm/route-matcher.js +171 -0
- package/dist/esm/route-matcher.js.map +1 -0
- package/dist/esm/streaming-handler.js +112 -0
- package/dist/esm/streaming-handler.js.map +1 -0
- package/dist/esm/types.js +10 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/auth.d.ts +37 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/cors.d.ts +26 -0
- package/dist/types/cors.d.ts.map +1 -0
- package/dist/types/error-handler.d.ts +38 -0
- package/dist/types/error-handler.d.ts.map +1 -0
- package/dist/types/handler.d.ts +45 -0
- package/dist/types/handler.d.ts.map +1 -0
- package/dist/types/health.d.ts +164 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/rate-limiter.d.ts +56 -0
- package/dist/types/rate-limiter.d.ts.map +1 -0
- package/dist/types/request-parser.d.ts +22 -0
- package/dist/types/request-parser.d.ts.map +1 -0
- package/dist/types/response-formatter.d.ts +49 -0
- package/dist/types/response-formatter.d.ts.map +1 -0
- package/dist/types/route-matcher.d.ts +45 -0
- package/dist/types/route-matcher.d.ts.map +1 -0
- package/dist/types/streaming-handler.d.ts +40 -0
- package/dist/types/streaming-handler.d.ts.map +1 -0
- package/dist/types/types.d.ts +398 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +73 -0
- package/readme.md +60 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core HTTP Handler
|
|
4
|
+
*
|
|
5
|
+
* Framework-agnostic HTTP request handler that can be adapted to any framework.
|
|
6
|
+
* Contains all the core logic for CORS, auth, rate limiting, routing, and streaming.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.CoreHTTPHandler = void 0;
|
|
12
|
+
const rate_limiter_js_1 = require("./rate-limiter.js");
|
|
13
|
+
const route_matcher_js_1 = require("./route-matcher.js");
|
|
14
|
+
const cors_js_1 = require("./cors.js");
|
|
15
|
+
const response_formatter_js_1 = require("./response-formatter.js");
|
|
16
|
+
/**
|
|
17
|
+
* Core HTTP request handler (framework-agnostic)
|
|
18
|
+
*/
|
|
19
|
+
class CoreHTTPHandler {
|
|
20
|
+
bridge;
|
|
21
|
+
options;
|
|
22
|
+
rateLimiter;
|
|
23
|
+
routeMatcher;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.bridge = options.bridge;
|
|
26
|
+
// Normalize options
|
|
27
|
+
const corsOptions = (0, cors_js_1.normalizeCORSOptions)(options.cors);
|
|
28
|
+
// Apply path prefix to routes if provided
|
|
29
|
+
let routes = options.routes;
|
|
30
|
+
if (routes && options.pathPrefix) {
|
|
31
|
+
routes = (0, route_matcher_js_1.applyPathPrefix)(routes, options.pathPrefix);
|
|
32
|
+
}
|
|
33
|
+
this.options = {
|
|
34
|
+
bridge: this.bridge,
|
|
35
|
+
corsOptions,
|
|
36
|
+
validateAuth: options.validateAuth,
|
|
37
|
+
onError: options.onError,
|
|
38
|
+
headers: options.headers || {},
|
|
39
|
+
timeout: options.timeout ?? 30000,
|
|
40
|
+
pathPrefix: options.pathPrefix ?? '',
|
|
41
|
+
rateLimit: options.rateLimit,
|
|
42
|
+
routes,
|
|
43
|
+
logging: options.logging ?? false,
|
|
44
|
+
log: options.log ?? (() => { }), // no-op by default
|
|
45
|
+
maxBodySize: options.maxBodySize ?? 10 * 1024 * 1024, // 10MB
|
|
46
|
+
streaming: options.streaming ?? true,
|
|
47
|
+
};
|
|
48
|
+
// Create rate limiter if configured
|
|
49
|
+
// TODO: Refactor RateLimiter to use generic types
|
|
50
|
+
this.rateLimiter = this.options.rateLimit
|
|
51
|
+
? new rate_limiter_js_1.RateLimiter(this.options.rateLimit)
|
|
52
|
+
: null;
|
|
53
|
+
// Create route matcher if routes configured
|
|
54
|
+
this.routeMatcher = this.options.routes ? new route_matcher_js_1.RouteMatcher(this.options.routes) : null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Dispose of the handler and release resources.
|
|
58
|
+
* Call this when the handler is no longer needed to prevent memory leaks.
|
|
59
|
+
*/
|
|
60
|
+
dispose() {
|
|
61
|
+
if (this.rateLimiter) {
|
|
62
|
+
this.rateLimiter.dispose();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Handle HTTP request
|
|
67
|
+
*/
|
|
68
|
+
async handle(req, res) {
|
|
69
|
+
try {
|
|
70
|
+
// Handle CORS if enabled
|
|
71
|
+
if (this.options.corsOptions) {
|
|
72
|
+
const origin = req.headers.origin || req.headers['Origin'] || '';
|
|
73
|
+
// Check if origin is allowed
|
|
74
|
+
if (!this.isOriginAllowed(origin, this.options.corsOptions.origin)) {
|
|
75
|
+
res.status(403);
|
|
76
|
+
res.send({ error: 'Origin not allowed' });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Set CORS headers
|
|
80
|
+
if (typeof this.options.corsOptions.origin === 'string' &&
|
|
81
|
+
this.options.corsOptions.origin === '*') {
|
|
82
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
83
|
+
}
|
|
84
|
+
else if (origin) {
|
|
85
|
+
res.header('Access-Control-Allow-Origin', origin);
|
|
86
|
+
res.header('Vary', 'Origin');
|
|
87
|
+
}
|
|
88
|
+
if (this.options.corsOptions.credentials) {
|
|
89
|
+
res.header('Access-Control-Allow-Credentials', 'true');
|
|
90
|
+
}
|
|
91
|
+
if (this.options.corsOptions.exposedHeaders &&
|
|
92
|
+
this.options.corsOptions.exposedHeaders.length > 0) {
|
|
93
|
+
res.header('Access-Control-Expose-Headers', Array.isArray(this.options.corsOptions.exposedHeaders)
|
|
94
|
+
? this.options.corsOptions.exposedHeaders.join(', ')
|
|
95
|
+
: this.options.corsOptions.exposedHeaders);
|
|
96
|
+
}
|
|
97
|
+
// Handle preflight
|
|
98
|
+
const isPreflightRequest = req.method === 'OPTIONS' &&
|
|
99
|
+
origin &&
|
|
100
|
+
(req.headers['access-control-request-method'] ||
|
|
101
|
+
req.headers['Access-Control-Request-Method']);
|
|
102
|
+
if (isPreflightRequest) {
|
|
103
|
+
// Set preflight headers
|
|
104
|
+
res.header('Access-Control-Allow-Methods', Array.isArray(this.options.corsOptions.methods)
|
|
105
|
+
? this.options.corsOptions.methods.join(', ')
|
|
106
|
+
: this.options.corsOptions.methods);
|
|
107
|
+
const requestHeaders = req.headers['access-control-request-headers'] ||
|
|
108
|
+
req.headers['Access-Control-Request-Headers'];
|
|
109
|
+
if (requestHeaders) {
|
|
110
|
+
res.header('Access-Control-Allow-Headers', requestHeaders);
|
|
111
|
+
}
|
|
112
|
+
else if (this.options.corsOptions.allowedHeaders) {
|
|
113
|
+
res.header('Access-Control-Allow-Headers', Array.isArray(this.options.corsOptions.allowedHeaders)
|
|
114
|
+
? this.options.corsOptions.allowedHeaders.join(', ')
|
|
115
|
+
: this.options.corsOptions.allowedHeaders);
|
|
116
|
+
}
|
|
117
|
+
res.header('Access-Control-Max-Age', String(this.options.corsOptions.maxAge));
|
|
118
|
+
// Send successful preflight response
|
|
119
|
+
res.status(204);
|
|
120
|
+
res.send('');
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check rate limit
|
|
125
|
+
if (this.rateLimiter && res.isWritable()) {
|
|
126
|
+
// Create minimal Node.js-like request/response for rate limiter
|
|
127
|
+
// TODO: Refactor rate limiter to use generic types
|
|
128
|
+
const nodeReq = {
|
|
129
|
+
headers: req.headers,
|
|
130
|
+
socket: { remoteAddress: req.ip },
|
|
131
|
+
};
|
|
132
|
+
const nodeRes = {
|
|
133
|
+
setHeader: (name, value) => res.header(name, value),
|
|
134
|
+
end: (data) => {
|
|
135
|
+
if (data) {
|
|
136
|
+
res.send(JSON.parse(data));
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
get statusCode() {
|
|
140
|
+
return this._statusCode || 200;
|
|
141
|
+
},
|
|
142
|
+
set statusCode(value) {
|
|
143
|
+
this._statusCode = value;
|
|
144
|
+
res.status(value);
|
|
145
|
+
},
|
|
146
|
+
_statusCode: 200,
|
|
147
|
+
};
|
|
148
|
+
const isLimited = await this.rateLimiter.check(nodeReq, nodeRes);
|
|
149
|
+
if (isLimited) {
|
|
150
|
+
return; // Rate limiter already sent response
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Validate authentication
|
|
154
|
+
if (this.options.validateAuth) {
|
|
155
|
+
const isAuthenticated = await this.options.validateAuth(req);
|
|
156
|
+
if (!isAuthenticated) {
|
|
157
|
+
const format = (0, response_formatter_js_1.detectProviderFormat)(req.url || '');
|
|
158
|
+
res.status(401);
|
|
159
|
+
res.send(this.formatErrorResponse(new Error('Unauthorized'), 401, format));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Parse request (create explicit object instead of spread to ensure all properties are copied)
|
|
164
|
+
const parsedRequest = {
|
|
165
|
+
method: req.method,
|
|
166
|
+
url: req.url,
|
|
167
|
+
headers: req.headers,
|
|
168
|
+
body: req.body,
|
|
169
|
+
params: req.params,
|
|
170
|
+
query: req.query,
|
|
171
|
+
ip: req.ip,
|
|
172
|
+
stream: req.body?.stream === true,
|
|
173
|
+
};
|
|
174
|
+
// Log request if enabled
|
|
175
|
+
if (this.options.logging && this.options.log) {
|
|
176
|
+
this.options.log(`${parsedRequest.method} ${parsedRequest.url}`, parsedRequest.body);
|
|
177
|
+
}
|
|
178
|
+
// Check if request body exists for POST/PUT/PATCH
|
|
179
|
+
if (['POST', 'PUT', 'PATCH'].includes(parsedRequest.method) && !parsedRequest.body) {
|
|
180
|
+
const format = (0, response_formatter_js_1.detectProviderFormat)(parsedRequest.url || '');
|
|
181
|
+
res.status(400);
|
|
182
|
+
res.send(this.formatErrorResponse(new Error('Request body is required'), 400, format));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Match route if route matcher configured
|
|
186
|
+
let activeBridge = this.bridge;
|
|
187
|
+
if (this.routeMatcher) {
|
|
188
|
+
// Create minimal Node.js-like request for route matcher
|
|
189
|
+
// TODO: Refactor route matcher to use generic types
|
|
190
|
+
const nodeReq = {
|
|
191
|
+
url: req.url,
|
|
192
|
+
method: req.method,
|
|
193
|
+
};
|
|
194
|
+
const matchedRoute = this.routeMatcher.match(nodeReq);
|
|
195
|
+
if (!matchedRoute) {
|
|
196
|
+
res.status(404);
|
|
197
|
+
res.send({ error: 'Route not found' });
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// Use route-specific bridge if provided
|
|
201
|
+
if (matchedRoute.config.bridge) {
|
|
202
|
+
activeBridge = matchedRoute.config.bridge;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Apply custom headers
|
|
206
|
+
if (this.options.headers) {
|
|
207
|
+
for (const [key, value] of Object.entries(this.options.headers)) {
|
|
208
|
+
res.header(key, value);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Handle streaming or non-streaming request
|
|
212
|
+
if (this.options.streaming && parsedRequest.stream) {
|
|
213
|
+
// Handle streaming request
|
|
214
|
+
const stream = activeBridge.chatStream(parsedRequest.body);
|
|
215
|
+
// Convert to async generator for generic response
|
|
216
|
+
async function* convertStream() {
|
|
217
|
+
for await (const chunk of stream) {
|
|
218
|
+
yield chunk;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
await res.stream(convertStream());
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Handle non-streaming request
|
|
225
|
+
const response = await activeBridge.chat(parsedRequest.body);
|
|
226
|
+
// Send response
|
|
227
|
+
res.status(200);
|
|
228
|
+
res.send(response);
|
|
229
|
+
}
|
|
230
|
+
// Log response if enabled
|
|
231
|
+
if (this.options.logging && this.options.log) {
|
|
232
|
+
this.options.log(`${parsedRequest.method} ${parsedRequest.url} - 200 OK`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
// Handle errors
|
|
237
|
+
await this.handleError(error, req, res);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Handle errors
|
|
242
|
+
*/
|
|
243
|
+
async handleError(error, req, res) {
|
|
244
|
+
// Log error if enabled
|
|
245
|
+
if (this.options.logging && this.options.log) {
|
|
246
|
+
this.options.log(`Error: ${req.method} ${req.url}`, error);
|
|
247
|
+
}
|
|
248
|
+
// Call error handler
|
|
249
|
+
if (this.options.onError) {
|
|
250
|
+
await this.options.onError(error, req, res);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// Use built-in error formatting
|
|
254
|
+
const format = (0, response_formatter_js_1.detectProviderFormat)(req.url || '');
|
|
255
|
+
const statusCode = this.getErrorStatusCode(error);
|
|
256
|
+
res.status(statusCode);
|
|
257
|
+
res.send(this.formatErrorResponse(error, statusCode, format));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Check if origin is allowed
|
|
262
|
+
*/
|
|
263
|
+
isOriginAllowed(origin, allowedOrigin) {
|
|
264
|
+
if (!origin) {
|
|
265
|
+
return true; // Allow requests without origin header
|
|
266
|
+
}
|
|
267
|
+
if (typeof allowedOrigin === 'string') {
|
|
268
|
+
return allowedOrigin === '*' || allowedOrigin === origin;
|
|
269
|
+
}
|
|
270
|
+
if (Array.isArray(allowedOrigin)) {
|
|
271
|
+
return allowedOrigin.includes(origin) || allowedOrigin.includes('*');
|
|
272
|
+
}
|
|
273
|
+
if (typeof allowedOrigin === 'function') {
|
|
274
|
+
return allowedOrigin(origin);
|
|
275
|
+
}
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get HTTP status code from error
|
|
280
|
+
*/
|
|
281
|
+
getErrorStatusCode(error) {
|
|
282
|
+
// Check for common error patterns
|
|
283
|
+
const message = error.message.toLowerCase();
|
|
284
|
+
if (message.includes('unauthorized') || message.includes('authentication')) {
|
|
285
|
+
return 401;
|
|
286
|
+
}
|
|
287
|
+
if (message.includes('forbidden') || message.includes('permission')) {
|
|
288
|
+
return 403;
|
|
289
|
+
}
|
|
290
|
+
if (message.includes('not found')) {
|
|
291
|
+
return 404;
|
|
292
|
+
}
|
|
293
|
+
if (message.includes('timeout')) {
|
|
294
|
+
return 408;
|
|
295
|
+
}
|
|
296
|
+
if (message.includes('conflict')) {
|
|
297
|
+
return 409;
|
|
298
|
+
}
|
|
299
|
+
if (message.includes('validation') || message.includes('invalid')) {
|
|
300
|
+
return 400;
|
|
301
|
+
}
|
|
302
|
+
// Default to 500 for unknown errors
|
|
303
|
+
return 500;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Format error response in provider-specific format
|
|
307
|
+
*/
|
|
308
|
+
formatErrorResponse(error, statusCode, format) {
|
|
309
|
+
if (format === 'openai') {
|
|
310
|
+
return {
|
|
311
|
+
error: {
|
|
312
|
+
message: error.message,
|
|
313
|
+
type: 'server_error',
|
|
314
|
+
code: statusCode >= 500 ? 'internal_server_error' : 'invalid_request_error',
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
if (format === 'anthropic') {
|
|
319
|
+
return {
|
|
320
|
+
type: 'error',
|
|
321
|
+
error: {
|
|
322
|
+
type: statusCode >= 500 ? 'api_error' : 'invalid_request_error',
|
|
323
|
+
message: error.message,
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Generic format
|
|
328
|
+
return {
|
|
329
|
+
error: error.message,
|
|
330
|
+
statusCode,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
exports.CoreHTTPHandler = CoreHTTPHandler;
|
|
335
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Health Check Utilities
|
|
4
|
+
*
|
|
5
|
+
* Health check endpoint for monitoring and load balancers.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.HealthCheck = void 0;
|
|
11
|
+
exports.createHealthCheck = createHealthCheck;
|
|
12
|
+
exports.createHealthCheckMiddleware = createHealthCheckMiddleware;
|
|
13
|
+
exports.createReadinessCheck = createReadinessCheck;
|
|
14
|
+
exports.createLivenessCheck = createLivenessCheck;
|
|
15
|
+
/**
|
|
16
|
+
* Health check handler
|
|
17
|
+
*/
|
|
18
|
+
class HealthCheck {
|
|
19
|
+
config;
|
|
20
|
+
customChecks;
|
|
21
|
+
metadata;
|
|
22
|
+
startTime;
|
|
23
|
+
router;
|
|
24
|
+
constructor(bridgeOrRouter, config = {}) {
|
|
25
|
+
this.config = {
|
|
26
|
+
serviceName: 'ai.matey',
|
|
27
|
+
version: '1.0.0',
|
|
28
|
+
includeUptime: true,
|
|
29
|
+
includeChecks: true,
|
|
30
|
+
checkBackends: true,
|
|
31
|
+
...config,
|
|
32
|
+
};
|
|
33
|
+
this.customChecks = config.customChecks || {};
|
|
34
|
+
this.metadata = config.metadata || {};
|
|
35
|
+
this.startTime = Date.now();
|
|
36
|
+
// Detect if bridge or router
|
|
37
|
+
if ('getBackends' in bridgeOrRouter) {
|
|
38
|
+
this.router = bridgeOrRouter;
|
|
39
|
+
}
|
|
40
|
+
// Bridge support can be added in the future
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Perform health check
|
|
44
|
+
*/
|
|
45
|
+
async check() {
|
|
46
|
+
const checks = {};
|
|
47
|
+
// Basic system check
|
|
48
|
+
if (this.config.includeChecks) {
|
|
49
|
+
checks.system = {
|
|
50
|
+
status: 'healthy',
|
|
51
|
+
message: 'System operational',
|
|
52
|
+
};
|
|
53
|
+
// Check backend health (router only)
|
|
54
|
+
if (this.router && this.config.checkBackends) {
|
|
55
|
+
try {
|
|
56
|
+
// For now, assume healthy if router exists
|
|
57
|
+
// In the future, we can add a getBackends() method to Router
|
|
58
|
+
checks.backends = {
|
|
59
|
+
status: 'healthy',
|
|
60
|
+
message: 'Router operational',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
checks.backends = {
|
|
65
|
+
status: 'unhealthy',
|
|
66
|
+
message: 'Unable to check backends',
|
|
67
|
+
details: { error: error.message },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Run custom checks
|
|
72
|
+
for (const [name, checkFn] of Object.entries(this.customChecks)) {
|
|
73
|
+
try {
|
|
74
|
+
checks[name] = await checkFn();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
checks[name] = {
|
|
78
|
+
status: 'unhealthy',
|
|
79
|
+
message: `Check failed: ${error.message}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Determine overall status
|
|
85
|
+
const statuses = Object.values(checks).map((c) => c.status);
|
|
86
|
+
let overallStatus = 'healthy';
|
|
87
|
+
if (statuses.includes('unhealthy')) {
|
|
88
|
+
overallStatus = 'unhealthy';
|
|
89
|
+
}
|
|
90
|
+
else if (statuses.includes('degraded')) {
|
|
91
|
+
overallStatus = 'degraded';
|
|
92
|
+
}
|
|
93
|
+
const result = {
|
|
94
|
+
status: overallStatus,
|
|
95
|
+
timestamp: new Date().toISOString(),
|
|
96
|
+
service: this.config.serviceName,
|
|
97
|
+
version: this.config.version,
|
|
98
|
+
};
|
|
99
|
+
if (this.config.includeUptime) {
|
|
100
|
+
result.uptime = Date.now() - this.startTime;
|
|
101
|
+
}
|
|
102
|
+
if (this.config.includeChecks && Object.keys(checks).length > 0) {
|
|
103
|
+
result.checks = checks;
|
|
104
|
+
}
|
|
105
|
+
if (Object.keys(this.metadata).length > 0) {
|
|
106
|
+
result.metadata = this.metadata;
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Handle health check request
|
|
112
|
+
*/
|
|
113
|
+
async handle(_req, res) {
|
|
114
|
+
const result = await this.check();
|
|
115
|
+
// Set status code based on health
|
|
116
|
+
const statusCode = result.status === 'healthy' ? 200 : result.status === 'degraded' ? 200 : 503;
|
|
117
|
+
res.status(statusCode);
|
|
118
|
+
res.header('Content-Type', 'application/json');
|
|
119
|
+
res.header('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
120
|
+
res.send(result);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.HealthCheck = HealthCheck;
|
|
124
|
+
/**
|
|
125
|
+
* Create health check handler
|
|
126
|
+
*
|
|
127
|
+
* @param bridgeOrRouter - Bridge or Router instance
|
|
128
|
+
* @param config - Health check configuration
|
|
129
|
+
* @returns Health check handler
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* import { createHealthCheck } from 'ai.matey.http';
|
|
134
|
+
*
|
|
135
|
+
* const healthCheck = createHealthCheck(bridge, {
|
|
136
|
+
* serviceName: 'my-ai-service',
|
|
137
|
+
* version: '1.0.0',
|
|
138
|
+
* });
|
|
139
|
+
*
|
|
140
|
+
* // In your HTTP server:
|
|
141
|
+
* if (req.url === '/health') {
|
|
142
|
+
* await healthCheck.handle(req, res);
|
|
143
|
+
* }
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
function createHealthCheck(bridgeOrRouter, config) {
|
|
147
|
+
return new HealthCheck(bridgeOrRouter, config);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create simple health check middleware
|
|
151
|
+
*
|
|
152
|
+
* @param bridgeOrRouter - Bridge or Router instance
|
|
153
|
+
* @param path - Health check path (default: '/health')
|
|
154
|
+
* @param config - Health check configuration
|
|
155
|
+
* @returns Middleware function
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* import { createHealthCheckMiddleware } from 'ai.matey.http';
|
|
160
|
+
*
|
|
161
|
+
* const healthMiddleware = createHealthCheckMiddleware(bridge);
|
|
162
|
+
*
|
|
163
|
+
* // Use in HTTP server
|
|
164
|
+
* app.use(healthMiddleware);
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
function createHealthCheckMiddleware(bridgeOrRouter, path = '/health', config) {
|
|
168
|
+
const healthCheck = new HealthCheck(bridgeOrRouter, config);
|
|
169
|
+
return async (req, res) => {
|
|
170
|
+
if (req.url === path || req.url?.startsWith(`${path}?`)) {
|
|
171
|
+
await healthCheck.handle(req, res);
|
|
172
|
+
return true; // Handled
|
|
173
|
+
}
|
|
174
|
+
return false; // Not handled
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Readiness check (for Kubernetes)
|
|
179
|
+
*
|
|
180
|
+
* Returns 200 when service is ready to accept traffic.
|
|
181
|
+
*/
|
|
182
|
+
function createReadinessCheck(bridgeOrRouter) {
|
|
183
|
+
const healthCheck = new HealthCheck(bridgeOrRouter, {
|
|
184
|
+
includeUptime: false,
|
|
185
|
+
includeChecks: true,
|
|
186
|
+
checkBackends: true,
|
|
187
|
+
});
|
|
188
|
+
return async (_req, res) => {
|
|
189
|
+
const result = await healthCheck.check();
|
|
190
|
+
// Only ready if all checks are healthy
|
|
191
|
+
const isReady = result.status === 'healthy';
|
|
192
|
+
res.status(isReady ? 200 : 503);
|
|
193
|
+
res.header('Content-Type', 'application/json');
|
|
194
|
+
res.send({
|
|
195
|
+
ready: isReady,
|
|
196
|
+
timestamp: result.timestamp,
|
|
197
|
+
checks: result.checks,
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Liveness check (for Kubernetes)
|
|
203
|
+
*
|
|
204
|
+
* Returns 200 if service is alive (even if degraded).
|
|
205
|
+
*/
|
|
206
|
+
function createLivenessCheck() {
|
|
207
|
+
const startTime = Date.now();
|
|
208
|
+
return (_req, res) => {
|
|
209
|
+
res.status(200);
|
|
210
|
+
res.header('Content-Type', 'application/json');
|
|
211
|
+
res.send({
|
|
212
|
+
alive: true,
|
|
213
|
+
timestamp: new Date().toISOString(),
|
|
214
|
+
uptime: Date.now() - startTime,
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Core Module
|
|
4
|
+
*
|
|
5
|
+
* Framework-agnostic HTTP utilities for the Universal AI Adapter System.
|
|
6
|
+
* This package provides the core logic for HTTP request handling that can
|
|
7
|
+
* be adapted to any HTTP framework.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createLivenessCheck = exports.createReadinessCheck = exports.createHealthCheckMiddleware = exports.createHealthCheck = exports.HealthCheck = exports.applyPathPrefix = exports.normalizePath = exports.createDefaultRoutes = exports.RouteMatcher = exports.createAbortController = exports.supportsStreaming = exports.onClientDisconnect = exports.SSEKeepAlive = exports.handleStreamingRequest = exports.isServerError = exports.isClientError = exports.isRetryableError = exports.wrapErrorHandler = exports.createReportingErrorHandler = exports.createLoggingErrorHandler = exports.defaultErrorHandler = exports.combineKeyGenerators = exports.tokenKeyGenerator = exports.userIDKeyGenerator = exports.RateLimiter = exports.skipAuthForPaths = exports.requireAllAuth = exports.combineAuthValidators = exports.createBasicAuthValidator = exports.createAPIKeyValidator = exports.createBearerTokenValidator = exports.defaultAuthValidator = exports.isPreflight = exports.handlePreflight = exports.handleCORS = exports.normalizeCORSOptions = exports.detectProviderFormat = exports.sendNoContent = exports.sendText = exports.sendSSEError = exports.sendSSEDone = exports.sendSSEEvent = exports.sendSSEChunk = exports.sendSSEHeaders = exports.sendError = exports.sendJSON = exports.getClientIP = exports.extractBearerToken = exports.parseRequest = exports.CoreHTTPHandler = void 0;
|
|
13
|
+
// Core handler
|
|
14
|
+
var handler_js_1 = require("./handler.js");
|
|
15
|
+
Object.defineProperty(exports, "CoreHTTPHandler", { enumerable: true, get: function () { return handler_js_1.CoreHTTPHandler; } });
|
|
16
|
+
// Request parsing
|
|
17
|
+
var request_parser_js_1 = require("./request-parser.js");
|
|
18
|
+
Object.defineProperty(exports, "parseRequest", { enumerable: true, get: function () { return request_parser_js_1.parseRequest; } });
|
|
19
|
+
Object.defineProperty(exports, "extractBearerToken", { enumerable: true, get: function () { return request_parser_js_1.extractBearerToken; } });
|
|
20
|
+
Object.defineProperty(exports, "getClientIP", { enumerable: true, get: function () { return request_parser_js_1.getClientIP; } });
|
|
21
|
+
// Response formatting
|
|
22
|
+
var response_formatter_js_1 = require("./response-formatter.js");
|
|
23
|
+
Object.defineProperty(exports, "sendJSON", { enumerable: true, get: function () { return response_formatter_js_1.sendJSON; } });
|
|
24
|
+
Object.defineProperty(exports, "sendError", { enumerable: true, get: function () { return response_formatter_js_1.sendError; } });
|
|
25
|
+
Object.defineProperty(exports, "sendSSEHeaders", { enumerable: true, get: function () { return response_formatter_js_1.sendSSEHeaders; } });
|
|
26
|
+
Object.defineProperty(exports, "sendSSEChunk", { enumerable: true, get: function () { return response_formatter_js_1.sendSSEChunk; } });
|
|
27
|
+
Object.defineProperty(exports, "sendSSEEvent", { enumerable: true, get: function () { return response_formatter_js_1.sendSSEEvent; } });
|
|
28
|
+
Object.defineProperty(exports, "sendSSEDone", { enumerable: true, get: function () { return response_formatter_js_1.sendSSEDone; } });
|
|
29
|
+
Object.defineProperty(exports, "sendSSEError", { enumerable: true, get: function () { return response_formatter_js_1.sendSSEError; } });
|
|
30
|
+
Object.defineProperty(exports, "sendText", { enumerable: true, get: function () { return response_formatter_js_1.sendText; } });
|
|
31
|
+
Object.defineProperty(exports, "sendNoContent", { enumerable: true, get: function () { return response_formatter_js_1.sendNoContent; } });
|
|
32
|
+
Object.defineProperty(exports, "detectProviderFormat", { enumerable: true, get: function () { return response_formatter_js_1.detectProviderFormat; } });
|
|
33
|
+
// CORS
|
|
34
|
+
var cors_js_1 = require("./cors.js");
|
|
35
|
+
Object.defineProperty(exports, "normalizeCORSOptions", { enumerable: true, get: function () { return cors_js_1.normalizeCORSOptions; } });
|
|
36
|
+
Object.defineProperty(exports, "handleCORS", { enumerable: true, get: function () { return cors_js_1.handleCORS; } });
|
|
37
|
+
Object.defineProperty(exports, "handlePreflight", { enumerable: true, get: function () { return cors_js_1.handlePreflight; } });
|
|
38
|
+
Object.defineProperty(exports, "isPreflight", { enumerable: true, get: function () { return cors_js_1.isPreflight; } });
|
|
39
|
+
// Authentication
|
|
40
|
+
var auth_js_1 = require("./auth.js");
|
|
41
|
+
Object.defineProperty(exports, "defaultAuthValidator", { enumerable: true, get: function () { return auth_js_1.defaultAuthValidator; } });
|
|
42
|
+
Object.defineProperty(exports, "createBearerTokenValidator", { enumerable: true, get: function () { return auth_js_1.createBearerTokenValidator; } });
|
|
43
|
+
Object.defineProperty(exports, "createAPIKeyValidator", { enumerable: true, get: function () { return auth_js_1.createAPIKeyValidator; } });
|
|
44
|
+
Object.defineProperty(exports, "createBasicAuthValidator", { enumerable: true, get: function () { return auth_js_1.createBasicAuthValidator; } });
|
|
45
|
+
Object.defineProperty(exports, "combineAuthValidators", { enumerable: true, get: function () { return auth_js_1.combineAuthValidators; } });
|
|
46
|
+
Object.defineProperty(exports, "requireAllAuth", { enumerable: true, get: function () { return auth_js_1.requireAllAuth; } });
|
|
47
|
+
Object.defineProperty(exports, "skipAuthForPaths", { enumerable: true, get: function () { return auth_js_1.skipAuthForPaths; } });
|
|
48
|
+
// Rate limiting
|
|
49
|
+
var rate_limiter_js_1 = require("./rate-limiter.js");
|
|
50
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return rate_limiter_js_1.RateLimiter; } });
|
|
51
|
+
Object.defineProperty(exports, "userIDKeyGenerator", { enumerable: true, get: function () { return rate_limiter_js_1.userIDKeyGenerator; } });
|
|
52
|
+
Object.defineProperty(exports, "tokenKeyGenerator", { enumerable: true, get: function () { return rate_limiter_js_1.tokenKeyGenerator; } });
|
|
53
|
+
Object.defineProperty(exports, "combineKeyGenerators", { enumerable: true, get: function () { return rate_limiter_js_1.combineKeyGenerators; } });
|
|
54
|
+
// Error handling
|
|
55
|
+
var error_handler_js_1 = require("./error-handler.js");
|
|
56
|
+
Object.defineProperty(exports, "defaultErrorHandler", { enumerable: true, get: function () { return error_handler_js_1.defaultErrorHandler; } });
|
|
57
|
+
Object.defineProperty(exports, "createLoggingErrorHandler", { enumerable: true, get: function () { return error_handler_js_1.createLoggingErrorHandler; } });
|
|
58
|
+
Object.defineProperty(exports, "createReportingErrorHandler", { enumerable: true, get: function () { return error_handler_js_1.createReportingErrorHandler; } });
|
|
59
|
+
Object.defineProperty(exports, "wrapErrorHandler", { enumerable: true, get: function () { return error_handler_js_1.wrapErrorHandler; } });
|
|
60
|
+
Object.defineProperty(exports, "isRetryableError", { enumerable: true, get: function () { return error_handler_js_1.isRetryableError; } });
|
|
61
|
+
Object.defineProperty(exports, "isClientError", { enumerable: true, get: function () { return error_handler_js_1.isClientError; } });
|
|
62
|
+
Object.defineProperty(exports, "isServerError", { enumerable: true, get: function () { return error_handler_js_1.isServerError; } });
|
|
63
|
+
// Streaming
|
|
64
|
+
var streaming_handler_js_1 = require("./streaming-handler.js");
|
|
65
|
+
Object.defineProperty(exports, "handleStreamingRequest", { enumerable: true, get: function () { return streaming_handler_js_1.handleStreamingRequest; } });
|
|
66
|
+
Object.defineProperty(exports, "SSEKeepAlive", { enumerable: true, get: function () { return streaming_handler_js_1.SSEKeepAlive; } });
|
|
67
|
+
Object.defineProperty(exports, "onClientDisconnect", { enumerable: true, get: function () { return streaming_handler_js_1.onClientDisconnect; } });
|
|
68
|
+
Object.defineProperty(exports, "supportsStreaming", { enumerable: true, get: function () { return streaming_handler_js_1.supportsStreaming; } });
|
|
69
|
+
Object.defineProperty(exports, "createAbortController", { enumerable: true, get: function () { return streaming_handler_js_1.createAbortController; } });
|
|
70
|
+
// Routing
|
|
71
|
+
var route_matcher_js_1 = require("./route-matcher.js");
|
|
72
|
+
Object.defineProperty(exports, "RouteMatcher", { enumerable: true, get: function () { return route_matcher_js_1.RouteMatcher; } });
|
|
73
|
+
Object.defineProperty(exports, "createDefaultRoutes", { enumerable: true, get: function () { return route_matcher_js_1.createDefaultRoutes; } });
|
|
74
|
+
Object.defineProperty(exports, "normalizePath", { enumerable: true, get: function () { return route_matcher_js_1.normalizePath; } });
|
|
75
|
+
Object.defineProperty(exports, "applyPathPrefix", { enumerable: true, get: function () { return route_matcher_js_1.applyPathPrefix; } });
|
|
76
|
+
// Health checks
|
|
77
|
+
var health_js_1 = require("./health.js");
|
|
78
|
+
Object.defineProperty(exports, "HealthCheck", { enumerable: true, get: function () { return health_js_1.HealthCheck; } });
|
|
79
|
+
Object.defineProperty(exports, "createHealthCheck", { enumerable: true, get: function () { return health_js_1.createHealthCheck; } });
|
|
80
|
+
Object.defineProperty(exports, "createHealthCheckMiddleware", { enumerable: true, get: function () { return health_js_1.createHealthCheckMiddleware; } });
|
|
81
|
+
Object.defineProperty(exports, "createReadinessCheck", { enumerable: true, get: function () { return health_js_1.createReadinessCheck; } });
|
|
82
|
+
Object.defineProperty(exports, "createLivenessCheck", { enumerable: true, get: function () { return health_js_1.createLivenessCheck; } });
|
|
83
|
+
//# sourceMappingURL=index.js.map
|