@morojs/moro 1.8.3 → 1.8.5
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/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/framework.d.ts +11 -0
- package/dist/core/framework.js +107 -36
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/grpc/types.js.map +1 -1
- package/dist/core/http/http-server.js +18 -1
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.js +13 -0
- package/dist/core/http/http2-server.js.map +1 -1
- package/dist/core/http/moro-engine-server.js +13 -0
- package/dist/core/http/moro-engine-server.js.map +1 -1
- package/dist/core/http/uws-http-server.js +16 -1
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/mail/mail-adapter.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js +5 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/cloudwatch/index.d.ts +4 -0
- package/dist/core/middleware/built-in/cloudwatch/index.js +5 -0
- package/dist/core/middleware/built-in/cloudwatch/index.js.map +1 -0
- package/dist/core/middleware/built-in/cloudwatch/middleware.d.ts +31 -0
- package/dist/core/middleware/built-in/cloudwatch/middleware.js +52 -0
- package/dist/core/middleware/built-in/cloudwatch/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.d.ts +3 -1
- package/dist/core/middleware/built-in/error-tracker/index.js +3 -2
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +6 -3
- package/dist/core/middleware/built-in/error-tracker/middleware.js +18 -13
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +43 -7
- package/dist/core/middleware/built-in/index.js +37 -7
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.d.ts +3 -1
- package/dist/core/middleware/built-in/performance-monitor/index.js +3 -2
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +3 -3
- package/dist/core/middleware/built-in/performance-monitor/middleware.js +19 -17
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/prometheus/core.d.ts +27 -0
- package/dist/core/middleware/built-in/prometheus/core.js +0 -0
- package/dist/core/middleware/built-in/prometheus/core.js.map +1 -0
- package/dist/core/middleware/built-in/prometheus/index.d.ts +5 -0
- package/dist/core/middleware/built-in/prometheus/index.js +6 -0
- package/dist/core/middleware/built-in/prometheus/index.js.map +1 -0
- package/dist/core/middleware/built-in/prometheus/middleware.d.ts +15 -0
- package/dist/core/middleware/built-in/prometheus/middleware.js +30 -0
- package/dist/core/middleware/built-in/prometheus/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/index.d.ts +3 -1
- package/dist/core/middleware/built-in/request-logger/index.js +3 -2
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger/middleware.d.ts +4 -4
- package/dist/core/middleware/built-in/request-logger/middleware.js +14 -12
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
- package/dist/core/middleware/index.d.ts +3 -1
- package/dist/core/middleware/index.js +6 -1
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/pooling/index.d.ts +3 -0
- package/dist/core/pooling/index.js +5 -0
- package/dist/core/pooling/index.js.map +1 -0
- package/dist/core/pooling/lru-cache.d.ts +32 -0
- package/dist/core/pooling/lru-cache.js +74 -0
- package/dist/core/pooling/lru-cache.js.map +1 -0
- package/dist/core/pooling/object-pool-manager.d.ts +3 -1
- package/dist/core/pooling/object-pool-manager.js +37 -140
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/pooling/object-pool.d.ts +42 -0
- package/dist/core/pooling/object-pool.js +78 -0
- package/dist/core/pooling/object-pool.js.map +1 -0
- package/dist/core/routing/create-router.js.map +1 -1
- package/dist/core/routing/path-matcher.js +1 -43
- package/dist/core/routing/path-matcher.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +2 -0
- package/dist/core/routing/unified-router.js +15 -0
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +5 -5
- package/dist/core/utilities/hooks.js +9 -6
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +0 -1
- package/dist/core/utilities/index.js +0 -2
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/workers/facade.d.ts +20 -4
- package/dist/core/workers/facade.js +15 -7
- package/dist/core/workers/facade.js.map +1 -1
- package/dist/core/workers/worker-manager.d.ts +12 -0
- package/dist/core/workers/worker-manager.js +27 -0
- package/dist/core/workers/worker-manager.js.map +1 -1
- package/dist/core/workers/worker.d.ts +17 -1
- package/dist/core/workers/worker.js +28 -26
- package/dist/core/workers/worker.js.map +1 -1
- package/dist/index.d.ts +39 -2
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +1 -0
- package/dist/moro.js +82 -15
- package/dist/moro.js.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +1 -0
- package/dist/types/core.js.map +1 -1
- package/dist/types/hooks.d.ts +2 -0
- package/dist/types/hooks.js.map +1 -1
- package/dist/types/module.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/prometheus/core.ts"],"names":[],"mappings":"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","sourcesContent":["// Prometheus Core - metrics registry and text exposition rendering\nimport { getPoolManager } from '../../../pooling/object-pool-manager.js';\n\nexport interface PrometheusOptions {\n /** Path that serves the metrics exposition (default '/metrics') */\n endpoint?: string;\n /** Include process/heap/uptime gauges (default true) */\n includeProcessMetrics?: boolean;\n /** Include framework object-pool and route-cache metrics (default true) */\n includePoolMetrics?: boolean;\n /** Histogram bucket upper bounds in seconds */\n buckets?: number[];\n}\n\nconst DEFAULT_BUCKETS = [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];\n\ninterface HistogramSeries {\n // Per-bucket (non-cumulative) observation counts; cumulated at render time\n bucketCounts: number[];\n sum: number;\n count: number;\n}\n\n/**\n * Minimal dependency-free Prometheus metrics registry.\n * Tracks request counters and duration histograms labeled by\n * {method, status} — bounded label cardinality by design (no raw paths).\n */\nexport class PrometheusCore {\n private readonly buckets: number[];\n private readonly includeProcessMetrics: boolean;\n private readonly includePoolMetrics: boolean;\n private requestCounts = new Map<string, number>();\n private durations = new Map<string, HistogramSeries>();\n\n constructor(options: PrometheusOptions = {}) {\n this.buckets = options.buckets ?? DEFAULT_BUCKETS;\n this.includeProcessMetrics = options.includeProcessMetrics !== false;\n this.includePoolMetrics = options.includePoolMetrics !== false;\n }\n\n recordRequest(method: string, statusCode: number, durationMs: number): void {\n const key = `${method}\u0000${statusCode}`;\n this.requestCounts.set(key, (this.requestCounts.get(key) || 0) + 1);\n\n let series = this.durations.get(key);\n if (!series) {\n series = {\n bucketCounts: new Array<number>(this.buckets.length).fill(0),\n sum: 0,\n count: 0,\n };\n this.durations.set(key, series);\n }\n\n const seconds = durationMs / 1000;\n series.sum += seconds;\n series.count++;\n for (let i = 0; i < this.buckets.length; i++) {\n const bound = this.buckets[i];\n if (bound !== undefined && seconds <= bound) {\n series.bucketCounts[i] = (series.bucketCounts[i] || 0) + 1;\n break;\n }\n }\n }\n\n /** Render all metrics in the Prometheus text exposition format (0.0.4). */\n render(): string {\n const lines: string[] = [];\n\n lines.push('# HELP http_requests_total Total number of HTTP requests handled');\n lines.push('# TYPE http_requests_total counter');\n for (const [key, count] of this.requestCounts) {\n lines.push(`http_requests_total{${this.labelsFor(key)}} ${count}`);\n }\n\n lines.push('# HELP http_request_duration_seconds HTTP request duration in seconds');\n lines.push('# TYPE http_request_duration_seconds histogram');\n for (const [key, series] of this.durations) {\n const labels = this.labelsFor(key);\n let cumulative = 0;\n for (let i = 0; i < this.buckets.length; i++) {\n cumulative += series.bucketCounts[i] || 0;\n lines.push(\n `http_request_duration_seconds_bucket{${labels},le=\"${this.buckets[i]}\"} ${cumulative}`\n );\n }\n lines.push(`http_request_duration_seconds_bucket{${labels},le=\"+Inf\"} ${series.count}`);\n lines.push(`http_request_duration_seconds_sum{${labels}} ${series.sum}`);\n lines.push(`http_request_duration_seconds_count{${labels}} ${series.count}`);\n }\n\n if (this.includeProcessMetrics) {\n const memory = process.memoryUsage();\n lines.push('# HELP process_resident_memory_bytes Resident set size in bytes');\n lines.push('# TYPE process_resident_memory_bytes gauge');\n lines.push(`process_resident_memory_bytes ${memory.rss}`);\n lines.push('# HELP nodejs_heap_size_used_bytes V8 heap used in bytes');\n lines.push('# TYPE nodejs_heap_size_used_bytes gauge');\n lines.push(`nodejs_heap_size_used_bytes ${memory.heapUsed}`);\n lines.push('# HELP process_uptime_seconds Process uptime in seconds');\n lines.push('# TYPE process_uptime_seconds gauge');\n lines.push(`process_uptime_seconds ${process.uptime()}`);\n }\n\n if (this.includePoolMetrics) {\n const stats = getPoolManager().getStats();\n lines.push('# HELP moro_pool_size Current pooled object count per pool');\n lines.push('# TYPE moro_pool_size gauge');\n lines.push(`moro_pool_size{pool=\"params\"} ${stats.paramPool.poolSize}`);\n lines.push(`moro_pool_size{pool=\"query\"} ${stats.queryPool.poolSize}`);\n lines.push(`moro_pool_size{pool=\"headers\"} ${stats.headerPool.poolSize}`);\n lines.push('# HELP moro_pool_max_size Capacity per pool');\n lines.push('# TYPE moro_pool_max_size gauge');\n lines.push(`moro_pool_max_size{pool=\"params\"} ${stats.paramPool.maxSize}`);\n lines.push(`moro_pool_max_size{pool=\"query\"} ${stats.queryPool.maxSize}`);\n lines.push(`moro_pool_max_size{pool=\"headers\"} ${stats.headerPool.maxSize}`);\n lines.push('# HELP moro_route_cache_hits_total Route cache hits');\n lines.push('# TYPE moro_route_cache_hits_total counter');\n lines.push(`moro_route_cache_hits_total ${stats.routeCache.hits}`);\n lines.push('# HELP moro_route_cache_misses_total Route cache misses');\n lines.push('# TYPE moro_route_cache_misses_total counter');\n lines.push(`moro_route_cache_misses_total ${stats.routeCache.misses}`);\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n private labelsFor(key: string): string {\n const separator = key.indexOf('\u0000');\n const method = key.slice(0, separator);\n const status = key.slice(separator + 1);\n return `method=\"${method}\",status=\"${status}\"`;\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { PrometheusCore } from './core.js';
|
|
2
|
+
export type { PrometheusOptions } from './core.js';
|
|
3
|
+
export { createPrometheusMiddleware } from './middleware.js';
|
|
4
|
+
import { createPrometheusMiddleware } from './middleware.js';
|
|
5
|
+
export declare const prometheus: typeof createPrometheusMiddleware;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Prometheus Middleware - Centralized Exports
|
|
2
|
+
export { PrometheusCore } from './core.js';
|
|
3
|
+
export { createPrometheusMiddleware } from './middleware.js';
|
|
4
|
+
import { createPrometheusMiddleware } from './middleware.js';
|
|
5
|
+
export const prometheus = createPrometheusMiddleware;
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/prometheus/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,0BAA0B,CAAC","sourcesContent":["// Prometheus Middleware - Centralized Exports\nexport { PrometheusCore } from './core.js';\nexport type { PrometheusOptions } from './core.js';\nexport { createPrometheusMiddleware } from './middleware.js';\n\nimport { createPrometheusMiddleware } from './middleware.js';\n\nexport const prometheus = createPrometheusMiddleware;\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Middleware } from '../../../../types/http.js';
|
|
2
|
+
import { PrometheusOptions } from './core.js';
|
|
3
|
+
/**
|
|
4
|
+
* Prometheus metrics middleware
|
|
5
|
+
* Records request count and duration histograms (labeled by method and
|
|
6
|
+
* status), and serves the text exposition format at the configured endpoint.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { middleware } from '@morojs/moro';
|
|
11
|
+
*
|
|
12
|
+
* app.use(middleware.prometheus({ endpoint: '/metrics' }));
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function createPrometheusMiddleware(options?: PrometheusOptions): Middleware;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PrometheusCore } from './core.js';
|
|
2
|
+
/**
|
|
3
|
+
* Prometheus metrics middleware
|
|
4
|
+
* Records request count and duration histograms (labeled by method and
|
|
5
|
+
* status), and serves the text exposition format at the configured endpoint.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { middleware } from '@morojs/moro';
|
|
10
|
+
*
|
|
11
|
+
* app.use(middleware.prometheus({ endpoint: '/metrics' }));
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export function createPrometheusMiddleware(options = {}) {
|
|
15
|
+
const core = new PrometheusCore(options);
|
|
16
|
+
const endpoint = options.endpoint ?? '/metrics';
|
|
17
|
+
return (req, res, next) => {
|
|
18
|
+
if (req.path === endpoint && req.method === 'GET') {
|
|
19
|
+
res.setHeader('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');
|
|
20
|
+
res.end(core.render());
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const start = Date.now();
|
|
24
|
+
res.on('finish', () => {
|
|
25
|
+
core.recordRequest(req.method || 'UNKNOWN', res.statusCode, Date.now() - start);
|
|
26
|
+
});
|
|
27
|
+
next();
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/prometheus/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAqB,MAAM,WAAW,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAA6B,EAAE;IACxE,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAEhD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0CAA0C,CAAC,CAAC;YACzE,GAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Prometheus Middleware - chain-style factory\nimport { Middleware } from '../../../../types/http.js';\nimport { PrometheusCore, PrometheusOptions } from './core.js';\n\n/**\n * Prometheus metrics middleware\n * Records request count and duration histograms (labeled by method and\n * status), and serves the text exposition format at the configured endpoint.\n *\n * @example\n * ```ts\n * import { middleware } from '@morojs/moro';\n *\n * app.use(middleware.prometheus({ endpoint: '/metrics' }));\n * ```\n */\nexport function createPrometheusMiddleware(options: PrometheusOptions = {}): Middleware {\n const core = new PrometheusCore(options);\n const endpoint = options.endpoint ?? '/metrics';\n\n return (req, res, next) => {\n if (req.path === endpoint && req.method === 'GET') {\n res.setHeader('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n (res as any).end(core.render());\n return;\n }\n\n const start = Date.now();\n res.on('finish', () => {\n core.recordRequest(req.method || 'UNKNOWN', res.statusCode, Date.now() - start);\n });\n\n next();\n };\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Request Logger - Main entry point
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
export { createRequestLoggerMiddleware } from './middleware.js';
|
|
3
|
+
import { createRequestLoggerMiddleware } from './middleware.js';
|
|
4
|
+
export const requestLogger = createRequestLoggerMiddleware;
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/request-logger/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/request-logger/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,6BAA6B,CAAC","sourcesContent":["// Request Logger - Main entry point\nexport { createRequestLoggerMiddleware } from './middleware.js';\n\nimport { createRequestLoggerMiddleware } from './middleware.js';\n\nexport const requestLogger = createRequestLoggerMiddleware;\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { HttpRequest, HttpResponse } from '../../../../types/http.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Request logging middleware
|
|
4
4
|
* Logs incoming requests and their completion time
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```ts
|
|
8
|
-
* import {
|
|
8
|
+
* import { middleware } from '@morojs/moro';
|
|
9
9
|
*
|
|
10
|
-
* app.use(requestLogger);
|
|
10
|
+
* app.use(middleware.requestLogger());
|
|
11
11
|
* ```
|
|
12
12
|
*/
|
|
13
|
-
export declare
|
|
13
|
+
export declare function createRequestLoggerMiddleware(): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
|
|
@@ -2,23 +2,25 @@
|
|
|
2
2
|
import { createFrameworkLogger } from '../../../logger/index.js';
|
|
3
3
|
const logger = createFrameworkLogger('RequestLogger');
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Request logging middleware
|
|
6
6
|
* Logs incoming requests and their completion time
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* ```ts
|
|
10
|
-
* import {
|
|
10
|
+
* import { middleware } from '@morojs/moro';
|
|
11
11
|
*
|
|
12
|
-
* app.use(requestLogger);
|
|
12
|
+
* app.use(middleware.requestLogger());
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
export function createRequestLoggerMiddleware() {
|
|
16
|
+
return (req, res, next) => {
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
logger.info(`${req.method} ${req.path}`, 'RequestLogger');
|
|
19
|
+
res.on('finish', () => {
|
|
20
|
+
const duration = Date.now() - startTime;
|
|
21
|
+
logger.info(`Request completed in ${duration}ms`, 'RequestLogger');
|
|
22
|
+
});
|
|
23
|
+
next();
|
|
24
|
+
};
|
|
25
|
+
}
|
|
24
26
|
//# sourceMappingURL=middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/request-logger/middleware.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/request-logger/middleware.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO,CAAC,GAAgB,EAAE,GAAiB,EAAE,IAAgB,EAAQ,EAAE;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;QAE1D,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,IAAI,EAAE,eAAe,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Request Logger Middleware\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\n\nconst logger = createFrameworkLogger('RequestLogger');\n\n/**\n * Request logging middleware\n * Logs incoming requests and their completion time\n *\n * @example\n * ```ts\n * import { middleware } from '@morojs/moro';\n *\n * app.use(middleware.requestLogger());\n * ```\n */\nexport function createRequestLoggerMiddleware() {\n return (req: HttpRequest, res: HttpResponse, next: () => void): void => {\n const startTime = Date.now();\n\n logger.info(`${req.method} ${req.path}`, 'RequestLogger');\n\n res.on('finish', () => {\n const duration = Date.now() - startTime;\n logger.info(`Request completed in ${duration}ms`, 'RequestLogger');\n });\n\n next();\n };\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
|
+
import { HookManager } from '../utilities/index.js';
|
|
2
3
|
import { MiddlewareInterface, SimpleMiddlewareFunction } from '../../types/hooks.js';
|
|
3
4
|
export type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks.js';
|
|
4
5
|
export declare class MiddlewareManager extends EventEmitter {
|
|
@@ -12,11 +13,12 @@ export declare class MiddlewareManager extends EventEmitter {
|
|
|
12
13
|
uninstall(name: string): void;
|
|
13
14
|
getInstalled(): string[];
|
|
14
15
|
getConfig(name: string): any;
|
|
16
|
+
getHookManager(): HookManager;
|
|
15
17
|
isInstalled(name: string): boolean;
|
|
16
18
|
get(name: string): MiddlewareInterface | SimpleMiddlewareFunction | undefined;
|
|
17
19
|
list(): MiddlewareInterface[];
|
|
18
20
|
installWithDependencies(middleware: MiddlewareInterface[], options?: Record<string, any>): Promise<void>;
|
|
19
21
|
private topologicalSort;
|
|
20
22
|
}
|
|
21
|
-
export {
|
|
23
|
+
export { middleware, builtInMiddleware } from './built-in/index.js';
|
|
22
24
|
export * from './built-in/index.js';
|
|
@@ -84,6 +84,11 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
84
84
|
getConfig(name) {
|
|
85
85
|
return this.middleware.get(name)?.metadata;
|
|
86
86
|
}
|
|
87
|
+
// The live hook manager that MiddlewareInterface.install() receives.
|
|
88
|
+
// Exposed so the app can offer a public `app.hooks` accessor.
|
|
89
|
+
getHookManager() {
|
|
90
|
+
return this.hooks;
|
|
91
|
+
}
|
|
87
92
|
// Check if middleware is installed
|
|
88
93
|
isInstalled(name) {
|
|
89
94
|
return this.middleware.has(name);
|
|
@@ -147,6 +152,6 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
147
152
|
}
|
|
148
153
|
}
|
|
149
154
|
// Built-in middleware exports
|
|
150
|
-
export {
|
|
155
|
+
export { middleware, builtInMiddleware } from './built-in/index.js';
|
|
151
156
|
export * from './built-in/index.js';
|
|
152
157
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/middleware/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Middleware System for Moro\n/*\n All middleware in Moro should follow or adopt all of the following patterns:\n Core - Core.method(req, res, config) - Direct logic, no next, used by router directly\n Middleware - (req, res, next) => { ... next() } - For middleware chains, calls next\n Hooks - MiddlewareInterface with before/after hooks\n*/\n\nimport { EventEmitter } from 'events';\nimport { HookManager } from '../utilities/index.js';\nimport { MiddlewareInterface, SimpleMiddlewareFunction } from '../../types/hooks.js';\nimport { createFrameworkLogger } from '../logger/index.js';\n\n// Export types needed by built-in middleware\nexport type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks.js';\n\nexport class MiddlewareManager extends EventEmitter {\n private middleware = new Map<string, MiddlewareInterface>();\n private simpleMiddleware = new Map<string, SimpleMiddlewareFunction>();\n private hooks: HookManager;\n private logger = createFrameworkLogger('Middleware');\n\n constructor() {\n super();\n this.hooks = new HookManager();\n }\n\n // Register middleware without installing\n register(name: string, middleware: MiddlewareInterface): void {\n if (this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is already registered`);\n }\n\n this.middleware.set(name, middleware);\n this.logger.debug(`Registered middleware: ${name}`, 'Registration');\n this.emit('registered', { name, middleware });\n }\n\n // Install simple function-style middleware\n install(middleware: SimpleMiddlewareFunction | MiddlewareInterface, options: any = {}): void {\n if (typeof middleware === 'function') {\n // Simple function-style middleware\n const simpleName = middleware.name || 'anonymous';\n this.logger.debug(`Installing simple middleware: ${simpleName}`, 'Installation');\n\n this.simpleMiddleware.set(simpleName, middleware);\n this.emit('installed', { name: simpleName, type: 'simple' });\n this.logger.info(`Simple middleware installed: ${simpleName}`, 'Installation');\n return;\n }\n\n // Advanced middleware with dependencies and lifecycle\n const name = middleware.metadata?.name || 'unknown';\n\n if (this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is already installed`);\n }\n\n // Check dependencies\n if (middleware.metadata?.dependencies) {\n for (const dep of middleware.metadata.dependencies) {\n if (!this.middleware.has(dep)) {\n throw new Error(`Dependency ${dep} not found for middleware ${name}`);\n }\n }\n }\n\n // Store middleware\n this.middleware.set(name, middleware);\n\n this.logger.debug(`Installing middleware: ${name}`, 'Installation');\n\n // Initialize middleware\n if (middleware.install) {\n void middleware.install(this.hooks, options);\n }\n\n this.emit('installed', { name, middleware, options });\n this.logger.info(`Middleware installed: ${name}`, 'Installation');\n }\n\n // Uninstall middleware and clean up\n uninstall(name: string): void {\n if (!this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is not installed`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const middleware = this.middleware.get(name)!;\n\n this.logger.debug(`Uninstalling middleware: ${name}`, 'Uninstallation');\n\n // Call cleanup if available\n if (middleware.uninstall) {\n void middleware.uninstall(this.hooks);\n }\n\n this.middleware.delete(name);\n this.emit('uninstalled', { name, middleware });\n this.logger.info(`Middleware uninstalled: ${name}`, 'Uninstallation');\n }\n\n // Get installed middleware\n getInstalled(): string[] {\n return Array.from(this.middleware.keys());\n }\n\n // Get middleware configuration\n getConfig(name: string): any {\n return this.middleware.get(name)?.metadata;\n }\n\n // Check if middleware is installed\n isInstalled(name: string): boolean {\n return this.middleware.has(name);\n }\n\n // Get middleware by name (safe getter for module usage)\n get(name: string): MiddlewareInterface | SimpleMiddlewareFunction | undefined {\n // Check installed middleware first\n if (this.middleware.has(name)) {\n return this.middleware.get(name);\n }\n\n // Check simple middleware\n if (this.simpleMiddleware.has(name)) {\n return this.simpleMiddleware.get(name);\n }\n\n return undefined;\n }\n\n // List all registered middleware\n list(): MiddlewareInterface[] {\n return Array.from(this.middleware.values());\n }\n\n // Dependency resolution with topological sorting for optimal middleware loading\n async installWithDependencies(\n middleware: MiddlewareInterface[],\n options?: Record<string, any>\n ): Promise<void> {\n // Advanced topological sort for dependency resolution\n const resolved = this.topologicalSort(middleware);\n\n for (const middlewareItem of resolved) {\n const middlewareOptions = options?.[middlewareItem.name];\n await this.install(middlewareItem, middlewareOptions);\n }\n }\n\n // Optimized topological sort implementation for middleware dependencies\n private topologicalSort(middleware: MiddlewareInterface[]): MiddlewareInterface[] {\n const visited = new Set<string>();\n const temp = new Set<string>();\n const result: MiddlewareInterface[] = [];\n\n const visit = (middlewareItem: MiddlewareInterface) => {\n if (temp.has(middlewareItem.name)) {\n throw new Error(`Circular dependency detected: ${middlewareItem.name}`);\n }\n\n if (!visited.has(middlewareItem.name)) {\n temp.add(middlewareItem.name);\n\n // Visit dependencies first\n if (middlewareItem.dependencies) {\n for (const depName of middlewareItem.dependencies) {\n const dependency = middleware.find(m => m.name === depName);\n if (dependency) {\n visit(dependency);\n }\n }\n }\n\n temp.delete(middlewareItem.name);\n visited.add(middlewareItem.name);\n result.push(middlewareItem);\n }\n };\n\n for (const middlewareItem of middleware) {\n if (!visited.has(middlewareItem.name)) {\n visit(middlewareItem);\n }\n }\n\n return result;\n }\n}\n\n// Built-in middleware exports\nexport { builtInMiddleware, simpleMiddleware } from './built-in/index.js';\nexport * from './built-in/index.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/middleware/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Middleware System for Moro\n/*\n All middleware in Moro should follow or adopt all of the following patterns:\n Core - Core.method(req, res, config) - Direct logic, no next, used by router directly\n Middleware - (req, res, next) => { ... next() } - For middleware chains, calls next\n Hooks - MiddlewareInterface with before/after hooks\n*/\n\nimport { EventEmitter } from 'events';\nimport { HookManager } from '../utilities/index.js';\nimport { MiddlewareInterface, SimpleMiddlewareFunction } from '../../types/hooks.js';\nimport { createFrameworkLogger } from '../logger/index.js';\n\n// Export types needed by built-in middleware\nexport type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks.js';\n\nexport class MiddlewareManager extends EventEmitter {\n private middleware = new Map<string, MiddlewareInterface>();\n private simpleMiddleware = new Map<string, SimpleMiddlewareFunction>();\n private hooks: HookManager;\n private logger = createFrameworkLogger('Middleware');\n\n constructor() {\n super();\n this.hooks = new HookManager();\n }\n\n // Register middleware without installing\n register(name: string, middleware: MiddlewareInterface): void {\n if (this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is already registered`);\n }\n\n this.middleware.set(name, middleware);\n this.logger.debug(`Registered middleware: ${name}`, 'Registration');\n this.emit('registered', { name, middleware });\n }\n\n // Install simple function-style middleware\n install(middleware: SimpleMiddlewareFunction | MiddlewareInterface, options: any = {}): void {\n if (typeof middleware === 'function') {\n // Simple function-style middleware\n const simpleName = middleware.name || 'anonymous';\n this.logger.debug(`Installing simple middleware: ${simpleName}`, 'Installation');\n\n this.simpleMiddleware.set(simpleName, middleware);\n this.emit('installed', { name: simpleName, type: 'simple' });\n this.logger.info(`Simple middleware installed: ${simpleName}`, 'Installation');\n return;\n }\n\n // Advanced middleware with dependencies and lifecycle\n const name = middleware.metadata?.name || 'unknown';\n\n if (this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is already installed`);\n }\n\n // Check dependencies\n if (middleware.metadata?.dependencies) {\n for (const dep of middleware.metadata.dependencies) {\n if (!this.middleware.has(dep)) {\n throw new Error(`Dependency ${dep} not found for middleware ${name}`);\n }\n }\n }\n\n // Store middleware\n this.middleware.set(name, middleware);\n\n this.logger.debug(`Installing middleware: ${name}`, 'Installation');\n\n // Initialize middleware\n if (middleware.install) {\n void middleware.install(this.hooks, options);\n }\n\n this.emit('installed', { name, middleware, options });\n this.logger.info(`Middleware installed: ${name}`, 'Installation');\n }\n\n // Uninstall middleware and clean up\n uninstall(name: string): void {\n if (!this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is not installed`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const middleware = this.middleware.get(name)!;\n\n this.logger.debug(`Uninstalling middleware: ${name}`, 'Uninstallation');\n\n // Call cleanup if available\n if (middleware.uninstall) {\n void middleware.uninstall(this.hooks);\n }\n\n this.middleware.delete(name);\n this.emit('uninstalled', { name, middleware });\n this.logger.info(`Middleware uninstalled: ${name}`, 'Uninstallation');\n }\n\n // Get installed middleware\n getInstalled(): string[] {\n return Array.from(this.middleware.keys());\n }\n\n // Get middleware configuration\n getConfig(name: string): any {\n return this.middleware.get(name)?.metadata;\n }\n\n // The live hook manager that MiddlewareInterface.install() receives.\n // Exposed so the app can offer a public `app.hooks` accessor.\n getHookManager(): HookManager {\n return this.hooks;\n }\n\n // Check if middleware is installed\n isInstalled(name: string): boolean {\n return this.middleware.has(name);\n }\n\n // Get middleware by name (safe getter for module usage)\n get(name: string): MiddlewareInterface | SimpleMiddlewareFunction | undefined {\n // Check installed middleware first\n if (this.middleware.has(name)) {\n return this.middleware.get(name);\n }\n\n // Check simple middleware\n if (this.simpleMiddleware.has(name)) {\n return this.simpleMiddleware.get(name);\n }\n\n return undefined;\n }\n\n // List all registered middleware\n list(): MiddlewareInterface[] {\n return Array.from(this.middleware.values());\n }\n\n // Dependency resolution with topological sorting for optimal middleware loading\n async installWithDependencies(\n middleware: MiddlewareInterface[],\n options?: Record<string, any>\n ): Promise<void> {\n // Advanced topological sort for dependency resolution\n const resolved = this.topologicalSort(middleware);\n\n for (const middlewareItem of resolved) {\n const middlewareOptions = options?.[middlewareItem.name];\n await this.install(middlewareItem, middlewareOptions);\n }\n }\n\n // Optimized topological sort implementation for middleware dependencies\n private topologicalSort(middleware: MiddlewareInterface[]): MiddlewareInterface[] {\n const visited = new Set<string>();\n const temp = new Set<string>();\n const result: MiddlewareInterface[] = [];\n\n const visit = (middlewareItem: MiddlewareInterface) => {\n if (temp.has(middlewareItem.name)) {\n throw new Error(`Circular dependency detected: ${middlewareItem.name}`);\n }\n\n if (!visited.has(middlewareItem.name)) {\n temp.add(middlewareItem.name);\n\n // Visit dependencies first\n if (middlewareItem.dependencies) {\n for (const depName of middlewareItem.dependencies) {\n const dependency = middleware.find(m => m.name === depName);\n if (dependency) {\n visit(dependency);\n }\n }\n }\n\n temp.delete(middlewareItem.name);\n visited.add(middlewareItem.name);\n result.push(middlewareItem);\n }\n };\n\n for (const middlewareItem of middleware) {\n if (!visited.has(middlewareItem.name)) {\n visit(middlewareItem);\n }\n }\n\n return result;\n }\n}\n\n// Built-in middleware exports\nexport { middleware, builtInMiddleware } from './built-in/index.js';\nexport * from './built-in/index.js';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/pooling/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["// Object Pooling & Caching - Centralized Exports\nexport { ObjectPool } from './object-pool.js';\nexport { LRUCache } from './lru-cache.js';\nexport { ObjectPoolManager, getPoolManager } from './object-pool-manager.js';\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Least-recently-used cache with hit/miss statistics
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { LRUCache } from '@morojs/moro';
|
|
7
|
+
*
|
|
8
|
+
* const cache = new LRUCache<string, User>(500);
|
|
9
|
+
* cache.set('user:1', user);
|
|
10
|
+
* const hit = cache.get('user:1');
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare class LRUCache<K, V> {
|
|
14
|
+
private cache;
|
|
15
|
+
private readonly maxSize;
|
|
16
|
+
private hits;
|
|
17
|
+
private misses;
|
|
18
|
+
constructor(maxSize?: number);
|
|
19
|
+
get(key: K): V | undefined;
|
|
20
|
+
set(key: K, value: V): void;
|
|
21
|
+
has(key: K): boolean;
|
|
22
|
+
delete(key: K): boolean;
|
|
23
|
+
clear(): void;
|
|
24
|
+
get size(): number;
|
|
25
|
+
get stats(): {
|
|
26
|
+
size: number;
|
|
27
|
+
maxSize: number;
|
|
28
|
+
hits: number;
|
|
29
|
+
misses: number;
|
|
30
|
+
hitRate: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// LRU Cache
|
|
2
|
+
// Single shared implementation (previously duplicated privately in the
|
|
3
|
+
// object pool manager and the routing path matcher).
|
|
4
|
+
/**
|
|
5
|
+
* Least-recently-used cache with hit/miss statistics
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { LRUCache } from '@morojs/moro';
|
|
10
|
+
*
|
|
11
|
+
* const cache = new LRUCache<string, User>(500);
|
|
12
|
+
* cache.set('user:1', user);
|
|
13
|
+
* const hit = cache.get('user:1');
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export class LRUCache {
|
|
17
|
+
cache = new Map();
|
|
18
|
+
maxSize;
|
|
19
|
+
hits = 0;
|
|
20
|
+
misses = 0;
|
|
21
|
+
constructor(maxSize = 500) {
|
|
22
|
+
this.maxSize = maxSize;
|
|
23
|
+
}
|
|
24
|
+
get(key) {
|
|
25
|
+
const value = this.cache.get(key);
|
|
26
|
+
if (value !== undefined) {
|
|
27
|
+
this.hits++;
|
|
28
|
+
// Move to end (most recently used)
|
|
29
|
+
this.cache.delete(key);
|
|
30
|
+
this.cache.set(key, value);
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
this.misses++;
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
set(key, value) {
|
|
37
|
+
if (this.cache.has(key)) {
|
|
38
|
+
this.cache.delete(key);
|
|
39
|
+
}
|
|
40
|
+
this.cache.set(key, value);
|
|
41
|
+
// Evict oldest if over capacity
|
|
42
|
+
if (this.cache.size > this.maxSize) {
|
|
43
|
+
const firstKey = this.cache.keys().next().value;
|
|
44
|
+
if (firstKey !== undefined) {
|
|
45
|
+
this.cache.delete(firstKey);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
has(key) {
|
|
50
|
+
return this.cache.has(key);
|
|
51
|
+
}
|
|
52
|
+
delete(key) {
|
|
53
|
+
return this.cache.delete(key);
|
|
54
|
+
}
|
|
55
|
+
clear() {
|
|
56
|
+
this.cache.clear();
|
|
57
|
+
this.hits = 0;
|
|
58
|
+
this.misses = 0;
|
|
59
|
+
}
|
|
60
|
+
get size() {
|
|
61
|
+
return this.cache.size;
|
|
62
|
+
}
|
|
63
|
+
get stats() {
|
|
64
|
+
const total = this.hits + this.misses;
|
|
65
|
+
return {
|
|
66
|
+
size: this.cache.size,
|
|
67
|
+
maxSize: this.maxSize,
|
|
68
|
+
hits: this.hits,
|
|
69
|
+
misses: this.misses,
|
|
70
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=lru-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-cache.js","sourceRoot":"","sources":["../../../src/core/pooling/lru-cache.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,uEAAuE;AACvE,qDAAqD;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,QAAQ;IACX,KAAK,GAAG,IAAI,GAAG,EAAQ,CAAC;IACf,OAAO,CAAS;IACzB,IAAI,GAAG,CAAC,CAAC;IACT,MAAM,GAAG,CAAC,CAAC;IAEnB,YAAY,UAAkB,GAAG;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,mCAAmC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE3B,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C,CAAC;IACJ,CAAC;CACF","sourcesContent":["// LRU Cache\n// Single shared implementation (previously duplicated privately in the\n// object pool manager and the routing path matcher).\n\n/**\n * Least-recently-used cache with hit/miss statistics\n *\n * @example\n * ```ts\n * import { LRUCache } from '@morojs/moro';\n *\n * const cache = new LRUCache<string, User>(500);\n * cache.set('user:1', user);\n * const hit = cache.get('user:1');\n * ```\n */\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private readonly maxSize: number;\n private hits = 0;\n private misses = 0;\n\n constructor(maxSize: number = 500) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n this.hits++;\n // Move to end (most recently used)\n this.cache.delete(key);\n this.cache.set(key, value);\n return value;\n }\n this.misses++;\n return undefined;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n this.cache.set(key, value);\n\n // Evict oldest if over capacity\n if (this.cache.size > this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n }\n\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n get stats() {\n const total = this.hits + this.misses;\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hits: this.hits,\n misses: this.misses,\n hitRate: total > 0 ? this.hits / total : 0,\n };\n }\n}\n"]}
|
|
@@ -59,7 +59,9 @@ export declare class ObjectPoolManager {
|
|
|
59
59
|
hasCachedResponse(key: string): boolean;
|
|
60
60
|
clearResponseCache(): void;
|
|
61
61
|
/**
|
|
62
|
-
* Adaptively adjust pool sizes based on usage patterns
|
|
62
|
+
* Adaptively adjust pool sizes based on usage patterns.
|
|
63
|
+
* Each pool is sized to ~120% of its average observed size, clamped to a
|
|
64
|
+
* [min, max] range, and only resized when the change exceeds a threshold.
|
|
63
65
|
*/
|
|
64
66
|
private adjustPoolSizes;
|
|
65
67
|
/**
|