ai.matey.http.core 0.2.0 → 0.3.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/CHANGELOG.md +24 -0
- package/dist/cjs/handler.js +132 -32
- package/dist/cjs/handler.js.map +1 -1
- package/dist/cjs/index.js +18 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/metrics.js +185 -0
- package/dist/cjs/metrics.js.map +1 -0
- package/dist/cjs/rate-limiter.js +106 -1
- package/dist/cjs/rate-limiter.js.map +1 -1
- package/dist/cjs/route-matcher.js +2 -1
- package/dist/cjs/route-matcher.js.map +1 -1
- package/dist/esm/handler.js +133 -33
- package/dist/esm/handler.js.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/metrics.js +179 -0
- package/dist/esm/metrics.js.map +1 -0
- package/dist/esm/rate-limiter.js +104 -0
- package/dist/esm/rate-limiter.js.map +1 -1
- package/dist/esm/route-matcher.js +2 -1
- package/dist/esm/route-matcher.js.map +1 -1
- package/dist/types/handler.d.ts +9 -0
- package/dist/types/handler.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/metrics.d.ts +52 -0
- package/dist/types/metrics.d.ts.map +1 -0
- package/dist/types/rate-limiter.d.ts +36 -1
- package/dist/types/rate-limiter.d.ts.map +1 -1
- package/dist/types/route-matcher.d.ts +14 -2
- package/dist/types/route-matcher.d.ts.map +1 -1
- package/dist/types/types.d.ts +38 -0
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus Metrics
|
|
3
|
+
*
|
|
4
|
+
* Pull-based metrics endpoint: formats Bridge/Router statistics (which are
|
|
5
|
+
* already tracked internally) as Prometheus text exposition format v0.0.4.
|
|
6
|
+
* No new instrumentation and no dependencies.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Format samples as Prometheus text exposition format.
|
|
12
|
+
*
|
|
13
|
+
* Samples with the same name share one HELP/TYPE header; label values are
|
|
14
|
+
* escaped per the spec.
|
|
15
|
+
*/
|
|
16
|
+
export function formatPrometheus(samples) {
|
|
17
|
+
const lines = [];
|
|
18
|
+
const seenHeaders = new Set();
|
|
19
|
+
for (const sample of samples) {
|
|
20
|
+
if (!seenHeaders.has(sample.name)) {
|
|
21
|
+
seenHeaders.add(sample.name);
|
|
22
|
+
if (sample.help) {
|
|
23
|
+
lines.push(`# HELP ${sample.name} ${escapeHelp(sample.help)}`);
|
|
24
|
+
}
|
|
25
|
+
lines.push(`# TYPE ${sample.name} ${sample.type === 'summary' ? 'gauge' : sample.type}`);
|
|
26
|
+
}
|
|
27
|
+
const labels = sample.labels
|
|
28
|
+
? `{${Object.entries(sample.labels)
|
|
29
|
+
.map(([key, value]) => `${key}="${escapeLabel(value)}"`)
|
|
30
|
+
.join(',')}}`
|
|
31
|
+
: '';
|
|
32
|
+
lines.push(`${sample.name}${labels} ${formatValue(sample.value)}`);
|
|
33
|
+
}
|
|
34
|
+
return lines.join('\n') + '\n';
|
|
35
|
+
}
|
|
36
|
+
function escapeHelp(text) {
|
|
37
|
+
return text.replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
|
|
38
|
+
}
|
|
39
|
+
function escapeLabel(text) {
|
|
40
|
+
return text.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n');
|
|
41
|
+
}
|
|
42
|
+
function formatValue(value) {
|
|
43
|
+
if (Number.isNaN(value)) {
|
|
44
|
+
return 'NaN';
|
|
45
|
+
}
|
|
46
|
+
if (!Number.isFinite(value)) {
|
|
47
|
+
return value > 0 ? '+Inf' : '-Inf';
|
|
48
|
+
}
|
|
49
|
+
return String(value);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Collect metrics from a Bridge's built-in statistics.
|
|
53
|
+
*/
|
|
54
|
+
export function collectBridgeMetrics(bridge, prefix = 'ai_matey') {
|
|
55
|
+
const stats = bridge.getStats();
|
|
56
|
+
const samples = [
|
|
57
|
+
{
|
|
58
|
+
name: `${prefix}_requests_total`,
|
|
59
|
+
type: 'counter',
|
|
60
|
+
help: 'Total requests through the bridge',
|
|
61
|
+
value: stats.totalRequests,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: `${prefix}_requests_successful_total`,
|
|
65
|
+
type: 'counter',
|
|
66
|
+
help: 'Successful requests',
|
|
67
|
+
value: stats.successfulRequests,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: `${prefix}_requests_failed_total`,
|
|
71
|
+
type: 'counter',
|
|
72
|
+
help: 'Failed requests',
|
|
73
|
+
value: stats.failedRequests,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: `${prefix}_streaming_requests_total`,
|
|
77
|
+
type: 'counter',
|
|
78
|
+
help: 'Streaming requests',
|
|
79
|
+
value: stats.streamingRequests,
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
const latencyByQuantile = {
|
|
83
|
+
'50': stats.p50LatencyMs,
|
|
84
|
+
'95': stats.p95LatencyMs,
|
|
85
|
+
'99': stats.p99LatencyMs,
|
|
86
|
+
};
|
|
87
|
+
for (const [quantile, value] of Object.entries(latencyByQuantile)) {
|
|
88
|
+
if (typeof value === 'number' && !Number.isNaN(value)) {
|
|
89
|
+
samples.push({
|
|
90
|
+
name: `${prefix}_request_latency_ms`,
|
|
91
|
+
type: 'summary',
|
|
92
|
+
help: 'Request latency percentiles in milliseconds',
|
|
93
|
+
labels: { quantile },
|
|
94
|
+
value,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
for (const [code, count] of Object.entries(stats.errorBreakdown ?? {})) {
|
|
99
|
+
samples.push({
|
|
100
|
+
name: `${prefix}_errors_total`,
|
|
101
|
+
type: 'counter',
|
|
102
|
+
help: 'Errors by code',
|
|
103
|
+
labels: { code },
|
|
104
|
+
value: count,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return samples;
|
|
108
|
+
}
|
|
109
|
+
const CIRCUIT_STATES = ['closed', 'open', 'half-open'];
|
|
110
|
+
/**
|
|
111
|
+
* Collect metrics from a Router's per-backend statistics.
|
|
112
|
+
*/
|
|
113
|
+
export function collectRouterMetrics(router, prefix = 'ai_matey') {
|
|
114
|
+
const samples = [];
|
|
115
|
+
for (const info of router.getBackendInfo()) {
|
|
116
|
+
const labels = { backend: info.name };
|
|
117
|
+
samples.push({
|
|
118
|
+
name: `${prefix}_backend_up`,
|
|
119
|
+
type: 'gauge',
|
|
120
|
+
help: 'Backend health (1 = healthy)',
|
|
121
|
+
labels,
|
|
122
|
+
value: info.isHealthy ? 1 : 0,
|
|
123
|
+
}, {
|
|
124
|
+
name: `${prefix}_backend_requests_total`,
|
|
125
|
+
type: 'counter',
|
|
126
|
+
help: 'Requests per backend',
|
|
127
|
+
labels,
|
|
128
|
+
value: info.stats.totalRequests,
|
|
129
|
+
}, {
|
|
130
|
+
name: `${prefix}_backend_failures_total`,
|
|
131
|
+
type: 'counter',
|
|
132
|
+
help: 'Failed requests per backend',
|
|
133
|
+
labels,
|
|
134
|
+
value: info.stats.failedRequests,
|
|
135
|
+
}, {
|
|
136
|
+
name: `${prefix}_backend_cost_usd_total`,
|
|
137
|
+
type: 'counter',
|
|
138
|
+
help: 'Estimated cost per backend in USD',
|
|
139
|
+
labels,
|
|
140
|
+
value: info.stats.totalCost ?? 0,
|
|
141
|
+
});
|
|
142
|
+
for (const state of CIRCUIT_STATES) {
|
|
143
|
+
samples.push({
|
|
144
|
+
name: `${prefix}_backend_circuit_state`,
|
|
145
|
+
type: 'gauge',
|
|
146
|
+
help: 'Circuit breaker state (1 = active state)',
|
|
147
|
+
labels: { ...labels, state },
|
|
148
|
+
value: info.circuitBreakerState === state ? 1 : 0,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (typeof info.stats.averageLatencyMs === 'number') {
|
|
152
|
+
samples.push({
|
|
153
|
+
name: `${prefix}_backend_latency_avg_ms`,
|
|
154
|
+
type: 'gauge',
|
|
155
|
+
help: 'Average latency per backend in milliseconds',
|
|
156
|
+
labels,
|
|
157
|
+
value: info.stats.averageLatencyMs,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return samples;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Create a GET /metrics handler emitting Prometheus text format.
|
|
165
|
+
*/
|
|
166
|
+
export function createMetricsHandler(options) {
|
|
167
|
+
const prefix = options.prefix ?? 'ai_matey';
|
|
168
|
+
return (_req, res) => {
|
|
169
|
+
const samples = [
|
|
170
|
+
...(options.bridge ? collectBridgeMetrics(options.bridge, prefix) : []),
|
|
171
|
+
...(options.router ? collectRouterMetrics(options.router, prefix) : []),
|
|
172
|
+
...(options.custom ? options.custom() : []),
|
|
173
|
+
];
|
|
174
|
+
res.status(200);
|
|
175
|
+
res.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');
|
|
176
|
+
res.send(formatPrometheus(samples));
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/rate-limiter.js
CHANGED
|
@@ -7,6 +7,110 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { getClientIP } from './request-parser.js';
|
|
9
9
|
import { sendJSON } from './response-formatter.js';
|
|
10
|
+
/**
|
|
11
|
+
* Framework-agnostic rate limiter operating on GenericRequest/GenericResponse.
|
|
12
|
+
*
|
|
13
|
+
* Used by CoreHTTPHandler so every framework adapter (Express, Fastify, Hono,
|
|
14
|
+
* Koa, Node, Deno) shares one implementation without Node-specific shims.
|
|
15
|
+
*/
|
|
16
|
+
export class GenericRateLimiter {
|
|
17
|
+
options;
|
|
18
|
+
store;
|
|
19
|
+
cleanupIntervalId;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.options = {
|
|
22
|
+
max: options.max,
|
|
23
|
+
windowMs: options.windowMs ?? 60000,
|
|
24
|
+
keyGenerator: options.keyGenerator ?? ((req) => req.ip ?? 'unknown'),
|
|
25
|
+
handler: options.handler ?? defaultGenericRateLimitHandler,
|
|
26
|
+
skip: options.skip ?? (() => false),
|
|
27
|
+
headers: options.headers ?? true,
|
|
28
|
+
};
|
|
29
|
+
this.store = new Map();
|
|
30
|
+
this.cleanupIntervalId = setInterval(() => this.cleanup(), this.options.windowMs);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a request should be rate limited.
|
|
34
|
+
*
|
|
35
|
+
* @returns true when the request was rejected (response already sent)
|
|
36
|
+
*/
|
|
37
|
+
async check(req, res) {
|
|
38
|
+
if (await this.options.skip(req)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const key = this.options.keyGenerator(req);
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
let state = this.store.get(key);
|
|
44
|
+
if (!state || now >= state.resetTime) {
|
|
45
|
+
state = { count: 0, resetTime: now + this.options.windowMs };
|
|
46
|
+
this.store.set(key, state);
|
|
47
|
+
}
|
|
48
|
+
state.count++;
|
|
49
|
+
if (this.options.headers) {
|
|
50
|
+
res.header('X-RateLimit-Limit', String(this.options.max));
|
|
51
|
+
res.header('X-RateLimit-Remaining', String(Math.max(0, this.options.max - state.count)));
|
|
52
|
+
res.header('X-RateLimit-Reset', String(Math.ceil(state.resetTime / 1000)));
|
|
53
|
+
}
|
|
54
|
+
if (state.count > this.options.max) {
|
|
55
|
+
const retryAfter = Math.ceil((state.resetTime - now) / 1000);
|
|
56
|
+
if (this.options.headers) {
|
|
57
|
+
res.header('Retry-After', String(retryAfter));
|
|
58
|
+
}
|
|
59
|
+
await this.options.handler(req, res, retryAfter);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Reset rate limit for a specific key.
|
|
66
|
+
*/
|
|
67
|
+
reset(key) {
|
|
68
|
+
this.store.delete(key);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reset all rate limits.
|
|
72
|
+
*/
|
|
73
|
+
resetAll() {
|
|
74
|
+
this.store.clear();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get current state for a key.
|
|
78
|
+
*/
|
|
79
|
+
getState(key) {
|
|
80
|
+
return this.store.get(key);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Dispose of the rate limiter and clean up resources.
|
|
84
|
+
*/
|
|
85
|
+
dispose() {
|
|
86
|
+
if (this.cleanupIntervalId) {
|
|
87
|
+
clearInterval(this.cleanupIntervalId);
|
|
88
|
+
this.cleanupIntervalId = undefined;
|
|
89
|
+
}
|
|
90
|
+
this.store.clear();
|
|
91
|
+
}
|
|
92
|
+
cleanup() {
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
for (const [key, state] of this.store.entries()) {
|
|
95
|
+
if (now >= state.resetTime) {
|
|
96
|
+
this.store.delete(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Default rate limit handler for the generic limiter.
|
|
103
|
+
*/
|
|
104
|
+
function defaultGenericRateLimitHandler(_req, res, retryAfter) {
|
|
105
|
+
res.status(429);
|
|
106
|
+
res.send({
|
|
107
|
+
error: {
|
|
108
|
+
message: 'Too many requests, please try again later.',
|
|
109
|
+
type: 'rate_limit_exceeded',
|
|
110
|
+
retryAfter,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
10
114
|
/**
|
|
11
115
|
* Rate limiter class
|
|
12
116
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,8 @@ export class RouteMatcher {
|
|
|
17
17
|
* Match request to a route
|
|
18
18
|
*/
|
|
19
19
|
match(req) {
|
|
20
|
-
const
|
|
20
|
+
const host = Array.isArray(req.headers?.host) ? req.headers.host[0] : req.headers?.host;
|
|
21
|
+
const url = new URL(req.url || '/', `http://${host || 'localhost'}`);
|
|
21
22
|
const path = url.pathname;
|
|
22
23
|
const method = req.method?.toUpperCase() || 'GET';
|
|
23
24
|
for (const route of this.routes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-matcher.js","sourceRoot":"","sources":["../../src/route-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"route-matcher.js","sourceRoot":"","sources":["../../src/route-matcher.ts"],"names":[],"mappings":"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"}
|
package/dist/types/handler.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ export declare class CoreHTTPHandler {
|
|
|
15
15
|
private readonly options;
|
|
16
16
|
private readonly rateLimiter;
|
|
17
17
|
private readonly routeMatcher;
|
|
18
|
+
private readonly routeRateLimiters;
|
|
19
|
+
private readonly healthHandlers;
|
|
20
|
+
private readonly metricsHandler;
|
|
18
21
|
constructor(options: CoreHandlerOptions);
|
|
19
22
|
/**
|
|
20
23
|
* Dispose of the handler and release resources.
|
|
@@ -28,6 +31,12 @@ export declare class CoreHTTPHandler {
|
|
|
28
31
|
/**
|
|
29
32
|
* Handle errors
|
|
30
33
|
*/
|
|
34
|
+
/**
|
|
35
|
+
* Serve built-in health/metrics/embeddings endpoints.
|
|
36
|
+
*
|
|
37
|
+
* @returns true when the request was handled
|
|
38
|
+
*/
|
|
39
|
+
private handleBuiltinEndpoints;
|
|
31
40
|
private handleError;
|
|
32
41
|
/**
|
|
33
42
|
* Check if origin is allowed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,EAEnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AASpB;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAqBtB;IACF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAC3E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAItB;IACT,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+D;gBAElF,OAAO,EAAE,kBAAkB;IAgEvC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoMtE;;OAEG;IACH;;;;OAIG;YACW,sBAAsB;YAoFtB,WAAW;IAuBzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA+B5B"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -13,9 +13,10 @@ export { parseRequest, extractBearerToken, getClientIP } from './request-parser.
|
|
|
13
13
|
export { sendJSON, sendError, sendSSEHeaders, sendSSEChunk, sendSSEEvent, sendSSEDone, sendSSEError, sendText, sendNoContent, detectProviderFormat, } from './response-formatter.js';
|
|
14
14
|
export { normalizeCORSOptions, handleCORS, handlePreflight, isPreflight } from './cors.js';
|
|
15
15
|
export { defaultAuthValidator, createBearerTokenValidator, createAPIKeyValidator, createBasicAuthValidator, combineAuthValidators, requireAllAuth, skipAuthForPaths, } from './auth.js';
|
|
16
|
-
export { RateLimiter, userIDKeyGenerator, tokenKeyGenerator, combineKeyGenerators, } from './rate-limiter.js';
|
|
16
|
+
export { RateLimiter, GenericRateLimiter, userIDKeyGenerator, tokenKeyGenerator, combineKeyGenerators, } from './rate-limiter.js';
|
|
17
17
|
export { defaultErrorHandler, createLoggingErrorHandler, createReportingErrorHandler, wrapErrorHandler, isRetryableError, isClientError, isServerError, } from './error-handler.js';
|
|
18
18
|
export { handleStreamingRequest, SSEKeepAlive, onClientDisconnect, supportsStreaming, createAbortController, } from './streaming-handler.js';
|
|
19
19
|
export { RouteMatcher, createDefaultRoutes, normalizePath, applyPathPrefix, } from './route-matcher.js';
|
|
20
20
|
export { HealthCheck, createHealthCheck, createHealthCheckMiddleware, createReadinessCheck, createLivenessCheck, type HealthCheckConfig, type HealthCheckResult, type HealthStatus, type ComponentHealth, } from './health.js';
|
|
21
|
+
export * from './metrics.js';
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3F,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3F,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus Metrics
|
|
3
|
+
*
|
|
4
|
+
* Pull-based metrics endpoint: formats Bridge/Router statistics (which are
|
|
5
|
+
* already tracked internally) as Prometheus text exposition format v0.0.4.
|
|
6
|
+
* No new instrumentation and no dependencies.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { GenericRequest, GenericResponse } from './types.js';
|
|
11
|
+
import type { Bridge, Router } from 'ai.matey.core';
|
|
12
|
+
/**
|
|
13
|
+
* A single metric sample.
|
|
14
|
+
*/
|
|
15
|
+
export interface MetricSample {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly type: 'counter' | 'gauge' | 'summary';
|
|
18
|
+
readonly help?: string;
|
|
19
|
+
readonly labels?: Record<string, string>;
|
|
20
|
+
readonly value: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Format samples as Prometheus text exposition format.
|
|
24
|
+
*
|
|
25
|
+
* Samples with the same name share one HELP/TYPE header; label values are
|
|
26
|
+
* escaped per the spec.
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatPrometheus(samples: readonly MetricSample[]): string;
|
|
29
|
+
/**
|
|
30
|
+
* Collect metrics from a Bridge's built-in statistics.
|
|
31
|
+
*/
|
|
32
|
+
export declare function collectBridgeMetrics(bridge: Bridge, prefix?: string): MetricSample[];
|
|
33
|
+
/**
|
|
34
|
+
* Collect metrics from a Router's per-backend statistics.
|
|
35
|
+
*/
|
|
36
|
+
export declare function collectRouterMetrics(router: Router, prefix?: string): MetricSample[];
|
|
37
|
+
/**
|
|
38
|
+
* Options for the metrics handler.
|
|
39
|
+
*/
|
|
40
|
+
export interface MetricsHandlerOptions {
|
|
41
|
+
readonly bridge?: Bridge;
|
|
42
|
+
readonly router?: Router;
|
|
43
|
+
/** Additional samples (custom gauges, cost summaries, ...). */
|
|
44
|
+
readonly custom?: () => MetricSample[];
|
|
45
|
+
/** Metric name prefix. @default 'ai_matey' */
|
|
46
|
+
readonly prefix?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a GET /metrics handler emitting Prometheus text format.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createMetricsHandler(options: MetricsHandlerOptions): (req: GenericRequest, res: GenericResponse) => void;
|
|
52
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAsBzE;AAoBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAa,GAAG,YAAY,EAAE,CAyDxF;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAa,GAAG,YAAY,EAAE,CA2DxF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;IACvC,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAcrD"}
|
|
@@ -6,7 +6,42 @@
|
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
8
|
import type { IncomingMessage, ServerResponse } from 'http';
|
|
9
|
-
import type { RateLimitOptions, RateLimitState } from './types.js';
|
|
9
|
+
import type { GenericRateLimitOptions, GenericRequest, GenericResponse, RateLimitOptions, RateLimitState } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Framework-agnostic rate limiter operating on GenericRequest/GenericResponse.
|
|
12
|
+
*
|
|
13
|
+
* Used by CoreHTTPHandler so every framework adapter (Express, Fastify, Hono,
|
|
14
|
+
* Koa, Node, Deno) shares one implementation without Node-specific shims.
|
|
15
|
+
*/
|
|
16
|
+
export declare class GenericRateLimiter {
|
|
17
|
+
private readonly options;
|
|
18
|
+
private readonly store;
|
|
19
|
+
private cleanupIntervalId;
|
|
20
|
+
constructor(options: GenericRateLimitOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Check if a request should be rate limited.
|
|
23
|
+
*
|
|
24
|
+
* @returns true when the request was rejected (response already sent)
|
|
25
|
+
*/
|
|
26
|
+
check(req: GenericRequest, res: GenericResponse): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Reset rate limit for a specific key.
|
|
29
|
+
*/
|
|
30
|
+
reset(key: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Reset all rate limits.
|
|
33
|
+
*/
|
|
34
|
+
resetAll(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get current state for a key.
|
|
37
|
+
*/
|
|
38
|
+
getState(key: string): RateLimitState | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Dispose of the rate limiter and clean up resources.
|
|
41
|
+
*/
|
|
42
|
+
dispose(): void;
|
|
43
|
+
private cleanup;
|
|
44
|
+
}
|
|
10
45
|
/**
|
|
11
46
|
* Rate limiter class
|
|
12
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAIpB;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,OAAO,EAAE,uBAAuB;IAa5C;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCxE;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIjD;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,OAAO;CAQhB;AAoBD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,OAAO,EAAE,gBAAgB;IAgBrC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAgDxE;;OAEG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;CAGlD;AA8BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAI/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAQ9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,EAAE,GAClD,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAKlC"}
|
|
@@ -5,8 +5,20 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
|
-
import type { IncomingMessage } from 'http';
|
|
9
8
|
import type { RouteConfig, MatchedRoute } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Minimal request shape needed for route matching.
|
|
11
|
+
*
|
|
12
|
+
* Structurally satisfied by Node's IncomingMessage and by GenericRequest,
|
|
13
|
+
* so any framework adapter can pass its request straight through.
|
|
14
|
+
*/
|
|
15
|
+
export interface RouteMatchable {
|
|
16
|
+
url?: string;
|
|
17
|
+
method?: string;
|
|
18
|
+
headers?: {
|
|
19
|
+
host?: string | string[];
|
|
20
|
+
} & Record<string, unknown>;
|
|
21
|
+
}
|
|
10
22
|
/**
|
|
11
23
|
* Route matcher class
|
|
12
24
|
*/
|
|
@@ -16,7 +28,7 @@ export declare class RouteMatcher {
|
|
|
16
28
|
/**
|
|
17
29
|
* Match request to a route
|
|
18
30
|
*/
|
|
19
|
-
match(req:
|
|
31
|
+
match(req: RouteMatchable): MatchedRoute | null;
|
|
20
32
|
/**
|
|
21
33
|
* Add a route
|
|
22
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-matcher.d.ts","sourceRoot":"","sources":["../../src/route-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"route-matcher.d.ts","sourceRoot":"","sources":["../../src/route-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClE;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,WAAW,EAAE;IAIjC;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI;IA0B/C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIlC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IASlC;;OAEG;IACH,SAAS,IAAI,SAAS,WAAW,EAAE;CAGpC;AAkFD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW,EAAE,CAsBrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAOpF"}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -59,6 +59,11 @@ export interface RouteConfig {
|
|
|
59
59
|
* Optional bridge to use (overrides default)
|
|
60
60
|
*/
|
|
61
61
|
bridge?: Bridge;
|
|
62
|
+
/**
|
|
63
|
+
* Per-route rate limit. Replaces the handler's global rate limit for
|
|
64
|
+
* requests matching this route.
|
|
65
|
+
*/
|
|
66
|
+
rateLimit?: GenericRateLimitOptions;
|
|
62
67
|
}
|
|
63
68
|
/**
|
|
64
69
|
* Matched route information
|
|
@@ -229,6 +234,39 @@ export interface CoreHandlerOptions {
|
|
|
229
234
|
* Route configurations for multi-endpoint support
|
|
230
235
|
*/
|
|
231
236
|
routes?: RouteConfig[];
|
|
237
|
+
/**
|
|
238
|
+
* Built-in health endpoints. When enabled, GET {path}, {path}/ready,
|
|
239
|
+
* and {path}/live are served before route matching.
|
|
240
|
+
* @default disabled
|
|
241
|
+
*/
|
|
242
|
+
health?: {
|
|
243
|
+
enabled: boolean;
|
|
244
|
+
/** Base path. @default '/health' */
|
|
245
|
+
path?: string;
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* Built-in Prometheus metrics endpoint (GET, text exposition format).
|
|
249
|
+
* @default disabled
|
|
250
|
+
*/
|
|
251
|
+
metrics?: {
|
|
252
|
+
enabled: boolean;
|
|
253
|
+
/** Endpoint path. @default '/metrics' */
|
|
254
|
+
path?: string;
|
|
255
|
+
/** Require validateAuth for scrapes. @default true when validateAuth is set */
|
|
256
|
+
auth?: boolean;
|
|
257
|
+
/** Metric name prefix. @default 'ai_matey' */
|
|
258
|
+
prefix?: string;
|
|
259
|
+
};
|
|
260
|
+
/**
|
|
261
|
+
* OpenAI-compatible embeddings endpoint (POST {path}), executed via the
|
|
262
|
+
* bridge's backend `embed()` capability.
|
|
263
|
+
* @default disabled
|
|
264
|
+
*/
|
|
265
|
+
embeddings?: {
|
|
266
|
+
enabled: boolean;
|
|
267
|
+
/** Endpoint path. @default '/v1/embeddings' */
|
|
268
|
+
path?: string;
|
|
269
|
+
};
|
|
232
270
|
/**
|
|
233
271
|
* Enable request/response logging
|
|
234
272
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMtD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAE3D;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE5B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEnC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEnC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,QAAQ,EAAE,eAAe,CAAC;IAE1B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|