@morojs/moro 1.8.3 → 1.8.4

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.
Files changed (87) hide show
  1. package/dist/core/config/config-sources.js.map +1 -1
  2. package/dist/core/framework.d.ts +11 -0
  3. package/dist/core/framework.js +107 -36
  4. package/dist/core/framework.js.map +1 -1
  5. package/dist/core/graphql/core.js.map +1 -1
  6. package/dist/core/grpc/types.js.map +1 -1
  7. package/dist/core/http/moro-engine-server.js.map +1 -1
  8. package/dist/core/mail/mail-adapter.js.map +1 -1
  9. package/dist/core/middleware/built-in/cloudwatch/index.d.ts +4 -0
  10. package/dist/core/middleware/built-in/cloudwatch/index.js +5 -0
  11. package/dist/core/middleware/built-in/cloudwatch/index.js.map +1 -0
  12. package/dist/core/middleware/built-in/cloudwatch/middleware.d.ts +31 -0
  13. package/dist/core/middleware/built-in/cloudwatch/middleware.js +52 -0
  14. package/dist/core/middleware/built-in/cloudwatch/middleware.js.map +1 -0
  15. package/dist/core/middleware/built-in/error-tracker/index.d.ts +3 -1
  16. package/dist/core/middleware/built-in/error-tracker/index.js +3 -2
  17. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
  18. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +6 -3
  19. package/dist/core/middleware/built-in/error-tracker/middleware.js +18 -13
  20. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
  21. package/dist/core/middleware/built-in/index.d.ts +43 -7
  22. package/dist/core/middleware/built-in/index.js +37 -7
  23. package/dist/core/middleware/built-in/index.js.map +1 -1
  24. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +3 -1
  25. package/dist/core/middleware/built-in/performance-monitor/index.js +3 -2
  26. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
  27. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +3 -3
  28. package/dist/core/middleware/built-in/performance-monitor/middleware.js +19 -17
  29. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
  30. package/dist/core/middleware/built-in/prometheus/core.d.ts +27 -0
  31. package/dist/core/middleware/built-in/prometheus/core.js +0 -0
  32. package/dist/core/middleware/built-in/prometheus/core.js.map +1 -0
  33. package/dist/core/middleware/built-in/prometheus/index.d.ts +5 -0
  34. package/dist/core/middleware/built-in/prometheus/index.js +6 -0
  35. package/dist/core/middleware/built-in/prometheus/index.js.map +1 -0
  36. package/dist/core/middleware/built-in/prometheus/middleware.d.ts +15 -0
  37. package/dist/core/middleware/built-in/prometheus/middleware.js +30 -0
  38. package/dist/core/middleware/built-in/prometheus/middleware.js.map +1 -0
  39. package/dist/core/middleware/built-in/request-logger/index.d.ts +3 -1
  40. package/dist/core/middleware/built-in/request-logger/index.js +3 -2
  41. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
  42. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +4 -4
  43. package/dist/core/middleware/built-in/request-logger/middleware.js +14 -12
  44. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
  45. package/dist/core/middleware/index.d.ts +1 -1
  46. package/dist/core/middleware/index.js +1 -1
  47. package/dist/core/middleware/index.js.map +1 -1
  48. package/dist/core/pooling/index.d.ts +3 -0
  49. package/dist/core/pooling/index.js +5 -0
  50. package/dist/core/pooling/index.js.map +1 -0
  51. package/dist/core/pooling/lru-cache.d.ts +32 -0
  52. package/dist/core/pooling/lru-cache.js +74 -0
  53. package/dist/core/pooling/lru-cache.js.map +1 -0
  54. package/dist/core/pooling/object-pool-manager.d.ts +3 -1
  55. package/dist/core/pooling/object-pool-manager.js +37 -140
  56. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  57. package/dist/core/pooling/object-pool.d.ts +42 -0
  58. package/dist/core/pooling/object-pool.js +78 -0
  59. package/dist/core/pooling/object-pool.js.map +1 -0
  60. package/dist/core/routing/create-router.js.map +1 -1
  61. package/dist/core/routing/path-matcher.js +1 -43
  62. package/dist/core/routing/path-matcher.js.map +1 -1
  63. package/dist/core/utilities/hooks.d.ts +0 -1
  64. package/dist/core/utilities/hooks.js +0 -2
  65. package/dist/core/utilities/hooks.js.map +1 -1
  66. package/dist/core/utilities/index.d.ts +0 -1
  67. package/dist/core/utilities/index.js +0 -2
  68. package/dist/core/utilities/index.js.map +1 -1
  69. package/dist/core/workers/facade.d.ts +20 -4
  70. package/dist/core/workers/facade.js +15 -7
  71. package/dist/core/workers/facade.js.map +1 -1
  72. package/dist/core/workers/worker-manager.d.ts +12 -0
  73. package/dist/core/workers/worker-manager.js +27 -0
  74. package/dist/core/workers/worker-manager.js.map +1 -1
  75. package/dist/core/workers/worker.d.ts +17 -1
  76. package/dist/core/workers/worker.js +28 -26
  77. package/dist/core/workers/worker.js.map +1 -1
  78. package/dist/index.d.ts +39 -2
  79. package/dist/index.js +14 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/moro.js +25 -1
  82. package/dist/moro.js.map +1 -1
  83. package/dist/types/config.js.map +1 -1
  84. package/dist/types/core.d.ts +1 -0
  85. package/dist/types/core.js.map +1 -1
  86. package/dist/types/module.js.map +1 -1
  87. package/package.json +3 -3
@@ -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 +1,3 @@
1
- export { requestLogger } from './middleware.js';
1
+ export { createRequestLoggerMiddleware } from './middleware.js';
2
+ import { createRequestLoggerMiddleware } from './middleware.js';
3
+ export declare const requestLogger: typeof createRequestLoggerMiddleware;
@@ -1,4 +1,5 @@
1
1
  // Request Logger - Main entry point
2
- // Re-exports the request logger middleware
3
- export { requestLogger } from './middleware.js';
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,2CAA2C;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["// Request Logger - Main entry point\n// Re-exports the request logger middleware\n\nexport { requestLogger } from './middleware.js';\n"]}
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
- * Simple request logging middleware
3
+ * Request logging middleware
4
4
  * Logs incoming requests and their completion time
5
5
  *
6
6
  * @example
7
7
  * ```ts
8
- * import { requestLogger } from '@/middleware/built-in/request-logger';
8
+ * import { middleware } from '@morojs/moro';
9
9
  *
10
- * app.use(requestLogger);
10
+ * app.use(middleware.requestLogger());
11
11
  * ```
12
12
  */
13
- export declare const requestLogger: (req: HttpRequest, res: HttpResponse, next: () => void) => void;
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
- * Simple request logging middleware
5
+ * Request logging middleware
6
6
  * Logs incoming requests and their completion time
7
7
  *
8
8
  * @example
9
9
  * ```ts
10
- * import { requestLogger } from '@/middleware/built-in/request-logger';
10
+ * import { middleware } from '@morojs/moro';
11
11
  *
12
- * app.use(requestLogger);
12
+ * app.use(middleware.requestLogger());
13
13
  * ```
14
14
  */
15
- export const requestLogger = (req, res, next) => {
16
- const startTime = Date.now();
17
- logger.info(`${req.method} ${req.path}`, 'RequestLogger');
18
- res.on('finish', () => {
19
- const duration = Date.now() - startTime;
20
- logger.info(`Request completed in ${duration}ms`, 'RequestLogger');
21
- });
22
- next();
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,CAAC,MAAM,aAAa,GAAG,CAAC,GAAgB,EAAE,GAAiB,EAAE,IAAgB,EAAQ,EAAE;IAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IAE1D,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,IAAI,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACT,CAAC,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 * Simple request logging middleware\n * Logs incoming requests and their completion time\n *\n * @example\n * ```ts\n * import { requestLogger } from '@/middleware/built-in/request-logger';\n *\n * app.use(requestLogger);\n * ```\n */\nexport const requestLogger = (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"]}
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"]}
@@ -18,5 +18,5 @@ export declare class MiddlewareManager extends EventEmitter {
18
18
  installWithDependencies(middleware: MiddlewareInterface[], options?: Record<string, any>): Promise<void>;
19
19
  private topologicalSort;
20
20
  }
21
- export { builtInMiddleware, simpleMiddleware } from './built-in/index.js';
21
+ export { middleware, builtInMiddleware } from './built-in/index.js';
22
22
  export * from './built-in/index.js';
@@ -147,6 +147,6 @@ export class MiddlewareManager extends EventEmitter {
147
147
  }
148
148
  }
149
149
  // Built-in middleware exports
150
- export { builtInMiddleware, simpleMiddleware } from './built-in/index.js';
150
+ export { middleware, builtInMiddleware } from './built-in/index.js';
151
151
  export * from './built-in/index.js';
152
152
  //# 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 // 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,3 @@
1
+ export { ObjectPool } from './object-pool.js';
2
+ export { LRUCache } from './lru-cache.js';
3
+ export { ObjectPoolManager, getPoolManager } from './object-pool-manager.js';
@@ -0,0 +1,5 @@
1
+ // Object Pooling & Caching - Centralized Exports
2
+ export { ObjectPool } from './object-pool.js';
3
+ export { LRUCache } from './lru-cache.js';
4
+ export { ObjectPoolManager, getPoolManager } from './object-pool-manager.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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
  /**
@@ -2,121 +2,9 @@
2
2
  // Consolidates object pooling from http-server, router, and other components
3
3
  import { createFrameworkLogger } from '../logger/index.js';
4
4
  import * as crypto from 'crypto';
5
+ import { ObjectPool } from './object-pool.js';
6
+ import { LRUCache } from './lru-cache.js';
5
7
  const logger = createFrameworkLogger('ObjectPoolManager');
6
- /**
7
- * Generic object pool for reusable objects
8
- */
9
- class ObjectPool {
10
- pool = [];
11
- factory;
12
- reset;
13
- maxSize;
14
- acquireCount = 0;
15
- releaseCount = 0;
16
- createCount = 0;
17
- constructor(factory, maxSize = 100, reset) {
18
- this.factory = factory;
19
- this.maxSize = maxSize;
20
- this.reset = reset;
21
- }
22
- acquire() {
23
- this.acquireCount++;
24
- if (this.pool.length > 0) {
25
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
26
- return this.pool.pop();
27
- }
28
- this.createCount++;
29
- return this.factory();
30
- }
31
- release(obj) {
32
- if (this.pool.length >= this.maxSize) {
33
- return; // Pool is full, let it be garbage collected
34
- }
35
- this.releaseCount++;
36
- // Reset object if reset function provided
37
- if (this.reset) {
38
- this.reset(obj);
39
- }
40
- this.pool.push(obj);
41
- }
42
- get size() {
43
- return this.pool.length;
44
- }
45
- get stats() {
46
- return {
47
- poolSize: this.pool.length,
48
- maxSize: this.maxSize,
49
- acquireCount: this.acquireCount,
50
- releaseCount: this.releaseCount,
51
- createCount: this.createCount,
52
- utilization: this.maxSize > 0 ? this.pool.length / this.maxSize : 0,
53
- };
54
- }
55
- clear() {
56
- this.pool = [];
57
- }
58
- }
59
- /**
60
- * LRU Cache for route lookups
61
- */
62
- class LRUCache {
63
- cache = new Map();
64
- maxSize;
65
- hits = 0;
66
- misses = 0;
67
- constructor(maxSize = 500) {
68
- this.maxSize = maxSize;
69
- }
70
- get(key) {
71
- const value = this.cache.get(key);
72
- if (value !== undefined) {
73
- this.hits++;
74
- // Move to end (most recently used)
75
- this.cache.delete(key);
76
- this.cache.set(key, value);
77
- return value;
78
- }
79
- this.misses++;
80
- return undefined;
81
- }
82
- set(key, value) {
83
- if (this.cache.has(key)) {
84
- this.cache.delete(key);
85
- }
86
- this.cache.set(key, value);
87
- // Evict oldest if over capacity
88
- if (this.cache.size > this.maxSize) {
89
- const firstKey = this.cache.keys().next().value;
90
- if (firstKey !== undefined) {
91
- this.cache.delete(firstKey);
92
- }
93
- }
94
- }
95
- has(key) {
96
- return this.cache.has(key);
97
- }
98
- delete(key) {
99
- return this.cache.delete(key);
100
- }
101
- clear() {
102
- this.cache.clear();
103
- this.hits = 0;
104
- this.misses = 0;
105
- }
106
- get size() {
107
- return this.cache.size;
108
- }
109
- get stats() {
110
- const total = this.hits + this.misses;
111
- return {
112
- size: this.cache.size,
113
- maxSize: this.maxSize,
114
- hits: this.hits,
115
- misses: this.misses,
116
- hitRate: total > 0 ? this.hits / total : 0,
117
- };
118
- }
119
- }
120
8
  /**
121
9
  * ObjectPoolManager - Singleton for managing all object pools
122
10
  * Consolidates pools from:
@@ -306,11 +194,26 @@ export class ObjectPoolManager {
306
194
  // Query Object Pool
307
195
  acquireQuery() {
308
196
  this.performanceStats.totalAcquisitions++;
309
- return this.queryPool.acquire();
197
+ const obj = this.queryPool.acquire();
198
+ const history = this.poolUsageHistory.get('query');
199
+ if (history) {
200
+ if (history.length >= 100) {
201
+ history.shift();
202
+ }
203
+ history.push(this.queryPool.size);
204
+ }
205
+ else {
206
+ this.poolUsageHistory.set('query', [this.queryPool.size]);
207
+ }
208
+ return obj;
310
209
  }
311
210
  releaseQuery(obj) {
312
211
  this.performanceStats.totalReleases++;
313
212
  this.queryPool.release(obj);
213
+ if (this.adaptiveMode &&
214
+ Date.now() - this.performanceStats.lastAdjustment > this.performanceStats.adjustmentInterval) {
215
+ this.adjustPoolSizes();
216
+ }
314
217
  }
315
218
  // Request ID Generation
316
219
  generateRequestId() {
@@ -399,40 +302,34 @@ export class ObjectPoolManager {
399
302
  this.responseCache.clear();
400
303
  }
401
304
  /**
402
- * Adaptively adjust pool sizes based on usage patterns
305
+ * Adaptively adjust pool sizes based on usage patterns.
306
+ * Each pool is sized to ~120% of its average observed size, clamped to a
307
+ * [min, max] range, and only resized when the change exceeds a threshold.
403
308
  */
404
309
  adjustPoolSizes() {
405
310
  this.performanceStats.lastAdjustment = Date.now();
406
- // Adjust parameter pool size
407
- const paramHistory = this.poolUsageHistory.get('params') || [];
408
- if (paramHistory.length >= 10) {
409
- const avgUsage = paramHistory.reduce((sum, size) => sum + size, 0) / paramHistory.length;
410
- const targetSize = Math.min(Math.max(Math.round(avgUsage * 1.2), 50), 200); // 20% buffer, 50-200 range
411
- if (Math.abs(this.paramPool.stats.maxSize - targetSize) > 10) {
412
- logger.debug(`Adjusting param pool size from ${this.paramPool.stats.maxSize} to ${targetSize}`, 'PoolManager');
413
- // Note: We can't directly change maxSize, but we can log the recommendation
414
- // In a real implementation, we'd recreate the pool with the new size
311
+ const applyFromHistory = (pool, historyKey, min, max, threshold, label) => {
312
+ const history = this.poolUsageHistory.get(historyKey) || [];
313
+ if (history.length < 10)
314
+ return;
315
+ const avgUsage = history.reduce((sum, size) => sum + size, 0) / history.length;
316
+ const targetSize = Math.min(Math.max(Math.round(avgUsage * 1.2), min), max);
317
+ if (Math.abs(pool.stats.maxSize - targetSize) > threshold) {
318
+ logger.debug(`Adjusting ${label} pool size from ${pool.stats.maxSize} to ${targetSize}`, 'PoolManager');
319
+ pool.setMaxSize(targetSize);
415
320
  }
416
- }
417
- // Adjust buffer pool sizes
321
+ };
322
+ applyFromHistory(this.paramPool, 'params', 50, 200, 10, 'param');
323
+ applyFromHistory(this.queryPool, 'query', 50, 200, 10, 'query');
418
324
  const bufferSizesLen = this.bufferSizes.length;
419
325
  for (let i = 0; i < bufferSizesLen; i++) {
420
326
  const size = this.bufferSizes[i];
421
327
  if (size === undefined)
422
328
  continue;
423
- const poolKey = `buffer_${size}`;
424
- const history = this.poolUsageHistory.get(poolKey) || [];
425
- if (history.length >= 10) {
426
- const avgUsage = history.reduce((sum, size) => sum + size, 0) / history.length;
427
- const pool = this.bufferPools.get(size);
428
- if (pool) {
429
- const currentMax = pool.stats.maxSize;
430
- const targetMax = this.getOptimalPoolSize(size);
431
- if (Math.abs(currentMax - targetMax) > 5) {
432
- logger.debug(`Buffer pool ${size}B: usage ${avgUsage.toFixed(1)}/${currentMax}, target ${targetMax}`, 'PoolManager');
433
- }
434
- }
435
- }
329
+ const pool = this.bufferPools.get(size);
330
+ if (!pool)
331
+ continue;
332
+ applyFromHistory(pool, `buffer_${size}`, 10, this.getOptimalPoolSize(size) * 2, 5, `buffer ${size}B`);
436
333
  }
437
334
  logger.debug('Pool size adjustment cycle completed', 'PoolManager');
438
335
  }