@morojs/moro 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +29 -38
  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 +8 -49
  6. package/dist/core/config/config-sources.js.map +1 -1
  7. package/dist/core/config/config-validator.js +2 -3
  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 +4 -1
  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 +2 -2
  44. package/dist/core/framework.js +21 -14
  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 +0 -13
  66. package/dist/core/http/http-server.js +34 -141
  67. package/dist/core/http/http-server.js.map +1 -1
  68. package/dist/core/http/http2-server.js +27 -5
  69. package/dist/core/http/http2-server.js.map +1 -1
  70. package/dist/core/http/index.js.map +1 -1
  71. package/dist/core/http/moro-engine-server.d.ts +2 -2
  72. package/dist/core/http/moro-engine-server.js +48 -22
  73. package/dist/core/http/moro-engine-server.js.map +1 -1
  74. package/dist/core/http/utils/compression.js +3 -3
  75. package/dist/core/http/utils/compression.js.map +1 -1
  76. package/dist/core/http/utils/lazy-event-emitter.js.map +1 -1
  77. package/dist/core/http/utils/multipart-parser.js +7 -3
  78. package/dist/core/http/utils/multipart-parser.js.map +1 -1
  79. package/dist/core/http/utils/query-parser.js.map +1 -1
  80. package/dist/core/http/utils/size.js +2 -2
  81. package/dist/core/http/utils/size.js.map +1 -1
  82. package/dist/core/http/utils/ssl-config.d.ts +10 -10
  83. package/dist/core/http/utils/ssl-config.js.map +1 -1
  84. package/dist/core/http/utils/uws-worker-clustering.js +37 -30
  85. package/dist/core/http/utils/uws-worker-clustering.js.map +1 -1
  86. package/dist/core/http/uws-http-server.d.ts +1 -0
  87. package/dist/core/http/uws-http-server.js +80 -22
  88. package/dist/core/http/uws-http-server.js.map +1 -1
  89. package/dist/core/jobs/cron-parser.js +7 -5
  90. package/dist/core/jobs/cron-parser.js.map +1 -1
  91. package/dist/core/jobs/index.js.map +1 -1
  92. package/dist/core/jobs/job-executor.d.ts +1 -1
  93. package/dist/core/jobs/job-executor.js.map +1 -1
  94. package/dist/core/jobs/job-scheduler.d.ts +3 -3
  95. package/dist/core/jobs/job-scheduler.js.map +1 -1
  96. package/dist/core/jobs/job-state-manager.d.ts +3 -3
  97. package/dist/core/jobs/job-state-manager.js +25 -4
  98. package/dist/core/jobs/job-state-manager.js.map +1 -1
  99. package/dist/core/jobs/leader-election.d.ts +15 -0
  100. package/dist/core/jobs/leader-election.js +158 -69
  101. package/dist/core/jobs/leader-election.js.map +1 -1
  102. package/dist/core/jobs/types.d.ts +4 -4
  103. package/dist/core/jobs/types.js.map +1 -1
  104. package/dist/core/jobs/utils.d.ts +1 -1
  105. package/dist/core/jobs/utils.js +7 -3
  106. package/dist/core/jobs/utils.js.map +1 -1
  107. package/dist/core/logger/filters.js +3 -2
  108. package/dist/core/logger/filters.js.map +1 -1
  109. package/dist/core/logger/index.js.map +1 -1
  110. package/dist/core/logger/logger.js +56 -25
  111. package/dist/core/logger/logger.js.map +1 -1
  112. package/dist/core/logger/outputs.js.map +1 -1
  113. package/dist/core/mail/adapters/console-adapter.js.map +1 -1
  114. package/dist/core/mail/adapters/index.js.map +1 -1
  115. package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -1
  116. package/dist/core/mail/adapters/resend-adapter.js.map +1 -1
  117. package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -1
  118. package/dist/core/mail/adapters/ses-adapter.js.map +1 -1
  119. package/dist/core/mail/index.js.map +1 -1
  120. package/dist/core/mail/mail-adapter.js.map +1 -1
  121. package/dist/core/mail/mail-manager.d.ts +10 -0
  122. package/dist/core/mail/mail-manager.js +21 -5
  123. package/dist/core/mail/mail-manager.js.map +1 -1
  124. package/dist/core/mail/template-engine.js.map +1 -1
  125. package/dist/core/mail/types.js.map +1 -1
  126. package/dist/core/middleware/built-in/auth/core.js +3 -3
  127. package/dist/core/middleware/built-in/auth/core.js.map +1 -1
  128. package/dist/core/middleware/built-in/auth/helpers.js +4 -4
  129. package/dist/core/middleware/built-in/auth/helpers.js.map +1 -1
  130. package/dist/core/middleware/built-in/auth/hook.js.map +1 -1
  131. package/dist/core/middleware/built-in/auth/index.js.map +1 -1
  132. package/dist/core/middleware/built-in/auth/jwt-helpers.d.ts +4 -4
  133. package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -1
  134. package/dist/core/middleware/built-in/auth/middleware.js.map +1 -1
  135. package/dist/core/middleware/built-in/auth/providers.js.map +1 -1
  136. package/dist/core/middleware/built-in/body-parsers/index.js.map +1 -1
  137. package/dist/core/middleware/built-in/body-size/core.js +2 -2
  138. package/dist/core/middleware/built-in/body-size/core.js.map +1 -1
  139. package/dist/core/middleware/built-in/body-size/hook.js.map +1 -1
  140. package/dist/core/middleware/built-in/body-size/index.js.map +1 -1
  141. package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -1
  142. package/dist/core/middleware/built-in/cache/adapters/cache/file.js +3 -1
  143. package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -1
  144. package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -1
  145. package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -1
  146. package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -1
  147. package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -1
  148. package/dist/core/middleware/built-in/cache/core.js.map +1 -1
  149. package/dist/core/middleware/built-in/cache/hook.js +3 -3
  150. package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
  151. package/dist/core/middleware/built-in/cache/index.js.map +1 -1
  152. package/dist/core/middleware/built-in/cache/middleware.js.map +1 -1
  153. package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -1
  154. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -1
  155. package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -1
  156. package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -1
  157. package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -1
  158. package/dist/core/middleware/built-in/cdn/core.js.map +1 -1
  159. package/dist/core/middleware/built-in/cdn/hook.js.map +1 -1
  160. package/dist/core/middleware/built-in/cdn/index.js.map +1 -1
  161. package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -1
  162. package/dist/core/middleware/built-in/compression/core.js.map +1 -1
  163. package/dist/core/middleware/built-in/compression/hook.js.map +1 -1
  164. package/dist/core/middleware/built-in/compression/index.js.map +1 -1
  165. package/dist/core/middleware/built-in/compression/middleware.js.map +1 -1
  166. package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
  167. package/dist/core/middleware/built-in/cookie/hook.js.map +1 -1
  168. package/dist/core/middleware/built-in/cookie/index.js.map +1 -1
  169. package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -1
  170. package/dist/core/middleware/built-in/cors/core.js.map +1 -1
  171. package/dist/core/middleware/built-in/cors/hook.js.map +1 -1
  172. package/dist/core/middleware/built-in/cors/index.js.map +1 -1
  173. package/dist/core/middleware/built-in/cors/middleware.js.map +1 -1
  174. package/dist/core/middleware/built-in/csp/core.js.map +1 -1
  175. package/dist/core/middleware/built-in/csp/hook.js.map +1 -1
  176. package/dist/core/middleware/built-in/csp/index.js.map +1 -1
  177. package/dist/core/middleware/built-in/csp/middleware.js.map +1 -1
  178. package/dist/core/middleware/built-in/csrf/core.js +1 -1
  179. package/dist/core/middleware/built-in/csrf/core.js.map +1 -1
  180. package/dist/core/middleware/built-in/csrf/hook.js.map +1 -1
  181. package/dist/core/middleware/built-in/csrf/index.js.map +1 -1
  182. package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -1
  183. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
  184. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
  185. package/dist/core/middleware/built-in/graphql/core.js.map +1 -1
  186. package/dist/core/middleware/built-in/graphql/helpers.js.map +1 -1
  187. package/dist/core/middleware/built-in/graphql/hook.js.map +1 -1
  188. package/dist/core/middleware/built-in/graphql/index.js.map +1 -1
  189. package/dist/core/middleware/built-in/graphql/middleware.js.map +1 -1
  190. package/dist/core/middleware/built-in/graphql/subscriptions.js.map +1 -1
  191. package/dist/core/middleware/built-in/helmet/core.js.map +1 -1
  192. package/dist/core/middleware/built-in/helmet/hook.js.map +1 -1
  193. package/dist/core/middleware/built-in/helmet/index.js.map +1 -1
  194. package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -1
  195. package/dist/core/middleware/built-in/http2/core.js.map +1 -1
  196. package/dist/core/middleware/built-in/http2/hook.js.map +1 -1
  197. package/dist/core/middleware/built-in/http2/index.js.map +1 -1
  198. package/dist/core/middleware/built-in/http2/middleware.js.map +1 -1
  199. package/dist/core/middleware/built-in/index.js.map +1 -1
  200. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
  201. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
  202. package/dist/core/middleware/built-in/range/core.js +4 -1
  203. package/dist/core/middleware/built-in/range/core.js.map +1 -1
  204. package/dist/core/middleware/built-in/range/hook.js.map +1 -1
  205. package/dist/core/middleware/built-in/range/index.js.map +1 -1
  206. package/dist/core/middleware/built-in/range/middleware.js.map +1 -1
  207. package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -1
  208. package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -1
  209. package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -1
  210. package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -1
  211. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
  212. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
  213. package/dist/core/middleware/built-in/session/core.js +4 -4
  214. package/dist/core/middleware/built-in/session/core.js.map +1 -1
  215. package/dist/core/middleware/built-in/session/hook.js.map +1 -1
  216. package/dist/core/middleware/built-in/session/index.js.map +1 -1
  217. package/dist/core/middleware/built-in/session/middleware.js.map +1 -1
  218. package/dist/core/middleware/built-in/sse/core.js.map +1 -1
  219. package/dist/core/middleware/built-in/sse/hook.js.map +1 -1
  220. package/dist/core/middleware/built-in/sse/index.js.map +1 -1
  221. package/dist/core/middleware/built-in/sse/middleware.js.map +1 -1
  222. package/dist/core/middleware/built-in/static/core.js.map +1 -1
  223. package/dist/core/middleware/built-in/static/hook.js.map +1 -1
  224. package/dist/core/middleware/built-in/static/index.js.map +1 -1
  225. package/dist/core/middleware/built-in/static/middleware.js.map +1 -1
  226. package/dist/core/middleware/built-in/template/core.js +1 -1
  227. package/dist/core/middleware/built-in/template/core.js.map +1 -1
  228. package/dist/core/middleware/built-in/template/hook.js.map +1 -1
  229. package/dist/core/middleware/built-in/template/index.js.map +1 -1
  230. package/dist/core/middleware/built-in/template/middleware.js.map +1 -1
  231. package/dist/core/middleware/built-in/upload/core.js.map +1 -1
  232. package/dist/core/middleware/built-in/upload/hook.js.map +1 -1
  233. package/dist/core/middleware/built-in/upload/index.js.map +1 -1
  234. package/dist/core/middleware/built-in/upload/middleware.js.map +1 -1
  235. package/dist/core/middleware/built-in/validation/core.js.map +1 -1
  236. package/dist/core/middleware/built-in/validation/hook.js.map +1 -1
  237. package/dist/core/middleware/built-in/validation/index.js.map +1 -1
  238. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
  239. package/dist/core/middleware/index.js +2 -2
  240. package/dist/core/middleware/index.js.map +1 -1
  241. package/dist/core/modules/auto-discovery.js +11 -7
  242. package/dist/core/modules/auto-discovery.js.map +1 -1
  243. package/dist/core/modules/index.js.map +1 -1
  244. package/dist/core/modules/modules.js +18 -13
  245. package/dist/core/modules/modules.js.map +1 -1
  246. package/dist/core/networking/adapters/engine-adapter.js +30 -2
  247. package/dist/core/networking/adapters/engine-adapter.js.map +1 -1
  248. package/dist/core/networking/adapters/index.js.map +1 -1
  249. package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -0
  250. package/dist/core/networking/adapters/socketio-adapter.js +12 -1
  251. package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
  252. package/dist/core/networking/adapters/uws-adapter.js +1 -1
  253. package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
  254. package/dist/core/networking/adapters/ws-adapter.d.ts +15 -0
  255. package/dist/core/networking/adapters/ws-adapter.js +120 -6
  256. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  257. package/dist/core/networking/index.js.map +1 -1
  258. package/dist/core/networking/service-discovery.js +7 -5
  259. package/dist/core/networking/service-discovery.js.map +1 -1
  260. package/dist/core/networking/websocket-adapter.d.ts +22 -3
  261. package/dist/core/networking/websocket-adapter.js.map +1 -1
  262. package/dist/core/networking/websocket-manager.js +70 -67
  263. package/dist/core/networking/websocket-manager.js.map +1 -1
  264. package/dist/core/pooling/object-pool-manager.js +6 -0
  265. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  266. package/dist/core/queue/adapters/bull-adapter.js.map +1 -1
  267. package/dist/core/queue/adapters/index.js.map +1 -1
  268. package/dist/core/queue/adapters/kafka-adapter.js +2 -2
  269. package/dist/core/queue/adapters/kafka-adapter.js.map +1 -1
  270. package/dist/core/queue/adapters/memory-adapter.js +6 -6
  271. package/dist/core/queue/adapters/memory-adapter.js.map +1 -1
  272. package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +50 -0
  273. package/dist/core/queue/adapters/rabbitmq-adapter.js +176 -20
  274. package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -1
  275. package/dist/core/queue/adapters/sqs-adapter.d.ts +12 -2
  276. package/dist/core/queue/adapters/sqs-adapter.js +75 -24
  277. package/dist/core/queue/adapters/sqs-adapter.js.map +1 -1
  278. package/dist/core/queue/index.js.map +1 -1
  279. package/dist/core/queue/middleware/index.js.map +1 -1
  280. package/dist/core/queue/middleware/monitoring.d.ts +1 -1
  281. package/dist/core/queue/middleware/monitoring.js.map +1 -1
  282. package/dist/core/queue/middleware/priority.js +2 -1
  283. package/dist/core/queue/middleware/priority.js.map +1 -1
  284. package/dist/core/queue/middleware/rate-limit.js.map +1 -1
  285. package/dist/core/queue/queue-adapter.js.map +1 -1
  286. package/dist/core/queue/queue-manager.js.map +1 -1
  287. package/dist/core/queue/types.d.ts +8 -8
  288. package/dist/core/queue/types.js.map +1 -1
  289. package/dist/core/routing/app-integration.js.map +1 -1
  290. package/dist/core/routing/create-router.js.map +1 -1
  291. package/dist/core/routing/index.js.map +1 -1
  292. package/dist/core/routing/path-matcher.js.map +1 -1
  293. package/dist/core/routing/radix-tree.js.map +1 -1
  294. package/dist/core/routing/router.js.map +1 -1
  295. package/dist/core/routing/unified-router.js +12 -4
  296. package/dist/core/routing/unified-router.js.map +1 -1
  297. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  298. package/dist/core/runtime/base-adapter.js +2 -2
  299. package/dist/core/runtime/base-adapter.js.map +1 -1
  300. package/dist/core/runtime/cloudflare-workers-adapter.js +2 -0
  301. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  302. package/dist/core/runtime/index.js.map +1 -1
  303. package/dist/core/runtime/node-adapter.js +19 -17
  304. package/dist/core/runtime/node-adapter.js.map +1 -1
  305. package/dist/core/runtime/vercel-edge-adapter.js +2 -0
  306. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  307. package/dist/core/utilities/circuit-breaker.d.ts +1 -0
  308. package/dist/core/utilities/circuit-breaker.js +25 -2
  309. package/dist/core/utilities/circuit-breaker.js.map +1 -1
  310. package/dist/core/utilities/container.js +9 -9
  311. package/dist/core/utilities/container.js.map +1 -1
  312. package/dist/core/utilities/hooks.js +28 -6
  313. package/dist/core/utilities/hooks.js.map +1 -1
  314. package/dist/core/utilities/index.js.map +1 -1
  315. package/dist/core/utilities/module-path.js.map +1 -1
  316. package/dist/core/utilities/package-utils.js +1 -1
  317. package/dist/core/utilities/package-utils.js.map +1 -1
  318. package/dist/core/utilities/response-helpers.js +1 -1
  319. package/dist/core/utilities/response-helpers.js.map +1 -1
  320. package/dist/core/validation/adapters.js.map +1 -1
  321. package/dist/core/validation/error-handler.js.map +1 -1
  322. package/dist/core/validation/index.js.map +1 -1
  323. package/dist/core/validation/schema-interface.js.map +1 -1
  324. package/dist/core/workers/facade.js.map +1 -1
  325. package/dist/core/workers/index.js.map +1 -1
  326. package/dist/core/workers/worker-entry.d.ts +1 -0
  327. package/dist/core/workers/worker-entry.js +12 -0
  328. package/dist/core/workers/worker-entry.js.map +1 -0
  329. package/dist/core/workers/worker-manager.d.ts +23 -2
  330. package/dist/core/workers/worker-manager.js +117 -17
  331. package/dist/core/workers/worker-manager.js.map +1 -1
  332. package/dist/core/workers/worker.js +8 -6
  333. package/dist/core/workers/worker.js.map +1 -1
  334. package/dist/index.d.ts +1 -1
  335. package/dist/index.js +4 -1
  336. package/dist/index.js.map +1 -1
  337. package/dist/moro.d.ts +18 -1
  338. package/dist/moro.js +168 -50
  339. package/dist/moro.js.map +1 -1
  340. package/dist/types/auth.d.ts +4 -4
  341. package/dist/types/auth.js.map +1 -1
  342. package/dist/types/cache.js.map +1 -1
  343. package/dist/types/cdn.js.map +1 -1
  344. package/dist/types/config.d.ts +10 -10
  345. package/dist/types/config.js.map +1 -1
  346. package/dist/types/core.js.map +1 -1
  347. package/dist/types/database.js.map +1 -1
  348. package/dist/types/discovery.js.map +1 -1
  349. package/dist/types/events.js.map +1 -1
  350. package/dist/types/hooks.js.map +1 -1
  351. package/dist/types/http.js.map +1 -1
  352. package/dist/types/logger.js.map +1 -1
  353. package/dist/types/module.js.map +1 -1
  354. package/dist/types/runtime.js.map +1 -1
  355. package/dist/types/session.js.map +1 -1
  356. package/package.json +29 -17
@@ -30,6 +30,27 @@ export class LeaderElection extends EventEmitter {
30
30
  redisClient;
31
31
  isShuttingDown = false;
32
32
  lockAcquireAttempts = 0;
33
+ static REDIS_LOCK_KEY = 'moro:jobs:leader:lock';
34
+ // Compare-and-refresh: rewrite the value and extend the TTL only if the stored
35
+ // lock still belongs to this instance (ownership is fenced by instanceId).
36
+ static REDIS_REFRESH_SCRIPT = `
37
+ local cur = redis.call('GET', KEYS[1])
38
+ if not cur then return 0 end
39
+ local ok, decoded = pcall(cjson.decode, cur)
40
+ if ok and decoded['instanceId'] == ARGV[1] then
41
+ redis.call('SET', KEYS[1], ARGV[2], 'PX', ARGV[3])
42
+ return 1
43
+ end
44
+ return 0`;
45
+ // Compare-and-delete: release the lock only if it still belongs to this instance.
46
+ static REDIS_RELEASE_SCRIPT = `
47
+ local cur = redis.call('GET', KEYS[1])
48
+ if not cur then return 0 end
49
+ local ok, decoded = pcall(cjson.decode, cur)
50
+ if ok and decoded['instanceId'] == ARGV[1] then
51
+ return redis.call('DEL', KEYS[1])
52
+ end
53
+ return 0`;
33
54
  constructor(logger, options = { strategy: 'file' }) {
34
55
  super();
35
56
  this.logger = logger;
@@ -135,48 +156,69 @@ export class LeaderElection extends EventEmitter {
135
156
  }
136
157
  /**
137
158
  * Try to acquire file-based lock
159
+ *
160
+ * Uses O_EXCL (open flag 'wx') for the common "no lock yet" case so exactly one
161
+ * instance can win the create race. An expired lock is taken over via an atomic
162
+ * temp-write + rename. A takeover race between two instances is a last-writer-wins
163
+ * rename, which is then reconciled by the periodic verifyLeadership() check and the
164
+ * ownership-checked heartbeat below, so a single leader is still guaranteed.
138
165
  */
139
166
  async tryAcquireFileLock() {
140
167
  if (!this.lockPath) {
141
168
  throw new Error('Lock path not configured');
142
169
  }
170
+ const lockInfo = {
171
+ instanceId: this.instanceId,
172
+ hostname: os.hostname(),
173
+ pid: process.pid,
174
+ electedAt: new Date(),
175
+ lastHeartbeat: new Date(),
176
+ metadata: this.getInstanceMetadata(),
177
+ };
178
+ const serialized = JSON.stringify(lockInfo);
179
+ // Fast path: atomically create the lock file (O_EXCL). Fails with EEXIST if
180
+ // another instance already holds the lock.
143
181
  try {
144
- // Check if lock file exists
145
- const exists = await fs.promises
146
- .access(this.lockPath)
147
- .then(() => true)
148
- .catch(() => false);
149
- if (exists) {
150
- // Read existing lock
151
- const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');
152
- const existingLeader = JSON.parse(lockData);
153
- // Check if lock is expired
154
- const lockAge = Date.now() - new Date(existingLeader.lastHeartbeat).getTime();
155
- if (lockAge < this.lockTimeout) {
156
- // Lock is still valid
157
- this.leaderInfo = existingLeader;
158
- this.logger.debug('Leader lock held by another instance', this.loggerContext, {
159
- leader: existingLeader.instanceId,
160
- age: lockAge,
161
- });
162
- return false;
163
- }
164
- // Lock expired, take over
165
- this.logger.warn('Leader lock expired, taking over', this.loggerContext, {
166
- previousLeader: existingLeader.instanceId,
167
- lockAge,
182
+ const handle = await fs.promises.open(this.lockPath, 'wx');
183
+ try {
184
+ await handle.writeFile(serialized, 'utf-8');
185
+ }
186
+ finally {
187
+ await handle.close();
188
+ }
189
+ this.leaderInfo = lockInfo;
190
+ return true;
191
+ }
192
+ catch (error) {
193
+ if (error?.code !== 'EEXIST') {
194
+ this.logger.error('Failed to acquire file lock', this.loggerContext, {
195
+ error,
196
+ lockPath: this.lockPath,
168
197
  });
198
+ return false;
169
199
  }
170
- // Create/update lock file
171
- const lockInfo = {
172
- instanceId: this.instanceId,
173
- hostname: os.hostname(),
174
- pid: process.pid,
175
- electedAt: new Date(),
176
- lastHeartbeat: new Date(),
177
- metadata: this.getInstanceMetadata(),
178
- };
179
- await fs.promises.writeFile(this.lockPath, JSON.stringify(lockInfo), 'utf-8');
200
+ // Lock file already exists — fall through to the expiry/takeover check.
201
+ }
202
+ try {
203
+ // Read existing lock and decide whether we may take it over.
204
+ const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');
205
+ const existingLeader = JSON.parse(lockData);
206
+ const lockAge = Date.now() - new Date(existingLeader.lastHeartbeat).getTime();
207
+ if (lockAge < this.lockTimeout) {
208
+ // Lock is still valid and held by another instance.
209
+ this.leaderInfo = existingLeader;
210
+ this.logger.debug('Leader lock held by another instance', this.loggerContext, {
211
+ leader: existingLeader.instanceId,
212
+ age: lockAge,
213
+ });
214
+ return false;
215
+ }
216
+ // Lock expired — take over with an atomic temp-write + rename.
217
+ this.logger.warn('Leader lock expired, taking over', this.loggerContext, {
218
+ previousLeader: existingLeader.instanceId,
219
+ lockAge,
220
+ });
221
+ await this.atomicWriteLock(serialized);
180
222
  this.leaderInfo = lockInfo;
181
223
  return true;
182
224
  }
@@ -188,6 +230,25 @@ export class LeaderElection extends EventEmitter {
188
230
  return false;
189
231
  }
190
232
  }
233
+ /**
234
+ * Atomically (re)write the lock file: write to a unique temp file, then rename
235
+ * over the target. rename() is atomic on POSIX so readers never see a partial
236
+ * lock file.
237
+ */
238
+ async atomicWriteLock(serialized) {
239
+ if (!this.lockPath) {
240
+ throw new Error('Lock path not configured');
241
+ }
242
+ const tempPath = `${this.lockPath}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.tmp`;
243
+ await fs.promises.writeFile(tempPath, serialized, 'utf-8');
244
+ try {
245
+ await fs.promises.rename(tempPath, this.lockPath);
246
+ }
247
+ catch (error) {
248
+ await fs.promises.unlink(tempPath).catch(() => { });
249
+ throw error;
250
+ }
251
+ }
191
252
  /**
192
253
  * Try to acquire Redis-based lock
193
254
  */
@@ -196,7 +257,7 @@ export class LeaderElection extends EventEmitter {
196
257
  throw new Error('Redis client not configured');
197
258
  }
198
259
  try {
199
- const lockKey = 'moro:jobs:leader:lock';
260
+ const lockKey = LeaderElection.REDIS_LOCK_KEY;
200
261
  const lockInfo = {
201
262
  instanceId: this.instanceId,
202
263
  hostname: os.hostname(),
@@ -255,13 +316,24 @@ export class LeaderElection extends EventEmitter {
255
316
  });
256
317
  this.isLeader = false;
257
318
  this.stopHeartbeat();
258
- // Release lock
319
+ // Release lock — only if we still own it, so we never delete a lock that
320
+ // another instance has since acquired.
259
321
  try {
260
322
  if (this.strategy === 'file' && this.lockPath) {
261
- await fs.promises.unlink(this.lockPath).catch(() => { });
323
+ try {
324
+ const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');
325
+ const currentLeader = JSON.parse(lockData);
326
+ if (currentLeader.instanceId === this.instanceId) {
327
+ await fs.promises.unlink(this.lockPath).catch(() => { });
328
+ }
329
+ }
330
+ catch {
331
+ // Lock file missing or unreadable — nothing to release.
332
+ }
262
333
  }
263
334
  else if (this.strategy === 'redis' && this.redisClient) {
264
- await this.redisClient.del('moro:jobs:leader:lock');
335
+ // Compare-and-delete: only DEL if the stored lock still belongs to us.
336
+ await this.redisClient.eval(LeaderElection.REDIS_RELEASE_SCRIPT, 1, LeaderElection.REDIS_LOCK_KEY, this.instanceId);
265
337
  }
266
338
  }
267
339
  catch (error) {
@@ -276,21 +348,25 @@ export class LeaderElection extends EventEmitter {
276
348
  if (this.heartbeatTimer) {
277
349
  return;
278
350
  }
279
- this.heartbeatTimer = setInterval(async () => {
280
- if (this.isShuttingDown) {
281
- return;
282
- }
283
- try {
284
- await this.sendHeartbeat();
285
- }
286
- catch (error) {
287
- this.logger.error('Heartbeat failed', this.loggerContext, { error });
288
- // Lost leadership
289
- await this.stepDown();
290
- // Try to reacquire
291
- const retryTimer = setTimeout(() => this.tryAcquireLeadership(), 1000);
292
- retryTimer.unref(); // Don't keep process alive
293
- }
351
+ this.heartbeatTimer = setInterval(() => {
352
+ void (async () => {
353
+ if (this.isShuttingDown) {
354
+ return;
355
+ }
356
+ try {
357
+ await this.sendHeartbeat();
358
+ }
359
+ catch (error) {
360
+ this.logger.error('Heartbeat failed', this.loggerContext, { error });
361
+ // Lost leadership
362
+ await this.stepDown();
363
+ // Try to reacquire
364
+ const retryTimer = setTimeout(() => {
365
+ void this.tryAcquireLeadership();
366
+ }, 1000);
367
+ retryTimer.unref(); // Don't keep process alive
368
+ }
369
+ })();
294
370
  }, this.heartbeatInterval);
295
371
  // Don't keep process alive
296
372
  this.heartbeatTimer.unref();
@@ -313,11 +389,22 @@ export class LeaderElection extends EventEmitter {
313
389
  }
314
390
  this.leaderInfo.lastHeartbeat = new Date();
315
391
  if (this.strategy === 'file' && this.lockPath) {
316
- await fs.promises.writeFile(this.lockPath, JSON.stringify(this.leaderInfo), 'utf-8');
392
+ // Verify we still own the lock before refreshing it. If the file is gone or
393
+ // now owned by another instance, we have lost leadership — throw so the
394
+ // heartbeat handler steps us down and attempts a clean re-acquire.
395
+ const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');
396
+ const currentLeader = JSON.parse(lockData);
397
+ if (currentLeader.instanceId !== this.instanceId) {
398
+ throw new Error('Lost leadership: file lock is owned by another instance');
399
+ }
400
+ await this.atomicWriteLock(JSON.stringify(this.leaderInfo));
317
401
  }
318
402
  else if (this.strategy === 'redis' && this.redisClient) {
319
- const lockKey = 'moro:jobs:leader:lock';
320
- await this.redisClient.set(lockKey, JSON.stringify(this.leaderInfo), 'PX', this.lockTimeout);
403
+ // Compare-and-refresh: only rewrite + extend the TTL if we still own the lock.
404
+ const refreshed = await this.redisClient.eval(LeaderElection.REDIS_REFRESH_SCRIPT, 1, LeaderElection.REDIS_LOCK_KEY, this.instanceId, JSON.stringify(this.leaderInfo), this.lockTimeout);
405
+ if (Number(refreshed) !== 1) {
406
+ throw new Error('Lost leadership: redis lock is no longer owned by this instance');
407
+ }
321
408
  }
322
409
  this.logger.debug('Heartbeat sent', this.loggerContext, { instanceId: this.instanceId });
323
410
  this.emit('leader:heartbeat', {
@@ -333,18 +420,20 @@ export class LeaderElection extends EventEmitter {
333
420
  return;
334
421
  }
335
422
  const checkInterval = Math.floor(this.heartbeatInterval * 1.5);
336
- this.checkTimer = setInterval(async () => {
337
- if (this.isShuttingDown) {
338
- return;
339
- }
340
- if (!this.isLeader) {
341
- // Try to acquire leadership
342
- await this.tryAcquireLeadership();
343
- }
344
- else {
345
- // Verify we still hold the lock
346
- await this.verifyLeadership();
347
- }
423
+ this.checkTimer = setInterval(() => {
424
+ void (async () => {
425
+ if (this.isShuttingDown) {
426
+ return;
427
+ }
428
+ if (!this.isLeader) {
429
+ // Try to acquire leadership
430
+ await this.tryAcquireLeadership();
431
+ }
432
+ else {
433
+ // Verify we still hold the lock
434
+ await this.verifyLeadership();
435
+ }
436
+ })();
348
437
  }, checkInterval);
349
438
  // Don't keep process alive
350
439
  this.checkTimer.unref();
@@ -373,7 +462,7 @@ export class LeaderElection extends EventEmitter {
373
462
  stillLeader = currentLeader.instanceId === this.instanceId;
374
463
  }
375
464
  else if (this.strategy === 'redis' && this.redisClient) {
376
- const lockData = await this.redisClient.get('moro:jobs:leader:lock');
465
+ const lockData = await this.redisClient.get(LeaderElection.REDIS_LOCK_KEY);
377
466
  if (lockData) {
378
467
  const currentLeader = JSON.parse(lockData);
379
468
  stillLeader = currentLeader.instanceId === this.instanceId;
@@ -1 +1 @@
1
- {"version":3,"file":"leader-election.js","sourceRoot":"","sources":["../../../src/core/jobs/leader-election.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"leader-election.js","sourceRoot":"","sources":["../../../src/core/jobs/leader-election.ts"],"names":[],"mappings":"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","sourcesContent":["// Production-grade Leader Election for Distributed Job Scheduling\n// Supports file-based and Redis-based locking for K8s and clustered environments\n\nimport { EventEmitter } from 'events';\nimport crypto from 'crypto';\nimport { Logger } from '../../types/logger.js';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport cluster from 'cluster';\nimport { isMainThread } from 'worker_threads';\n\nexport interface LeaderElectionOptions {\n strategy: 'file' | 'redis' | 'none';\n lockPath?: string;\n lockTimeout?: number;\n heartbeatInterval?: number;\n redisClient?: any; // Optional Redis client\n forceLeader?: boolean; // Force this instance to be leader (dev/testing)\n instanceId?: string; // Custom instance ID\n}\n\nexport interface LeaderInfo {\n instanceId: string;\n hostname: string;\n pid: number;\n electedAt: Date;\n lastHeartbeat: Date;\n metadata?: Record<string, any>;\n}\n\n/**\n * LeaderElection - Ensures only one job scheduler runs across distributed instances\n * Supports:\n * - File-based locking (for local/NFS environments)\n * - Redis-based locking (for distributed systems)\n * - Kubernetes pod detection\n * - Automatic failover with health checks\n */\nexport class LeaderElection extends EventEmitter {\n private isLeader = false;\n private strategy: 'file' | 'redis' | 'none';\n private lockPath?: string;\n private lockTimeout: number;\n private heartbeatInterval: number;\n private heartbeatTimer?: NodeJS.Timeout | undefined;\n private checkTimer?: NodeJS.Timeout | undefined;\n private logger: Logger;\n private loggerContext = 'LeaderElection';\n private instanceId: string;\n private leaderInfo?: LeaderInfo;\n private redisClient?: any;\n private isShuttingDown = false;\n private lockAcquireAttempts = 0;\n\n private static readonly REDIS_LOCK_KEY = 'moro:jobs:leader:lock';\n\n // Compare-and-refresh: rewrite the value and extend the TTL only if the stored\n // lock still belongs to this instance (ownership is fenced by instanceId).\n private static readonly REDIS_REFRESH_SCRIPT = `\nlocal cur = redis.call('GET', KEYS[1])\nif not cur then return 0 end\nlocal ok, decoded = pcall(cjson.decode, cur)\nif ok and decoded['instanceId'] == ARGV[1] then\n redis.call('SET', KEYS[1], ARGV[2], 'PX', ARGV[3])\n return 1\nend\nreturn 0`;\n\n // Compare-and-delete: release the lock only if it still belongs to this instance.\n private static readonly REDIS_RELEASE_SCRIPT = `\nlocal cur = redis.call('GET', KEYS[1])\nif not cur then return 0 end\nlocal ok, decoded = pcall(cjson.decode, cur)\nif ok and decoded['instanceId'] == ARGV[1] then\n return redis.call('DEL', KEYS[1])\nend\nreturn 0`;\n\n constructor(logger: Logger, options: LeaderElectionOptions = { strategy: 'file' }) {\n super();\n this.logger = logger;\n this.strategy = options.strategy;\n this.lockTimeout = options.lockTimeout ?? 30000; // 30s default\n this.heartbeatInterval = options.heartbeatInterval ?? 10000; // 10s default\n this.redisClient = options.redisClient;\n\n // Generate unique instance ID\n this.instanceId =\n options.instanceId ||\n `${os.hostname()}-${process.pid}-${Date.now()}-${crypto.randomBytes(6).toString('hex')}`;\n\n // Setup lock path for file-based strategy\n if (this.strategy === 'file') {\n if (options.lockPath) {\n this.lockPath = options.lockPath;\n } else {\n const tmpDir = os.tmpdir();\n this.lockPath = path.join(tmpDir, 'moro-jobs-leader.lock');\n }\n }\n\n // Force leader mode (for dev/testing)\n if (options.forceLeader) {\n this.isLeader = true;\n this.logger.warn('Leader election forced - running as leader');\n }\n\n this.logger.debug('LeaderElection initialized', this.loggerContext, {\n strategy: this.strategy,\n instanceId: this.instanceId,\n lockPath: this.lockPath,\n forceLeader: options.forceLeader,\n });\n }\n\n /**\n * Start leader election process\n */\n public async start(): Promise<void> {\n if (this.strategy === 'none') {\n this.logger.debug('Leader election disabled, assuming leader role');\n this.becomeLeader();\n return;\n }\n\n // Check if we should participate in leader election\n if (!this.shouldParticipate()) {\n this.logger.info('Not participating in leader election (worker process/thread)');\n return;\n }\n\n this.logger.info('Starting leader election...', this.loggerContext, {\n strategy: this.strategy,\n instanceId: this.instanceId,\n });\n\n // Try to acquire leadership\n await this.tryAcquireLeadership();\n\n // Start periodic checks\n this.startPeriodicCheck();\n }\n\n /**\n * Check if this process should participate in leader election\n */\n private shouldParticipate(): boolean {\n // Only main thread and primary cluster process can be leader\n if (!isMainThread) {\n return false;\n }\n\n if (cluster.isWorker) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Try to acquire leadership\n */\n private async tryAcquireLeadership(): Promise<boolean> {\n if (this.isShuttingDown) {\n return false;\n }\n\n this.lockAcquireAttempts++;\n\n try {\n let acquired = false;\n\n if (this.strategy === 'file') {\n acquired = await this.tryAcquireFileLock();\n } else if (this.strategy === 'redis') {\n acquired = await this.tryAcquireRedisLock();\n }\n\n if (acquired) {\n this.becomeLeader();\n return true;\n } else {\n // Check if current leader is still alive\n await this.checkLeaderHealth();\n return false;\n }\n } catch (error) {\n this.logger.error('Error during leader election', this.loggerContext, {\n error,\n attempt: this.lockAcquireAttempts,\n });\n return false;\n }\n }\n\n /**\n * Try to acquire file-based lock\n *\n * Uses O_EXCL (open flag 'wx') for the common \"no lock yet\" case so exactly one\n * instance can win the create race. An expired lock is taken over via an atomic\n * temp-write + rename. A takeover race between two instances is a last-writer-wins\n * rename, which is then reconciled by the periodic verifyLeadership() check and the\n * ownership-checked heartbeat below, so a single leader is still guaranteed.\n */\n private async tryAcquireFileLock(): Promise<boolean> {\n if (!this.lockPath) {\n throw new Error('Lock path not configured');\n }\n\n const lockInfo: LeaderInfo = {\n instanceId: this.instanceId,\n hostname: os.hostname(),\n pid: process.pid,\n electedAt: new Date(),\n lastHeartbeat: new Date(),\n metadata: this.getInstanceMetadata(),\n };\n const serialized = JSON.stringify(lockInfo);\n\n // Fast path: atomically create the lock file (O_EXCL). Fails with EEXIST if\n // another instance already holds the lock.\n try {\n const handle = await fs.promises.open(this.lockPath, 'wx');\n try {\n await handle.writeFile(serialized, 'utf-8');\n } finally {\n await handle.close();\n }\n this.leaderInfo = lockInfo;\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code !== 'EEXIST') {\n this.logger.error('Failed to acquire file lock', this.loggerContext, {\n error,\n lockPath: this.lockPath,\n });\n return false;\n }\n // Lock file already exists — fall through to the expiry/takeover check.\n }\n\n try {\n // Read existing lock and decide whether we may take it over.\n const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');\n const existingLeader: LeaderInfo = JSON.parse(lockData);\n\n const lockAge = Date.now() - new Date(existingLeader.lastHeartbeat).getTime();\n\n if (lockAge < this.lockTimeout) {\n // Lock is still valid and held by another instance.\n this.leaderInfo = existingLeader;\n this.logger.debug('Leader lock held by another instance', this.loggerContext, {\n leader: existingLeader.instanceId,\n age: lockAge,\n });\n return false;\n }\n\n // Lock expired — take over with an atomic temp-write + rename.\n this.logger.warn('Leader lock expired, taking over', this.loggerContext, {\n previousLeader: existingLeader.instanceId,\n lockAge,\n });\n\n await this.atomicWriteLock(serialized);\n this.leaderInfo = lockInfo;\n return true;\n } catch (error) {\n this.logger.error('Failed to acquire file lock', this.loggerContext, {\n error,\n lockPath: this.lockPath,\n });\n return false;\n }\n }\n\n /**\n * Atomically (re)write the lock file: write to a unique temp file, then rename\n * over the target. rename() is atomic on POSIX so readers never see a partial\n * lock file.\n */\n private async atomicWriteLock(serialized: string): Promise<void> {\n if (!this.lockPath) {\n throw new Error('Lock path not configured');\n }\n\n const tempPath = `${this.lockPath}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.tmp`;\n await fs.promises.writeFile(tempPath, serialized, 'utf-8');\n try {\n await fs.promises.rename(tempPath, this.lockPath);\n } catch (error) {\n await fs.promises.unlink(tempPath).catch(() => {});\n throw error;\n }\n }\n\n /**\n * Try to acquire Redis-based lock\n */\n private async tryAcquireRedisLock(): Promise<boolean> {\n if (!this.redisClient) {\n throw new Error('Redis client not configured');\n }\n\n try {\n const lockKey = LeaderElection.REDIS_LOCK_KEY;\n const lockInfo: LeaderInfo = {\n instanceId: this.instanceId,\n hostname: os.hostname(),\n pid: process.pid,\n electedAt: new Date(),\n lastHeartbeat: new Date(),\n metadata: this.getInstanceMetadata(),\n };\n\n // Try to set lock with NX (only if not exists) and PX (expiration in ms)\n const result = await this.redisClient.set(\n lockKey,\n JSON.stringify(lockInfo),\n 'PX',\n this.lockTimeout,\n 'NX'\n );\n\n if (result === 'OK') {\n this.leaderInfo = lockInfo;\n return true;\n }\n\n // Lock exists, get current leader info\n const existingLock = await this.redisClient.get(lockKey);\n if (existingLock) {\n this.leaderInfo = JSON.parse(existingLock);\n }\n\n return false;\n } catch (error) {\n this.logger.error('Failed to acquire Redis lock', this.loggerContext, { error });\n return false;\n }\n }\n\n /**\n * Become leader\n */\n private becomeLeader(): void {\n if (this.isLeader) {\n return;\n }\n\n this.isLeader = true;\n this.logger.info('Became leader', this.loggerContext, {\n instanceId: this.instanceId,\n strategy: this.strategy,\n attempts: this.lockAcquireAttempts,\n });\n\n this.emit('leader:elected', {\n instanceId: this.instanceId,\n electedAt: this.leaderInfo?.electedAt,\n });\n\n // Start heartbeat\n this.startHeartbeat();\n }\n\n /**\n * Step down as leader\n */\n private async stepDown(): Promise<void> {\n if (!this.isLeader) {\n return;\n }\n\n this.logger.info('Stepping down as leader', this.loggerContext, {\n instanceId: this.instanceId,\n });\n\n this.isLeader = false;\n this.stopHeartbeat();\n\n // Release lock — only if we still own it, so we never delete a lock that\n // another instance has since acquired.\n try {\n if (this.strategy === 'file' && this.lockPath) {\n try {\n const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');\n const currentLeader: LeaderInfo = JSON.parse(lockData);\n if (currentLeader.instanceId === this.instanceId) {\n await fs.promises.unlink(this.lockPath).catch(() => {});\n }\n } catch {\n // Lock file missing or unreadable — nothing to release.\n }\n } else if (this.strategy === 'redis' && this.redisClient) {\n // Compare-and-delete: only DEL if the stored lock still belongs to us.\n await this.redisClient.eval(\n LeaderElection.REDIS_RELEASE_SCRIPT,\n 1,\n LeaderElection.REDIS_LOCK_KEY,\n this.instanceId\n );\n }\n } catch (error) {\n this.logger.error('Failed to release lock during step down', this.loggerContext, { error });\n }\n\n this.emit('leader:stepdown', { instanceId: this.instanceId });\n }\n\n /**\n * Start heartbeat to maintain leadership\n */\n private startHeartbeat(): void {\n if (this.heartbeatTimer) {\n return;\n }\n\n this.heartbeatTimer = setInterval(() => {\n void (async () => {\n if (this.isShuttingDown) {\n return;\n }\n\n try {\n await this.sendHeartbeat();\n } catch (error) {\n this.logger.error('Heartbeat failed', this.loggerContext, { error });\n // Lost leadership\n await this.stepDown();\n // Try to reacquire\n const retryTimer = setTimeout(() => {\n void this.tryAcquireLeadership();\n }, 1000);\n retryTimer.unref(); // Don't keep process alive\n }\n })();\n }, this.heartbeatInterval);\n\n // Don't keep process alive\n this.heartbeatTimer.unref();\n }\n\n /**\n * Stop heartbeat\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = undefined;\n }\n }\n\n /**\n * Send heartbeat to maintain lock\n */\n private async sendHeartbeat(): Promise<void> {\n if (!this.leaderInfo) {\n return;\n }\n\n this.leaderInfo.lastHeartbeat = new Date();\n\n if (this.strategy === 'file' && this.lockPath) {\n // Verify we still own the lock before refreshing it. If the file is gone or\n // now owned by another instance, we have lost leadership — throw so the\n // heartbeat handler steps us down and attempts a clean re-acquire.\n const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');\n const currentLeader: LeaderInfo = JSON.parse(lockData);\n if (currentLeader.instanceId !== this.instanceId) {\n throw new Error('Lost leadership: file lock is owned by another instance');\n }\n await this.atomicWriteLock(JSON.stringify(this.leaderInfo));\n } else if (this.strategy === 'redis' && this.redisClient) {\n // Compare-and-refresh: only rewrite + extend the TTL if we still own the lock.\n const refreshed = await this.redisClient.eval(\n LeaderElection.REDIS_REFRESH_SCRIPT,\n 1,\n LeaderElection.REDIS_LOCK_KEY,\n this.instanceId,\n JSON.stringify(this.leaderInfo),\n this.lockTimeout\n );\n if (Number(refreshed) !== 1) {\n throw new Error('Lost leadership: redis lock is no longer owned by this instance');\n }\n }\n\n this.logger.debug('Heartbeat sent', this.loggerContext, { instanceId: this.instanceId });\n this.emit('leader:heartbeat', {\n instanceId: this.instanceId,\n timestamp: this.leaderInfo.lastHeartbeat,\n });\n }\n\n /**\n * Start periodic check for leadership changes\n */\n private startPeriodicCheck(): void {\n if (this.checkTimer) {\n return;\n }\n\n const checkInterval = Math.floor(this.heartbeatInterval * 1.5);\n\n this.checkTimer = setInterval(() => {\n void (async () => {\n if (this.isShuttingDown) {\n return;\n }\n\n if (!this.isLeader) {\n // Try to acquire leadership\n await this.tryAcquireLeadership();\n } else {\n // Verify we still hold the lock\n await this.verifyLeadership();\n }\n })();\n }, checkInterval);\n\n // Don't keep process alive\n this.checkTimer.unref();\n }\n\n /**\n * Stop periodic check\n */\n private stopPeriodicCheck(): void {\n if (this.checkTimer) {\n clearInterval(this.checkTimer);\n this.checkTimer = undefined;\n }\n }\n\n /**\n * Verify we still hold leadership\n */\n private async verifyLeadership(): Promise<void> {\n if (!this.isLeader) {\n return;\n }\n\n try {\n let stillLeader = false;\n\n if (this.strategy === 'file' && this.lockPath) {\n const lockData = await fs.promises.readFile(this.lockPath, 'utf-8');\n const currentLeader: LeaderInfo = JSON.parse(lockData);\n stillLeader = currentLeader.instanceId === this.instanceId;\n } else if (this.strategy === 'redis' && this.redisClient) {\n const lockData = await this.redisClient.get(LeaderElection.REDIS_LOCK_KEY);\n if (lockData) {\n const currentLeader: LeaderInfo = JSON.parse(lockData);\n stillLeader = currentLeader.instanceId === this.instanceId;\n }\n }\n\n if (!stillLeader) {\n this.logger.warn('Lost leadership', this.loggerContext, { instanceId: this.instanceId });\n await this.stepDown();\n }\n } catch (error) {\n this.logger.error('Failed to verify leadership', this.loggerContext, { error });\n await this.stepDown();\n }\n }\n\n /**\n * Check health of current leader\n */\n private async checkLeaderHealth(): Promise<void> {\n if (!this.leaderInfo || this.leaderInfo.instanceId === this.instanceId) {\n return;\n }\n\n const heartbeatAge = Date.now() - new Date(this.leaderInfo.lastHeartbeat).getTime();\n\n if (heartbeatAge > this.lockTimeout) {\n this.logger.warn('Current leader appears unhealthy', this.loggerContext, {\n leader: this.leaderInfo.instanceId,\n heartbeatAge,\n });\n\n this.emit('leader:unhealthy', {\n leader: this.leaderInfo.instanceId,\n heartbeatAge,\n });\n }\n }\n\n /**\n * Get instance metadata\n */\n private getInstanceMetadata(): Record<string, any> {\n const metadata: Record<string, any> = {\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n uptime: process.uptime(),\n };\n\n // K8s detection\n if (process.env.KUBERNETES_SERVICE_HOST) {\n metadata.kubernetes = {\n podName: process.env.HOSTNAME || os.hostname(),\n namespace: process.env.POD_NAMESPACE,\n nodeName: process.env.NODE_NAME,\n };\n }\n\n // Container detection\n if (process.env.CONTAINER) {\n metadata.container = process.env.CONTAINER;\n }\n\n return metadata;\n }\n\n /**\n * Check if current instance is leader\n */\n public isCurrentLeader(): boolean {\n return this.isLeader;\n }\n\n /**\n * Get current leader info\n */\n public getLeaderInfo(): LeaderInfo | undefined {\n return this.leaderInfo ? { ...this.leaderInfo } : undefined;\n }\n\n /**\n * Get instance ID\n */\n public getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Force step down (for testing/admin)\n */\n public async forceStepDown(): Promise<void> {\n if (!this.isLeader) {\n return;\n }\n\n this.logger.warn('Forced step down requested', this.loggerContext, {\n instanceId: this.instanceId,\n });\n await this.stepDown();\n }\n\n /**\n * Shutdown and cleanup\n */\n public async shutdown(): Promise<void> {\n this.logger.info('LeaderElection shutting down...', this.loggerContext, {\n instanceId: this.instanceId,\n wasLeader: this.isLeader,\n });\n\n this.isShuttingDown = true;\n\n this.stopHeartbeat();\n this.stopPeriodicCheck();\n\n if (this.isLeader) {\n await this.stepDown();\n }\n\n this.removeAllListeners();\n this.logger.info('LeaderElection shutdown complete');\n }\n}\n"]}
@@ -47,12 +47,12 @@ export interface JobHealth {
47
47
  name: string;
48
48
  status: JobHealthStatus;
49
49
  enabled: boolean;
50
- lastExecution?: Date;
51
- lastSuccess?: Date;
50
+ lastExecution?: Date | undefined;
51
+ lastSuccess?: Date | undefined;
52
52
  consecutiveFailures: number;
53
53
  circuitBreakerState?: 'open' | 'half-open' | 'closed';
54
- nextRun?: Date;
55
- message?: string;
54
+ nextRun?: Date | undefined;
55
+ message?: string | undefined;
56
56
  }
57
57
  export interface JobEvents {
58
58
  'scheduler:started': {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/jobs/types.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,0DAA0D"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/jobs/types.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,0DAA0D","sourcesContent":["// Job System Types\n// Complete type definitions for the job scheduling system\n\nexport type { CronSchedule, NextRunResult } from './cron-parser.js';\nexport type {\n JobExecution,\n JobState,\n JobHistory,\n StateManagerOptions,\n} from './job-state-manager.js';\nexport type { LeaderElectionOptions, LeaderInfo } from './leader-election.js';\nexport type {\n JobExecutorOptions,\n JobFunction,\n ExecutionContext,\n ExecutionResult,\n} from './job-executor.js';\nexport type {\n JobScheduleType,\n JobSchedule,\n JobOptions,\n Job,\n JobSchedulerOptions,\n} from './job-scheduler.js';\n\n// Simplified API types for users\nexport interface SimpleJobOptions {\n name?: string;\n enabled?: boolean;\n priority?: number;\n timezone?: string;\n maxConcurrent?: number;\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n retryBackoff?: 'linear' | 'exponential';\n enableCircuitBreaker?: boolean;\n metadata?: Record<string, any>;\n onStart?: (context: JobContext) => void | Promise<void>;\n onComplete?: (context: JobContext, result: any) => void | Promise<void>;\n onError?: (context: JobContext, error: Error) => void | Promise<void>;\n}\n\nexport interface JobContext {\n jobId: string;\n executionId: string;\n attempt: number;\n startTime: Date;\n metadata?: Record<string, any>;\n}\n\nexport interface JobMetrics {\n successRate: number;\n failureRate: number;\n averageDuration: number;\n totalExecutions: number;\n recentFailures: number;\n}\n\nexport interface SchedulerStats {\n totalJobs: number;\n enabledJobs: number;\n runningJobs: number;\n queuedJobs: number;\n isLeader: boolean;\n isStarted: boolean;\n}\n\n// Job health status\nexport type JobHealthStatus = 'healthy' | 'warning' | 'critical' | 'unknown';\n\nexport interface JobHealth {\n jobId: string;\n name: string;\n status: JobHealthStatus;\n enabled: boolean;\n lastExecution?: Date | undefined;\n lastSuccess?: Date | undefined;\n consecutiveFailures: number;\n circuitBreakerState?: 'open' | 'half-open' | 'closed';\n nextRun?: Date | undefined;\n message?: string | undefined;\n}\n\n// Job event types\nexport interface JobEvents {\n 'scheduler:started': { jobCount: number; isLeader: boolean };\n 'scheduler:shutdown': Record<string, never>;\n 'job:registered': { jobId: string; name: string; schedule: any };\n 'job:unregistered': { jobId: string; name: string };\n 'job:enabled': { jobId: string; enabled: boolean };\n 'job:queued': { jobId: string; executionId: string; queueLength: number };\n 'job:start': { jobId: string; executionId: string; context: any };\n 'job:complete': { jobId: string; executionId: string; result: any; duration: number };\n 'job:error': {\n jobId: string;\n executionId: string;\n error: Error;\n duration: number;\n timedOut?: boolean;\n };\n 'leader:elected': { instanceId: string; electedAt?: Date };\n 'leader:stepdown': { instanceId: string };\n 'leader:heartbeat': { instanceId: string; timestamp: Date };\n 'leader:unhealthy': { leader: string; heartbeatAge: number };\n 'execution:success': { jobId: string; executionId: string; attempts: number; duration: number };\n 'execution:failed': {\n jobId: string;\n executionId: string;\n attempts: number;\n duration: number;\n error: Error;\n };\n 'execution:retry': {\n jobId: string;\n executionId: string;\n attempt: number;\n maxAttempts: number;\n error: Error;\n };\n 'execution:cancelled': { executionId: string };\n 'circuit-breaker:open': { jobId: string };\n 'circuit-breaker:half-open': { jobId: string };\n 'circuit-breaker:closed': { jobId: string };\n 'memory:threshold-exceeded': { jobId: string; heapUsedMB: number; threshold: number };\n}\n"]}
@@ -24,7 +24,7 @@ export declare class JobHealthChecker {
24
24
  stats: SchedulerStats;
25
25
  jobs: JobHealth[];
26
26
  unhealthyJobCount: number;
27
- message?: string;
27
+ message?: string | undefined;
28
28
  };
29
29
  }
30
30
  /**
@@ -110,15 +110,19 @@ export function parseInterval(interval) {
110
110
  if (!match) {
111
111
  throw new Error(`Invalid interval format: "${interval}". Use format like: 5s, 10m, 2h, 1d`);
112
112
  }
113
- const value = parseFloat(match[1]);
114
- const unit = match[2].toLowerCase();
113
+ const value = parseFloat(match[1] ?? '');
114
+ const unit = (match[2] ?? '').toLowerCase();
115
115
  const multipliers = {
116
116
  s: 1000,
117
117
  m: 60000,
118
118
  h: 3600000,
119
119
  d: 86400000,
120
120
  };
121
- return value * multipliers[unit];
121
+ const multiplier = multipliers[unit];
122
+ if (multiplier === undefined) {
123
+ throw new Error(`Invalid interval format: "${interval}". Use format like: 5s, 10m, 2h, 1d`);
124
+ }
125
+ return value * multiplier;
122
126
  }
123
127
  /**
124
128
  * Format duration in human-readable format
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/jobs/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/jobs/utils.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,uDAAuD;AAMvD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,SAAS,CAAe;IACxB,MAAM,CAAS;IAEvB,YAAY,SAAuB,EAAE,MAAc;QACjD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,KAAa;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,KAAK;gBACL,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,KAAK;gBACd,mBAAmB,EAAE,CAAC;gBACtB,OAAO,EAAE,eAAe;aACzB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,MAAM,GAAoB,SAAS,CAAC;QACxC,IAAI,OAA2B,CAAC;QAEhC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,GAAG,iBAAiB,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,EAAE,mBAAmB,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,GAAG,UAAU,CAAC;YACpB,OAAO,GAAG,GAAG,KAAK,CAAC,mBAAmB,uBAAuB,CAAC;QAChE,CAAC;aAAM,IAAI,KAAK,EAAE,mBAAmB,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,GAAG,GAAG,KAAK,CAAC,mBAAmB,uBAAuB,CAAC;QAChE,CAAC;aAAM,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC/C,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,GAAG,sBAAsB,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACpE,CAAC;QAED,OAAO;YACL,KAAK;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM;YACN,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS;YAC9C,WAAW,EACT,KAAK,EAAE,aAAa,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACxF,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,IAAI,CAAC;YACpD,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,YAAY;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,kBAAkB;QAOvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEvC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAEhG,IAAI,MAAM,GAAoB,SAAS,CAAC;QACxC,IAAI,OAA2B,CAAC;QAEhC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,GAAG,UAAU,CAAC;YACpB,OAAO,GAAG,uBAAuB,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,GAAG,2BAA2B,CAAC;QACxC,CAAC;aAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,UAAU,CAAC;YACpB,OAAO,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,gBAAgB,CAAC;QACzF,CAAC;aAAM,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,GAAG,GAAG,aAAa,CAAC,MAAM,iBAAiB,CAAC;QACrD,CAAC;QAED,OAAO;YACL,MAAM;YACN,KAAK;YACL,IAAI,EAAE,UAAU;YAChB,iBAAiB,EAAE,aAAa,CAAC,MAAM;YACvC,OAAO;SACR,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,qCAAqC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE5C,MAAM,WAAW,GAA2B;QAC1C,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,OAAO;QACV,CAAC,EAAE,QAAQ;KACZ,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,qCAAqC,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,KAAK,GAAG,UAAU,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,EAAE,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,GAAG,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,QAAiB;IAChE,OAAO;QACL,IAAI,EAAE,MAAe;QACrB,IAAI,EAAE,UAAU;QAChB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,OAAO;QACL,IAAI,EAAE,SAAkB;QACxB,EAAE,EAAE,IAAI;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,KAAK,CAAU;IACf,SAAS,CAAO;IAChB,QAAQ,GAAQ,EAAE,CAAC;IAEpB,IAAI,CAAC,IAAY;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,QAAyB;QACpC,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,IAAI,CAAC,UAAkB,EAAE,QAAiB;QAC/C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,EAAE,CAAC,IAAU;QAClB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,OAAgB;QAC7B,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,QAAQ,CAAC,QAAgB;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,aAAa,CAAC,GAAW;QAC9B,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,EAAU;QACvB,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAIZ;QACC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,cAAc,CAAC,OAAgB;QACpC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,OAAO,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,QAAQ,CAAC,QAA6B;QAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,EAAsC;QACnD,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,UAAU,CAAC,EAAmD;QACnE,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,EAAoD;QACjE,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,OAAO,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC","sourcesContent":["// Job Utilities and Helper Functions\n// Health checks, monitoring, and convenience functions\n\nimport { Logger } from '../../types/logger.js';\nimport { JobScheduler } from './job-scheduler.js';\nimport { JobHealth, JobHealthStatus, SchedulerStats } from './types.js';\n\n/**\n * JobHealthChecker - Monitors job health and provides status\n */\nexport class JobHealthChecker {\n private scheduler: JobScheduler;\n private logger: Logger;\n\n constructor(scheduler: JobScheduler, logger: Logger) {\n this.scheduler = scheduler;\n this.logger = logger;\n }\n\n /**\n * Check health of a specific job\n */\n public checkJobHealth(jobId: string): JobHealth {\n const job = this.scheduler.getJob(jobId);\n if (!job) {\n return {\n jobId,\n name: 'Unknown',\n status: 'unknown',\n enabled: false,\n consecutiveFailures: 0,\n message: 'Job not found',\n };\n }\n\n const state = this.scheduler.getJobState(jobId);\n const metrics = this.scheduler.getJobMetrics(jobId);\n\n let status: JobHealthStatus = 'healthy';\n let message: string | undefined;\n\n if (!job.enabled) {\n status = 'warning';\n message = 'Job is disabled';\n } else if (state?.consecutiveFailures && state.consecutiveFailures >= 5) {\n status = 'critical';\n message = `${state.consecutiveFailures} consecutive failures`;\n } else if (state?.consecutiveFailures && state.consecutiveFailures >= 3) {\n status = 'warning';\n message = `${state.consecutiveFailures} consecutive failures`;\n } else if (metrics && metrics.failureRate > 50) {\n status = 'warning';\n message = `High failure rate: ${metrics.failureRate.toFixed(1)}%`;\n }\n\n return {\n jobId,\n name: job.name,\n status,\n enabled: job.enabled,\n lastExecution: state?.lastExecution?.startTime,\n lastSuccess:\n state?.lastExecution?.status === 'completed' ? state.lastExecution.endTime : undefined,\n consecutiveFailures: state?.consecutiveFailures || 0,\n nextRun: job.nextRun,\n message,\n };\n }\n\n /**\n * Check health of all jobs\n */\n public checkAllJobs(): JobHealth[] {\n const jobs = this.scheduler.getAllJobs();\n return jobs.map(job => this.checkJobHealth(job.id));\n }\n\n /**\n * Get overall scheduler health\n */\n public getSchedulerHealth(): {\n status: JobHealthStatus;\n stats: SchedulerStats;\n jobs: JobHealth[];\n unhealthyJobCount: number;\n message?: string | undefined;\n } {\n const stats = this.scheduler.getStats();\n const jobHealths = this.checkAllJobs();\n\n const unhealthyJobs = jobHealths.filter(h => h.status === 'critical' || h.status === 'warning');\n\n let status: JobHealthStatus = 'healthy';\n let message: string | undefined;\n\n if (!stats.isStarted) {\n status = 'critical';\n message = 'Scheduler not started';\n } else if (!stats.isLeader) {\n status = 'warning';\n message = 'Not leader (standby mode)';\n } else if (unhealthyJobs.filter(h => h.status === 'critical').length > 0) {\n status = 'critical';\n message = `${unhealthyJobs.filter(h => h.status === 'critical').length} critical jobs`;\n } else if (unhealthyJobs.length > 0) {\n status = 'warning';\n message = `${unhealthyJobs.length} unhealthy jobs`;\n }\n\n return {\n status,\n stats,\n jobs: jobHealths,\n unhealthyJobCount: unhealthyJobs.length,\n message,\n };\n }\n}\n\n/**\n * Parse interval string to milliseconds\n * Supports: '5s', '10m', '2h', '1d'\n */\nexport function parseInterval(interval: string | number): number {\n if (typeof interval === 'number') {\n return interval;\n }\n\n const match = interval.match(/^(\\d+(?:\\.\\d+)?)\\s*([smhd])$/i);\n if (!match) {\n throw new Error(`Invalid interval format: \"${interval}\". Use format like: 5s, 10m, 2h, 1d`);\n }\n\n const value = parseFloat(match[1] ?? '');\n const unit = (match[2] ?? '').toLowerCase();\n\n const multipliers: Record<string, number> = {\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n };\n\n const multiplier = multipliers[unit];\n if (multiplier === undefined) {\n throw new Error(`Invalid interval format: \"${interval}\". Use format like: 5s, 10m, 2h, 1d`);\n }\n\n return value * multiplier;\n}\n\n/**\n * Format duration in human-readable format\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) {\n return `${seconds}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m ${seconds % 60}s`;\n }\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h ${minutes % 60}m`;\n }\n\n const days = Math.floor(hours / 24);\n return `${days}d ${hours % 24}h`;\n}\n\n/**\n * Create a simple interval-based job schedule\n */\nexport function everyInterval(interval: string | number) {\n return {\n type: 'interval' as const,\n interval: parseInterval(interval),\n };\n}\n\n/**\n * Create a cron-based job schedule\n */\nexport function cronSchedule(expression: string, timezone?: string) {\n return {\n type: 'cron' as const,\n cron: expression,\n timezone,\n };\n}\n\n/**\n * Create a one-time job schedule\n */\nexport function oneTimeAt(date: Date) {\n return {\n type: 'oneTime' as const,\n at: date,\n };\n}\n\n/**\n * Job builder for fluent API\n */\nexport class JobBuilder {\n private _name?: string;\n private _schedule?: any;\n private _options: any = {};\n\n public name(name: string): this {\n this._name = name;\n return this;\n }\n\n public every(interval: string | number): this {\n this._schedule = everyInterval(interval);\n return this;\n }\n\n public cron(expression: string, timezone?: string): this {\n this._schedule = cronSchedule(expression, timezone);\n return this;\n }\n\n public at(date: Date): this {\n this._schedule = oneTimeAt(date);\n return this;\n }\n\n public enabled(enabled: boolean): this {\n this._options.enabled = enabled;\n return this;\n }\n\n public priority(priority: number): this {\n this._options.priority = priority;\n return this;\n }\n\n public maxConcurrent(max: number): this {\n this._options.maxConcurrent = max;\n return this;\n }\n\n public timeout(ms: number): this {\n this._options.timeout = ms;\n return this;\n }\n\n public retry(options: {\n maxRetries?: number;\n delay?: number;\n backoff?: 'linear' | 'exponential';\n }): this {\n this._options.maxRetries = options.maxRetries;\n this._options.retryDelay = options.delay;\n this._options.retryBackoff = options.backoff;\n return this;\n }\n\n public circuitBreaker(enabled: boolean): this {\n this._options.enableCircuitBreaker = enabled;\n return this;\n }\n\n public metadata(metadata: Record<string, any>): this {\n this._options.metadata = metadata;\n return this;\n }\n\n public onStart(fn: (ctx: any) => void | Promise<void>): this {\n this._options.onStart = fn;\n return this;\n }\n\n public onComplete(fn: (ctx: any, result: any) => void | Promise<void>): this {\n this._options.onComplete = fn;\n return this;\n }\n\n public onError(fn: (ctx: any, error: Error) => void | Promise<void>): this {\n this._options.onError = fn;\n return this;\n }\n\n public build(): { name: string; schedule: any; options: any } {\n if (!this._name) {\n throw new Error('Job name is required');\n }\n if (!this._schedule) {\n throw new Error('Job schedule is required');\n }\n\n return {\n name: this._name,\n schedule: this._schedule,\n options: this._options,\n };\n }\n}\n\n/**\n * Create a job builder\n */\nexport function createJob(name: string): JobBuilder {\n return new JobBuilder().name(name);\n}\n"]}
@@ -30,8 +30,9 @@ export const rateLimitFilter = (maxPerSecond) => {
30
30
  const cutoff = now - 1000;
31
31
  let keepIndex = 0;
32
32
  for (let i = 0; i < timestamps.length; i++) {
33
- if (timestamps[i] >= cutoff) {
34
- timestamps[keepIndex++] = timestamps[i];
33
+ const ts = timestamps[i];
34
+ if (ts !== undefined && ts >= cutoff) {
35
+ timestamps[keepIndex++] = ts;
35
36
  }
36
37
  }
37
38
  timestamps.length = keepIndex;
@@ -1 +1 @@
1
- {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/core/logger/filters.ts"],"names":[],"mappings":"AAGA,qBAAqB;AACrB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAa,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,SAAS,QAAQ,EAAE;IACzB,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAA+B,CAAC,CAAC;IACxE,CAAC;CACF,CAAC,CAAC;AAEH,uBAAuB;AACvB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,eAAyB,EAAa,EAAE,CAAC,CAAC;IACtE,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAChC,oEAAoE;QACpE,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;CACF,CAAC,CAAC;AAEH,uBAAuB;AACvB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,YAAoB,EAAa,EAAE;IACjE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,6DAA6D;QAC7D,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,yDAAyD;YACzD,IAAI,GAAG,GAAG,WAAW,GAAG,IAAI,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;gBAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;wBAC5B,UAAU,CAAC,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;gBACD,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC9B,WAAW,GAAG,GAAG,CAAC;YACpB,CAAC;YAED,mBAAmB;YACnB,IAAI,UAAU,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,wBAAwB;AACxB,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,gBAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,EACrD,EAAE,CAAC,CAAC;IACf,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;QAC1B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAExC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBAChC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,gCAAgC;QAChC,IAAI,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,+BAA+B,EAAE,IAAI,CAAC,CAAC;YACvE,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAa,EAAE,CAAC,CAAC;IACpE,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC9C,OAAO,KAAK,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC;IACnD,CAAC;CACF,CAAC,CAAC;AAEH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,gBAAwB,CAAC,EACzB,aAAqB,KAAK,EACf,EAAE;IACb,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgD,CAAC;IAE5E,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;YAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YAEpE,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,+BAA+B;YAC/B,IAAI,GAAG,GAAG,QAAQ,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;gBAC1C,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,oCAAoC;YACpC,IAAI,QAAQ,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC;gBACpC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAyC,EAAa,EAAE,CAAC,CAAC;IAC1F,IAAI,EAAE,OAAO,WAAW,EAAE;IAC1B,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;QAC1B,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;YACjC,sEAAsE;YACtE,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC1C,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,cAAwB,EAAa,EAAE,CAAC,CAAC;IACpE,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,CAAC,KAAe,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/core/logger/filters.ts"],"names":[],"mappings":"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","sourcesContent":["// Advanced Logger Filters\nimport { LogEntry, LogFilter } from '../../types/logger.js';\n\n// Level-based filter\nexport const levelFilter = (minLevel: string): LogFilter => ({\n name: `level-${minLevel}`,\n filter: (entry: LogEntry) => {\n const levels = { debug: 0, info: 1, warn: 2, error: 3, fatal: 4 };\n return levels[entry.level] >= levels[minLevel as keyof typeof levels];\n },\n});\n\n// Context-based filter\nexport const contextFilter = (allowedContexts: string[]): LogFilter => ({\n name: 'context-filter',\n filter: (entry: LogEntry) => {\n if (!entry.context) return true;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return allowedContexts.some(ctx => entry.context!.includes(ctx));\n },\n});\n\n// Rate limiting filter\nexport const rateLimitFilter = (maxPerSecond: number): LogFilter => {\n const timestamps: number[] = [];\n let lastCleanup = 0;\n\n return {\n name: 'rate-limit',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n filter: (entry: LogEntry) => {\n const now = Date.now();\n\n // Batch cleanup for better performance and thread safety\n if (now - lastCleanup > 1000) {\n const cutoff = now - 1000;\n let keepIndex = 0;\n for (let i = 0; i < timestamps.length; i++) {\n const ts = timestamps[i];\n if (ts !== undefined && ts >= cutoff) {\n timestamps[keepIndex++] = ts;\n }\n }\n timestamps.length = keepIndex;\n lastCleanup = now;\n }\n\n // Check rate limit\n if (timestamps.length >= maxPerSecond) {\n return false;\n }\n\n timestamps.push(now);\n return true;\n },\n };\n};\n\n// Sensitive data filter\nexport const sanitizeFilter = (\n sensitiveKeys: string[] = ['password', 'token', 'key', 'secret']\n): LogFilter => ({\n name: 'sanitize',\n filter: (entry: LogEntry) => {\n if (entry.metadata) {\n const sanitized = { ...entry.metadata };\n\n for (const key of sensitiveKeys) {\n if (sanitized[key]) {\n sanitized[key] = '[REDACTED]';\n }\n }\n\n entry.metadata = sanitized;\n }\n\n // Also sanitize message content\n let sanitizedMessage = entry.message;\n for (const key of sensitiveKeys) {\n const regex = new RegExp(`(${key}[\"\\\\s]*[:=][\"\\\\s]*)([^\"\\\\s]+)`, 'gi');\n sanitizedMessage = sanitizedMessage.replace(regex, '$1[REDACTED]');\n }\n entry.message = sanitizedMessage;\n\n return true;\n },\n});\n\n// Performance filter - only log slow operations\nexport const performanceFilter = (minDuration: number): LogFilter => ({\n name: 'performance',\n filter: (entry: LogEntry) => {\n if (!entry.performance?.duration) return true;\n return entry.performance.duration >= minDuration;\n },\n});\n\n// Error aggregation filter - prevent spam\nexport const errorAggregationFilter = (\n maxSameErrors: number = 5,\n timeWindow: number = 60000\n): LogFilter => {\n const errorCounts = new Map<string, { count: number; firstSeen: number }>();\n\n return {\n name: 'error-aggregation',\n filter: (entry: LogEntry) => {\n if (entry.level !== 'error' && entry.level !== 'fatal') return true;\n\n const errorKey = `${entry.message}:${entry.context || ''}`;\n const now = Date.now();\n const existing = errorCounts.get(errorKey);\n\n if (!existing) {\n errorCounts.set(errorKey, { count: 1, firstSeen: now });\n return true;\n }\n\n // Reset if outside time window\n if (now - existing.firstSeen > timeWindow) {\n errorCounts.set(errorKey, { count: 1, firstSeen: now });\n return true;\n }\n\n // Check if we've exceeded the limit\n if (existing.count >= maxSameErrors) {\n return false;\n }\n\n existing.count++;\n return true;\n },\n };\n};\n\n// Development vs Production filter\nexport const environmentFilter = (environment: 'development' | 'production'): LogFilter => ({\n name: `env-${environment}`,\n filter: (entry: LogEntry) => {\n if (environment === 'production') {\n // In production, filter out debug logs and sensitive development info\n if (entry.level === 'debug') return false;\n if (entry.context?.includes('dev') || entry.context?.includes('test')) return false;\n }\n return true;\n },\n});\n\n// Module-specific filter\nexport const moduleFilter = (allowedModules: string[]): LogFilter => ({\n name: 'module-filter',\n filter: (entry: LogEntry) => {\n if (!entry.moduleId) return true;\n return allowedModules.includes(entry.moduleId);\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/logger/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EACL,UAAU,EACV,MAAM,EACN,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/logger/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EACL,UAAU,EACV,MAAM,EACN,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc,cAAc,CAAC","sourcesContent":["// Logger System - Main Exports\nexport {\n MoroLogger,\n logger,\n createFrameworkLogger,\n configureGlobalLogger,\n applyLoggingConfiguration,\n destroyGlobalLogger,\n} from './logger.js';\nexport * from './filters.js';\n\nexport type {\n LogLevel,\n LogEntry,\n LoggerOptions,\n Logger,\n LogOutput,\n LogFilter,\n LogMetrics,\n ColorScheme,\n} from '../../types/logger.js';\n"]}