@morojs/moro 1.7.30 → 1.8.1

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 (373) hide show
  1. package/README.md +89 -46
  2. package/dist/core/auth/morojs-adapter.js +95 -45
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/config-manager.js.map +1 -1
  5. package/dist/core/config/config-sources.js +119 -48
  6. package/dist/core/config/config-sources.js.map +1 -1
  7. package/dist/core/config/config-validator.js +189 -8
  8. package/dist/core/config/config-validator.js.map +1 -1
  9. package/dist/core/config/file-loader.js.map +1 -1
  10. package/dist/core/config/index.js.map +1 -1
  11. package/dist/core/config/schema.js +35 -4
  12. package/dist/core/config/schema.js.map +1 -1
  13. package/dist/core/config/utils.js.map +1 -1
  14. package/dist/core/database/adapters/drizzle.js +2 -2
  15. package/dist/core/database/adapters/drizzle.js.map +1 -1
  16. package/dist/core/database/adapters/index.js.map +1 -1
  17. package/dist/core/database/adapters/mongodb.d.ts +1 -0
  18. package/dist/core/database/adapters/mongodb.js +16 -0
  19. package/dist/core/database/adapters/mongodb.js.map +1 -1
  20. package/dist/core/database/adapters/mysql.d.ts +1 -0
  21. package/dist/core/database/adapters/mysql.js +13 -2
  22. package/dist/core/database/adapters/mysql.js.map +1 -1
  23. package/dist/core/database/adapters/postgresql.js +2 -2
  24. package/dist/core/database/adapters/postgresql.js.map +1 -1
  25. package/dist/core/database/adapters/redis.js.map +1 -1
  26. package/dist/core/database/adapters/sql-safety.js +5 -4
  27. package/dist/core/database/adapters/sql-safety.js.map +1 -1
  28. package/dist/core/database/adapters/sqlite.js.map +1 -1
  29. package/dist/core/database/index.js.map +1 -1
  30. package/dist/core/docs/index.js +11 -7
  31. package/dist/core/docs/index.js.map +1 -1
  32. package/dist/core/docs/openapi-generator.js +8 -6
  33. package/dist/core/docs/openapi-generator.js.map +1 -1
  34. package/dist/core/docs/schema-to-openapi.js +3 -3
  35. package/dist/core/docs/schema-to-openapi.js.map +1 -1
  36. package/dist/core/docs/simple-docs.js.map +1 -1
  37. package/dist/core/docs/swagger-ui.js.map +1 -1
  38. package/dist/core/docs/zod-to-openapi.js +2 -2
  39. package/dist/core/docs/zod-to-openapi.js.map +1 -1
  40. package/dist/core/events/event-bus.js +14 -5
  41. package/dist/core/events/event-bus.js.map +1 -1
  42. package/dist/core/events/index.js.map +1 -1
  43. package/dist/core/framework.d.ts +41 -3
  44. package/dist/core/framework.js +342 -95
  45. package/dist/core/framework.js.map +1 -1
  46. package/dist/core/graphql/adapter.js.map +1 -1
  47. package/dist/core/graphql/adapters/graphql-js-adapter.js.map +1 -1
  48. package/dist/core/graphql/core.js.map +1 -1
  49. package/dist/core/graphql/index.js.map +1 -1
  50. package/dist/core/graphql/loader.js.map +1 -1
  51. package/dist/core/graphql/types.js.map +1 -1
  52. package/dist/core/grpc/adapters/grpc-js-adapter.js +4 -0
  53. package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -1
  54. package/dist/core/grpc/adapters/index.js.map +1 -1
  55. package/dist/core/grpc/grpc-adapter.js.map +1 -1
  56. package/dist/core/grpc/grpc-manager.js.map +1 -1
  57. package/dist/core/grpc/index.js.map +1 -1
  58. package/dist/core/grpc/middleware/auth.js +1 -1
  59. package/dist/core/grpc/middleware/auth.js.map +1 -1
  60. package/dist/core/grpc/middleware/logging.js.map +1 -1
  61. package/dist/core/grpc/middleware/validation.js +1 -1
  62. package/dist/core/grpc/middleware/validation.js.map +1 -1
  63. package/dist/core/grpc/types.d.ts +7 -7
  64. package/dist/core/grpc/types.js.map +1 -1
  65. package/dist/core/http/http-server.d.ts +17 -23
  66. package/dist/core/http/http-server.js +109 -249
  67. package/dist/core/http/http-server.js.map +1 -1
  68. package/dist/core/http/http2-server.d.ts +6 -16
  69. package/dist/core/http/http2-server.js +40 -83
  70. package/dist/core/http/http2-server.js.map +1 -1
  71. package/dist/core/http/index.d.ts +1 -0
  72. package/dist/core/http/index.js +3 -0
  73. package/dist/core/http/index.js.map +1 -1
  74. package/dist/core/http/moro-engine-server.d.ts +263 -0
  75. package/dist/core/http/moro-engine-server.js +1962 -0
  76. package/dist/core/http/moro-engine-server.js.map +1 -0
  77. package/dist/core/http/utils/compression.d.ts +47 -0
  78. package/dist/core/http/utils/compression.js +132 -0
  79. package/dist/core/http/utils/compression.js.map +1 -0
  80. package/dist/core/http/utils/lazy-event-emitter.d.ts +11 -0
  81. package/dist/core/http/utils/lazy-event-emitter.js +69 -0
  82. package/dist/core/http/utils/lazy-event-emitter.js.map +1 -0
  83. package/dist/core/http/utils/multipart-parser.d.ts +32 -0
  84. package/dist/core/http/utils/multipart-parser.js +215 -0
  85. package/dist/core/http/utils/multipart-parser.js.map +1 -0
  86. package/dist/core/http/utils/query-parser.d.ts +1 -0
  87. package/dist/core/http/utils/query-parser.js +44 -0
  88. package/dist/core/http/utils/query-parser.js.map +1 -0
  89. package/dist/core/http/utils/size.d.ts +33 -0
  90. package/dist/core/http/utils/size.js +37 -0
  91. package/dist/core/http/utils/size.js.map +1 -0
  92. package/dist/core/http/utils/ssl-config.d.ts +69 -0
  93. package/dist/core/http/utils/ssl-config.js +116 -0
  94. package/dist/core/http/utils/ssl-config.js.map +1 -0
  95. package/dist/core/http/utils/uws-worker-clustering.js +45 -32
  96. package/dist/core/http/utils/uws-worker-clustering.js.map +1 -1
  97. package/dist/core/http/uws-http-server.d.ts +25 -3
  98. package/dist/core/http/uws-http-server.js +465 -86
  99. package/dist/core/http/uws-http-server.js.map +1 -1
  100. package/dist/core/jobs/cron-parser.js +7 -5
  101. package/dist/core/jobs/cron-parser.js.map +1 -1
  102. package/dist/core/jobs/index.js.map +1 -1
  103. package/dist/core/jobs/job-executor.d.ts +1 -1
  104. package/dist/core/jobs/job-executor.js.map +1 -1
  105. package/dist/core/jobs/job-scheduler.d.ts +3 -3
  106. package/dist/core/jobs/job-scheduler.js.map +1 -1
  107. package/dist/core/jobs/job-state-manager.d.ts +3 -3
  108. package/dist/core/jobs/job-state-manager.js +25 -4
  109. package/dist/core/jobs/job-state-manager.js.map +1 -1
  110. package/dist/core/jobs/leader-election.d.ts +15 -0
  111. package/dist/core/jobs/leader-election.js +158 -69
  112. package/dist/core/jobs/leader-election.js.map +1 -1
  113. package/dist/core/jobs/types.d.ts +4 -4
  114. package/dist/core/jobs/types.js.map +1 -1
  115. package/dist/core/jobs/utils.d.ts +1 -1
  116. package/dist/core/jobs/utils.js +7 -3
  117. package/dist/core/jobs/utils.js.map +1 -1
  118. package/dist/core/logger/filters.js +3 -2
  119. package/dist/core/logger/filters.js.map +1 -1
  120. package/dist/core/logger/index.js.map +1 -1
  121. package/dist/core/logger/logger.js +56 -25
  122. package/dist/core/logger/logger.js.map +1 -1
  123. package/dist/core/logger/outputs.js.map +1 -1
  124. package/dist/core/mail/adapters/console-adapter.js.map +1 -1
  125. package/dist/core/mail/adapters/index.js.map +1 -1
  126. package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -1
  127. package/dist/core/mail/adapters/resend-adapter.js.map +1 -1
  128. package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -1
  129. package/dist/core/mail/adapters/ses-adapter.js.map +1 -1
  130. package/dist/core/mail/index.js.map +1 -1
  131. package/dist/core/mail/mail-adapter.js.map +1 -1
  132. package/dist/core/mail/mail-manager.d.ts +10 -0
  133. package/dist/core/mail/mail-manager.js +21 -5
  134. package/dist/core/mail/mail-manager.js.map +1 -1
  135. package/dist/core/mail/template-engine.js.map +1 -1
  136. package/dist/core/mail/types.js.map +1 -1
  137. package/dist/core/middleware/built-in/auth/core.js +3 -3
  138. package/dist/core/middleware/built-in/auth/core.js.map +1 -1
  139. package/dist/core/middleware/built-in/auth/helpers.js +4 -4
  140. package/dist/core/middleware/built-in/auth/helpers.js.map +1 -1
  141. package/dist/core/middleware/built-in/auth/hook.js.map +1 -1
  142. package/dist/core/middleware/built-in/auth/index.js.map +1 -1
  143. package/dist/core/middleware/built-in/auth/jwt-helpers.d.ts +4 -4
  144. package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -1
  145. package/dist/core/middleware/built-in/auth/middleware.js.map +1 -1
  146. package/dist/core/middleware/built-in/auth/providers.js.map +1 -1
  147. package/dist/core/middleware/built-in/body-parsers/index.js.map +1 -1
  148. package/dist/core/middleware/built-in/body-size/core.js +2 -2
  149. package/dist/core/middleware/built-in/body-size/core.js.map +1 -1
  150. package/dist/core/middleware/built-in/body-size/hook.js.map +1 -1
  151. package/dist/core/middleware/built-in/body-size/index.js.map +1 -1
  152. package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -1
  153. package/dist/core/middleware/built-in/cache/adapters/cache/file.js +3 -1
  154. package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -1
  155. package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -1
  156. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -1
  157. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -1
  158. package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -1
  159. package/dist/core/middleware/built-in/cache/core.js.map +1 -1
  160. package/dist/core/middleware/built-in/cache/hook.js +3 -3
  161. package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
  162. package/dist/core/middleware/built-in/cache/index.js.map +1 -1
  163. package/dist/core/middleware/built-in/cache/middleware.js.map +1 -1
  164. package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -1
  165. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -1
  166. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -1
  167. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -1
  168. package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -1
  169. package/dist/core/middleware/built-in/cdn/core.js.map +1 -1
  170. package/dist/core/middleware/built-in/cdn/hook.js.map +1 -1
  171. package/dist/core/middleware/built-in/cdn/index.js.map +1 -1
  172. package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -1
  173. package/dist/core/middleware/built-in/compression/core.d.ts +3 -0
  174. package/dist/core/middleware/built-in/compression/core.js +28 -34
  175. package/dist/core/middleware/built-in/compression/core.js.map +1 -1
  176. package/dist/core/middleware/built-in/compression/hook.js.map +1 -1
  177. package/dist/core/middleware/built-in/compression/index.js.map +1 -1
  178. package/dist/core/middleware/built-in/compression/middleware.js.map +1 -1
  179. package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
  180. package/dist/core/middleware/built-in/cookie/hook.js.map +1 -1
  181. package/dist/core/middleware/built-in/cookie/index.js.map +1 -1
  182. package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -1
  183. package/dist/core/middleware/built-in/cors/core.js.map +1 -1
  184. package/dist/core/middleware/built-in/cors/hook.js.map +1 -1
  185. package/dist/core/middleware/built-in/cors/index.js.map +1 -1
  186. package/dist/core/middleware/built-in/cors/middleware.js.map +1 -1
  187. package/dist/core/middleware/built-in/csp/core.js.map +1 -1
  188. package/dist/core/middleware/built-in/csp/hook.js.map +1 -1
  189. package/dist/core/middleware/built-in/csp/index.js.map +1 -1
  190. package/dist/core/middleware/built-in/csp/middleware.js.map +1 -1
  191. package/dist/core/middleware/built-in/csrf/core.js +1 -1
  192. package/dist/core/middleware/built-in/csrf/core.js.map +1 -1
  193. package/dist/core/middleware/built-in/csrf/hook.js.map +1 -1
  194. package/dist/core/middleware/built-in/csrf/index.js.map +1 -1
  195. package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -1
  196. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
  197. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
  198. package/dist/core/middleware/built-in/graphql/core.js.map +1 -1
  199. package/dist/core/middleware/built-in/graphql/helpers.js.map +1 -1
  200. package/dist/core/middleware/built-in/graphql/hook.js.map +1 -1
  201. package/dist/core/middleware/built-in/graphql/index.js.map +1 -1
  202. package/dist/core/middleware/built-in/graphql/middleware.js.map +1 -1
  203. package/dist/core/middleware/built-in/graphql/subscriptions.js.map +1 -1
  204. package/dist/core/middleware/built-in/helmet/core.js.map +1 -1
  205. package/dist/core/middleware/built-in/helmet/hook.js.map +1 -1
  206. package/dist/core/middleware/built-in/helmet/index.js.map +1 -1
  207. package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -1
  208. package/dist/core/middleware/built-in/http2/core.js.map +1 -1
  209. package/dist/core/middleware/built-in/http2/hook.js.map +1 -1
  210. package/dist/core/middleware/built-in/http2/index.js.map +1 -1
  211. package/dist/core/middleware/built-in/http2/middleware.js.map +1 -1
  212. package/dist/core/middleware/built-in/index.js.map +1 -1
  213. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
  214. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
  215. package/dist/core/middleware/built-in/range/core.js +4 -1
  216. package/dist/core/middleware/built-in/range/core.js.map +1 -1
  217. package/dist/core/middleware/built-in/range/hook.js.map +1 -1
  218. package/dist/core/middleware/built-in/range/index.js.map +1 -1
  219. package/dist/core/middleware/built-in/range/middleware.js.map +1 -1
  220. package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -1
  221. package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -1
  222. package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -1
  223. package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -1
  224. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
  225. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
  226. package/dist/core/middleware/built-in/session/core.js +4 -4
  227. package/dist/core/middleware/built-in/session/core.js.map +1 -1
  228. package/dist/core/middleware/built-in/session/hook.js.map +1 -1
  229. package/dist/core/middleware/built-in/session/index.js.map +1 -1
  230. package/dist/core/middleware/built-in/session/middleware.js.map +1 -1
  231. package/dist/core/middleware/built-in/sse/core.js.map +1 -1
  232. package/dist/core/middleware/built-in/sse/hook.js.map +1 -1
  233. package/dist/core/middleware/built-in/sse/index.js.map +1 -1
  234. package/dist/core/middleware/built-in/sse/middleware.js.map +1 -1
  235. package/dist/core/middleware/built-in/static/core.js.map +1 -1
  236. package/dist/core/middleware/built-in/static/hook.js.map +1 -1
  237. package/dist/core/middleware/built-in/static/index.js.map +1 -1
  238. package/dist/core/middleware/built-in/static/middleware.js.map +1 -1
  239. package/dist/core/middleware/built-in/template/core.js +1 -1
  240. package/dist/core/middleware/built-in/template/core.js.map +1 -1
  241. package/dist/core/middleware/built-in/template/hook.js.map +1 -1
  242. package/dist/core/middleware/built-in/template/index.js.map +1 -1
  243. package/dist/core/middleware/built-in/template/middleware.js.map +1 -1
  244. package/dist/core/middleware/built-in/upload/core.js.map +1 -1
  245. package/dist/core/middleware/built-in/upload/hook.js.map +1 -1
  246. package/dist/core/middleware/built-in/upload/index.js.map +1 -1
  247. package/dist/core/middleware/built-in/upload/middleware.js.map +1 -1
  248. package/dist/core/middleware/built-in/validation/core.js.map +1 -1
  249. package/dist/core/middleware/built-in/validation/hook.js.map +1 -1
  250. package/dist/core/middleware/built-in/validation/index.js.map +1 -1
  251. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
  252. package/dist/core/middleware/index.js +2 -2
  253. package/dist/core/middleware/index.js.map +1 -1
  254. package/dist/core/modules/auto-discovery.js +11 -7
  255. package/dist/core/modules/auto-discovery.js.map +1 -1
  256. package/dist/core/modules/index.js.map +1 -1
  257. package/dist/core/modules/modules.js +18 -13
  258. package/dist/core/modules/modules.js.map +1 -1
  259. package/dist/core/networking/adapters/engine-adapter.d.ts +23 -0
  260. package/dist/core/networking/adapters/engine-adapter.js +365 -0
  261. package/dist/core/networking/adapters/engine-adapter.js.map +1 -0
  262. package/dist/core/networking/adapters/index.d.ts +1 -0
  263. package/dist/core/networking/adapters/index.js +1 -0
  264. package/dist/core/networking/adapters/index.js.map +1 -1
  265. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -0
  266. package/dist/core/networking/adapters/socketio-adapter.js +12 -1
  267. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  268. package/dist/core/networking/adapters/uws-adapter.js +27 -16
  269. package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
  270. package/dist/core/networking/adapters/ws-adapter.d.ts +15 -0
  271. package/dist/core/networking/adapters/ws-adapter.js +120 -6
  272. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  273. package/dist/core/networking/index.js.map +1 -1
  274. package/dist/core/networking/service-discovery.js +7 -5
  275. package/dist/core/networking/service-discovery.js.map +1 -1
  276. package/dist/core/networking/websocket-adapter.d.ts +22 -3
  277. package/dist/core/networking/websocket-adapter.js.map +1 -1
  278. package/dist/core/networking/websocket-manager.js +70 -67
  279. package/dist/core/networking/websocket-manager.js.map +1 -1
  280. package/dist/core/pooling/object-pool-manager.js +6 -0
  281. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  282. package/dist/core/queue/adapters/bull-adapter.js.map +1 -1
  283. package/dist/core/queue/adapters/index.js.map +1 -1
  284. package/dist/core/queue/adapters/kafka-adapter.js +2 -2
  285. package/dist/core/queue/adapters/kafka-adapter.js.map +1 -1
  286. package/dist/core/queue/adapters/memory-adapter.js +6 -6
  287. package/dist/core/queue/adapters/memory-adapter.js.map +1 -1
  288. package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +50 -0
  289. package/dist/core/queue/adapters/rabbitmq-adapter.js +176 -20
  290. package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -1
  291. package/dist/core/queue/adapters/sqs-adapter.d.ts +12 -2
  292. package/dist/core/queue/adapters/sqs-adapter.js +75 -24
  293. package/dist/core/queue/adapters/sqs-adapter.js.map +1 -1
  294. package/dist/core/queue/index.js.map +1 -1
  295. package/dist/core/queue/middleware/index.js.map +1 -1
  296. package/dist/core/queue/middleware/monitoring.d.ts +1 -1
  297. package/dist/core/queue/middleware/monitoring.js.map +1 -1
  298. package/dist/core/queue/middleware/priority.js +2 -1
  299. package/dist/core/queue/middleware/priority.js.map +1 -1
  300. package/dist/core/queue/middleware/rate-limit.js.map +1 -1
  301. package/dist/core/queue/queue-adapter.js.map +1 -1
  302. package/dist/core/queue/queue-manager.js.map +1 -1
  303. package/dist/core/queue/types.d.ts +8 -8
  304. package/dist/core/queue/types.js.map +1 -1
  305. package/dist/core/routing/app-integration.js.map +1 -1
  306. package/dist/core/routing/create-router.js.map +1 -1
  307. package/dist/core/routing/index.js.map +1 -1
  308. package/dist/core/routing/path-matcher.js.map +1 -1
  309. package/dist/core/routing/radix-tree.js.map +1 -1
  310. package/dist/core/routing/router.js.map +1 -1
  311. package/dist/core/routing/unified-router.js +12 -4
  312. package/dist/core/routing/unified-router.js.map +1 -1
  313. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  314. package/dist/core/runtime/base-adapter.js +2 -2
  315. package/dist/core/runtime/base-adapter.js.map +1 -1
  316. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -0
  317. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  318. package/dist/core/runtime/index.js.map +1 -1
  319. package/dist/core/runtime/node-adapter.js +19 -17
  320. package/dist/core/runtime/node-adapter.js.map +1 -1
  321. package/dist/core/runtime/vercel-edge-adapter.js +2 -0
  322. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  323. package/dist/core/utilities/circuit-breaker.d.ts +1 -0
  324. package/dist/core/utilities/circuit-breaker.js +25 -2
  325. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  326. package/dist/core/utilities/container.js +9 -9
  327. package/dist/core/utilities/container.js.map +1 -1
  328. package/dist/core/utilities/hooks.js +28 -6
  329. package/dist/core/utilities/hooks.js.map +1 -1
  330. package/dist/core/utilities/index.js.map +1 -1
  331. package/dist/core/utilities/module-path.js.map +1 -1
  332. package/dist/core/utilities/package-utils.d.ts +68 -0
  333. package/dist/core/utilities/package-utils.js +198 -1
  334. package/dist/core/utilities/package-utils.js.map +1 -1
  335. package/dist/core/utilities/response-helpers.js +1 -1
  336. package/dist/core/utilities/response-helpers.js.map +1 -1
  337. package/dist/core/validation/adapters.js.map +1 -1
  338. package/dist/core/validation/error-handler.js.map +1 -1
  339. package/dist/core/validation/index.js.map +1 -1
  340. package/dist/core/validation/schema-interface.js.map +1 -1
  341. package/dist/core/workers/facade.js.map +1 -1
  342. package/dist/core/workers/index.js.map +1 -1
  343. package/dist/core/workers/worker-entry.d.ts +1 -0
  344. package/dist/core/workers/worker-entry.js +12 -0
  345. package/dist/core/workers/worker-entry.js.map +1 -0
  346. package/dist/core/workers/worker-manager.d.ts +23 -2
  347. package/dist/core/workers/worker-manager.js +117 -17
  348. package/dist/core/workers/worker-manager.js.map +1 -1
  349. package/dist/core/workers/worker.js +8 -6
  350. package/dist/core/workers/worker.js.map +1 -1
  351. package/dist/index.d.ts +2 -2
  352. package/dist/index.js +5 -2
  353. package/dist/index.js.map +1 -1
  354. package/dist/moro.d.ts +20 -1
  355. package/dist/moro.js +230 -70
  356. package/dist/moro.js.map +1 -1
  357. package/dist/types/auth.d.ts +4 -4
  358. package/dist/types/auth.js.map +1 -1
  359. package/dist/types/cache.js.map +1 -1
  360. package/dist/types/cdn.js.map +1 -1
  361. package/dist/types/config.d.ts +100 -15
  362. package/dist/types/config.js.map +1 -1
  363. package/dist/types/core.js.map +1 -1
  364. package/dist/types/database.js.map +1 -1
  365. package/dist/types/discovery.js.map +1 -1
  366. package/dist/types/events.js.map +1 -1
  367. package/dist/types/hooks.js.map +1 -1
  368. package/dist/types/http.js.map +1 -1
  369. package/dist/types/logger.js.map +1 -1
  370. package/dist/types/module.js.map +1 -1
  371. package/dist/types/runtime.js.map +1 -1
  372. package/dist/types/session.js.map +1 -1
  373. package/package.json +32 -17
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Unified SSL/TLS configuration.
3
+ *
4
+ * MoroJS historically carried TWO incompatible SSL shapes:
5
+ * - `config.server.ssl` = uWS-style file paths { key_file_name, cert_file_name, passphrase }
6
+ * - `options.https` = node-style buffers { key, cert, ca }
7
+ * and each reached only one runtime (uWS / http2 respectively). This module
8
+ * normalizes both into ONE internal shape and projects it back out for each
9
+ * of the four servers (Node https, uWS SSLApp, HTTP/2, the native engine), so
10
+ * a single `server.ssl` config flows everywhere.
11
+ */
12
+ import { readFileSync } from 'fs';
13
+ const toArray = (v) => v === undefined ? undefined : Array.isArray(v) ? v : [v];
14
+ /**
15
+ * Normalize the two historical SSL shapes into one. `serverSsl`
16
+ * (config.server.ssl) wins over `optionsHttps` (options.https) when both are
17
+ * present, matching the pre-existing precedence in framework.ts. Returns null
18
+ * when neither carries any key/cert material (TLS simply off).
19
+ */
20
+ export function normalizeSSLConfig(serverSsl, optionsHttps, logger) {
21
+ if (serverSsl && optionsHttps) {
22
+ logger?.warn('Both server.ssl and options.https are set; server.ssl takes precedence', 'SSL');
23
+ }
24
+ const src = serverSsl ?? optionsHttps;
25
+ if (!src)
26
+ return null;
27
+ const out = {
28
+ keyFile: src.keyFile ?? src.key_file_name,
29
+ certFile: src.certFile ?? src.cert_file_name,
30
+ caFile: toArray(src.caFile ?? src.ca_file_name),
31
+ key: src.key,
32
+ cert: src.cert,
33
+ ca: toArray(src.ca),
34
+ passphrase: src.passphrase,
35
+ minVersion: src.minVersion,
36
+ requestCert: src.requestCert,
37
+ rejectUnauthorized: src.rejectUnauthorized,
38
+ };
39
+ const hasKey = Boolean(out.key || out.keyFile);
40
+ const hasCert = Boolean(out.cert || out.certFile);
41
+ if (!hasKey && !hasCert)
42
+ return null; // nothing usable -> TLS off
43
+ return out;
44
+ }
45
+ /** True when the config actually carries a key+cert (complete TLS material). */
46
+ export function sslIsComplete(ssl) {
47
+ return Boolean((ssl.key || ssl.keyFile) && (ssl.cert || ssl.certFile));
48
+ }
49
+ /**
50
+ * Project for the Node http/https and HTTP/2 servers: node's tls API wants
51
+ * key/cert/ca as strings or Buffers, so any file paths are read here.
52
+ */
53
+ export function sslForNode(ssl) {
54
+ const key = ssl.key ?? (ssl.keyFile ? readFileSync(ssl.keyFile) : undefined);
55
+ const cert = ssl.cert ?? (ssl.certFile ? readFileSync(ssl.certFile) : undefined);
56
+ const ca = ssl.ca ?? (ssl.caFile ? ssl.caFile.map(p => readFileSync(p)) : undefined);
57
+ if (!key || !cert) {
58
+ throw new Error('sslForNode requires both a key and a certificate');
59
+ }
60
+ return {
61
+ key,
62
+ cert,
63
+ ...(ca && { ca }),
64
+ ...(ssl.passphrase && { passphrase: ssl.passphrase }),
65
+ ...(ssl.minVersion && { minVersion: ssl.minVersion }),
66
+ ...(ssl.requestCert !== undefined && { requestCert: ssl.requestCert }),
67
+ ...(ssl.rejectUnauthorized !== undefined && {
68
+ rejectUnauthorized: ssl.rejectUnauthorized,
69
+ }),
70
+ };
71
+ }
72
+ /**
73
+ * Project for uWebSockets.js SSLApp, which requires FILE PATHS (it has no
74
+ * inline-PEM option). Returns null when only inline PEM is available so the
75
+ * caller can log a clear error instead of silently booting plain HTTP.
76
+ */
77
+ export function sslForUws(ssl) {
78
+ if (!ssl.keyFile || !ssl.certFile)
79
+ return null;
80
+ return {
81
+ key_file_name: ssl.keyFile,
82
+ cert_file_name: ssl.certFile,
83
+ ...(ssl.caFile && ssl.caFile[0] && { ca_file_name: ssl.caFile[0] }),
84
+ ...(ssl.passphrase && { passphrase: ssl.passphrase }),
85
+ };
86
+ }
87
+ /**
88
+ * Project for the native @morojs/engine serve() options.ssl, which accepts
89
+ * BOTH shapes (file paths and inline PEM) and prefers inline. Pass everything
90
+ * through; the engine decides.
91
+ */
92
+ export function sslForEngine(ssl) {
93
+ const out = {};
94
+ if (ssl.keyFile)
95
+ out.key_file_name = ssl.keyFile;
96
+ if (ssl.certFile)
97
+ out.cert_file_name = ssl.certFile;
98
+ if (ssl.caFile && ssl.caFile[0])
99
+ out.ca_file_name = ssl.caFile[0];
100
+ if (ssl.key)
101
+ out.key = ssl.key;
102
+ if (ssl.cert)
103
+ out.cert = ssl.cert;
104
+ if (ssl.ca && ssl.ca[0])
105
+ out.ca = ssl.ca[0];
106
+ if (ssl.passphrase)
107
+ out.passphrase = ssl.passphrase;
108
+ if (ssl.minVersion)
109
+ out.minVersion = ssl.minVersion;
110
+ if (ssl.requestCert !== undefined)
111
+ out.requestCert = ssl.requestCert;
112
+ if (ssl.rejectUnauthorized !== undefined)
113
+ out.rejectUnauthorized = ssl.rejectUnauthorized;
114
+ return out;
115
+ }
116
+ //# sourceMappingURL=ssl-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssl-config.js","sourceRoot":"","sources":["../../../../src/core/http/utils/ssl-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unified SSL/TLS configuration.\n *\n * MoroJS historically carried TWO incompatible SSL shapes:\n * - `config.server.ssl` = uWS-style file paths { key_file_name, cert_file_name, passphrase }\n * - `options.https` = node-style buffers { key, cert, ca }\n * and each reached only one runtime (uWS / http2 respectively). This module\n * normalizes both into ONE internal shape and projects it back out for each\n * of the four servers (Node https, uWS SSLApp, HTTP/2, the native engine), so\n * a single `server.ssl` config flows everywhere.\n */\nimport { readFileSync } from 'fs';\nimport type { MoroLogger } from '../../logger/index.js';\n\n/** Raw, un-normalized SSL config as a user may supply it (either shape). */\nexport interface SSLConfigInput {\n // File-path shape (uWS-style; also accepted node-style keyFile/certFile)\n key_file_name?: string;\n cert_file_name?: string;\n ca_file_name?: string | string[];\n keyFile?: string;\n certFile?: string;\n caFile?: string | string[];\n // Inline shape (node-style)\n key?: string | Buffer;\n cert?: string | Buffer;\n ca?: string | Buffer | Array<string | Buffer>;\n passphrase?: string;\n minVersion?: 'TLSv1.2' | 'TLSv1.3';\n requestCert?: boolean;\n rejectUnauthorized?: boolean;\n}\n\n/** Canonical internal SSL config after normalization. */\nexport interface NormalizedSSLConfig {\n keyFile?: string | undefined;\n certFile?: string | undefined;\n caFile?: string[] | undefined;\n key?: string | Buffer | undefined;\n cert?: string | Buffer | undefined;\n ca?: Array<string | Buffer> | undefined;\n passphrase?: string | undefined;\n minVersion?: 'TLSv1.2' | 'TLSv1.3' | undefined;\n requestCert?: boolean | undefined;\n rejectUnauthorized?: boolean | undefined;\n}\n\nconst toArray = <T>(v: T | T[] | undefined): T[] | undefined =>\n v === undefined ? undefined : Array.isArray(v) ? v : [v];\n\n/**\n * Normalize the two historical SSL shapes into one. `serverSsl`\n * (config.server.ssl) wins over `optionsHttps` (options.https) when both are\n * present, matching the pre-existing precedence in framework.ts. Returns null\n * when neither carries any key/cert material (TLS simply off).\n */\nexport function normalizeSSLConfig(\n serverSsl?: SSLConfigInput | null,\n optionsHttps?: SSLConfigInput | null,\n logger?: MoroLogger\n): NormalizedSSLConfig | null {\n if (serverSsl && optionsHttps) {\n logger?.warn('Both server.ssl and options.https are set; server.ssl takes precedence', 'SSL');\n }\n const src = serverSsl ?? optionsHttps;\n if (!src) return null;\n\n const out: NormalizedSSLConfig = {\n keyFile: src.keyFile ?? src.key_file_name,\n certFile: src.certFile ?? src.cert_file_name,\n caFile: toArray(src.caFile ?? src.ca_file_name),\n key: src.key,\n cert: src.cert,\n ca: toArray(src.ca),\n passphrase: src.passphrase,\n minVersion: src.minVersion,\n requestCert: src.requestCert,\n rejectUnauthorized: src.rejectUnauthorized,\n };\n\n const hasKey = Boolean(out.key || out.keyFile);\n const hasCert = Boolean(out.cert || out.certFile);\n if (!hasKey && !hasCert) return null; // nothing usable -> TLS off\n return out;\n}\n\n/** True when the config actually carries a key+cert (complete TLS material). */\nexport function sslIsComplete(ssl: NormalizedSSLConfig): boolean {\n return Boolean((ssl.key || ssl.keyFile) && (ssl.cert || ssl.certFile));\n}\n\n/**\n * Project for the Node http/https and HTTP/2 servers: node's tls API wants\n * key/cert/ca as strings or Buffers, so any file paths are read here.\n */\nexport function sslForNode(ssl: NormalizedSSLConfig): {\n key: string | Buffer;\n cert: string | Buffer;\n ca?: Array<string | Buffer>;\n passphrase?: string;\n minVersion?: string;\n requestCert?: boolean;\n rejectUnauthorized?: boolean;\n} {\n const key = ssl.key ?? (ssl.keyFile ? readFileSync(ssl.keyFile) : undefined);\n const cert = ssl.cert ?? (ssl.certFile ? readFileSync(ssl.certFile) : undefined);\n const ca = ssl.ca ?? (ssl.caFile ? ssl.caFile.map(p => readFileSync(p)) : undefined);\n if (!key || !cert) {\n throw new Error('sslForNode requires both a key and a certificate');\n }\n return {\n key,\n cert,\n ...(ca && { ca }),\n ...(ssl.passphrase && { passphrase: ssl.passphrase }),\n ...(ssl.minVersion && { minVersion: ssl.minVersion }),\n ...(ssl.requestCert !== undefined && { requestCert: ssl.requestCert }),\n ...(ssl.rejectUnauthorized !== undefined && {\n rejectUnauthorized: ssl.rejectUnauthorized,\n }),\n };\n}\n\n/**\n * Project for uWebSockets.js SSLApp, which requires FILE PATHS (it has no\n * inline-PEM option). Returns null when only inline PEM is available so the\n * caller can log a clear error instead of silently booting plain HTTP.\n */\nexport function sslForUws(ssl: NormalizedSSLConfig): {\n key_file_name: string;\n cert_file_name: string;\n ca_file_name?: string;\n passphrase?: string;\n} | null {\n if (!ssl.keyFile || !ssl.certFile) return null;\n return {\n key_file_name: ssl.keyFile,\n cert_file_name: ssl.certFile,\n ...(ssl.caFile && ssl.caFile[0] && { ca_file_name: ssl.caFile[0] }),\n ...(ssl.passphrase && { passphrase: ssl.passphrase }),\n };\n}\n\n/**\n * Project for the native @morojs/engine serve() options.ssl, which accepts\n * BOTH shapes (file paths and inline PEM) and prefers inline. Pass everything\n * through; the engine decides.\n */\nexport function sslForEngine(ssl: NormalizedSSLConfig): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (ssl.keyFile) out.key_file_name = ssl.keyFile;\n if (ssl.certFile) out.cert_file_name = ssl.certFile;\n if (ssl.caFile && ssl.caFile[0]) out.ca_file_name = ssl.caFile[0];\n if (ssl.key) out.key = ssl.key;\n if (ssl.cert) out.cert = ssl.cert;\n if (ssl.ca && ssl.ca[0]) out.ca = ssl.ca[0];\n if (ssl.passphrase) out.passphrase = ssl.passphrase;\n if (ssl.minVersion) out.minVersion = ssl.minVersion;\n if (ssl.requestCert !== undefined) out.requestCert = ssl.requestCert;\n if (ssl.rejectUnauthorized !== undefined) out.rejectUnauthorized = ssl.rejectUnauthorized;\n return out;\n}\n"]}
@@ -10,6 +10,7 @@
10
10
  import { Worker, isMainThread, threadId, parentPort } from 'worker_threads';
11
11
  import os from 'os';
12
12
  import { createFrameworkLogger } from '../../logger/index.js';
13
+ import { loadNativeEngine } from '../../utilities/package-utils.js';
13
14
  const logger = createFrameworkLogger('UWSClustering');
14
15
  export class UWSWorkerClusterManager {
15
16
  workers = [];
@@ -46,8 +47,13 @@ export class UWSWorkerClusterManager {
46
47
  throw new Error('startAcceptorAndWorkers can only be called from main thread');
47
48
  }
48
49
  try {
49
- // Lazy load uWebSockets.js
50
- const uwsModule = await import('uWebSockets.js');
50
+ // Worker clustering uses the uWS-shaped App/SSLApp + SO_REUSEPORT API,
51
+ // so it needs uWebSockets.js specifically (not @morojs/engine).
52
+ const engine = loadNativeEngine({ candidates: ['uWebSockets.js'] });
53
+ if (!engine) {
54
+ throw new Error('uWebSockets.js is not available for uWS worker clustering');
55
+ }
56
+ const uwsModule = engine.module;
51
57
  this.uws = uwsModule.default || uwsModule;
52
58
  // Create acceptor app - must match SSL config of worker apps
53
59
  const ssl = this.config.ssl;
@@ -91,7 +97,12 @@ export class UWSWorkerClusterManager {
91
97
  }
92
98
  async spawnWorker(index) {
93
99
  return new Promise((resolve, reject) => {
94
- const worker = new Worker(process.argv[1], {
100
+ const scriptPath = process.argv[1];
101
+ if (scriptPath === undefined) {
102
+ reject(new Error('Cannot spawn worker: process.argv[1] (entry script) is unavailable'));
103
+ return;
104
+ }
105
+ const worker = new Worker(scriptPath, {
95
106
  workerData: {
96
107
  isUWSWorker: true,
97
108
  workerIndex: index,
@@ -161,7 +172,7 @@ export class UWSWorkerClusterManager {
161
172
  setTimeout(() => {
162
173
  if (!descriptorReceived) {
163
174
  logger.error(`Worker ${index} failed to send descriptor within timeout`, 'WorkerSpawn');
164
- worker.terminate();
175
+ void worker.terminate();
165
176
  reject(new Error(`Worker ${index} initialization timeout`));
166
177
  }
167
178
  }, 10000); // 10 second timeout
@@ -195,7 +206,7 @@ export class UWSWorkerClusterManager {
195
206
  logger.info(`Worker ${index} taking too long to exit, terminating forcefully`, 'Shutdown');
196
207
  try {
197
208
  // Terminate is the last resort for stuck workers
198
- worker.terminate();
209
+ void worker.terminate();
199
210
  }
200
211
  catch {
201
212
  logger.error(`Error terminating worker ${index}`, 'Shutdown');
@@ -225,7 +236,7 @@ export class UWSWorkerClusterManager {
225
236
  logger.error(`Failed to send shutdown message to worker ${index}`, 'Shutdown');
226
237
  clearTimeout(timeout);
227
238
  try {
228
- worker.terminate();
239
+ void worker.terminate();
229
240
  }
230
241
  catch {
231
242
  // Ignore termination errors
@@ -245,8 +256,8 @@ export class UWSWorkerClusterManager {
245
256
  logger.info('Shutdown complete', 'Shutdown');
246
257
  process.exit(0);
247
258
  };
248
- process.on('SIGINT', gracefulShutdown);
249
- process.on('SIGTERM', gracefulShutdown);
259
+ process.on('SIGINT', () => void gracefulShutdown());
260
+ process.on('SIGTERM', () => void gracefulShutdown());
250
261
  }
251
262
  static isUWSWorker() {
252
263
  return !isMainThread && process.env.UWS_WORKER_MODE === 'true';
@@ -280,33 +291,35 @@ export class UWSWorkerClusterManager {
280
291
  if (!parentPort) {
281
292
  return;
282
293
  }
283
- parentPort.on('message', async (message) => {
284
- if (message.type === 'shutdown') {
285
- logger.info(`Worker thread ${threadId} shutting down...`, 'Worker');
286
- try {
287
- // Call the close callback and wait if it's async
288
- const result = closeCallback();
289
- if (result && typeof result.then === 'function') {
290
- await result;
294
+ parentPort.on('message', (message) => {
295
+ void (async () => {
296
+ if (message.type === 'shutdown') {
297
+ logger.info(`Worker thread ${threadId} shutting down...`, 'Worker');
298
+ try {
299
+ // Call the close callback and wait if it's async
300
+ const result = closeCallback();
301
+ if (result && typeof result.then === 'function') {
302
+ await result;
303
+ }
304
+ // Give uWebSockets event loop time to fully cleanup
305
+ await new Promise(resolve => setTimeout(resolve, 150));
306
+ // Close parent port to signal we're ready to exit
307
+ if (parentPort) {
308
+ parentPort.close();
309
+ }
310
+ logger.info(`Worker thread ${threadId} cleanup complete`, 'Worker');
311
+ // DON'T call process.exit() - let Node.js exit naturally
312
+ // This allows the event loop to properly drain all uWebSockets handles
313
+ // The worker will exit on its own once all handles are closed
291
314
  }
292
- // Give uWebSockets event loop time to fully cleanup
293
- await new Promise(resolve => setTimeout(resolve, 150));
294
- // Close parent port to signal we're ready to exit
295
- if (parentPort) {
296
- parentPort.close();
315
+ catch (error) {
316
+ logger.error('Error during worker shutdown', 'Worker', {
317
+ error: error instanceof Error ? error.message : String(error),
318
+ });
319
+ // Still don't force exit - let it drain naturally
297
320
  }
298
- logger.info(`Worker thread ${threadId} cleanup complete`, 'Worker');
299
- // DON'T call process.exit() - let Node.js exit naturally
300
- // This allows the event loop to properly drain all uWebSockets handles
301
- // The worker will exit on its own once all handles are closed
302
321
  }
303
- catch (error) {
304
- logger.error('Error during worker shutdown', 'Worker', {
305
- error: error instanceof Error ? error.message : String(error),
306
- });
307
- // Still don't force exit - let it drain naturally
308
- }
309
- }
322
+ })();
310
323
  });
311
324
  }
312
325
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uws-worker-clustering.js","sourceRoot":"","sources":["../../../../src/core/http/utils/uws-worker-clustering.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uws-worker-clustering.js","sourceRoot":"","sources":["../../../../src/core/http/utils/uws-worker-clustering.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oEAAoE;AACpE,EAAE;AACF,2FAA2F;AAC3F,0FAA0F;AAC1F,wFAAwF;AACxF,8FAA8F;AAC9F,yEAAyE;AACzE,2CAA2C;AAE3C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;AActD,MAAM,OAAO,uBAAuB;IAC1B,OAAO,GAAa,EAAE,CAAC;IACvB,WAAW,GAAQ,IAAI,CAAC;IACxB,oBAAoB,GAAQ,IAAI,CAAC;IACjC,GAAG,GAAQ,IAAI,CAAC;IAChB,MAAM,CAAmB;IACzB,WAAW,CAAS;IACpB,cAAc,GAAG,KAAK,CAAC;IAE/B,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACjD,CAAC;IAEO,oBAAoB;QAC1B,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;QAE1D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;YAClC,MAAM,aAAa,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;YAE3D,IAAI,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAEtD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,CAAC,CAAC;gBACrB,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YACzF,CAAC;YAED,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC;YAEhF,MAAM,CAAC,IAAI,CACT,iCAAiC,WAAW,UAAU,QAAQ,UAAU,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,iBAAiB,gBAAgB,EACxI,mBAAmB,CACpB,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,iCAAiC,WAAW,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,WAAsB;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC;YACH,uEAAuE;YACvE,gEAAgE;YAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC;YAE1C,6DAA6D;YAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC5B,IAAI,GAAG,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;oBACjC,aAAa,EAAE,GAAG,CAAC,aAAa;oBAChC,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,UAAU,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,UAAU,CAAC,CAAC;YAC9D,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAU,EAAE,EAAE;gBAC3C,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,gBAAgB,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;gBACxF,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,gBAAgB,QAAQ,EAAE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,gBAAgB;YAChB,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,iBAAiB,EAAE,SAAS,CAAC,CAAC;YAEtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;YAED,0BAA0B;YAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,SAAS,EAAE;gBAC9D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAa;QACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE;gBACpC,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI;oBACjB,WAAW,EAAE,KAAK;oBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB;gBACD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3B,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,eAAe,EAAE,MAAM;oBACvB,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC;iBAChC;aACF,CAAC,CAAC;YAEH,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAE/B,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAY,EAAE,EAAE;gBACpC,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBACxD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBACtB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAC;wBAC5D,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;wBAClD,OAAO;oBACT,CAAC;oBAED,IAAI,CAAC;wBACH,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAC3D,kBAAkB,GAAG,IAAI,CAAC;wBAC1B,MAAM,CAAC,IAAI,CACT,UAAU,KAAK,YAAY,OAAO,CAAC,QAAQ,4BAA4B,EACvE,aAAa,CACd,CAAC;wBACF,OAAO,EAAE,CAAC;oBACZ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,aAAa,EAAE;4BAChE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAC9D,CAAC,CAAC;wBACH,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACpC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,0BAA0B,OAAO,CAAC,KAAK,EAAE,EAAE,aAAa,CAAC,CAAC;oBACtF,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;gBAClC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,QAAQ,EAAE;oBAC9C,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;gBACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACjC,uEAAuE;gBACvE,oCAAoC;gBACpC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,6BAA6B,IAAI,kBAAkB,EAAE,QAAQ,CAAC,CAAC;oBAE1F,4BAA4B;oBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC/C,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;wBACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;oBACpC,CAAC;oBAED,iBAAiB;oBACjB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACpC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,QAAQ,EAAE;4BACjD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAC9D,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1B,mCAAmC;YACnC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACxB,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,2CAA2C,EAAE,aAAa,CAAC,CAAC;oBACxF,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,yBAAyB,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,oBAAoB;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,qBAAqB;QAC3B,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,IAAI,IAAI,CAAC,cAAc;gBAAE,OAAO;YAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAE3B,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,UAAU,CAAC,CAAC;YAEtE,qCAAqC;YACrC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBACH,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBAC3D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,UAAU,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,UAAU,EAAE;wBACxD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,kEAAkE;YAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC1D,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;oBACjC,IAAI,YAAY,GAAG,KAAK,CAAC;oBAEzB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;4BAClB,MAAM,CAAC,IAAI,CACT,UAAU,KAAK,kDAAkD,EACjE,UAAU,CACX,CAAC;4BACF,IAAI,CAAC;gCACH,iDAAiD;gCACjD,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;4BAC1B,CAAC;4BAAC,MAAM,CAAC;gCACP,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;4BAChE,CAAC;wBACH,CAAC;wBACD,OAAO,EAAE,CAAC;oBACZ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,mCAAmC;oBAE7C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;wBACzB,YAAY,GAAG,IAAI,CAAC;wBACpB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;4BACf,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,iBAAiB,EAAE,UAAU,CAAC,CAAC;wBAC5D,CAAC;6BAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;4BACtB,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,0BAA0B,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC;wBAC5E,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,gCAAgC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;wBACjF,CAAC;wBACD,OAAO,EAAE,CAAC;oBACZ,CAAC,CAAC,CAAC;oBAEH,wBAAwB;oBACxB,IAAI,CAAC;wBACH,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC3C,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,CAAC,KAAK,CAAC,6CAA6C,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;wBAC/E,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,IAAI,CAAC;4BACH,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;wBAC1B,CAAC;wBAAC,MAAM,CAAC;4BACP,4BAA4B;wBAC9B,CAAC;wBACD,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;YAEjD,+DAA+D;YAC/D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,CAAC;YAED,mEAAmE;YACnE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvD,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAQ;QAC5C,IAAI,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;YAEvC,UAAU,CAAC,WAAW,CAAC;gBACrB,IAAI,EAAE,YAAY;gBAClB,UAAU;gBACV,QAAQ;aACT,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,iBAAiB,QAAQ,8BAA8B,EAAE,QAAQ,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAEzF,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,WAAW,CAAC;oBACrB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,YAAY;iBACpB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,CAAC,0BAA0B,CAAC,aAAyC;QACzE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAY,EAAE,EAAE;YACxC,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,iBAAiB,QAAQ,mBAAmB,EAAE,QAAQ,CAAC,CAAC;oBAEpE,IAAI,CAAC;wBACH,iDAAiD;wBACjD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;wBAC/B,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;4BAChD,MAAM,MAAM,CAAC;wBACf,CAAC;wBAED,oDAAoD;wBACpD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;wBAEvD,kDAAkD;wBAClD,IAAI,UAAU,EAAE,CAAC;4BACf,UAAU,CAAC,KAAK,EAAE,CAAC;wBACrB,CAAC;wBAED,MAAM,CAAC,IAAI,CAAC,iBAAiB,QAAQ,mBAAmB,EAAE,QAAQ,CAAC,CAAC;wBAEpE,yDAAyD;wBACzD,uEAAuE;wBACvE,8DAA8D;oBAChE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,QAAQ,EAAE;4BACrD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAC9D,CAAC,CAAC;wBACH,kDAAkD;oBACpD,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["// uWebSockets.js Worker Thread Clustering Implementation\n// Uses worker threads with acceptor pattern for maximum performance\n//\n// NOTE: When terminating, you may see \"uv_loop_close() while having open handles\" warnings\n// from Node.js. This is a known limitation when using uWebSockets.js with worker threads.\n// The uWS C++ addon maintains internal libuv poll handles that cannot be cleanly closed\n// through JavaScript APIs. These warnings are harmless - the process will still exit cleanly.\n// To suppress these warnings, you can run Node.js with: --no-warnings or\n// NODE_NO_WARNINGS=1 environment variable.\n\nimport { Worker, isMainThread, threadId, parentPort } from 'worker_threads';\nimport os from 'os';\nimport { createFrameworkLogger } from '../../logger/index.js';\nimport { loadNativeEngine } from '../../utilities/package-utils.js';\n\nconst logger = createFrameworkLogger('UWSClustering');\n\nexport interface UWSClusterConfig {\n workers?: number | 'auto';\n memoryPerWorkerGB?: number;\n port: number;\n host?: string;\n ssl?: {\n key_file_name?: string;\n cert_file_name?: string;\n passphrase?: string;\n };\n}\n\nexport class UWSWorkerClusterManager {\n private workers: Worker[] = [];\n private acceptorApp: any = null;\n private acceptorListenSocket: any = null;\n private uws: any = null;\n private config: UWSClusterConfig;\n private workerCount: number;\n private isShuttingDown = false;\n\n constructor(config: UWSClusterConfig) {\n this.config = config;\n this.workerCount = this.calculateWorkerCount();\n }\n\n private calculateWorkerCount(): number {\n let workerCount = this.config.workers || os.cpus().length;\n\n if (workerCount === 'auto') {\n const cpuCount = os.cpus().length;\n const totalMemoryGB = os.totalmem() / (1024 * 1024 * 1024);\n\n let memoryPerWorkerGB = this.config.memoryPerWorkerGB;\n\n if (!memoryPerWorkerGB) {\n const headroomGB = 4;\n memoryPerWorkerGB = Math.max(0.5, Math.floor((totalMemoryGB - headroomGB) / cpuCount));\n }\n\n workerCount = Math.min(cpuCount, Math.floor(totalMemoryGB / memoryPerWorkerGB));\n\n logger.info(\n `Auto-calculated worker count: ${workerCount} (CPU: ${cpuCount}, RAM: ${totalMemoryGB.toFixed(1)}GB, ${memoryPerWorkerGB}GB per worker)`,\n 'WorkerCalculation'\n );\n } else if (typeof workerCount === 'number') {\n logger.info(`Using specified worker count: ${workerCount}`, 'WorkerCalculation');\n }\n\n return workerCount;\n }\n\n async startAcceptorAndWorkers(_appFactory: () => any): Promise<void> {\n if (!isMainThread) {\n throw new Error('startAcceptorAndWorkers can only be called from main thread');\n }\n\n try {\n // Worker clustering uses the uWS-shaped App/SSLApp + SO_REUSEPORT API,\n // so it needs uWebSockets.js specifically (not @morojs/engine).\n const engine = loadNativeEngine({ candidates: ['uWebSockets.js'] });\n if (!engine) {\n throw new Error('uWebSockets.js is not available for uWS worker clustering');\n }\n const uwsModule = engine.module;\n this.uws = uwsModule.default || uwsModule;\n\n // Create acceptor app - must match SSL config of worker apps\n const ssl = this.config.ssl;\n if (ssl && ssl.key_file_name && ssl.cert_file_name) {\n this.acceptorApp = this.uws.SSLApp({\n key_file_name: ssl.key_file_name,\n cert_file_name: ssl.cert_file_name,\n passphrase: ssl.passphrase,\n });\n logger.info('uWebSockets SSL acceptor app created', 'Acceptor');\n } else {\n this.acceptorApp = this.uws.App();\n logger.info('uWebSockets acceptor app created', 'Acceptor');\n }\n\n // Start listening on acceptor\n const port = this.config.port;\n this.acceptorApp.listen(port, (token: any) => {\n if (token) {\n this.acceptorListenSocket = token;\n logger.info(`Acceptor listening on port ${port} from thread ${threadId}`, 'Acceptor');\n } else {\n throw new Error(`Failed to listen on port ${port} from thread ${threadId}`);\n }\n });\n\n // Spawn workers\n logger.info(`Starting ${this.workerCount} worker threads`, 'Workers');\n\n for (let i = 0; i < this.workerCount; i++) {\n await this.spawnWorker(i);\n }\n\n // Setup graceful shutdown\n this.setupGracefulShutdown();\n } catch (error) {\n logger.error('Failed to start acceptor and workers', 'Startup', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n private async spawnWorker(index: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const scriptPath = process.argv[1];\n if (scriptPath === undefined) {\n reject(new Error('Cannot spawn worker: process.argv[1] (entry script) is unavailable'));\n return;\n }\n const worker = new Worker(scriptPath, {\n workerData: {\n isUWSWorker: true,\n workerIndex: index,\n config: this.config,\n },\n argv: process.argv.slice(2),\n env: {\n ...process.env,\n UWS_WORKER_MODE: 'true',\n UWS_WORKER_INDEX: String(index),\n },\n });\n\n let descriptorReceived = false;\n\n worker.on('message', (message: any) => {\n if (message.type === 'descriptor' && message.descriptor) {\n if (!this.acceptorApp) {\n logger.error('Acceptor app not initialized', 'WorkerSpawn');\n reject(new Error('Acceptor app not initialized'));\n return;\n }\n\n try {\n this.acceptorApp.addChildAppDescriptor(message.descriptor);\n descriptorReceived = true;\n logger.info(\n `Worker ${index} (thread ${message.threadId}) registered with acceptor`,\n 'WorkerSpawn'\n );\n resolve();\n } catch (error) {\n logger.error('Failed to add child app descriptor', 'WorkerSpawn', {\n error: error instanceof Error ? error.message : String(error),\n });\n reject(error);\n }\n } else if (message.type === 'error') {\n logger.error(`Worker ${index} initialization error: ${message.error}`, 'WorkerSpawn');\n reject(new Error(message.error));\n }\n });\n\n worker.on('error', (error: Error) => {\n logger.error(`Worker ${index} error`, 'Worker', {\n error: error.message,\n });\n if (!descriptorReceived) {\n reject(error);\n }\n });\n\n worker.on('exit', (code: number) => {\n // Worker threads don't have exitedAfterDisconnect like cluster workers\n // Restart on any non-zero exit code\n if (code !== 0) {\n logger.warn(`Worker ${index} died unexpectedly (code: ${code}). Restarting...`, 'Worker');\n\n // Remove from workers array\n const workerIdx = this.workers.indexOf(worker);\n if (workerIdx > -1) {\n this.workers.splice(workerIdx, 1);\n }\n\n // Restart worker\n this.spawnWorker(index).catch(error => {\n logger.error('Failed to restart worker', 'Worker', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n });\n\n this.workers.push(worker);\n\n // Timeout for descriptor reception\n setTimeout(() => {\n if (!descriptorReceived) {\n logger.error(`Worker ${index} failed to send descriptor within timeout`, 'WorkerSpawn');\n void worker.terminate();\n reject(new Error(`Worker ${index} initialization timeout`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private setupGracefulShutdown(): void {\n const gracefulShutdown = async () => {\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n\n logger.info('Gracefully shutting down worker cluster...', 'Shutdown');\n\n // Close acceptor listen socket first\n if (this.acceptorListenSocket && this.uws) {\n try {\n this.uws.us_listen_socket_close(this.acceptorListenSocket);\n this.acceptorListenSocket = null;\n logger.info('Acceptor listen socket closed', 'Shutdown');\n } catch (error) {\n logger.error('Error closing acceptor socket', 'Shutdown', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Send shutdown message to all workers and wait for them to close\n const shutdownPromises = this.workers.map((worker, index) => {\n return new Promise<void>(resolve => {\n let workerExited = false;\n\n const timeout = setTimeout(() => {\n if (!workerExited) {\n logger.info(\n `Worker ${index} taking too long to exit, terminating forcefully`,\n 'Shutdown'\n );\n try {\n // Terminate is the last resort for stuck workers\n void worker.terminate();\n } catch {\n logger.error(`Error terminating worker ${index}`, 'Shutdown');\n }\n }\n resolve();\n }, 2000); // Give 2 seconds for graceful exit\n\n worker.once('exit', code => {\n workerExited = true;\n clearTimeout(timeout);\n if (code === 0) {\n logger.info(`Worker ${index} exited cleanly`, 'Shutdown');\n } else if (code === 1) {\n logger.info(`Worker ${index} terminated (exit code ${code})`, 'Shutdown');\n } else {\n logger.warn(`Worker ${index} exited with unexpected code ${code}`, 'Shutdown');\n }\n resolve();\n });\n\n // Send shutdown message\n try {\n worker.postMessage({ type: 'shutdown' });\n } catch {\n logger.error(`Failed to send shutdown message to worker ${index}`, 'Shutdown');\n clearTimeout(timeout);\n try {\n void worker.terminate();\n } catch {\n // Ignore termination errors\n }\n resolve();\n }\n });\n });\n\n await Promise.all(shutdownPromises);\n logger.info('All workers shut down', 'Shutdown');\n\n // Clear acceptor app reference to allow uWebSockets to cleanup\n if (this.acceptorApp) {\n this.acceptorApp = null;\n }\n\n // Give uWebSockets event loop time to fully cleanup before exiting\n await new Promise(resolve => setTimeout(resolve, 200));\n\n logger.info('Shutdown complete', 'Shutdown');\n process.exit(0);\n };\n\n process.on('SIGINT', () => void gracefulShutdown());\n process.on('SIGTERM', () => void gracefulShutdown());\n }\n\n static isUWSWorker(): boolean {\n return !isMainThread && process.env.UWS_WORKER_MODE === 'true';\n }\n\n static async sendDescriptorToAcceptor(app: any): Promise<void> {\n if (isMainThread || !parentPort) {\n throw new Error('sendDescriptorToAcceptor can only be called from worker thread');\n }\n\n try {\n const descriptor = app.getDescriptor();\n\n parentPort.postMessage({\n type: 'descriptor',\n descriptor,\n threadId,\n });\n\n logger.info(`Worker thread ${threadId} sent descriptor to acceptor`, 'Worker');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('Failed to send descriptor to acceptor', 'Worker', { error: errorMessage });\n\n if (parentPort) {\n parentPort.postMessage({\n type: 'error',\n error: errorMessage,\n });\n }\n\n throw error;\n }\n }\n\n static setupWorkerShutdownHandler(closeCallback: () => void | Promise<void>): void {\n if (!parentPort) {\n return;\n }\n\n parentPort.on('message', (message: any) => {\n void (async () => {\n if (message.type === 'shutdown') {\n logger.info(`Worker thread ${threadId} shutting down...`, 'Worker');\n\n try {\n // Call the close callback and wait if it's async\n const result = closeCallback();\n if (result && typeof result.then === 'function') {\n await result;\n }\n\n // Give uWebSockets event loop time to fully cleanup\n await new Promise(resolve => setTimeout(resolve, 150));\n\n // Close parent port to signal we're ready to exit\n if (parentPort) {\n parentPort.close();\n }\n\n logger.info(`Worker thread ${threadId} cleanup complete`, 'Worker');\n\n // DON'T call process.exit() - let Node.js exit naturally\n // This allows the event loop to properly drain all uWebSockets handles\n // The worker will exit on its own once all handles are closed\n } catch (error) {\n logger.error('Error during worker shutdown', 'Worker', {\n error: error instanceof Error ? error.message : String(error),\n });\n // Still don't force exit - let it drain naturally\n }\n }\n })();\n });\n }\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  import { HttpRequest, HttpResponse, Middleware } from '../../types/http.js';
2
+ import { LazyEventEmitter } from './utils/lazy-event-emitter.js';
3
+ import type { HttpRuntimeLimits } from './utils/size.js';
4
+ import { type CompressionSettings } from './utils/compression.js';
2
5
  /**
3
6
  * Prototype-based request object for the uWS adapter.
4
7
  *
@@ -8,7 +11,7 @@ import { HttpRequest, HttpResponse, Middleware } from '../../types/http.js';
8
11
  * so `materialize()` MUST be called before any `await` - it snapshots the
9
12
  * headers and detaches the native reference.
10
13
  */
11
- export declare class UwsRequest {
14
+ export declare class UwsRequest extends LazyEventEmitter {
12
15
  method: string;
13
16
  path: string;
14
17
  url: string;
@@ -23,7 +26,12 @@ export declare class UwsRequest {
23
26
  _cookies: Record<string, string> | undefined;
24
27
  _context: Record<string, any> | undefined;
25
28
  _requestId: string | undefined;
29
+ _socket: any;
26
30
  constructor(server: UWebSocketsHttpServer, uwsReq: any, method: string, url: string, queryString: string);
31
+ get socket(): any;
32
+ set socket(value: any);
33
+ get connection(): any;
34
+ set connection(value: any);
27
35
  /** Snapshot uWS-backed data and detach the native request. Idempotent.
28
36
  * Must be called before returning control to the event loop if the
29
37
  * request object outlives the synchronous route callback. */
@@ -58,6 +66,8 @@ export declare class UwsRequest {
58
66
  export declare class UWebSocketsHttpServer {
59
67
  private app;
60
68
  private uws;
69
+ private _limits?;
70
+ private multipartLimits?;
61
71
  private listenSocket;
62
72
  private globalMiddleware;
63
73
  private logger;
@@ -82,10 +92,19 @@ export declare class UWebSocketsHttpServer {
82
92
  ssl?: {
83
93
  key_file_name?: string;
84
94
  cert_file_name?: string;
95
+ ca_file_name?: string;
85
96
  passphrase?: string;
86
- };
97
+ } | null;
98
+ /** True when a TLS config was given but only as inline PEM (uWS needs
99
+ * file paths); triggers a clear error instead of a silent plain boot. */
100
+ sslInlineOnly?: boolean;
101
+ limits?: HttpRuntimeLimits;
87
102
  maxBodySize?: number;
88
103
  maxUploadSize?: number;
104
+ /** Preloaded native engine module (from loadNativeEngine) - avoids a
105
+ * second resolution and keeps load failures at the framework's
106
+ * synchronous preflight instead of surfacing at listen() */
107
+ engineModule?: any;
89
108
  });
90
109
  setRouterHandler(fn: (req: HttpRequest, res: HttpResponse) => boolean | Promise<boolean>): void;
91
110
  setNativeRouteProvider(provider: () => Array<{
@@ -101,6 +120,7 @@ export declare class UWebSocketsHttpServer {
101
120
  private handleNativeRouteError;
102
121
  private handleRequest;
103
122
  private createMoroRequest;
123
+ private static sanitizeHeaderValue;
104
124
  private static writeHeaders;
105
125
  private static getStatusString;
106
126
  private static readonly ResponsePrototype;
@@ -110,7 +130,9 @@ export declare class UWebSocketsHttpServer {
110
130
  use(middleware: Middleware): void;
111
131
  setRequestTracking(enabled: boolean): void;
112
132
  setHookManager(hookManager: any): void;
113
- configurePerformance(_config: any): void;
133
+ /** @internal buffered-response compression settings (read at init). */
134
+ _compression: CompressionSettings;
135
+ configurePerformance(config: any): void;
114
136
  listen(port: number, callback?: () => void): void;
115
137
  listen(port: number, host: string, callback?: () => void): void;
116
138
  close(callback?: (error?: Error) => void): void;