@morojs/moro 1.6.1 → 1.6.3

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 (575) 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 +202 -185
  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/auth/core.d.ts +78 -0
  97. package/dist/core/middleware/built-in/auth/core.js +358 -0
  98. package/dist/core/middleware/built-in/auth/core.js.map +1 -0
  99. package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +12 -23
  100. package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
  101. package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
  102. package/dist/core/middleware/built-in/auth/hook.js +99 -0
  103. package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
  104. package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
  105. package/dist/core/middleware/built-in/auth/index.js +15 -0
  106. package/dist/core/middleware/built-in/auth/index.js.map +1 -0
  107. package/dist/core/middleware/built-in/auth/jwt-helpers.d.ts +118 -0
  108. package/dist/core/middleware/built-in/auth/jwt-helpers.js +218 -0
  109. package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
  110. package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
  111. package/dist/core/middleware/built-in/auth/middleware.js +71 -0
  112. package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
  113. package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
  114. package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +5 -10
  115. package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
  116. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
  117. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +10 -47
  118. package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
  119. package/dist/core/middleware/built-in/cache/adapters/cache/index.d.ts +5 -0
  120. package/dist/core/middleware/built-in/cache/adapters/cache/index.js +21 -0
  121. package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
  122. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
  123. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +3 -7
  124. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
  125. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +3 -1
  126. package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +11 -9
  127. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
  128. package/dist/core/middleware/built-in/cache/adapters/index.d.ts +2 -0
  129. package/dist/core/middleware/built-in/cache/adapters/index.js +5 -0
  130. package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
  131. package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
  132. package/dist/core/middleware/built-in/cache/core.js +87 -0
  133. package/dist/core/middleware/built-in/cache/core.js.map +1 -0
  134. package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
  135. package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +30 -14
  136. package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
  137. package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
  138. package/dist/core/middleware/built-in/cache/index.js +9 -0
  139. package/dist/core/middleware/built-in/cache/index.js.map +1 -0
  140. package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
  141. package/dist/core/middleware/built-in/cache/middleware.js +44 -0
  142. package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
  143. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
  144. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +3 -7
  145. package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
  146. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
  147. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +3 -7
  148. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
  149. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +3 -1
  150. package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +12 -10
  151. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
  152. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.d.ts +5 -0
  153. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js +21 -0
  154. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
  155. package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
  156. package/dist/core/middleware/built-in/cdn/adapters/index.js +5 -0
  157. package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
  158. package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
  159. package/dist/core/middleware/built-in/cdn/core.js +144 -0
  160. package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
  161. package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
  162. package/dist/core/middleware/built-in/cdn/hook.js +70 -0
  163. package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
  164. package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
  165. package/dist/core/middleware/built-in/cdn/index.js +11 -0
  166. package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
  167. package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
  168. package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
  169. package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
  170. package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
  171. package/dist/core/middleware/built-in/cookie/core.js +83 -0
  172. package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
  173. package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
  174. package/dist/core/middleware/built-in/cookie/hook.js +47 -0
  175. package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
  176. package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
  177. package/dist/core/middleware/built-in/cookie/index.js +9 -0
  178. package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
  179. package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
  180. package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
  181. package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
  182. package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
  183. package/dist/core/middleware/built-in/cors/core.js +51 -0
  184. package/dist/core/middleware/built-in/cors/core.js.map +1 -0
  185. package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
  186. package/dist/core/middleware/built-in/cors/hook.js +37 -0
  187. package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
  188. package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
  189. package/dist/core/middleware/built-in/cors/index.js +9 -0
  190. package/dist/core/middleware/built-in/cors/index.js.map +1 -0
  191. package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
  192. package/dist/core/middleware/built-in/cors/middleware.js +22 -0
  193. package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
  194. package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
  195. package/dist/core/middleware/built-in/csp/core.js +88 -0
  196. package/dist/core/middleware/built-in/csp/core.js.map +1 -0
  197. package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
  198. package/dist/core/middleware/built-in/csp/hook.js +47 -0
  199. package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
  200. package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
  201. package/dist/core/middleware/built-in/csp/index.js +9 -0
  202. package/dist/core/middleware/built-in/csp/index.js.map +1 -0
  203. package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
  204. package/dist/core/middleware/built-in/csp/middleware.js +29 -0
  205. package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
  206. package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
  207. package/dist/core/middleware/built-in/csrf/core.js +69 -0
  208. package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
  209. package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
  210. package/dist/core/middleware/built-in/csrf/hook.js +45 -0
  211. package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
  212. package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
  213. package/dist/core/middleware/built-in/csrf/index.js +9 -0
  214. package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
  215. package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
  216. package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
  217. package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
  218. package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
  219. package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
  220. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
  221. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
  222. package/dist/core/middleware/built-in/error-tracker/middleware.js +26 -0
  223. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
  224. package/dist/core/middleware/built-in/index.d.ts +28 -61
  225. package/dist/core/middleware/built-in/index.js +48 -78
  226. package/dist/core/middleware/built-in/index.js.map +1 -1
  227. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
  228. package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
  229. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
  230. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
  231. package/dist/core/middleware/built-in/performance-monitor/middleware.js +29 -0
  232. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
  233. package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
  234. package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
  235. package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
  236. package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
  237. package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +24 -22
  238. package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
  239. package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
  240. package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
  241. package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
  242. package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
  243. package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
  244. package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
  245. package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
  246. package/dist/core/middleware/built-in/request-logger/index.js +4 -0
  247. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
  248. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
  249. package/dist/core/middleware/built-in/request-logger/middleware.js +24 -0
  250. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
  251. package/dist/core/middleware/built-in/session/core.d.ts +73 -0
  252. package/dist/core/middleware/built-in/session/core.js +227 -0
  253. package/dist/core/middleware/built-in/session/core.js.map +1 -0
  254. package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
  255. package/dist/core/middleware/built-in/session/hook.js +53 -0
  256. package/dist/core/middleware/built-in/session/hook.js.map +1 -0
  257. package/dist/core/middleware/built-in/session/index.d.ts +3 -0
  258. package/dist/core/middleware/built-in/session/index.js +9 -0
  259. package/dist/core/middleware/built-in/session/index.js.map +1 -0
  260. package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
  261. package/dist/core/middleware/built-in/session/middleware.js +38 -0
  262. package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
  263. package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
  264. package/dist/core/middleware/built-in/sse/core.js +117 -0
  265. package/dist/core/middleware/built-in/sse/core.js.map +1 -0
  266. package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
  267. package/dist/core/middleware/built-in/sse/hook.js +60 -0
  268. package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
  269. package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
  270. package/dist/core/middleware/built-in/sse/index.js +9 -0
  271. package/dist/core/middleware/built-in/sse/index.js.map +1 -0
  272. package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
  273. package/dist/core/middleware/built-in/sse/middleware.js +43 -0
  274. package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
  275. package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
  276. package/dist/core/middleware/built-in/validation/core.js +93 -0
  277. package/dist/core/middleware/built-in/validation/core.js.map +1 -0
  278. package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
  279. package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +16 -9
  280. package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
  281. package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
  282. package/dist/core/middleware/built-in/validation/index.js +9 -0
  283. package/dist/core/middleware/built-in/validation/index.js.map +1 -0
  284. package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
  285. package/dist/core/middleware/built-in/validation/middleware.js +27 -0
  286. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
  287. package/dist/core/middleware/index.d.ts +4 -4
  288. package/dist/core/middleware/index.js +14 -28
  289. package/dist/core/middleware/index.js.map +1 -1
  290. package/dist/core/modules/auto-discovery.d.ts +19 -2
  291. package/dist/core/modules/auto-discovery.js +391 -74
  292. package/dist/core/modules/auto-discovery.js.map +1 -1
  293. package/dist/core/modules/index.d.ts +2 -2
  294. package/dist/core/modules/index.js +2 -9
  295. package/dist/core/modules/index.js.map +1 -1
  296. package/dist/core/modules/modules.d.ts +3 -3
  297. package/dist/core/modules/modules.js +23 -54
  298. package/dist/core/modules/modules.js.map +1 -1
  299. package/dist/core/networking/adapters/index.d.ts +4 -3
  300. package/dist/core/networking/adapters/index.js +3 -7
  301. package/dist/core/networking/adapters/index.js.map +1 -1
  302. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
  303. package/dist/core/networking/adapters/socketio-adapter.js +5 -40
  304. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  305. package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
  306. package/dist/core/networking/adapters/uws-adapter.js +513 -0
  307. package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
  308. package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
  309. package/dist/core/networking/adapters/ws-adapter.js +8 -43
  310. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  311. package/dist/core/networking/index.d.ts +3 -2
  312. package/dist/core/networking/index.js +2 -7
  313. package/dist/core/networking/index.js.map +1 -1
  314. package/dist/core/networking/service-discovery.js +8 -12
  315. package/dist/core/networking/service-discovery.js.map +1 -1
  316. package/dist/core/networking/websocket-adapter.js +1 -2
  317. package/dist/core/networking/websocket-adapter.js.map +1 -1
  318. package/dist/core/networking/websocket-manager.d.ts +3 -3
  319. package/dist/core/networking/websocket-manager.js +9 -11
  320. package/dist/core/networking/websocket-manager.js.map +1 -1
  321. package/dist/core/pooling/object-pool-manager.d.ts +140 -0
  322. package/dist/core/pooling/object-pool-manager.js +502 -0
  323. package/dist/core/pooling/object-pool-manager.js.map +1 -0
  324. package/dist/core/routing/app-integration.d.ts +14 -12
  325. package/dist/core/routing/app-integration.js +49 -85
  326. package/dist/core/routing/app-integration.js.map +1 -1
  327. package/dist/core/routing/index.d.ts +17 -11
  328. package/dist/core/routing/index.js +48 -237
  329. package/dist/core/routing/index.js.map +1 -1
  330. package/dist/core/routing/path-matcher.d.ts +67 -0
  331. package/dist/core/routing/path-matcher.js +182 -0
  332. package/dist/core/routing/path-matcher.js.map +1 -0
  333. package/dist/core/routing/router.d.ts +38 -0
  334. package/dist/core/routing/router.js +68 -0
  335. package/dist/core/routing/router.js.map +1 -0
  336. package/dist/core/routing/unified-router.d.ts +132 -0
  337. package/dist/core/routing/unified-router.js +639 -0
  338. package/dist/core/routing/unified-router.js.map +1 -0
  339. package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
  340. package/dist/core/runtime/aws-lambda-adapter.js +2 -6
  341. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  342. package/dist/core/runtime/base-adapter.d.ts +2 -2
  343. package/dist/core/runtime/base-adapter.js +3 -7
  344. package/dist/core/runtime/base-adapter.js.map +1 -1
  345. package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
  346. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
  347. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  348. package/dist/core/runtime/index.d.ts +12 -12
  349. package/dist/core/runtime/index.js +22 -35
  350. package/dist/core/runtime/index.js.map +1 -1
  351. package/dist/core/runtime/node-adapter.d.ts +4 -4
  352. package/dist/core/runtime/node-adapter.js +18 -49
  353. package/dist/core/runtime/node-adapter.js.map +1 -1
  354. package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
  355. package/dist/core/runtime/vercel-edge-adapter.js +2 -6
  356. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  357. package/dist/core/utilities/circuit-breaker.js +1 -5
  358. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  359. package/dist/core/utilities/container.js +12 -22
  360. package/dist/core/utilities/container.js.map +1 -1
  361. package/dist/core/utilities/hooks.d.ts +2 -2
  362. package/dist/core/utilities/hooks.js +7 -12
  363. package/dist/core/utilities/hooks.js.map +1 -1
  364. package/dist/core/utilities/index.d.ts +5 -4
  365. package/dist/core/utilities/index.js +5 -19
  366. package/dist/core/utilities/index.js.map +1 -1
  367. package/dist/core/utilities/package-utils.d.ts +38 -0
  368. package/dist/core/utilities/package-utils.js +57 -0
  369. package/dist/core/utilities/package-utils.js.map +1 -0
  370. package/dist/core/validation/adapters.d.ts +1 -1
  371. package/dist/core/validation/adapters.js +15 -26
  372. package/dist/core/validation/adapters.js.map +1 -1
  373. package/dist/core/validation/index.d.ts +6 -4
  374. package/dist/core/validation/index.js +57 -28
  375. package/dist/core/validation/index.js.map +1 -1
  376. package/dist/core/validation/schema-interface.js +3 -9
  377. package/dist/core/validation/schema-interface.js.map +1 -1
  378. package/dist/index.d.ts +52 -52
  379. package/dist/index.js +24 -132
  380. package/dist/index.js.map +1 -1
  381. package/dist/moro.d.ts +70 -16
  382. package/dist/moro.js +650 -269
  383. package/dist/moro.js.map +1 -1
  384. package/dist/types/auth.js +3 -9
  385. package/dist/types/auth.js.map +1 -1
  386. package/dist/types/cache.js +1 -2
  387. package/dist/types/cdn.js +1 -2
  388. package/dist/types/config.d.ts +73 -2
  389. package/dist/types/config.js +1 -2
  390. package/dist/types/config.js.map +1 -1
  391. package/dist/types/core.d.ts +36 -42
  392. package/dist/types/core.js +1 -2
  393. package/dist/types/database.js +1 -2
  394. package/dist/types/discovery.js +1 -2
  395. package/dist/types/events.js +1 -2
  396. package/dist/types/hooks.d.ts +4 -1
  397. package/dist/types/hooks.js +1 -2
  398. package/dist/types/http.d.ts +16 -1
  399. package/dist/types/http.js +1 -2
  400. package/dist/types/logger.d.ts +7 -0
  401. package/dist/types/logger.js +1 -2
  402. package/dist/types/module.d.ts +11 -0
  403. package/dist/types/module.js +1 -2
  404. package/dist/types/runtime.d.ts +1 -1
  405. package/dist/types/runtime.js +1 -2
  406. package/dist/types/session.js +1 -2
  407. package/package.json +18 -55
  408. package/dist/core/config/loader.d.ts +0 -7
  409. package/dist/core/config/loader.js +0 -269
  410. package/dist/core/config/loader.js.map +0 -1
  411. package/dist/core/config/validation.d.ts +0 -17
  412. package/dist/core/config/validation.js +0 -131
  413. package/dist/core/config/validation.js.map +0 -1
  414. package/dist/core/http/router.d.ts +0 -14
  415. package/dist/core/http/router.js +0 -109
  416. package/dist/core/http/router.js.map +0 -1
  417. package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
  418. package/dist/core/middleware/built-in/adapters/cache/index.d.ts +0 -5
  419. package/dist/core/middleware/built-in/adapters/cache/index.js +0 -28
  420. package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
  421. package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
  422. package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
  423. package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
  424. package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
  425. package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
  426. package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +0 -5
  427. package/dist/core/middleware/built-in/adapters/cdn/index.js +0 -28
  428. package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
  429. package/dist/core/middleware/built-in/adapters/index.d.ts +0 -4
  430. package/dist/core/middleware/built-in/adapters/index.js +0 -26
  431. package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
  432. package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
  433. package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
  434. package/dist/core/middleware/built-in/auth.d.ts +0 -30
  435. package/dist/core/middleware/built-in/auth.js +0 -281
  436. package/dist/core/middleware/built-in/auth.js.map +0 -1
  437. package/dist/core/middleware/built-in/cache.d.ts +0 -3
  438. package/dist/core/middleware/built-in/cache.js.map +0 -1
  439. package/dist/core/middleware/built-in/cdn.d.ts +0 -3
  440. package/dist/core/middleware/built-in/cdn.js +0 -113
  441. package/dist/core/middleware/built-in/cdn.js.map +0 -1
  442. package/dist/core/middleware/built-in/cookie.d.ts +0 -14
  443. package/dist/core/middleware/built-in/cookie.js +0 -68
  444. package/dist/core/middleware/built-in/cookie.js.map +0 -1
  445. package/dist/core/middleware/built-in/cors.d.ts +0 -2
  446. package/dist/core/middleware/built-in/cors.js +0 -29
  447. package/dist/core/middleware/built-in/cors.js.map +0 -1
  448. package/dist/core/middleware/built-in/csp.d.ts +0 -22
  449. package/dist/core/middleware/built-in/csp.js +0 -71
  450. package/dist/core/middleware/built-in/csp.js.map +0 -1
  451. package/dist/core/middleware/built-in/csrf.d.ts +0 -9
  452. package/dist/core/middleware/built-in/csrf.js +0 -63
  453. package/dist/core/middleware/built-in/csrf.js.map +0 -1
  454. package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
  455. package/dist/core/middleware/built-in/error-tracker.js +0 -19
  456. package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
  457. package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
  458. package/dist/core/middleware/built-in/performance-monitor.js +0 -22
  459. package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
  460. package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
  461. package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
  462. package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
  463. package/dist/core/middleware/built-in/request-logger.js +0 -16
  464. package/dist/core/middleware/built-in/request-logger.js.map +0 -1
  465. package/dist/core/middleware/built-in/session.d.ts +0 -41
  466. package/dist/core/middleware/built-in/session.js +0 -209
  467. package/dist/core/middleware/built-in/session.js.map +0 -1
  468. package/dist/core/middleware/built-in/sse.d.ts +0 -6
  469. package/dist/core/middleware/built-in/sse.js +0 -71
  470. package/dist/core/middleware/built-in/sse.js.map +0 -1
  471. package/dist/core/middleware/built-in/validation.d.ts +0 -2
  472. package/dist/core/middleware/built-in/validation.js.map +0 -1
  473. package/src/core/auth/README.md +0 -339
  474. package/src/core/auth/morojs-adapter.ts +0 -410
  475. package/src/core/config/file-loader.ts +0 -407
  476. package/src/core/config/index.ts +0 -60
  477. package/src/core/config/loader.ts +0 -633
  478. package/src/core/config/schema.ts +0 -150
  479. package/src/core/config/utils.ts +0 -251
  480. package/src/core/config/validation.ts +0 -140
  481. package/src/core/database/README.md +0 -228
  482. package/src/core/database/adapters/drizzle.ts +0 -403
  483. package/src/core/database/adapters/index.ts +0 -42
  484. package/src/core/database/adapters/mongodb.ts +0 -269
  485. package/src/core/database/adapters/mysql.ts +0 -207
  486. package/src/core/database/adapters/postgresql.ts +0 -201
  487. package/src/core/database/adapters/redis.ts +0 -326
  488. package/src/core/database/adapters/sqlite.ts +0 -247
  489. package/src/core/database/index.ts +0 -3
  490. package/src/core/docs/index.ts +0 -231
  491. package/src/core/docs/openapi-generator.ts +0 -576
  492. package/src/core/docs/schema-to-openapi.ts +0 -148
  493. package/src/core/docs/simple-docs.ts +0 -295
  494. package/src/core/docs/swagger-ui.ts +0 -351
  495. package/src/core/docs/zod-to-openapi.ts +0 -532
  496. package/src/core/events/event-bus.ts +0 -231
  497. package/src/core/events/index.ts +0 -12
  498. package/src/core/framework.ts +0 -636
  499. package/src/core/http/http-server.ts +0 -1787
  500. package/src/core/http/index.ts +0 -6
  501. package/src/core/http/router.ts +0 -141
  502. package/src/core/logger/filters.ts +0 -145
  503. package/src/core/logger/index.ts +0 -20
  504. package/src/core/logger/logger.ts +0 -814
  505. package/src/core/logger/outputs.ts +0 -134
  506. package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
  507. package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
  508. package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
  509. package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -100
  510. package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
  511. package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
  512. package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -83
  513. package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
  514. package/src/core/middleware/built-in/adapters/index.ts +0 -7
  515. package/src/core/middleware/built-in/auth-helpers.ts +0 -401
  516. package/src/core/middleware/built-in/auth-providers.ts +0 -480
  517. package/src/core/middleware/built-in/auth.ts +0 -329
  518. package/src/core/middleware/built-in/cache.ts +0 -211
  519. package/src/core/middleware/built-in/cdn.ts +0 -124
  520. package/src/core/middleware/built-in/cookie.ts +0 -85
  521. package/src/core/middleware/built-in/cors.ts +0 -38
  522. package/src/core/middleware/built-in/csp.ts +0 -101
  523. package/src/core/middleware/built-in/csrf.ts +0 -82
  524. package/src/core/middleware/built-in/error-tracker.ts +0 -16
  525. package/src/core/middleware/built-in/index.ts +0 -79
  526. package/src/core/middleware/built-in/performance-monitor.ts +0 -25
  527. package/src/core/middleware/built-in/rate-limit.ts +0 -60
  528. package/src/core/middleware/built-in/request-logger.ts +0 -14
  529. package/src/core/middleware/built-in/session.ts +0 -288
  530. package/src/core/middleware/built-in/sse.ts +0 -86
  531. package/src/core/middleware/built-in/validation.ts +0 -33
  532. package/src/core/middleware/index.ts +0 -177
  533. package/src/core/modules/auto-discovery.ts +0 -263
  534. package/src/core/modules/index.ts +0 -3
  535. package/src/core/modules/modules.ts +0 -124
  536. package/src/core/networking/adapters/index.ts +0 -16
  537. package/src/core/networking/adapters/socketio-adapter.ts +0 -252
  538. package/src/core/networking/adapters/ws-adapter.ts +0 -430
  539. package/src/core/networking/index.ts +0 -3
  540. package/src/core/networking/service-discovery.ts +0 -304
  541. package/src/core/networking/websocket-adapter.ts +0 -217
  542. package/src/core/networking/websocket-manager.ts +0 -308
  543. package/src/core/routing/app-integration.ts +0 -216
  544. package/src/core/routing/index.ts +0 -488
  545. package/src/core/runtime/aws-lambda-adapter.ts +0 -147
  546. package/src/core/runtime/base-adapter.ts +0 -130
  547. package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
  548. package/src/core/runtime/index.ts +0 -62
  549. package/src/core/runtime/node-adapter.ts +0 -196
  550. package/src/core/runtime/vercel-edge-adapter.ts +0 -114
  551. package/src/core/utilities/circuit-breaker.ts +0 -46
  552. package/src/core/utilities/container.ts +0 -736
  553. package/src/core/utilities/hooks.ts +0 -142
  554. package/src/core/utilities/index.ts +0 -16
  555. package/src/core/validation/adapters.ts +0 -147
  556. package/src/core/validation/index.ts +0 -206
  557. package/src/core/validation/schema-interface.ts +0 -100
  558. package/src/index.ts +0 -226
  559. package/src/moro.ts +0 -1197
  560. package/src/types/auth.ts +0 -440
  561. package/src/types/cache.ts +0 -38
  562. package/src/types/cdn.ts +0 -22
  563. package/src/types/config.ts +0 -157
  564. package/src/types/core.ts +0 -56
  565. package/src/types/database.ts +0 -32
  566. package/src/types/discovery.ts +0 -7
  567. package/src/types/events.ts +0 -82
  568. package/src/types/hooks.ts +0 -47
  569. package/src/types/http.ts +0 -67
  570. package/src/types/logger.ts +0 -93
  571. package/src/types/module.ts +0 -87
  572. package/src/types/runtime.ts +0 -76
  573. package/src/types/session.ts +0 -89
  574. package/tsconfig.json +0 -21
  575. /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
package/src/moro.ts DELETED
@@ -1,1197 +0,0 @@
1
- // Moro Framework - Modern TypeScript API Framework
2
- // Built for developers who demand performance, elegance, and zero compromises
3
- // Event-driven • Modular • Enterprise-ready • Developer-first
4
- import { Moro as MoroCore } from './core/framework';
5
- import { HttpRequest, HttpResponse, middleware } from './core/http';
6
- import { ModuleConfig, InternalRouteDefinition } from './types/module';
7
- import { MoroOptions } from './types/core';
8
- import { MoroEventBus } from './core/events';
9
- import {
10
- createFrameworkLogger,
11
- logger as globalLogger,
12
- applyLoggingConfiguration,
13
- } from './core/logger';
14
- import { MiddlewareManager } from './core/middleware';
15
- import { IntelligentRoutingManager } from './core/routing/app-integration';
16
- import { RouteBuilder, RouteSchema, CompiledRoute } from './core/routing';
17
- import { AppDocumentationManager, DocsConfig } from './core/docs';
18
- import { readdirSync, statSync } from 'fs';
19
- import { join } from 'path';
20
- import { EventEmitter } from 'events';
21
- // Configuration System Integration
22
- import { initializeConfig, getGlobalConfig, type AppConfig } from './core/config';
23
- // Runtime System Integration
24
- import {
25
- RuntimeAdapter,
26
- RuntimeType,
27
- createRuntimeAdapter,
28
- NodeRuntimeAdapter,
29
- } from './core/runtime';
30
-
31
- export class Moro extends EventEmitter {
32
- private coreFramework: MoroCore;
33
- private routes: InternalRouteDefinition[] = [];
34
- private moduleCounter = 0;
35
- private loadedModules = new Set<string>();
36
- private routeHandlers: Record<string, Function> = {};
37
- // Enterprise event system integration
38
- private eventBus: MoroEventBus;
39
- // Application logger
40
- private logger = createFrameworkLogger('App');
41
- // Intelligent routing system
42
- private intelligentRouting = new IntelligentRoutingManager();
43
- // Documentation system
44
- private documentation = new AppDocumentationManager();
45
- // Configuration system
46
- private config: AppConfig;
47
- // Runtime system
48
- private runtimeAdapter: RuntimeAdapter;
49
- private runtimeType: RuntimeType;
50
- // Middleware system
51
- private middlewareManager: MiddlewareManager;
52
-
53
- constructor(options: MoroOptions = {}) {
54
- super(); // Call EventEmitter constructor
55
-
56
- // Configure logger from environment variables BEFORE config system initialization
57
- // This ensures the config loading process respects the log level
58
- const envLogLevel = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;
59
- if (envLogLevel) {
60
- applyLoggingConfiguration({ level: envLogLevel }, undefined);
61
- }
62
-
63
- // Initialize configuration system - create a deep copy for this instance
64
- this.config = JSON.parse(JSON.stringify(initializeConfig()));
65
-
66
- // Apply logging configuration from the loaded config (this happens after config file processing)
67
- if (this.config.logging) {
68
- applyLoggingConfiguration(this.config.logging, undefined);
69
- }
70
-
71
- // Apply additional logging configuration from createApp options (takes precedence)
72
- if (options.logger !== undefined) {
73
- applyLoggingConfiguration(undefined, options.logger);
74
- }
75
-
76
- // Apply performance configuration from createApp options (takes precedence)
77
- if (options.performance) {
78
- if (options.performance.clustering) {
79
- this.config.performance.clustering = {
80
- ...this.config.performance.clustering,
81
- ...options.performance.clustering,
82
- };
83
- }
84
- if (options.performance.compression) {
85
- this.config.performance.compression = {
86
- ...this.config.performance.compression,
87
- ...options.performance.compression,
88
- };
89
- }
90
- if (options.performance.circuitBreaker) {
91
- this.config.performance.circuitBreaker = {
92
- ...this.config.performance.circuitBreaker,
93
- ...options.performance.circuitBreaker,
94
- };
95
- }
96
- }
97
-
98
- // Apply modules configuration from createApp options (takes precedence)
99
- if (options.modules) {
100
- if (options.modules.cache) {
101
- this.config.modules.cache = {
102
- ...this.config.modules.cache,
103
- ...options.modules.cache,
104
- };
105
- }
106
- if (options.modules.rateLimit) {
107
- this.config.modules.rateLimit = {
108
- ...this.config.modules.rateLimit,
109
- ...options.modules.rateLimit,
110
- };
111
- }
112
- if (options.modules.validation) {
113
- this.config.modules.validation = {
114
- ...this.config.modules.validation,
115
- ...options.modules.validation,
116
- };
117
- }
118
- }
119
-
120
- this.logger.info(
121
- `Configuration system initialized: ${this.config.server.environment}:${this.config.server.port}`
122
- );
123
-
124
- // Initialize runtime system
125
- this.runtimeType = options.runtime?.type || 'node';
126
- this.runtimeAdapter = options.runtime?.adapter || createRuntimeAdapter(this.runtimeType);
127
-
128
- this.logger.info(`Runtime system initialized: ${this.runtimeType}`, 'Runtime');
129
-
130
- // Pass logging configuration from config to framework
131
- const frameworkOptions: any = {
132
- ...options,
133
- logger: this.config.logging,
134
- };
135
-
136
- this.coreFramework = new MoroCore(frameworkOptions);
137
-
138
- // Initialize middleware system
139
- this.middlewareManager = new MiddlewareManager();
140
-
141
- // Integrate hooks system with HTTP server
142
- const httpServer = (this.coreFramework as any).httpServer;
143
- if (httpServer && httpServer.setHookManager) {
144
- httpServer.setHookManager((this.middlewareManager as any).hooks);
145
- }
146
-
147
- // Configure HTTP server performance based on config
148
- if (httpServer && httpServer.configurePerformance) {
149
- const performanceConfig = this.config.performance;
150
- httpServer.configurePerformance({
151
- compression: performanceConfig?.compression || { enabled: true },
152
- minimal: performanceConfig?.compression?.enabled === false, // Enable minimal mode if compression disabled
153
- });
154
- }
155
-
156
- // Access enterprise event bus from core framework
157
- this.eventBus = (this.coreFramework as any).eventBus;
158
-
159
- // Setup default middleware if enabled - use config defaults with options override
160
- this.setupDefaultMiddleware({
161
- ...this.getDefaultOptionsFromConfig(),
162
- ...options,
163
- });
164
-
165
- // Auto-discover modules if enabled
166
- if (options.autoDiscover !== false) {
167
- this.autoDiscoverModules(options.modulesPath || './modules');
168
- }
169
-
170
- // Emit initialization event through enterprise event bus
171
- this.eventBus.emit('framework:initialized', {
172
- options,
173
- config: this.config,
174
- runtime: this.runtimeType,
175
- });
176
- }
177
-
178
- /**
179
- * Get configuration object
180
- */
181
- getConfig(): AppConfig {
182
- return this.config;
183
- }
184
-
185
- /**
186
- * Get runtime adapter
187
- */
188
- getRuntime(): RuntimeAdapter {
189
- return this.runtimeAdapter;
190
- }
191
-
192
- /**
193
- * Get runtime type
194
- */
195
- getRuntimeType(): RuntimeType {
196
- return this.runtimeType;
197
- }
198
-
199
- /**
200
- * Extract default options from configuration
201
- */
202
- private getDefaultOptionsFromConfig(): Partial<MoroOptions> {
203
- return {
204
- cors: this.config.security.cors.enabled,
205
- compression: this.config.performance.compression.enabled,
206
- helmet: this.config.security.helmet.enabled,
207
- };
208
- }
209
-
210
- // Intelligent route methods - chainable with automatic middleware ordering
211
- // Overloads for better TypeScript inference
212
- get(path: string): RouteBuilder;
213
- get(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
214
- get(
215
- path: string,
216
- handler?: (req: HttpRequest, res: HttpResponse) => any,
217
- options?: any
218
- ): RouteBuilder | this {
219
- if (handler) {
220
- // Direct route registration
221
- return this.addRoute('GET', path, handler, options);
222
- }
223
- // Chainable route builder
224
- return this.intelligentRouting.get(path);
225
- }
226
-
227
- post(path: string): RouteBuilder;
228
- post(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
229
- post(
230
- path: string,
231
- handler?: (req: HttpRequest, res: HttpResponse) => any,
232
- options?: any
233
- ): RouteBuilder | this {
234
- if (handler) {
235
- // Direct route registration
236
- return this.addRoute('POST', path, handler, options);
237
- }
238
- // Chainable route builder
239
- return this.intelligentRouting.post(path);
240
- }
241
-
242
- put(path: string): RouteBuilder;
243
- put(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
244
- put(
245
- path: string,
246
- handler?: (req: HttpRequest, res: HttpResponse) => any,
247
- options?: any
248
- ): RouteBuilder | this {
249
- if (handler) {
250
- // Direct route registration
251
- return this.addRoute('PUT', path, handler, options);
252
- }
253
- // Chainable route builder
254
- return this.intelligentRouting.put(path);
255
- }
256
-
257
- delete(path: string): RouteBuilder;
258
- delete(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
259
- delete(
260
- path: string,
261
- handler?: (req: HttpRequest, res: HttpResponse) => any,
262
- options?: any
263
- ): RouteBuilder | this {
264
- if (handler) {
265
- // Direct route registration
266
- return this.addRoute('DELETE', path, handler, options);
267
- }
268
- // Chainable route builder
269
- return this.intelligentRouting.delete(path);
270
- }
271
-
272
- patch(path: string): RouteBuilder;
273
- patch(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
274
- patch(
275
- path: string,
276
- handler?: (req: HttpRequest, res: HttpResponse) => any,
277
- options?: any
278
- ): RouteBuilder | this {
279
- if (handler) {
280
- // Direct route registration
281
- return this.addRoute('PATCH', path, handler, options);
282
- }
283
- // Chainable route builder
284
- return this.intelligentRouting.patch(path);
285
- }
286
-
287
- // Schema-first route method
288
- route(schema: RouteSchema): CompiledRoute {
289
- return this.intelligentRouting.route(schema);
290
- }
291
-
292
- // Enable automatic API documentation
293
- enableDocs(config: DocsConfig): void {
294
- this.documentation.enableDocs(config, this.intelligentRouting);
295
-
296
- this.logger.info(`API Documentation enabled at ${config.basePath || '/docs'}`, 'Documentation');
297
- this.eventBus.emit('docs:enabled', { config });
298
- }
299
-
300
- // Get OpenAPI specification
301
- getOpenAPISpec() {
302
- return this.documentation.getOpenAPISpec();
303
- }
304
-
305
- // Get documentation as JSON
306
- getDocsJSON(): string {
307
- return this.documentation.getDocsJSON();
308
- }
309
-
310
- // Get documentation as YAML
311
- getDocsYAML(): string {
312
- return this.documentation.getDocsYAML();
313
- }
314
-
315
- // Refresh documentation (useful after adding routes dynamically)
316
- refreshDocs(): void {
317
- this.documentation.refreshDocs();
318
- }
319
-
320
- // Universal middleware system - seamlessly handles standard and advanced middleware
321
- async use(middlewareOrFunction: any, config?: any) {
322
- // Standard middleware integration (req, res, next pattern)
323
- if (typeof middlewareOrFunction === 'function' && middlewareOrFunction.length >= 3) {
324
- this.coreFramework.addMiddleware(middlewareOrFunction);
325
- this.eventBus.emit('middleware:registered', {
326
- type: 'standard',
327
- middleware: middlewareOrFunction,
328
- });
329
- return this;
330
- }
331
-
332
- // Function-style middleware execution
333
- if (typeof middlewareOrFunction === 'function' && middlewareOrFunction.length <= 1) {
334
- await middlewareOrFunction(this);
335
- this.eventBus.emit('middleware:executed', {
336
- type: 'function',
337
- middleware: middlewareOrFunction,
338
- });
339
- return this;
340
- }
341
-
342
- // Advanced middleware pipeline integration - check if it's a MiddlewareInterface
343
- if (
344
- middlewareOrFunction &&
345
- typeof middlewareOrFunction === 'object' &&
346
- middlewareOrFunction.install &&
347
- middlewareOrFunction.metadata
348
- ) {
349
- // This is a MiddlewareInterface object - install it with the MiddlewareManager
350
- this.logger.debug(
351
- `Installing MiddlewareInterface: ${middlewareOrFunction.metadata.name}`,
352
- 'Middleware'
353
- );
354
- this.middlewareManager.install(middlewareOrFunction, config);
355
- return this;
356
- }
357
-
358
- // Fallback: emit event for unknown middleware types
359
- this.eventBus.emit('middleware:advanced', {
360
- middleware: middlewareOrFunction,
361
- config,
362
- });
363
- this.logger.debug(
364
- 'Advanced middleware integration - enhanced capabilities loading...',
365
- 'Middleware'
366
- );
367
- return this;
368
- }
369
-
370
- // Plugin compatibility layer - unified middleware interface
371
- async plugin(middleware: any, options?: any): Promise<this> {
372
- return this.use(middleware, options);
373
- }
374
-
375
- // Module loading with events
376
- async loadModule(moduleOrPath: ModuleConfig | string) {
377
- this.eventBus.emit('module:loading', {
378
- moduleId: typeof moduleOrPath === 'string' ? moduleOrPath : moduleOrPath.name,
379
- });
380
-
381
- if (typeof moduleOrPath === 'string') {
382
- const module = await this.importModule(moduleOrPath);
383
- await this.coreFramework.loadModule(module);
384
- this.loadedModules.add(moduleOrPath);
385
- this.eventBus.emit('module:loaded', {
386
- moduleId: module.name,
387
- version: module.version || '1.0.0',
388
- });
389
- } else {
390
- await this.coreFramework.loadModule(moduleOrPath);
391
- this.loadedModules.add(moduleOrPath.name);
392
- this.eventBus.emit('module:loaded', {
393
- moduleId: moduleOrPath.name,
394
- version: moduleOrPath.version || '1.0.0',
395
- });
396
- }
397
- return this;
398
- }
399
-
400
- // Database helper with events
401
- database(adapter: any) {
402
- this.eventBus.emit('database:connected', {
403
- adapter: adapter.constructor.name,
404
- config: 'hidden',
405
- });
406
- this.coreFramework.registerDatabase(adapter);
407
- return this;
408
- }
409
-
410
- // WebSocket helper with events
411
- websocket(namespace: string, handlers: Record<string, Function>) {
412
- const adapter = this.coreFramework.getWebSocketAdapter();
413
- if (!adapter) {
414
- throw new Error(
415
- 'WebSocket features require a WebSocket adapter. Install socket.io or configure an adapter:\n' +
416
- 'npm install socket.io\n' +
417
- 'or\n' +
418
- 'new Moro({ websocket: { adapter: new SocketIOAdapter() } })'
419
- );
420
- }
421
-
422
- this.emit('websocket:registering', { namespace, handlers });
423
-
424
- const ns = adapter.createNamespace(namespace);
425
-
426
- Object.entries(handlers).forEach(([event, handler]) => {
427
- ns.on('connection', socket => {
428
- this.emit('websocket:connection', { namespace, event, socket });
429
-
430
- socket.on(event, (data, callback) => {
431
- this.emit('websocket:event', { namespace, event, data });
432
-
433
- Promise.resolve(handler(socket, data))
434
- .then(result => {
435
- this.emit('websocket:response', { namespace, event, result });
436
- if (callback) callback(result);
437
- else if (result) socket.emit(`${event}:response`, result);
438
- })
439
- .catch(error => {
440
- this.emit('websocket:error', { namespace, event, error });
441
- const errorResponse = { success: false, error: error.message };
442
- if (callback) callback(errorResponse);
443
- else socket.emit('error', errorResponse);
444
- });
445
- });
446
- });
447
- });
448
-
449
- this.emit('websocket:registered', { namespace, handlers });
450
- return this;
451
- }
452
-
453
- // Start server with events (Node.js only)
454
- listen(callback?: () => void): void;
455
- listen(port: number, callback?: () => void): void;
456
- listen(port: number, host: string, callback?: () => void): void;
457
- listen(
458
- portOrCallback?: number | (() => void),
459
- hostOrCallback?: string | (() => void),
460
- callback?: () => void
461
- ) {
462
- // Only available for Node.js runtime
463
- if (this.runtimeType !== 'node') {
464
- throw new Error(
465
- `listen() is only available for Node.js runtime. Current runtime: ${this.runtimeType}. Use getHandler() for other runtimes.`
466
- );
467
- }
468
-
469
- // Handle overloaded parameters - supports:
470
- // listen(callback)
471
- // listen(port, callback)
472
- // listen(port, host, callback)
473
- let port: number;
474
- let host: string | undefined;
475
-
476
- if (typeof portOrCallback === 'function') {
477
- // listen(callback) - use port from config
478
- callback = portOrCallback;
479
- port = this.config.server.port;
480
- host = this.config.server.host;
481
- } else if (typeof portOrCallback === 'number') {
482
- // listen(port, ...) variants
483
- port = portOrCallback;
484
- if (typeof hostOrCallback === 'function') {
485
- // listen(port, callback)
486
- callback = hostOrCallback;
487
- host = undefined;
488
- } else {
489
- // listen(port, host, callback)
490
- host = hostOrCallback;
491
- }
492
- } else {
493
- // listen() - use config defaults
494
- port = this.config.server.port;
495
- host = this.config.server.host;
496
- }
497
-
498
- // Validate that we have a valid port
499
- if (!port || typeof port !== 'number') {
500
- throw new Error(
501
- 'Port not specified and not found in configuration. Please provide a port number or configure it in moro.config.js/ts'
502
- );
503
- }
504
-
505
- // Check if clustering is enabled for massive performance gains
506
- if (this.config.performance?.clustering?.enabled) {
507
- this.startWithClustering(port, host as string, callback);
508
- return;
509
- }
510
- this.eventBus.emit('server:starting', { port, runtime: this.runtimeType });
511
-
512
- // Add documentation middleware first (if enabled)
513
- try {
514
- const docsMiddleware = this.documentation.getDocsMiddleware();
515
- this.coreFramework.addMiddleware(docsMiddleware);
516
- this.logger.debug('Documentation middleware added', 'Documentation');
517
- } catch (error) {
518
- // Documentation not enabled, that's fine
519
- this.logger.debug('Documentation not enabled', 'Documentation');
520
- }
521
-
522
- // Add intelligent routing middleware to handle chainable routes
523
- this.coreFramework.addMiddleware(
524
- async (req: HttpRequest, res: HttpResponse, next: () => void) => {
525
- // Try intelligent routing first
526
- const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
527
- if (!handled) {
528
- next(); // Fall back to direct routes
529
- }
530
- }
531
- );
532
-
533
- // Register direct routes with the HTTP server
534
- if (this.routes.length > 0) {
535
- this.registerDirectRoutes();
536
- }
537
-
538
- const actualCallback = () => {
539
- const displayHost = host || 'localhost';
540
- this.logger.info('Moro Server Started', 'Server');
541
- this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
542
- this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
543
- this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
544
- this.logger.info('Native Node.js HTTP • Zero Dependencies • Maximum Performance', 'Server');
545
- this.logger.info('Learn more at https://morojs.com', 'Server');
546
-
547
- // Log intelligent routes info
548
- const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
549
- if (intelligentRoutes.length > 0) {
550
- this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
551
- }
552
-
553
- this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
554
- if (callback) callback();
555
- };
556
-
557
- if (host && typeof host === 'string') {
558
- this.coreFramework.listen(port, host, actualCallback);
559
- } else {
560
- this.coreFramework.listen(port, actualCallback);
561
- }
562
- }
563
-
564
- // Get handler for non-Node.js runtimes
565
- getHandler() {
566
- // Create a unified request handler that works with the runtime adapter
567
- const handler = async (req: HttpRequest, res: HttpResponse) => {
568
- // Add documentation middleware first (if enabled)
569
- try {
570
- const docsMiddleware = this.documentation.getDocsMiddleware();
571
- await docsMiddleware(req, res, () => {});
572
- if (res.headersSent) return;
573
- } catch (error) {
574
- // Documentation not enabled, that's fine
575
- }
576
-
577
- // Try intelligent routing first
578
- const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
579
- if (handled) return;
580
-
581
- // Handle direct routes
582
- if (this.routes.length > 0) {
583
- await this.handleDirectRoutes(req, res);
584
- }
585
- };
586
-
587
- // Use the runtime adapter to create the appropriate handler
588
- return this.runtimeAdapter.createServer(handler);
589
- }
590
-
591
- // Handle direct routes for runtime adapters
592
- private async handleDirectRoutes(req: HttpRequest, res: HttpResponse) {
593
- // Find matching route
594
- const route = this.findMatchingRoute(req.method!, req.path);
595
- if (!route) {
596
- (res as any).status(404).json({ success: false, error: 'Not found' });
597
- return;
598
- }
599
-
600
- try {
601
- // Extract path parameters
602
- const matches = req.path.match(route.pattern);
603
- if (matches) {
604
- req.params = {};
605
- route.paramNames.forEach((name: string, index: number) => {
606
- req.params[name] = matches[index + 1];
607
- });
608
- }
609
-
610
- // Get handler function
611
- const handler = this.routeHandlers[route.handler];
612
- if (!handler) {
613
- (res as any).status(500).json({ success: false, error: 'Handler not found' });
614
- return;
615
- }
616
-
617
- // Execute validation if present
618
- if (route.validation) {
619
- try {
620
- const validated = route.validation.parse(req.body);
621
- req.body = validated;
622
- } catch (error: any) {
623
- if (error.issues) {
624
- (res as any).status(400).json({
625
- success: false,
626
- error: 'Validation failed',
627
- details: error.issues.map((issue: any) => ({
628
- field: issue.path.length > 0 ? issue.path.join('.') : 'body',
629
- message: issue.message,
630
- code: issue.code,
631
- })),
632
- });
633
- return;
634
- }
635
- throw error;
636
- }
637
- }
638
-
639
- // Execute rate limiting if present
640
- if (route.rateLimit) {
641
- const clientId = req.ip || 'unknown';
642
- const key = `${route.method}:${route.path}:${clientId}`;
643
-
644
- if (!this.checkRateLimit(key, route.rateLimit)) {
645
- (res as any).status(429).json({
646
- success: false,
647
- error: 'Rate limit exceeded',
648
- retryAfter: Math.ceil(route.rateLimit.window / 1000),
649
- });
650
- return;
651
- }
652
- }
653
-
654
- // Execute the handler
655
- const result = await handler(req, res);
656
- if (result && !(res as any).headersSent) {
657
- (res as any).json(result);
658
- }
659
- } catch (error) {
660
- if (!(res as any).headersSent) {
661
- (res as any).status(500).json({
662
- success: false,
663
- error: error instanceof Error ? error.message : 'Internal server error',
664
- });
665
- }
666
- }
667
- }
668
-
669
- // Advanced route matching with caching and optimization
670
- private routeCache = new Map<string, { pattern: RegExp; paramNames: string[] }>();
671
- private staticRouteMap = new Map<string, any>();
672
- private dynamicRoutesBySegments = new Map<number, any[]>();
673
-
674
- private findMatchingRoute(method: string, path: string) {
675
- // Phase 1: O(1) static route lookup
676
- const staticKey = `${method}:${path}`;
677
- const staticRoute = this.staticRouteMap.get(staticKey);
678
- if (staticRoute) {
679
- return {
680
- ...staticRoute,
681
- pattern: /^.*$/, // Dummy pattern for static routes
682
- paramNames: [],
683
- };
684
- }
685
-
686
- // Phase 2: Optimized dynamic route matching by segment count
687
- const segments = path.split('/').filter(s => s.length > 0);
688
- const segmentCount = segments.length;
689
- const candidateRoutes = this.dynamicRoutesBySegments.get(segmentCount) || [];
690
-
691
- for (const route of candidateRoutes) {
692
- if (route.method === method) {
693
- const cacheKey = `${method}:${route.path}`;
694
- let pattern = this.routeCache.get(cacheKey);
695
-
696
- if (!pattern) {
697
- pattern = this.pathToRegex(route.path);
698
- this.routeCache.set(cacheKey, pattern);
699
- }
700
-
701
- if (pattern.pattern.test(path)) {
702
- return {
703
- ...route,
704
- pattern: pattern.pattern,
705
- paramNames: pattern.paramNames,
706
- };
707
- }
708
- }
709
- }
710
-
711
- return null;
712
- }
713
-
714
- // Convert path to regex (simplified version)
715
- private pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {
716
- const paramNames: string[] = [];
717
- const regexPath = path.replace(/\//g, '\\/').replace(/:([^/]+)/g, (match, paramName) => {
718
- paramNames.push(paramName);
719
- return '([^/]+)';
720
- });
721
-
722
- return {
723
- pattern: new RegExp(`^${regexPath}$`),
724
- paramNames,
725
- };
726
- }
727
-
728
- // Access enterprise event system for advanced integrations
729
- get events() {
730
- return this.eventBus;
731
- }
732
-
733
- // Access to core framework for advanced usage
734
- get core() {
735
- return this.coreFramework;
736
- }
737
-
738
- // Force cleanup of pooled objects
739
- forceCleanup(): void {
740
- const httpServer = (this.coreFramework as any).httpServer;
741
- if (httpServer && httpServer.forceCleanup) {
742
- httpServer.forceCleanup();
743
- }
744
- }
745
-
746
- // Private methods
747
- private addRoute(method: string, path: string, handler: Function, options: any = {}) {
748
- const handlerName = `handler_${this.routes.length}`;
749
-
750
- const route = {
751
- method: method as any,
752
- path,
753
- handler: handlerName,
754
- validation: options.validation,
755
- rateLimit: options.rateLimit,
756
- cache: options.cache,
757
- middleware: options.middleware,
758
- };
759
-
760
- this.routes.push(route);
761
-
762
- // Organize routes for optimal lookup
763
- this.organizeRouteForLookup(route);
764
-
765
- // Store handler for later module creation
766
- this.routeHandlers[handlerName] = handler;
767
-
768
- return this;
769
- }
770
-
771
- private organizeRouteForLookup(route: any): void {
772
- if (!route.path.includes(':')) {
773
- // Static route - add to static map for O(1) lookup
774
- const staticKey = `${route.method}:${route.path}`;
775
- this.staticRouteMap.set(staticKey, route);
776
- } else {
777
- // Dynamic route - organize by segment count
778
- const segments = route.path.split('/').filter((s: string) => s.length > 0);
779
- const segmentCount = segments.length;
780
-
781
- if (!this.dynamicRoutesBySegments.has(segmentCount)) {
782
- this.dynamicRoutesBySegments.set(segmentCount, []);
783
- }
784
- this.dynamicRoutesBySegments.get(segmentCount)!.push(route);
785
- }
786
- }
787
-
788
- private registerDirectRoutes() {
789
- // Register routes directly with the HTTP server for optimal performance
790
- // This provides the intuitive developer experience users expect
791
- for (const route of this.routes) {
792
- const handler = this.routeHandlers[route.handler];
793
-
794
- // Get direct access to the HTTP server through the core framework
795
- const httpServer = (this.coreFramework as any).httpServer;
796
-
797
- // Create a wrapper handler that handles validation, rate limiting, and return values
798
- const wrappedHandler = async (req: any, res: any) => {
799
- try {
800
- // Enhance request with events property for direct routes
801
- req.events = this.eventBus;
802
-
803
- // Universal validation middleware (works with any ValidationSchema)
804
- if (route.validation) {
805
- try {
806
- const validated = await route.validation.parseAsync(req.body);
807
- req.body = validated;
808
- } catch (error: any) {
809
- // Handle universal validation errors
810
- const { normalizeValidationError } = require('./core/validation/schema-interface');
811
- const normalizedError = normalizeValidationError(error);
812
- res.status(400).json({
813
- success: false,
814
- error: 'Validation failed',
815
- details: normalizedError.issues.map((issue: any) => ({
816
- field: issue.path.length > 0 ? issue.path.join('.') : 'body',
817
- message: issue.message,
818
- code: issue.code,
819
- })),
820
- requestId: req.requestId,
821
- });
822
- return;
823
- }
824
- }
825
-
826
- // Rate limiting middleware
827
- if (route.rateLimit) {
828
- const clientId = req.ip || req.connection.remoteAddress || 'unknown';
829
- const key = `${route.method}:${route.path}:${clientId}`;
830
-
831
- if (!this.checkRateLimit(key, route.rateLimit)) {
832
- res.status(429).json({
833
- success: false,
834
- error: 'Rate limit exceeded',
835
- retryAfter: Math.ceil(route.rateLimit.window / 1000),
836
- });
837
- return;
838
- }
839
- }
840
-
841
- // Execute the actual handler
842
- const result = await handler(req, res);
843
- if (result && !res.headersSent) {
844
- res.json(result);
845
- }
846
- } catch (error) {
847
- if (!res.headersSent) {
848
- res.status(500).json({
849
- success: false,
850
- error: error instanceof Error ? error.message : 'Internal server error',
851
- });
852
- }
853
- }
854
- };
855
-
856
- // Register with the appropriate HTTP method
857
- const method = route.method.toLowerCase();
858
- if (httpServer && httpServer[method]) {
859
- httpServer[method](route.path, wrappedHandler);
860
- }
861
- }
862
- }
863
-
864
- // Simple rate limiting for direct routes
865
- private rateLimitStore = new Map<string, { count: number; resetTime: number }>();
866
-
867
- private checkRateLimit(key: string, config: { requests: number; window: number }): boolean {
868
- const now = Date.now();
869
- const bucket = this.rateLimitStore.get(key);
870
-
871
- if (!bucket || now > bucket.resetTime) {
872
- // Create new bucket or reset expired bucket
873
- this.rateLimitStore.set(key, {
874
- count: 1,
875
- resetTime: now + config.window,
876
- });
877
- return true;
878
- }
879
-
880
- if (bucket.count >= config.requests) {
881
- return false; // Rate limit exceeded
882
- }
883
-
884
- bucket.count++;
885
- return true;
886
- }
887
-
888
- private setupDefaultMiddleware(options: MoroOptions) {
889
- // CORS
890
- if (options.cors !== false) {
891
- const corsOptions = typeof options.cors === 'object' ? options.cors : {};
892
- this.use(middleware.cors(corsOptions));
893
- }
894
-
895
- // Helmet
896
- if (options.helmet !== false) {
897
- this.use(middleware.helmet());
898
- }
899
-
900
- // Compression
901
- if (options.compression !== false) {
902
- const compressionOptions = typeof options.compression === 'object' ? options.compression : {};
903
- this.use(middleware.compression(compressionOptions));
904
- }
905
-
906
- // Body size limiting
907
- this.use(middleware.bodySize({ limit: '10mb' }));
908
- }
909
-
910
- private autoDiscoverModules(modulesPath: string) {
911
- try {
912
- if (!statSync(modulesPath).isDirectory()) return;
913
-
914
- const items = readdirSync(modulesPath);
915
- items.forEach(item => {
916
- const fullPath = join(modulesPath, item);
917
- if (statSync(fullPath).isDirectory()) {
918
- const indexPath = join(fullPath, 'index.ts');
919
- try {
920
- statSync(indexPath);
921
- // Module directory found, will be loaded later
922
- this.logger.debug(`Discovered module: ${item}`, 'ModuleDiscovery');
923
- } catch {
924
- // No index.ts, skip
925
- }
926
- }
927
- });
928
- } catch {
929
- // Modules directory doesn't exist, that's fine
930
- }
931
- }
932
-
933
- private async importModule(modulePath: string): Promise<ModuleConfig> {
934
- const module = await import(modulePath);
935
- return module.default || module;
936
- }
937
-
938
- // Clustering support for massive performance gains with proper cleanup
939
- private clusterWorkers = new Map<number, any>();
940
- private startWithClustering(port: number, host?: string, callback?: () => void): void {
941
- const cluster = require('cluster');
942
- const os = require('os');
943
-
944
- // Smart worker count calculation based on actual bottlenecks
945
- let workerCount = this.config.performance?.clustering?.workers || os.cpus().length;
946
-
947
- // Auto-optimize worker count based on system characteristics
948
- if (workerCount === 'auto' || workerCount > 8) {
949
- // For high-core machines, limit workers to prevent IPC/memory bottlenecks
950
- const cpuCount = os.cpus().length;
951
- const totalMemoryGB = os.totalmem() / (1024 * 1024 * 1024);
952
-
953
- // Optimal worker count formula based on research
954
- if (cpuCount >= 16) {
955
- // High-core machines: focus on memory/IPC efficiency
956
- workerCount = Math.min(Math.ceil(totalMemoryGB / 2), 4); // 2GB per worker max, cap at 4
957
- } else if (cpuCount >= 8) {
958
- // Mid-range machines: balanced approach
959
- workerCount = Math.min(cpuCount / 2, 4);
960
- } else {
961
- // Low-core machines: use all cores
962
- workerCount = cpuCount;
963
- }
964
-
965
- this.logger.info(
966
- `Auto-optimized workers: ${workerCount} (CPU: ${cpuCount}, RAM: ${totalMemoryGB.toFixed(1)}GB)`,
967
- 'Cluster'
968
- );
969
- }
970
-
971
- if (cluster.isPrimary) {
972
- this.logger.info(`🚀 Starting ${workerCount} workers for maximum performance`, 'Cluster');
973
-
974
- // Optimize cluster scheduling for high concurrency
975
- cluster.schedulingPolicy = cluster.SCHED_RR; // Round-robin scheduling
976
-
977
- // Set cluster settings for better performance
978
- cluster.setupMaster({
979
- exec: process.argv[1],
980
- args: process.argv.slice(2),
981
- silent: false,
982
- });
983
-
984
- // Optimize IPC to reduce communication overhead
985
- process.env.NODE_CLUSTER_SCHED_POLICY = 'rr'; // Ensure round-robin
986
- process.env.NODE_DISABLE_COLORS = '1'; // Reduce IPC message size
987
-
988
- // Graceful shutdown handler
989
- const gracefulShutdown = () => {
990
- this.logger.info('Gracefully shutting down cluster...', 'Cluster');
991
-
992
- // Clean up all workers
993
- for (const [pid, worker] of this.clusterWorkers) {
994
- worker.removeAllListeners();
995
- worker.kill('SIGTERM');
996
- }
997
-
998
- // Clean up cluster listeners
999
- cluster.removeAllListeners();
1000
- process.exit(0);
1001
- };
1002
-
1003
- // Handle process signals for graceful shutdown
1004
- process.on('SIGINT', gracefulShutdown);
1005
- process.on('SIGTERM', gracefulShutdown);
1006
-
1007
- // Fork workers with proper tracking and CPU affinity
1008
- for (let i = 0; i < workerCount; i++) {
1009
- const worker = cluster.fork({
1010
- WORKER_ID: i,
1011
- WORKER_CPU_AFFINITY: i % os.cpus().length, // Distribute workers across CPUs
1012
- });
1013
- this.clusterWorkers.set(worker.process.pid!, worker);
1014
- this.logger.info(
1015
- `Worker ${worker.process.pid} started (CPU ${i % os.cpus().length})`,
1016
- 'Cluster'
1017
- );
1018
-
1019
- // Handle individual worker messages (reuse handler)
1020
- worker.on('message', this.handleWorkerMessage.bind(this));
1021
- }
1022
-
1023
- // Handle worker exits with cleanup
1024
- cluster.on('exit', (worker: any, code: number, signal: string) => {
1025
- // Clean up worker tracking
1026
- this.clusterWorkers.delete(worker.process.pid);
1027
-
1028
- this.logger.warn(
1029
- `Worker ${worker.process.pid} died (${signal || code}). Restarting...`,
1030
- 'Cluster'
1031
- );
1032
-
1033
- // Restart worker with proper tracking
1034
- const newWorker = cluster.fork();
1035
- this.clusterWorkers.set(newWorker.process.pid!, newWorker);
1036
- newWorker.on('message', this.handleWorkerMessage.bind(this));
1037
- this.logger.info(`Worker ${newWorker.process.pid} started`, 'Cluster');
1038
- });
1039
-
1040
- // Master process callback
1041
- if (callback) callback();
1042
- } else {
1043
- // Worker process - start the actual server with proper cleanup
1044
- this.logger.info(`Worker ${process.pid} initializing`, 'Worker');
1045
-
1046
- // Worker-specific optimizations for high concurrency
1047
- process.env.UV_THREADPOOL_SIZE = '64';
1048
-
1049
- // Reduce logging contention in workers (major bottleneck)
1050
- if (this.config.logging) {
1051
- // Workers log less frequently to reduce I/O contention
1052
- this.config.logging.level = 'warn'; // Only warnings and errors
1053
- }
1054
-
1055
- // Memory optimization for workers
1056
- process.env.NODE_OPTIONS = '--max-old-space-size=1024'; // Limit memory per worker
1057
-
1058
- // Optimize V8 flags for better performance (Rust-level optimizations)
1059
- if (process.env.NODE_ENV === 'production') {
1060
- // Ultra-aggressive V8 optimizations for maximum performance
1061
- const v8Flags = [
1062
- '--optimize-for-size', // Trade memory for speed
1063
- '--always-opt', // Always optimize functions
1064
- '--turbo-fast-api-calls', // Optimize API calls
1065
- '--turbo-escape-analysis', // Escape analysis optimization
1066
- '--turbo-inline-api-calls', // Inline API calls
1067
- '--max-old-space-size=1024', // Limit memory to prevent GC pressure
1068
- ];
1069
- process.env.NODE_OPTIONS = (process.env.NODE_OPTIONS || '') + ' ' + v8Flags.join(' ');
1070
- }
1071
-
1072
- // Optimize garbage collection for workers
1073
- // eslint-disable-next-line no-undef
1074
- if ((global as any).gc) {
1075
- setInterval(() => {
1076
- // eslint-disable-next-line no-undef
1077
- if ((global as any).gc) (global as any).gc();
1078
- }, 60000); // GC every 60 seconds (less frequent)
1079
- }
1080
-
1081
- // Graceful shutdown for worker
1082
- const workerShutdown = () => {
1083
- this.logger.info(`Worker ${process.pid} shutting down gracefully...`, 'Worker');
1084
-
1085
- // Clean up event listeners
1086
- this.eventBus.removeAllListeners();
1087
- this.removeAllListeners();
1088
-
1089
- // Close server gracefully
1090
- if (this.coreFramework) {
1091
- const server = (this.coreFramework as any).server;
1092
- if (server) {
1093
- server.close(() => {
1094
- process.exit(0);
1095
- });
1096
- }
1097
- }
1098
- };
1099
-
1100
- // Handle worker shutdown signals
1101
- process.on('SIGTERM', workerShutdown);
1102
- process.on('SIGINT', workerShutdown);
1103
-
1104
- // Continue with normal server startup for this worker
1105
- this.eventBus.emit('server:starting', {
1106
- port,
1107
- runtime: this.runtimeType,
1108
- worker: process.pid,
1109
- });
1110
-
1111
- // Add documentation middleware first (if enabled)
1112
- try {
1113
- const docsMiddleware = this.documentation.getDocsMiddleware();
1114
- this.coreFramework.addMiddleware(docsMiddleware);
1115
- } catch (error) {
1116
- // Documentation not enabled, that's fine
1117
- }
1118
-
1119
- // Add intelligent routing middleware
1120
- this.coreFramework.addMiddleware(
1121
- async (req: HttpRequest, res: HttpResponse, next: () => void) => {
1122
- const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
1123
- if (!handled) {
1124
- next();
1125
- }
1126
- }
1127
- );
1128
-
1129
- // Register direct routes
1130
- if (this.routes.length > 0) {
1131
- this.registerDirectRoutes();
1132
- }
1133
-
1134
- const workerCallback = () => {
1135
- const displayHost = host || 'localhost';
1136
- this.logger.info(`Worker ${process.pid} ready on ${displayHost}:${port}`, 'Worker');
1137
- this.eventBus.emit('server:started', {
1138
- port,
1139
- runtime: this.runtimeType,
1140
- worker: process.pid,
1141
- });
1142
- };
1143
-
1144
- if (host) {
1145
- this.coreFramework.listen(port, host, workerCallback);
1146
- } else {
1147
- this.coreFramework.listen(port, workerCallback);
1148
- }
1149
- }
1150
- }
1151
-
1152
- // Reusable worker message handler (avoids creating new functions)
1153
- private handleWorkerMessage(message: any): void {
1154
- // Handle inter-worker communication if needed
1155
- if (message.type === 'health-check') {
1156
- // Worker health check response
1157
- return;
1158
- }
1159
-
1160
- // Log other worker messages
1161
- this.logger.debug(`Worker message: ${JSON.stringify(message)}`, 'Cluster');
1162
- }
1163
- }
1164
-
1165
- // Export convenience function
1166
- export function createApp(options?: MoroOptions): Moro {
1167
- return new Moro(options);
1168
- }
1169
-
1170
- // Runtime-specific convenience functions
1171
- export function createAppNode(options?: Omit<MoroOptions, 'runtime'>): Moro {
1172
- return new Moro({
1173
- ...options,
1174
- runtime: { type: 'node' },
1175
- });
1176
- }
1177
-
1178
- export function createAppEdge(options?: Omit<MoroOptions, 'runtime'>): Moro {
1179
- return new Moro({
1180
- ...options,
1181
- runtime: { type: 'vercel-edge' },
1182
- });
1183
- }
1184
-
1185
- export function createAppLambda(options?: Omit<MoroOptions, 'runtime'>): Moro {
1186
- return new Moro({
1187
- ...options,
1188
- runtime: { type: 'aws-lambda' },
1189
- });
1190
- }
1191
-
1192
- export function createAppWorker(options?: Omit<MoroOptions, 'runtime'>): Moro {
1193
- return new Moro({
1194
- ...options,
1195
- runtime: { type: 'cloudflare-workers' },
1196
- });
1197
- }