@morojs/moro 1.6.1 → 1.6.2

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 (404) hide show
  1. package/README.md +74 -256
  2. package/dist/core/auth/morojs-adapter.js +20 -20
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/config-manager.d.ts +44 -0
  5. package/dist/core/config/config-manager.js +104 -0
  6. package/dist/core/config/config-manager.js.map +1 -0
  7. package/dist/core/config/config-sources.d.ts +21 -0
  8. package/dist/core/config/config-sources.js +503 -0
  9. package/dist/core/config/config-sources.js.map +1 -0
  10. package/dist/core/config/config-validator.d.ts +21 -0
  11. package/dist/core/config/config-validator.js +791 -0
  12. package/dist/core/config/config-validator.js.map +1 -0
  13. package/dist/core/config/file-loader.d.ts +1 -6
  14. package/dist/core/config/file-loader.js +21 -249
  15. package/dist/core/config/file-loader.js.map +1 -1
  16. package/dist/core/config/index.d.ts +41 -12
  17. package/dist/core/config/index.js +65 -54
  18. package/dist/core/config/index.js.map +1 -1
  19. package/dist/core/config/schema.d.ts +2 -2
  20. package/dist/core/config/schema.js +55 -44
  21. package/dist/core/config/schema.js.map +1 -1
  22. package/dist/core/config/utils.d.ts +10 -3
  23. package/dist/core/config/utils.js +31 -58
  24. package/dist/core/config/utils.js.map +1 -1
  25. package/dist/core/database/adapters/drizzle.d.ts +1 -1
  26. package/dist/core/database/adapters/drizzle.js +18 -11
  27. package/dist/core/database/adapters/drizzle.js.map +1 -1
  28. package/dist/core/database/adapters/index.d.ts +7 -7
  29. package/dist/core/database/adapters/index.js +19 -29
  30. package/dist/core/database/adapters/index.js.map +1 -1
  31. package/dist/core/database/adapters/mongodb.d.ts +13 -1
  32. package/dist/core/database/adapters/mongodb.js +46 -10
  33. package/dist/core/database/adapters/mongodb.js.map +1 -1
  34. package/dist/core/database/adapters/mysql.d.ts +14 -1
  35. package/dist/core/database/adapters/mysql.js +19 -9
  36. package/dist/core/database/adapters/mysql.js.map +1 -1
  37. package/dist/core/database/adapters/postgresql.d.ts +12 -2
  38. package/dist/core/database/adapters/postgresql.js +19 -9
  39. package/dist/core/database/adapters/postgresql.js.map +1 -1
  40. package/dist/core/database/adapters/redis.d.ts +12 -1
  41. package/dist/core/database/adapters/redis.js +48 -13
  42. package/dist/core/database/adapters/redis.js.map +1 -1
  43. package/dist/core/database/adapters/sqlite.d.ts +3 -1
  44. package/dist/core/database/adapters/sqlite.js +19 -8
  45. package/dist/core/database/adapters/sqlite.js.map +1 -1
  46. package/dist/core/database/index.d.ts +2 -2
  47. package/dist/core/database/index.js +2 -18
  48. package/dist/core/database/index.js.map +1 -1
  49. package/dist/core/docs/index.d.ts +9 -9
  50. package/dist/core/docs/index.js +14 -35
  51. package/dist/core/docs/index.js.map +1 -1
  52. package/dist/core/docs/openapi-generator.d.ts +2 -2
  53. package/dist/core/docs/openapi-generator.js +11 -16
  54. package/dist/core/docs/openapi-generator.js.map +1 -1
  55. package/dist/core/docs/schema-to-openapi.d.ts +2 -2
  56. package/dist/core/docs/schema-to-openapi.js +5 -11
  57. package/dist/core/docs/schema-to-openapi.js.map +1 -1
  58. package/dist/core/docs/simple-docs.d.ts +1 -1
  59. package/dist/core/docs/simple-docs.js +4 -9
  60. package/dist/core/docs/simple-docs.js.map +1 -1
  61. package/dist/core/docs/swagger-ui.d.ts +2 -2
  62. package/dist/core/docs/swagger-ui.js +26 -29
  63. package/dist/core/docs/swagger-ui.js.map +1 -1
  64. package/dist/core/docs/zod-to-openapi.js +31 -28
  65. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  66. package/dist/core/events/event-bus.d.ts +1 -1
  67. package/dist/core/events/event-bus.js +7 -11
  68. package/dist/core/events/event-bus.js.map +1 -1
  69. package/dist/core/events/index.d.ts +2 -2
  70. package/dist/core/events/index.js +1 -5
  71. package/dist/core/events/index.js.map +1 -1
  72. package/dist/core/framework.d.ts +20 -13
  73. package/dist/core/framework.js +285 -102
  74. package/dist/core/framework.js.map +1 -1
  75. package/dist/core/http/http-server.d.ts +59 -7
  76. package/dist/core/http/http-server.js +190 -176
  77. package/dist/core/http/http-server.js.map +1 -1
  78. package/dist/core/http/index.d.ts +4 -3
  79. package/dist/core/http/index.js +3 -8
  80. package/dist/core/http/index.js.map +1 -1
  81. package/dist/core/http/uws-http-server.d.ts +46 -0
  82. package/dist/core/http/uws-http-server.js +523 -0
  83. package/dist/core/http/uws-http-server.js.map +1 -0
  84. package/dist/core/logger/filters.d.ts +1 -1
  85. package/dist/core/logger/filters.js +20 -23
  86. package/dist/core/logger/filters.js.map +1 -1
  87. package/dist/core/logger/index.d.ts +3 -3
  88. package/dist/core/logger/index.js +2 -24
  89. package/dist/core/logger/index.js.map +1 -1
  90. package/dist/core/logger/logger.d.ts +30 -14
  91. package/dist/core/logger/logger.js +398 -223
  92. package/dist/core/logger/logger.js.map +1 -1
  93. package/dist/core/logger/outputs.d.ts +1 -1
  94. package/dist/core/logger/outputs.js +8 -17
  95. package/dist/core/logger/outputs.js.map +1 -1
  96. package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
  97. package/dist/core/middleware/built-in/adapters/cache/file.js +10 -47
  98. package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
  99. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
  100. package/dist/core/middleware/built-in/adapters/cache/index.js +10 -17
  101. package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
  102. package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
  103. package/dist/core/middleware/built-in/adapters/cache/memory.js +3 -7
  104. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
  105. package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
  106. package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
  107. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
  108. package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
  109. package/dist/core/middleware/built-in/adapters/cdn/azure.js +3 -7
  110. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
  111. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
  112. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +3 -7
  113. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
  114. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
  115. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
  116. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
  117. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
  118. package/dist/core/middleware/built-in/adapters/cdn/index.js +10 -17
  119. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
  120. package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
  121. package/dist/core/middleware/built-in/adapters/index.js +4 -23
  122. package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
  123. package/dist/core/middleware/built-in/auth-helpers.js +11 -22
  124. package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
  125. package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
  126. package/dist/core/middleware/built-in/auth-providers.js +4 -9
  127. package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
  128. package/dist/core/middleware/built-in/auth.d.ts +2 -2
  129. package/dist/core/middleware/built-in/auth.js +93 -26
  130. package/dist/core/middleware/built-in/auth.js.map +1 -1
  131. package/dist/core/middleware/built-in/cache.d.ts +2 -2
  132. package/dist/core/middleware/built-in/cache.js +11 -12
  133. package/dist/core/middleware/built-in/cache.js.map +1 -1
  134. package/dist/core/middleware/built-in/cdn.d.ts +2 -2
  135. package/dist/core/middleware/built-in/cdn.js +5 -9
  136. package/dist/core/middleware/built-in/cdn.js.map +1 -1
  137. package/dist/core/middleware/built-in/cookie.d.ts +1 -1
  138. package/dist/core/middleware/built-in/cookie.js +3 -7
  139. package/dist/core/middleware/built-in/cookie.js.map +1 -1
  140. package/dist/core/middleware/built-in/cors.d.ts +1 -1
  141. package/dist/core/middleware/built-in/cors.js +3 -7
  142. package/dist/core/middleware/built-in/cors.js.map +1 -1
  143. package/dist/core/middleware/built-in/csp.d.ts +1 -1
  144. package/dist/core/middleware/built-in/csp.js +5 -8
  145. package/dist/core/middleware/built-in/csp.js.map +1 -1
  146. package/dist/core/middleware/built-in/csrf.d.ts +1 -1
  147. package/dist/core/middleware/built-in/csrf.js +5 -8
  148. package/dist/core/middleware/built-in/csrf.js.map +1 -1
  149. package/dist/core/middleware/built-in/error-tracker.js +3 -7
  150. package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
  151. package/dist/core/middleware/built-in/index.d.ts +28 -27
  152. package/dist/core/middleware/built-in/index.js +48 -78
  153. package/dist/core/middleware/built-in/index.js.map +1 -1
  154. package/dist/core/middleware/built-in/jwt-helpers.d.ts +118 -0
  155. package/dist/core/middleware/built-in/jwt-helpers.js +218 -0
  156. package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -0
  157. package/dist/core/middleware/built-in/performance-monitor.js +3 -7
  158. package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
  159. package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
  160. package/dist/core/middleware/built-in/rate-limit.js +3 -7
  161. package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
  162. package/dist/core/middleware/built-in/request-logger.js +5 -8
  163. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  164. package/dist/core/middleware/built-in/session.d.ts +2 -2
  165. package/dist/core/middleware/built-in/session.js +11 -15
  166. package/dist/core/middleware/built-in/session.js.map +1 -1
  167. package/dist/core/middleware/built-in/sse.d.ts +1 -1
  168. package/dist/core/middleware/built-in/sse.js +12 -14
  169. package/dist/core/middleware/built-in/sse.js.map +1 -1
  170. package/dist/core/middleware/built-in/validation.d.ts +1 -1
  171. package/dist/core/middleware/built-in/validation.js +3 -7
  172. package/dist/core/middleware/built-in/validation.js.map +1 -1
  173. package/dist/core/middleware/index.d.ts +4 -4
  174. package/dist/core/middleware/index.js +8 -28
  175. package/dist/core/middleware/index.js.map +1 -1
  176. package/dist/core/modules/auto-discovery.d.ts +19 -2
  177. package/dist/core/modules/auto-discovery.js +391 -74
  178. package/dist/core/modules/auto-discovery.js.map +1 -1
  179. package/dist/core/modules/index.d.ts +2 -2
  180. package/dist/core/modules/index.js +2 -9
  181. package/dist/core/modules/index.js.map +1 -1
  182. package/dist/core/modules/modules.d.ts +3 -3
  183. package/dist/core/modules/modules.js +23 -54
  184. package/dist/core/modules/modules.js.map +1 -1
  185. package/dist/core/networking/adapters/index.d.ts +4 -3
  186. package/dist/core/networking/adapters/index.js +3 -7
  187. package/dist/core/networking/adapters/index.js.map +1 -1
  188. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  189. package/dist/core/networking/adapters/socketio-adapter.js +5 -40
  190. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  191. package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
  192. package/dist/core/networking/adapters/uws-adapter.js +513 -0
  193. package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
  194. package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
  195. package/dist/core/networking/adapters/ws-adapter.js +8 -43
  196. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  197. package/dist/core/networking/index.d.ts +3 -2
  198. package/dist/core/networking/index.js +2 -7
  199. package/dist/core/networking/index.js.map +1 -1
  200. package/dist/core/networking/service-discovery.js +8 -12
  201. package/dist/core/networking/service-discovery.js.map +1 -1
  202. package/dist/core/networking/websocket-adapter.js +1 -2
  203. package/dist/core/networking/websocket-adapter.js.map +1 -1
  204. package/dist/core/networking/websocket-manager.d.ts +3 -3
  205. package/dist/core/networking/websocket-manager.js +9 -11
  206. package/dist/core/networking/websocket-manager.js.map +1 -1
  207. package/dist/core/pooling/object-pool-manager.d.ts +140 -0
  208. package/dist/core/pooling/object-pool-manager.js +502 -0
  209. package/dist/core/pooling/object-pool-manager.js.map +1 -0
  210. package/dist/core/routing/app-integration.d.ts +14 -12
  211. package/dist/core/routing/app-integration.js +49 -85
  212. package/dist/core/routing/app-integration.js.map +1 -1
  213. package/dist/core/routing/index.d.ts +17 -11
  214. package/dist/core/routing/index.js +48 -237
  215. package/dist/core/routing/index.js.map +1 -1
  216. package/dist/core/routing/path-matcher.d.ts +67 -0
  217. package/dist/core/routing/path-matcher.js +182 -0
  218. package/dist/core/routing/path-matcher.js.map +1 -0
  219. package/dist/core/routing/router.d.ts +38 -0
  220. package/dist/core/routing/router.js +68 -0
  221. package/dist/core/routing/router.js.map +1 -0
  222. package/dist/core/routing/unified-router.d.ts +148 -0
  223. package/dist/core/routing/unified-router.js +684 -0
  224. package/dist/core/routing/unified-router.js.map +1 -0
  225. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  226. package/dist/core/runtime/aws-lambda-adapter.js +2 -6
  227. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  228. package/dist/core/runtime/base-adapter.d.ts +2 -2
  229. package/dist/core/runtime/base-adapter.js +3 -7
  230. package/dist/core/runtime/base-adapter.js.map +1 -1
  231. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  232. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
  233. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  234. package/dist/core/runtime/index.d.ts +12 -12
  235. package/dist/core/runtime/index.js +22 -35
  236. package/dist/core/runtime/index.js.map +1 -1
  237. package/dist/core/runtime/node-adapter.d.ts +4 -4
  238. package/dist/core/runtime/node-adapter.js +18 -49
  239. package/dist/core/runtime/node-adapter.js.map +1 -1
  240. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  241. package/dist/core/runtime/vercel-edge-adapter.js +2 -6
  242. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  243. package/dist/core/utilities/circuit-breaker.js +1 -5
  244. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  245. package/dist/core/utilities/container.js +12 -22
  246. package/dist/core/utilities/container.js.map +1 -1
  247. package/dist/core/utilities/hooks.d.ts +2 -2
  248. package/dist/core/utilities/hooks.js +7 -12
  249. package/dist/core/utilities/hooks.js.map +1 -1
  250. package/dist/core/utilities/index.d.ts +5 -4
  251. package/dist/core/utilities/index.js +5 -19
  252. package/dist/core/utilities/index.js.map +1 -1
  253. package/dist/core/utilities/package-utils.d.ts +38 -0
  254. package/dist/core/utilities/package-utils.js +57 -0
  255. package/dist/core/utilities/package-utils.js.map +1 -0
  256. package/dist/core/validation/adapters.d.ts +1 -1
  257. package/dist/core/validation/adapters.js +15 -26
  258. package/dist/core/validation/adapters.js.map +1 -1
  259. package/dist/core/validation/index.d.ts +6 -4
  260. package/dist/core/validation/index.js +57 -28
  261. package/dist/core/validation/index.js.map +1 -1
  262. package/dist/core/validation/schema-interface.js +3 -9
  263. package/dist/core/validation/schema-interface.js.map +1 -1
  264. package/dist/index.d.ts +51 -52
  265. package/dist/index.js +23 -132
  266. package/dist/index.js.map +1 -1
  267. package/dist/moro.d.ts +70 -16
  268. package/dist/moro.js +658 -271
  269. package/dist/moro.js.map +1 -1
  270. package/dist/types/auth.js +3 -9
  271. package/dist/types/auth.js.map +1 -1
  272. package/dist/types/cache.js +1 -2
  273. package/dist/types/cdn.js +1 -2
  274. package/dist/types/config.d.ts +73 -2
  275. package/dist/types/config.js +1 -2
  276. package/dist/types/config.js.map +1 -1
  277. package/dist/types/core.d.ts +36 -42
  278. package/dist/types/core.js +1 -2
  279. package/dist/types/database.js +1 -2
  280. package/dist/types/discovery.js +1 -2
  281. package/dist/types/events.js +1 -2
  282. package/dist/types/hooks.d.ts +1 -1
  283. package/dist/types/hooks.js +1 -2
  284. package/dist/types/http.d.ts +16 -1
  285. package/dist/types/http.js +1 -2
  286. package/dist/types/logger.d.ts +7 -0
  287. package/dist/types/logger.js +1 -2
  288. package/dist/types/module.d.ts +11 -0
  289. package/dist/types/module.js +1 -2
  290. package/dist/types/runtime.d.ts +1 -1
  291. package/dist/types/runtime.js +1 -2
  292. package/dist/types/session.js +1 -2
  293. package/jest.config.mjs +41 -0
  294. package/package.json +19 -52
  295. package/src/core/auth/morojs-adapter.ts +18 -13
  296. package/src/core/config/config-manager.ts +133 -0
  297. package/src/core/config/config-sources.ts +600 -0
  298. package/src/core/config/config-validator.ts +1116 -0
  299. package/src/core/config/file-loader.ts +16 -273
  300. package/src/core/config/index.ts +83 -34
  301. package/src/core/config/schema.ts +47 -33
  302. package/src/core/config/utils.ts +24 -31
  303. package/src/core/database/README.md +26 -16
  304. package/src/core/database/adapters/drizzle.ts +18 -6
  305. package/src/core/database/adapters/index.ts +13 -13
  306. package/src/core/database/adapters/mongodb.ts +53 -5
  307. package/src/core/database/adapters/mysql.ts +32 -4
  308. package/src/core/database/adapters/postgresql.ts +30 -5
  309. package/src/core/database/adapters/redis.ts +61 -8
  310. package/src/core/database/adapters/sqlite.ts +19 -3
  311. package/src/core/database/index.ts +2 -2
  312. package/src/core/docs/index.ts +8 -8
  313. package/src/core/docs/openapi-generator.ts +4 -4
  314. package/src/core/docs/schema-to-openapi.ts +3 -6
  315. package/src/core/docs/simple-docs.ts +2 -2
  316. package/src/core/docs/swagger-ui.ts +19 -16
  317. package/src/core/docs/zod-to-openapi.ts +34 -34
  318. package/src/core/events/event-bus.ts +3 -3
  319. package/src/core/events/index.ts +2 -2
  320. package/src/core/framework.ts +320 -71
  321. package/src/core/http/http-server.ts +203 -143
  322. package/src/core/http/index.ts +4 -3
  323. package/src/core/http/uws-http-server.ts +591 -0
  324. package/src/core/logger/filters.ts +13 -5
  325. package/src/core/logger/index.ts +4 -3
  326. package/src/core/logger/logger.ts +435 -216
  327. package/src/core/logger/outputs.ts +1 -3
  328. package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
  329. package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
  330. package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
  331. package/src/core/middleware/built-in/adapters/cache/redis.ts +18 -4
  332. package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
  333. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
  334. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +16 -5
  335. package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
  336. package/src/core/middleware/built-in/adapters/index.ts +4 -4
  337. package/src/core/middleware/built-in/auth-helpers.ts +1 -1
  338. package/src/core/middleware/built-in/auth-providers.ts +1 -1
  339. package/src/core/middleware/built-in/auth.ts +102 -21
  340. package/src/core/middleware/built-in/cache.ts +8 -6
  341. package/src/core/middleware/built-in/cdn.ts +4 -4
  342. package/src/core/middleware/built-in/cookie.ts +2 -2
  343. package/src/core/middleware/built-in/cors.ts +2 -2
  344. package/src/core/middleware/built-in/csp.ts +3 -3
  345. package/src/core/middleware/built-in/csrf.ts +3 -3
  346. package/src/core/middleware/built-in/error-tracker.ts +1 -1
  347. package/src/core/middleware/built-in/index.ts +38 -30
  348. package/src/core/middleware/built-in/jwt-helpers.ts +243 -0
  349. package/src/core/middleware/built-in/performance-monitor.ts +1 -1
  350. package/src/core/middleware/built-in/rate-limit.ts +2 -2
  351. package/src/core/middleware/built-in/request-logger.ts +3 -1
  352. package/src/core/middleware/built-in/session.ts +7 -8
  353. package/src/core/middleware/built-in/sse.ts +11 -9
  354. package/src/core/middleware/built-in/validation.ts +2 -2
  355. package/src/core/middleware/index.ts +6 -6
  356. package/src/core/modules/auto-discovery.ts +478 -15
  357. package/src/core/modules/index.ts +2 -2
  358. package/src/core/modules/modules.ts +23 -12
  359. package/src/core/networking/adapters/index.ts +4 -3
  360. package/src/core/networking/adapters/socketio-adapter.ts +5 -3
  361. package/src/core/networking/adapters/uws-adapter.ts +619 -0
  362. package/src/core/networking/adapters/ws-adapter.ts +8 -9
  363. package/src/core/networking/index.ts +3 -2
  364. package/src/core/networking/service-discovery.ts +6 -7
  365. package/src/core/networking/websocket-manager.ts +7 -7
  366. package/src/core/pooling/object-pool-manager.ts +630 -0
  367. package/src/core/routing/app-integration.ts +60 -112
  368. package/src/core/routing/index.ts +66 -293
  369. package/src/core/routing/path-matcher.ts +222 -0
  370. package/src/core/routing/router.ts +97 -0
  371. package/src/core/routing/unified-router.ts +870 -0
  372. package/src/core/runtime/aws-lambda-adapter.ts +3 -3
  373. package/src/core/runtime/base-adapter.ts +2 -2
  374. package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
  375. package/src/core/runtime/index.ts +13 -13
  376. package/src/core/runtime/node-adapter.ts +16 -10
  377. package/src/core/runtime/vercel-edge-adapter.ts +3 -3
  378. package/src/core/utilities/hooks.ts +3 -3
  379. package/src/core/utilities/index.ts +5 -4
  380. package/src/core/utilities/package-utils.ts +59 -0
  381. package/src/core/validation/adapters.ts +1 -1
  382. package/src/core/validation/index.ts +68 -16
  383. package/src/index.ts +73 -66
  384. package/src/moro.ts +784 -253
  385. package/src/types/config.ts +74 -2
  386. package/src/types/core.ts +49 -47
  387. package/src/types/hooks.ts +1 -1
  388. package/src/types/http.ts +23 -1
  389. package/src/types/logger.ts +9 -0
  390. package/src/types/module.ts +12 -0
  391. package/src/types/runtime.ts +1 -1
  392. package/tsconfig.json +4 -2
  393. package/dist/core/config/loader.d.ts +0 -7
  394. package/dist/core/config/loader.js +0 -269
  395. package/dist/core/config/loader.js.map +0 -1
  396. package/dist/core/config/validation.d.ts +0 -17
  397. package/dist/core/config/validation.js +0 -131
  398. package/dist/core/config/validation.js.map +0 -1
  399. package/dist/core/http/router.d.ts +0 -14
  400. package/dist/core/http/router.js +0 -109
  401. package/dist/core/http/router.js.map +0 -1
  402. package/src/core/config/loader.ts +0 -633
  403. package/src/core/config/validation.ts +0 -140
  404. package/src/core/http/router.ts +0 -141
@@ -1,7 +1,6 @@
1
1
  // Service Discovery Client for Microservices
2
2
  // Supports Consul, Kubernetes, and in-memory registry
3
-
4
- import { logger, createFrameworkLogger } from '../logger';
3
+ import { createFrameworkLogger } from '../logger/index.js';
5
4
 
6
5
  export interface ServiceInfo {
7
6
  name: string;
@@ -124,7 +123,7 @@ export class ServiceRegistry {
124
123
  throw new Error(`Consul registration failed: ${response.statusText}`);
125
124
  }
126
125
  } catch (error) {
127
- this.serviceLogger.error('Failed to register with Consul:', 'ServiceRegistry', {
126
+ this.serviceLogger.error('Failed to register with Consul', 'SERVICE_DISCOVERY', {
128
127
  error: error instanceof Error ? error.message : String(error),
129
128
  });
130
129
  // Fallback to in-memory
@@ -155,7 +154,7 @@ export class ServiceRegistry {
155
154
  metadata: entry.Service.Meta,
156
155
  }));
157
156
  } catch (error) {
158
- this.serviceLogger.error('Failed to discover from Consul:', 'ServiceRegistry', {
157
+ this.serviceLogger.error('Failed to discover from Consul', 'SERVICE_DISCOVERY', {
159
158
  error: error instanceof Error ? error.message : String(error),
160
159
  });
161
160
  return this.discoverFromMemory(serviceName);
@@ -170,7 +169,7 @@ export class ServiceRegistry {
170
169
  method: 'PUT',
171
170
  });
172
171
  } catch (error) {
173
- this.serviceLogger.error('Failed to deregister from Consul:', 'ServiceRegistry', {
172
+ this.serviceLogger.error('Failed to deregister from Consul', 'SERVICE_DISCOVERY', {
174
173
  error: error instanceof Error ? error.message : String(error),
175
174
  });
176
175
  }
@@ -205,7 +204,7 @@ export class ServiceRegistry {
205
204
  },
206
205
  ];
207
206
  } catch (error) {
208
- this.serviceLogger.error('Failed to discover from Kubernetes:', 'ServiceRegistry', {
207
+ this.serviceLogger.error('Failed to discover from Kubernetes', 'SERVICE_DISCOVERY', {
209
208
  error: error instanceof Error ? error.message : String(error),
210
209
  });
211
210
  return this.discoverFromMemory(serviceName);
@@ -242,7 +241,7 @@ export class ServiceRegistry {
242
241
  this.removeUnhealthyService(serviceName, service);
243
242
  }
244
243
  } catch (error) {
245
- this.serviceLogger.warn(`Health check failed for ${serviceName}:`, 'ServiceRegistry', {
244
+ this.serviceLogger.warn(`Health check failed for ${serviceName}`, 'SERVICE_DISCOVERY', {
246
245
  error: error instanceof Error ? error.message : String(error),
247
246
  });
248
247
  this.removeUnhealthyService(serviceName, service);
@@ -1,10 +1,12 @@
1
1
  // WebSocket Manager for Moro Framework
2
2
  // Manages WebSocket connections using pluggable adapters
3
- import { Container } from '../utilities';
4
- import { CircuitBreaker } from '../utilities';
5
- import { ModuleConfig, WebSocketDefinition } from '../../types/module';
6
- import { WebSocketAdapter, WebSocketNamespace, WebSocketConnection } from './websocket-adapter';
7
- import { createFrameworkLogger } from '../logger';
3
+ import * as zlib from 'zlib';
4
+ import { Container } from '../utilities/index.js';
5
+ import { CircuitBreaker } from '../utilities/index.js';
6
+ import { ModuleConfig, WebSocketDefinition } from '../../types/module.js';
7
+ import { WebSocketAdapter, WebSocketNamespace, WebSocketConnection } from './websocket-adapter.js';
8
+ import { createFrameworkLogger } from '../logger/index.js';
9
+ import { normalizeValidationError } from '../validation/schema-interface.js';
8
10
 
9
11
  export class WebSocketManager {
10
12
  private circuitBreakers = new Map<string, CircuitBreaker>();
@@ -134,7 +136,6 @@ export class WebSocketManager {
134
136
  data = await wsConfig.validation.parseAsync(data);
135
137
  } catch (validationError: any) {
136
138
  // Handle universal validation errors
137
- const { normalizeValidationError } = require('../validation/schema-interface');
138
139
  const normalizedError = normalizeValidationError(validationError);
139
140
  const error = {
140
141
  success: false,
@@ -264,7 +265,6 @@ export class WebSocketManager {
264
265
  if (buffer[0] === 0x1f && buffer[1] === 0x8b) {
265
266
  // This is gzipped data
266
267
  try {
267
- const zlib = require('zlib');
268
268
  return zlib.gunzipSync(buffer);
269
269
  } catch {
270
270
  return buffer;
@@ -0,0 +1,630 @@
1
+ // Unified Object Pool Manager
2
+ // Consolidates object pooling from http-server, router, and other components
3
+
4
+ import { createFrameworkLogger } from '../logger/index.js';
5
+ import * as crypto from 'crypto';
6
+ const logger = createFrameworkLogger('ObjectPoolManager');
7
+
8
+ /**
9
+ * Generic object pool for reusable objects
10
+ */
11
+ class ObjectPool<T> {
12
+ private pool: T[] = [];
13
+ private readonly factory: () => T;
14
+ private readonly reset?: (obj: T) => void;
15
+ private readonly maxSize: number;
16
+ private acquireCount = 0;
17
+ private releaseCount = 0;
18
+ private createCount = 0;
19
+
20
+ constructor(factory: () => T, maxSize: number = 100, reset?: (obj: T) => void) {
21
+ this.factory = factory;
22
+ this.maxSize = maxSize;
23
+ this.reset = reset;
24
+ }
25
+
26
+ acquire(): T {
27
+ this.acquireCount++;
28
+
29
+ if (this.pool.length > 0) {
30
+ return this.pool.pop()!;
31
+ }
32
+
33
+ this.createCount++;
34
+ return this.factory();
35
+ }
36
+
37
+ release(obj: T): void {
38
+ if (this.pool.length >= this.maxSize) {
39
+ return; // Pool is full, let it be garbage collected
40
+ }
41
+
42
+ this.releaseCount++;
43
+
44
+ // Reset object if reset function provided
45
+ if (this.reset) {
46
+ this.reset(obj);
47
+ }
48
+
49
+ this.pool.push(obj);
50
+ }
51
+
52
+ get size(): number {
53
+ return this.pool.length;
54
+ }
55
+
56
+ get stats() {
57
+ return {
58
+ poolSize: this.pool.length,
59
+ maxSize: this.maxSize,
60
+ acquireCount: this.acquireCount,
61
+ releaseCount: this.releaseCount,
62
+ createCount: this.createCount,
63
+ utilization: this.maxSize > 0 ? this.pool.length / this.maxSize : 0,
64
+ };
65
+ }
66
+
67
+ clear(): void {
68
+ this.pool = [];
69
+ }
70
+ }
71
+
72
+ /**
73
+ * LRU Cache for route lookups
74
+ */
75
+ class LRUCache<K, V> {
76
+ private cache = new Map<K, V>();
77
+ private readonly maxSize: number;
78
+ private hits = 0;
79
+ private misses = 0;
80
+
81
+ constructor(maxSize: number = 500) {
82
+ this.maxSize = maxSize;
83
+ }
84
+
85
+ get(key: K): V | undefined {
86
+ const value = this.cache.get(key);
87
+ if (value !== undefined) {
88
+ this.hits++;
89
+ // Move to end (most recently used)
90
+ this.cache.delete(key);
91
+ this.cache.set(key, value);
92
+ return value;
93
+ }
94
+ this.misses++;
95
+ return undefined;
96
+ }
97
+
98
+ set(key: K, value: V): void {
99
+ if (this.cache.has(key)) {
100
+ this.cache.delete(key);
101
+ }
102
+
103
+ this.cache.set(key, value);
104
+
105
+ // Evict oldest if over capacity
106
+ if (this.cache.size > this.maxSize) {
107
+ const firstKey = this.cache.keys().next().value;
108
+ if (firstKey !== undefined) {
109
+ this.cache.delete(firstKey);
110
+ }
111
+ }
112
+ }
113
+
114
+ has(key: K): boolean {
115
+ return this.cache.has(key);
116
+ }
117
+
118
+ delete(key: K): boolean {
119
+ return this.cache.delete(key);
120
+ }
121
+
122
+ clear(): void {
123
+ this.cache.clear();
124
+ this.hits = 0;
125
+ this.misses = 0;
126
+ }
127
+
128
+ get size(): number {
129
+ return this.cache.size;
130
+ }
131
+
132
+ get stats() {
133
+ const total = this.hits + this.misses;
134
+ return {
135
+ size: this.cache.size,
136
+ maxSize: this.maxSize,
137
+ hits: this.hits,
138
+ misses: this.misses,
139
+ hitRate: total > 0 ? this.hits / total : 0,
140
+ };
141
+ }
142
+ }
143
+
144
+ /**
145
+ * ObjectPoolManager - Singleton for managing all object pools
146
+ * Consolidates pools from:
147
+ * - MoroHttpServer (paramObjectPool, bufferPool)
148
+ * - Router (paramObjectPool)
149
+ * - Various route caches
150
+ */
151
+ export class ObjectPoolManager {
152
+ private static instance: ObjectPoolManager | null = null;
153
+
154
+ // Parameter object pool (for route params)
155
+ private paramPool: ObjectPool<Record<string, string>>;
156
+
157
+ // Header object pool (for parsed headers)
158
+ private headerPool: ObjectPool<Record<string, string>>;
159
+
160
+ // Query object pool (for parsed query strings)
161
+ private queryPool: ObjectPool<Record<string, string>>;
162
+
163
+ // Buffer pools by size
164
+ private bufferPools: Map<number, ObjectPool<Buffer>>;
165
+ private readonly bufferSizes = [64, 256, 1024, 4096, 16384];
166
+
167
+ // Route lookup cache
168
+ private routeCache: LRUCache<string, any>;
169
+
170
+ // Response cache (for common responses - now includes full response metadata)
171
+ private responseCache: LRUCache<
172
+ string,
173
+ { buffer: Buffer; headers: Record<string, string>; statusCode: number }
174
+ >;
175
+
176
+ // Performance monitoring
177
+ private performanceStats = {
178
+ poolHits: 0,
179
+ poolMisses: 0,
180
+ totalAcquisitions: 0,
181
+ totalReleases: 0,
182
+ lastAdjustment: 0,
183
+ adjustmentInterval: 60000, // 1 minute
184
+ };
185
+
186
+ // Adaptive pool sizing
187
+ private poolUsageHistory: Map<string, number[]> = new Map();
188
+ private adaptiveMode = true;
189
+
190
+ private constructor() {
191
+ // Set initial last adjustment time to prevent immediate adjustment
192
+ this.performanceStats.lastAdjustment = Date.now();
193
+
194
+ // Initialize parameter object pool with adaptive sizing
195
+ this.paramPool = new ObjectPool(
196
+ () => ({}),
197
+ 100, // Initial size
198
+ (obj: Record<string, string>) => {
199
+ // Clear all properties
200
+ for (const key in obj) {
201
+ delete obj[key];
202
+ }
203
+ }
204
+ );
205
+
206
+ // Initialize header object pool
207
+ this.headerPool = new ObjectPool(
208
+ () => ({}),
209
+ 50, // Initial size - headers are less common to pool
210
+ (obj: Record<string, string>) => {
211
+ // Clear all properties
212
+ for (const key in obj) {
213
+ delete obj[key];
214
+ }
215
+ }
216
+ );
217
+
218
+ // Initialize query object pool
219
+ this.queryPool = new ObjectPool(
220
+ () => ({}),
221
+ 100, // Initial size - queries are very common
222
+ (obj: Record<string, string>) => {
223
+ // Clear all properties
224
+ for (const key in obj) {
225
+ delete obj[key];
226
+ }
227
+ }
228
+ );
229
+
230
+ // Initialize buffer pools with enhanced sizing
231
+ this.bufferPools = new Map();
232
+ this.bufferSizes.forEach(size => {
233
+ this.bufferPools.set(
234
+ size,
235
+ new ObjectPool<Buffer>(() => Buffer.allocUnsafe(size), this.getOptimalPoolSize(size))
236
+ );
237
+ });
238
+
239
+ // Initialize caches with enhanced statistics
240
+ this.routeCache = new LRUCache(500);
241
+ this.responseCache = new LRUCache(200); // Increased for full response caching
242
+
243
+ // Pre-warm pools for better initial performance
244
+ this.preWarmPools();
245
+
246
+ logger.debug(
247
+ 'ObjectPoolManager initialized with enhanced performance features',
248
+ 'Initialization'
249
+ );
250
+ }
251
+
252
+ /**
253
+ * Pre-warm pools with initial objects for better startup performance
254
+ */
255
+ private preWarmPools(): void {
256
+ // Pre-warm parameter pool
257
+ for (let i = 0; i < 20; i++) {
258
+ const obj = this.paramPool.acquire();
259
+ this.paramPool.release(obj);
260
+ }
261
+
262
+ // Pre-warm header pool
263
+ for (let i = 0; i < 10; i++) {
264
+ const obj = this.headerPool.acquire();
265
+ this.headerPool.release(obj);
266
+ }
267
+
268
+ // Pre-warm query pool
269
+ for (let i = 0; i < 20; i++) {
270
+ const obj = this.queryPool.acquire();
271
+ this.queryPool.release(obj);
272
+ }
273
+
274
+ // Pre-warm buffer pools
275
+ this.bufferSizes.forEach(size => {
276
+ const pool = this.bufferPools.get(size);
277
+ if (pool) {
278
+ for (let i = 0; i < Math.min(10, pool.stats.maxSize); i++) {
279
+ const buffer = pool.acquire();
280
+ pool.release(buffer);
281
+ }
282
+ }
283
+ });
284
+
285
+ logger.debug('Object pools pre-warmed', 'PoolManager');
286
+ }
287
+
288
+ /**
289
+ * Get optimal pool size based on buffer size and usage patterns
290
+ */
291
+ private getOptimalPoolSize(bufferSize: number): number {
292
+ // Smaller buffers can have larger pools
293
+ if (bufferSize <= 256) return 100;
294
+ if (bufferSize <= 1024) return 75;
295
+ if (bufferSize <= 4096) return 50;
296
+ return 25; // Large buffers need smaller pools
297
+ }
298
+
299
+ static getInstance(): ObjectPoolManager {
300
+ if (!this.instance) {
301
+ this.instance = new ObjectPoolManager();
302
+ }
303
+ return this.instance;
304
+ }
305
+
306
+ /**
307
+ * Reset the singleton (useful for testing)
308
+ */
309
+ static reset(): void {
310
+ if (this.instance) {
311
+ this.instance.clearAll();
312
+ }
313
+ this.instance = null;
314
+ }
315
+
316
+ // Parameter Object Pool
317
+
318
+ acquireParams(): Record<string, string> {
319
+ this.performanceStats.totalAcquisitions++;
320
+ const obj = this.paramPool.acquire();
321
+
322
+ if (this.poolUsageHistory.has('params')) {
323
+ const history = this.poolUsageHistory.get('params')!;
324
+ if (history.length >= 100) {
325
+ history.shift(); // Keep only last 100 measurements
326
+ }
327
+ history.push(this.paramPool.size);
328
+ } else {
329
+ this.poolUsageHistory.set('params', [this.paramPool.size]);
330
+ }
331
+
332
+ return obj;
333
+ }
334
+
335
+ releaseParams(obj: Record<string, string>): void {
336
+ this.performanceStats.totalReleases++;
337
+ this.paramPool.release(obj);
338
+
339
+ // Adaptive pool sizing based on usage patterns
340
+ if (
341
+ this.adaptiveMode &&
342
+ Date.now() - this.performanceStats.lastAdjustment > this.performanceStats.adjustmentInterval
343
+ ) {
344
+ this.adjustPoolSizes();
345
+ }
346
+ }
347
+
348
+ // Header Object Pool
349
+
350
+ acquireHeaders(): Record<string, string> {
351
+ this.performanceStats.totalAcquisitions++;
352
+ return this.headerPool.acquire();
353
+ }
354
+
355
+ releaseHeaders(obj: Record<string, string>): void {
356
+ this.performanceStats.totalReleases++;
357
+ this.headerPool.release(obj);
358
+ }
359
+
360
+ // Query Object Pool
361
+
362
+ acquireQuery(): Record<string, string> {
363
+ this.performanceStats.totalAcquisitions++;
364
+ return this.queryPool.acquire();
365
+ }
366
+
367
+ releaseQuery(obj: Record<string, string>): void {
368
+ this.performanceStats.totalReleases++;
369
+ this.queryPool.release(obj);
370
+ }
371
+
372
+ // Request ID Generation
373
+
374
+ generateRequestId(): string {
375
+ return crypto.randomUUID();
376
+ }
377
+
378
+ // Buffer Pool
379
+
380
+ acquireBuffer(size: number): Buffer {
381
+ this.performanceStats.totalAcquisitions++;
382
+
383
+ // Find smallest buffer that fits
384
+ for (const poolSize of this.bufferSizes) {
385
+ if (size <= poolSize) {
386
+ const pool = this.bufferPools.get(poolSize);
387
+ if (pool) {
388
+ const buffer = pool.acquire();
389
+ this.performanceStats.poolHits++;
390
+
391
+ // Track usage for adaptive sizing
392
+ const poolKey = `buffer_${poolSize}`;
393
+ if (this.poolUsageHistory.has(poolKey)) {
394
+ const history = this.poolUsageHistory.get(poolKey)!;
395
+ if (history.length >= 100) {
396
+ history.shift();
397
+ }
398
+ history.push(pool.size);
399
+ } else {
400
+ this.poolUsageHistory.set(poolKey, [pool.size]);
401
+ }
402
+
403
+ return buffer;
404
+ }
405
+ }
406
+ }
407
+
408
+ // No pool available for this size, allocate directly
409
+ this.performanceStats.poolMisses++;
410
+ return Buffer.allocUnsafe(size);
411
+ }
412
+
413
+ releaseBuffer(buffer: Buffer): void {
414
+ this.performanceStats.totalReleases++;
415
+ const size = buffer.length;
416
+ const pool = this.bufferPools.get(size);
417
+ if (pool) {
418
+ pool.release(buffer);
419
+
420
+ // Adaptive pool sizing based on usage patterns
421
+ if (
422
+ this.adaptiveMode &&
423
+ Date.now() - this.performanceStats.lastAdjustment > this.performanceStats.adjustmentInterval
424
+ ) {
425
+ this.adjustPoolSizes();
426
+ }
427
+ }
428
+ // If no pool for this size, let it be garbage collected
429
+ }
430
+
431
+ // Route Cache
432
+
433
+ getCachedRoute(key: string): any {
434
+ return this.routeCache.get(key);
435
+ }
436
+
437
+ cacheRoute(key: string, route: any): void {
438
+ this.routeCache.set(key, route);
439
+ }
440
+
441
+ hasCachedRoute(key: string): boolean {
442
+ return this.routeCache.has(key);
443
+ }
444
+
445
+ clearRouteCache(): void {
446
+ this.routeCache.clear();
447
+ }
448
+
449
+ // Response Cache (For Opt-In Explicit Caching Only)
450
+ // NOTE: This cache is NOT used automatically by the framework.
451
+ // It's available for developers who explicitly want to cache specific responses.
452
+ // Developers must carefully manage cache keys to avoid stale/incorrect data.
453
+
454
+ getCachedResponse(
455
+ key: string
456
+ ): { buffer: Buffer; headers: Record<string, string>; statusCode: number } | undefined {
457
+ return this.responseCache.get(key);
458
+ }
459
+
460
+ cacheResponse(
461
+ key: string,
462
+ buffer: Buffer,
463
+ headers: Record<string, string>,
464
+ statusCode: number = 200
465
+ ): void {
466
+ // Cache responses up to 4KB
467
+ // WARNING: Only use this for static responses that never change
468
+ if (buffer.length < 4096) {
469
+ this.responseCache.set(key, {
470
+ buffer: Buffer.from(buffer), // Clone to avoid mutations
471
+ headers: { ...headers }, // Clone headers
472
+ statusCode,
473
+ });
474
+ }
475
+ }
476
+
477
+ hasCachedResponse(key: string): boolean {
478
+ return this.responseCache.has(key);
479
+ }
480
+
481
+ clearResponseCache(): void {
482
+ this.responseCache.clear();
483
+ }
484
+
485
+ /**
486
+ * Adaptively adjust pool sizes based on usage patterns
487
+ */
488
+ private adjustPoolSizes(): void {
489
+ this.performanceStats.lastAdjustment = Date.now();
490
+
491
+ // Adjust parameter pool size
492
+ const paramHistory = this.poolUsageHistory.get('params') || [];
493
+ if (paramHistory.length >= 10) {
494
+ const avgUsage = paramHistory.reduce((sum, size) => sum + size, 0) / paramHistory.length;
495
+ const targetSize = Math.min(Math.max(Math.round(avgUsage * 1.2), 50), 200); // 20% buffer, 50-200 range
496
+
497
+ if (Math.abs(this.paramPool.stats.maxSize - targetSize) > 10) {
498
+ logger.debug(
499
+ `Adjusting param pool size from ${this.paramPool.stats.maxSize} to ${targetSize}`,
500
+ 'PoolManager'
501
+ );
502
+ // Note: We can't directly change maxSize, but we can log the recommendation
503
+ // In a real implementation, we'd recreate the pool with the new size
504
+ }
505
+ }
506
+
507
+ // Adjust buffer pool sizes
508
+ this.bufferSizes.forEach(size => {
509
+ const poolKey = `buffer_${size}`;
510
+ const history = this.poolUsageHistory.get(poolKey) || [];
511
+ if (history.length >= 10) {
512
+ const avgUsage = history.reduce((sum, size) => sum + size, 0) / history.length;
513
+ const pool = this.bufferPools.get(size);
514
+ if (pool) {
515
+ const currentMax = pool.stats.maxSize;
516
+ const targetMax = this.getOptimalPoolSize(size);
517
+
518
+ if (Math.abs(currentMax - targetMax) > 5) {
519
+ logger.debug(
520
+ `Buffer pool ${size}B: usage ${avgUsage.toFixed(1)}/${currentMax}, target ${targetMax}`,
521
+ 'PoolManager'
522
+ );
523
+ }
524
+ }
525
+ }
526
+ });
527
+
528
+ logger.debug('Pool size adjustment cycle completed', 'PoolManager');
529
+ }
530
+
531
+ /**
532
+ * Enable or disable adaptive pool sizing
533
+ */
534
+ setAdaptiveMode(enabled: boolean): void {
535
+ this.adaptiveMode = enabled;
536
+ logger.debug(`Adaptive pool sizing ${enabled ? 'enabled' : 'disabled'}`, 'PoolManager');
537
+ }
538
+
539
+ // Utility Methods
540
+
541
+ /**
542
+ * Clear all pools and caches
543
+ */
544
+ clearAll(): void {
545
+ this.paramPool.clear();
546
+ this.headerPool.clear();
547
+ this.queryPool.clear();
548
+ this.bufferPools.forEach(pool => pool.clear());
549
+ this.routeCache.clear();
550
+ this.responseCache.clear();
551
+ logger.debug('All pools and caches cleared', 'Maintenance');
552
+ }
553
+
554
+ /**
555
+ * Force garbage collection on pooled objects
556
+ */
557
+ forceCleanup(): void {
558
+ this.clearAll();
559
+
560
+ // Force GC if available
561
+ if (globalThis?.gc) {
562
+ globalThis.gc();
563
+ logger.debug('Forced garbage collection', 'Maintenance');
564
+ }
565
+ }
566
+
567
+ /**
568
+ * Get comprehensive performance statistics
569
+ */
570
+ getStats() {
571
+ const bufferPoolStats: Record<string, any> = {};
572
+ this.bufferPools.forEach((pool, size) => {
573
+ bufferPoolStats[`${size}B`] = pool.stats;
574
+ });
575
+
576
+ return {
577
+ paramPool: this.paramPool.stats,
578
+ headerPool: this.headerPool.stats,
579
+ queryPool: this.queryPool.stats,
580
+ bufferPools: bufferPoolStats,
581
+ routeCache: this.routeCache.stats,
582
+ responseCache: this.responseCache.stats,
583
+ totalMemory: {
584
+ params: this.paramPool.size * 50, // Rough estimate
585
+ headers: this.headerPool.size * 100, // Rough estimate
586
+ queries: this.queryPool.size * 50, // Rough estimate
587
+ buffers: Array.from(this.bufferPools.values()).reduce((sum, pool) => sum + pool.size, 0),
588
+ routes: this.routeCache.size * 200, // Rough estimate
589
+ responses: this.responseCache.size * 1000, // Rough estimate (increased for full responses)
590
+ },
591
+ };
592
+ }
593
+
594
+ /**
595
+ * Get performance summary for monitoring
596
+ */
597
+ getPerformanceSummary() {
598
+ const stats = this.getStats();
599
+ const routeCacheTotal = stats.routeCache.hits + stats.routeCache.misses;
600
+ const responseCacheTotal = stats.responseCache.hits + stats.responseCache.misses;
601
+
602
+ return {
603
+ routeCacheHitRate: routeCacheTotal > 0 ? (stats.routeCache.hits / routeCacheTotal) * 100 : 0,
604
+ responseCacheHitRate:
605
+ responseCacheTotal > 0 ? (stats.responseCache.hits / responseCacheTotal) * 100 : 0,
606
+ paramPoolUtilization: stats.paramPool.utilization * 100,
607
+ totalMemoryKB: Object.values(stats.totalMemory).reduce((a, b) => a + b, 0) / 1024,
608
+ };
609
+ }
610
+
611
+ /**
612
+ * Log performance statistics
613
+ */
614
+ logStats(): void {
615
+ const summary = this.getPerformanceSummary();
616
+ logger.info('ObjectPoolManager Performance', 'Stats', {
617
+ routeCacheHitRate: `${summary.routeCacheHitRate.toFixed(1)}%`,
618
+ responseCacheHitRate: `${summary.responseCacheHitRate.toFixed(1)}%`,
619
+ paramPoolUtilization: `${summary.paramPoolUtilization.toFixed(1)}%`,
620
+ totalMemory: `${summary.totalMemoryKB.toFixed(1)} KB`,
621
+ });
622
+ }
623
+ }
624
+
625
+ /**
626
+ * Convenience function to get the singleton instance
627
+ */
628
+ export function getPoolManager(): ObjectPoolManager {
629
+ return ObjectPoolManager.getInstance();
630
+ }