@morojs/moro 1.6.8 → 1.7.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 (307) hide show
  1. package/README.md +3 -1
  2. package/dist/core/auth/morojs-adapter.js +16 -6
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/config-sources.js +27 -15
  5. package/dist/core/config/config-sources.js.map +1 -1
  6. package/dist/core/config/config-validator.js +201 -6
  7. package/dist/core/config/config-validator.js.map +1 -1
  8. package/dist/core/docs/openapi-generator.js +8 -9
  9. package/dist/core/docs/openapi-generator.js.map +1 -1
  10. package/dist/core/events/event-bus.js +1 -1
  11. package/dist/core/events/event-bus.js.map +1 -1
  12. package/dist/core/framework.d.ts +4 -2
  13. package/dist/core/framework.js +25 -24
  14. package/dist/core/framework.js.map +1 -1
  15. package/dist/core/graphql/core.js +34 -8
  16. package/dist/core/graphql/core.js.map +1 -1
  17. package/dist/core/grpc/adapters/grpc-js-adapter.d.ts +28 -0
  18. package/dist/core/grpc/adapters/grpc-js-adapter.js +449 -0
  19. package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -0
  20. package/dist/core/grpc/adapters/index.d.ts +1 -0
  21. package/dist/core/grpc/adapters/index.js +6 -0
  22. package/dist/core/grpc/adapters/index.js.map +1 -0
  23. package/dist/core/grpc/grpc-adapter.d.ts +47 -0
  24. package/dist/core/grpc/grpc-adapter.js +4 -0
  25. package/dist/core/grpc/grpc-adapter.js.map +1 -0
  26. package/dist/core/grpc/grpc-manager.d.ts +59 -0
  27. package/dist/core/grpc/grpc-manager.js +218 -0
  28. package/dist/core/grpc/grpc-manager.js.map +1 -0
  29. package/dist/core/grpc/index.d.ts +7 -0
  30. package/dist/core/grpc/index.js +10 -0
  31. package/dist/core/grpc/index.js.map +1 -0
  32. package/dist/core/grpc/middleware/auth.d.ts +22 -0
  33. package/dist/core/grpc/middleware/auth.js +126 -0
  34. package/dist/core/grpc/middleware/auth.js.map +1 -0
  35. package/dist/core/grpc/middleware/logging.d.ts +19 -0
  36. package/dist/core/grpc/middleware/logging.js +57 -0
  37. package/dist/core/grpc/middleware/logging.js.map +1 -0
  38. package/dist/core/grpc/middleware/validation.d.ts +18 -0
  39. package/dist/core/grpc/middleware/validation.js +126 -0
  40. package/dist/core/grpc/middleware/validation.js.map +1 -0
  41. package/dist/core/grpc/types.d.ts +233 -0
  42. package/dist/core/grpc/types.js +36 -0
  43. package/dist/core/grpc/types.js.map +1 -0
  44. package/dist/core/http/http-server.d.ts +13 -84
  45. package/dist/core/http/http-server.js +338 -792
  46. package/dist/core/http/http-server.js.map +1 -1
  47. package/dist/core/http/http2-server.d.ts +131 -0
  48. package/dist/core/http/http2-server.js +936 -0
  49. package/dist/core/http/http2-server.js.map +1 -0
  50. package/dist/core/http/index.d.ts +3 -1
  51. package/dist/core/http/index.js +2 -1
  52. package/dist/core/http/index.js.map +1 -1
  53. package/dist/core/http/uws-http-server.js +154 -26
  54. package/dist/core/http/uws-http-server.js.map +1 -1
  55. package/dist/core/jobs/job-executor.js +6 -1
  56. package/dist/core/jobs/job-executor.js.map +1 -1
  57. package/dist/core/jobs/job-scheduler.js +4 -1
  58. package/dist/core/jobs/job-scheduler.js.map +1 -1
  59. package/dist/core/jobs/leader-election.js +2 -1
  60. package/dist/core/jobs/leader-election.js.map +1 -1
  61. package/dist/core/logger/logger.js +41 -18
  62. package/dist/core/logger/logger.js.map +1 -1
  63. package/dist/core/logger/outputs.js +9 -3
  64. package/dist/core/logger/outputs.js.map +1 -1
  65. package/dist/core/mail/adapters/console-adapter.d.ts +14 -0
  66. package/dist/core/mail/adapters/console-adapter.js +89 -0
  67. package/dist/core/mail/adapters/console-adapter.js.map +1 -0
  68. package/dist/core/mail/adapters/index.d.ts +5 -0
  69. package/dist/core/mail/adapters/index.js +8 -0
  70. package/dist/core/mail/adapters/index.js.map +1 -0
  71. package/dist/core/mail/adapters/nodemailer-adapter.d.ts +18 -0
  72. package/dist/core/mail/adapters/nodemailer-adapter.js +188 -0
  73. package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -0
  74. package/dist/core/mail/adapters/resend-adapter.d.ts +18 -0
  75. package/dist/core/mail/adapters/resend-adapter.js +169 -0
  76. package/dist/core/mail/adapters/resend-adapter.js.map +1 -0
  77. package/dist/core/mail/adapters/sendgrid-adapter.d.ts +19 -0
  78. package/dist/core/mail/adapters/sendgrid-adapter.js +186 -0
  79. package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -0
  80. package/dist/core/mail/adapters/ses-adapter.d.ts +18 -0
  81. package/dist/core/mail/adapters/ses-adapter.js +167 -0
  82. package/dist/core/mail/adapters/ses-adapter.js.map +1 -0
  83. package/dist/core/mail/index.d.ts +5 -0
  84. package/dist/core/mail/index.js +8 -0
  85. package/dist/core/mail/index.js.map +1 -0
  86. package/dist/core/mail/mail-adapter.d.ts +62 -0
  87. package/dist/core/mail/mail-adapter.js +83 -0
  88. package/dist/core/mail/mail-adapter.js.map +1 -0
  89. package/dist/core/mail/mail-manager.d.ts +63 -0
  90. package/dist/core/mail/mail-manager.js +302 -0
  91. package/dist/core/mail/mail-manager.js.map +1 -0
  92. package/dist/core/mail/template-engine.d.ts +43 -0
  93. package/dist/core/mail/template-engine.js +239 -0
  94. package/dist/core/mail/template-engine.js.map +1 -0
  95. package/dist/core/mail/types.d.ts +237 -0
  96. package/dist/core/mail/types.js +4 -0
  97. package/dist/core/mail/types.js.map +1 -0
  98. package/dist/core/middleware/built-in/body-size/core.d.ts +12 -0
  99. package/dist/core/middleware/built-in/body-size/core.js +52 -0
  100. package/dist/core/middleware/built-in/body-size/core.js.map +1 -0
  101. package/dist/core/middleware/built-in/body-size/hook.d.ts +2 -0
  102. package/dist/core/middleware/built-in/body-size/hook.js +12 -0
  103. package/dist/core/middleware/built-in/body-size/hook.js.map +1 -0
  104. package/dist/core/middleware/built-in/body-size/index.d.ts +6 -0
  105. package/dist/core/middleware/built-in/body-size/index.js +7 -0
  106. package/dist/core/middleware/built-in/body-size/index.js.map +1 -0
  107. package/dist/core/middleware/built-in/body-size/middleware.d.ts +14 -0
  108. package/dist/core/middleware/built-in/body-size/middleware.js +22 -0
  109. package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -0
  110. package/dist/core/middleware/built-in/cache/core.d.ts +20 -1
  111. package/dist/core/middleware/built-in/cache/core.js.map +1 -1
  112. package/dist/core/middleware/built-in/cache/hook.d.ts +38 -1
  113. package/dist/core/middleware/built-in/cache/hook.js +202 -16
  114. package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
  115. package/dist/core/middleware/built-in/cache/index.js +1 -1
  116. package/dist/core/middleware/built-in/cache/index.js.map +1 -1
  117. package/dist/core/middleware/built-in/compression/core.d.ts +16 -0
  118. package/dist/core/middleware/built-in/compression/core.js +75 -0
  119. package/dist/core/middleware/built-in/compression/core.js.map +1 -0
  120. package/dist/core/middleware/built-in/compression/hook.d.ts +2 -0
  121. package/dist/core/middleware/built-in/compression/hook.js +14 -0
  122. package/dist/core/middleware/built-in/compression/hook.js.map +1 -0
  123. package/dist/core/middleware/built-in/compression/index.d.ts +6 -0
  124. package/dist/core/middleware/built-in/compression/index.js +7 -0
  125. package/dist/core/middleware/built-in/compression/index.js.map +1 -0
  126. package/dist/core/middleware/built-in/compression/middleware.d.ts +20 -0
  127. package/dist/core/middleware/built-in/compression/middleware.js +28 -0
  128. package/dist/core/middleware/built-in/compression/middleware.js.map +1 -0
  129. package/dist/core/middleware/built-in/cookie/core.js +37 -9
  130. package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
  131. package/dist/core/middleware/built-in/helmet/core.d.ts +19 -0
  132. package/dist/core/middleware/built-in/helmet/core.js +70 -0
  133. package/dist/core/middleware/built-in/helmet/core.js.map +1 -0
  134. package/dist/core/middleware/built-in/helmet/hook.d.ts +2 -0
  135. package/dist/core/middleware/built-in/helmet/hook.js +12 -0
  136. package/dist/core/middleware/built-in/helmet/hook.js.map +1 -0
  137. package/dist/core/middleware/built-in/helmet/index.d.ts +6 -0
  138. package/dist/core/middleware/built-in/helmet/index.js +7 -0
  139. package/dist/core/middleware/built-in/helmet/index.js.map +1 -0
  140. package/dist/core/middleware/built-in/helmet/middleware.d.ts +22 -0
  141. package/dist/core/middleware/built-in/helmet/middleware.js +28 -0
  142. package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -0
  143. package/dist/core/middleware/built-in/http2/core.d.ts +35 -0
  144. package/dist/core/middleware/built-in/http2/core.js +128 -0
  145. package/dist/core/middleware/built-in/http2/core.js.map +1 -0
  146. package/dist/core/middleware/built-in/http2/hook.d.ts +5 -0
  147. package/dist/core/middleware/built-in/http2/hook.js +34 -0
  148. package/dist/core/middleware/built-in/http2/hook.js.map +1 -0
  149. package/dist/core/middleware/built-in/http2/index.d.ts +8 -0
  150. package/dist/core/middleware/built-in/http2/index.js +10 -0
  151. package/dist/core/middleware/built-in/http2/index.js.map +1 -0
  152. package/dist/core/middleware/built-in/http2/middleware.d.ts +20 -0
  153. package/dist/core/middleware/built-in/http2/middleware.js +31 -0
  154. package/dist/core/middleware/built-in/http2/middleware.js.map +1 -0
  155. package/dist/core/middleware/built-in/index.d.ts +18 -0
  156. package/dist/core/middleware/built-in/index.js +28 -0
  157. package/dist/core/middleware/built-in/index.js.map +1 -1
  158. package/dist/core/middleware/built-in/range/core.d.ts +16 -0
  159. package/dist/core/middleware/built-in/range/core.js +112 -0
  160. package/dist/core/middleware/built-in/range/core.js.map +1 -0
  161. package/dist/core/middleware/built-in/range/hook.d.ts +2 -0
  162. package/dist/core/middleware/built-in/range/hook.js +12 -0
  163. package/dist/core/middleware/built-in/range/hook.js.map +1 -0
  164. package/dist/core/middleware/built-in/range/index.d.ts +6 -0
  165. package/dist/core/middleware/built-in/range/index.js +7 -0
  166. package/dist/core/middleware/built-in/range/index.js.map +1 -0
  167. package/dist/core/middleware/built-in/range/middleware.d.ts +21 -0
  168. package/dist/core/middleware/built-in/range/middleware.js +27 -0
  169. package/dist/core/middleware/built-in/range/middleware.js.map +1 -0
  170. package/dist/core/middleware/built-in/session/core.js +14 -1
  171. package/dist/core/middleware/built-in/session/core.js.map +1 -1
  172. package/dist/core/middleware/built-in/static/core.d.ts +20 -0
  173. package/dist/core/middleware/built-in/static/core.js +143 -0
  174. package/dist/core/middleware/built-in/static/core.js.map +1 -0
  175. package/dist/core/middleware/built-in/static/hook.d.ts +2 -0
  176. package/dist/core/middleware/built-in/static/hook.js +12 -0
  177. package/dist/core/middleware/built-in/static/hook.js.map +1 -0
  178. package/dist/core/middleware/built-in/static/index.d.ts +6 -0
  179. package/dist/core/middleware/built-in/static/index.js +7 -0
  180. package/dist/core/middleware/built-in/static/index.js.map +1 -0
  181. package/dist/core/middleware/built-in/static/middleware.d.ts +18 -0
  182. package/dist/core/middleware/built-in/static/middleware.js +26 -0
  183. package/dist/core/middleware/built-in/static/middleware.js.map +1 -0
  184. package/dist/core/middleware/built-in/template/core.d.ts +19 -0
  185. package/dist/core/middleware/built-in/template/core.js +108 -0
  186. package/dist/core/middleware/built-in/template/core.js.map +1 -0
  187. package/dist/core/middleware/built-in/template/hook.d.ts +2 -0
  188. package/dist/core/middleware/built-in/template/hook.js +12 -0
  189. package/dist/core/middleware/built-in/template/hook.js.map +1 -0
  190. package/dist/core/middleware/built-in/template/index.d.ts +6 -0
  191. package/dist/core/middleware/built-in/template/index.js +7 -0
  192. package/dist/core/middleware/built-in/template/index.js.map +1 -0
  193. package/dist/core/middleware/built-in/template/middleware.d.ts +21 -0
  194. package/dist/core/middleware/built-in/template/middleware.js +27 -0
  195. package/dist/core/middleware/built-in/template/middleware.js.map +1 -0
  196. package/dist/core/middleware/built-in/upload/core.d.ts +29 -0
  197. package/dist/core/middleware/built-in/upload/core.js +66 -0
  198. package/dist/core/middleware/built-in/upload/core.js.map +1 -0
  199. package/dist/core/middleware/built-in/upload/hook.d.ts +2 -0
  200. package/dist/core/middleware/built-in/upload/hook.js +25 -0
  201. package/dist/core/middleware/built-in/upload/hook.js.map +1 -0
  202. package/dist/core/middleware/built-in/upload/index.d.ts +6 -0
  203. package/dist/core/middleware/built-in/upload/index.js +7 -0
  204. package/dist/core/middleware/built-in/upload/index.js.map +1 -0
  205. package/dist/core/middleware/built-in/upload/middleware.d.ts +18 -0
  206. package/dist/core/middleware/built-in/upload/middleware.js +41 -0
  207. package/dist/core/middleware/built-in/upload/middleware.js.map +1 -0
  208. package/dist/core/middleware/built-in/validation/middleware.js +2 -1
  209. package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
  210. package/dist/core/networking/adapters/uws-adapter.js +54 -6
  211. package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
  212. package/dist/core/networking/adapters/ws-adapter.js +56 -17
  213. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  214. package/dist/core/pooling/object-pool-manager.js +9 -1
  215. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  216. package/dist/core/queue/adapters/bull-adapter.d.ts +86 -0
  217. package/dist/core/queue/adapters/bull-adapter.js +330 -0
  218. package/dist/core/queue/adapters/bull-adapter.js.map +1 -0
  219. package/dist/core/queue/adapters/index.d.ts +9 -0
  220. package/dist/core/queue/adapters/index.js +10 -0
  221. package/dist/core/queue/adapters/index.js.map +1 -0
  222. package/dist/core/queue/adapters/kafka-adapter.d.ts +86 -0
  223. package/dist/core/queue/adapters/kafka-adapter.js +462 -0
  224. package/dist/core/queue/adapters/kafka-adapter.js.map +1 -0
  225. package/dist/core/queue/adapters/memory-adapter.d.ts +87 -0
  226. package/dist/core/queue/adapters/memory-adapter.js +419 -0
  227. package/dist/core/queue/adapters/memory-adapter.js.map +1 -0
  228. package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +86 -0
  229. package/dist/core/queue/adapters/rabbitmq-adapter.js +436 -0
  230. package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -0
  231. package/dist/core/queue/adapters/sqs-adapter.d.ts +102 -0
  232. package/dist/core/queue/adapters/sqs-adapter.js +522 -0
  233. package/dist/core/queue/adapters/sqs-adapter.js.map +1 -0
  234. package/dist/core/queue/index.d.ts +11 -0
  235. package/dist/core/queue/index.js +14 -0
  236. package/dist/core/queue/index.js.map +1 -0
  237. package/dist/core/queue/middleware/index.d.ts +7 -0
  238. package/dist/core/queue/middleware/index.js +8 -0
  239. package/dist/core/queue/middleware/index.js.map +1 -0
  240. package/dist/core/queue/middleware/monitoring.d.ts +84 -0
  241. package/dist/core/queue/middleware/monitoring.js +145 -0
  242. package/dist/core/queue/middleware/monitoring.js.map +1 -0
  243. package/dist/core/queue/middleware/priority.d.ts +61 -0
  244. package/dist/core/queue/middleware/priority.js +90 -0
  245. package/dist/core/queue/middleware/priority.js.map +1 -0
  246. package/dist/core/queue/middleware/rate-limit.d.ts +34 -0
  247. package/dist/core/queue/middleware/rate-limit.js +109 -0
  248. package/dist/core/queue/middleware/rate-limit.js.map +1 -0
  249. package/dist/core/queue/queue-adapter.d.ts +73 -0
  250. package/dist/core/queue/queue-adapter.js +20 -0
  251. package/dist/core/queue/queue-adapter.js.map +1 -0
  252. package/dist/core/queue/queue-manager.d.ts +92 -0
  253. package/dist/core/queue/queue-manager.js +327 -0
  254. package/dist/core/queue/queue-manager.js.map +1 -0
  255. package/dist/core/queue/types.d.ts +205 -0
  256. package/dist/core/queue/types.js +6 -0
  257. package/dist/core/queue/types.js.map +1 -0
  258. package/dist/core/routing/index.js +41 -10
  259. package/dist/core/routing/index.js.map +1 -1
  260. package/dist/core/routing/radix-tree.d.ts +48 -0
  261. package/dist/core/routing/radix-tree.js +211 -0
  262. package/dist/core/routing/radix-tree.js.map +1 -0
  263. package/dist/core/routing/router.d.ts +10 -9
  264. package/dist/core/routing/router.js +3 -1
  265. package/dist/core/routing/router.js.map +1 -1
  266. package/dist/core/routing/unified-router.d.ts +18 -12
  267. package/dist/core/routing/unified-router.js +220 -163
  268. package/dist/core/routing/unified-router.js.map +1 -1
  269. package/dist/core/runtime/aws-lambda-adapter.js +21 -10
  270. package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
  271. package/dist/core/runtime/base-adapter.js +15 -5
  272. package/dist/core/runtime/base-adapter.js.map +1 -1
  273. package/dist/core/runtime/cloudflare-workers-adapter.js +35 -12
  274. package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
  275. package/dist/core/runtime/vercel-edge-adapter.js +16 -6
  276. package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
  277. package/dist/core/utilities/container.js +3 -1
  278. package/dist/core/utilities/container.js.map +1 -1
  279. package/dist/core/utilities/index.d.ts +2 -0
  280. package/dist/core/utilities/index.js +2 -0
  281. package/dist/core/utilities/index.js.map +1 -1
  282. package/dist/core/utilities/response-helpers.d.ts +280 -0
  283. package/dist/core/utilities/response-helpers.js +359 -0
  284. package/dist/core/utilities/response-helpers.js.map +1 -0
  285. package/dist/core/workers/facade.d.ts +74 -0
  286. package/dist/core/workers/facade.js +98 -0
  287. package/dist/core/workers/facade.js.map +1 -0
  288. package/dist/core/workers/index.d.ts +2 -0
  289. package/dist/core/workers/index.js +6 -0
  290. package/dist/core/workers/index.js.map +1 -0
  291. package/dist/core/workers/worker-manager.d.ts +124 -0
  292. package/dist/core/workers/worker-manager.js +299 -0
  293. package/dist/core/workers/worker-manager.js.map +1 -0
  294. package/dist/core/workers/worker.d.ts +1 -0
  295. package/dist/core/workers/worker.js +225 -0
  296. package/dist/core/workers/worker.js.map +1 -0
  297. package/dist/index.d.ts +10 -2
  298. package/dist/index.js +9 -2
  299. package/dist/index.js.map +1 -1
  300. package/dist/moro.d.ts +345 -13
  301. package/dist/moro.js +820 -221
  302. package/dist/moro.js.map +1 -1
  303. package/dist/types/cache.d.ts +4 -0
  304. package/dist/types/config.d.ts +42 -0
  305. package/dist/types/core.d.ts +18 -1
  306. package/dist/types/http.d.ts +21 -0
  307. package/package.json +98 -24
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Monitoring Middleware for Queue Processing
3
+ * Collects metrics and tracks job performance
4
+ */
5
+ import type { JobHandler } from '../types.js';
6
+ /**
7
+ * Job execution metrics
8
+ */
9
+ export interface JobMetrics {
10
+ jobId: string;
11
+ queueName: string;
12
+ startTime: number;
13
+ endTime?: number;
14
+ duration?: number;
15
+ success: boolean;
16
+ error?: string;
17
+ attemptsMade: number;
18
+ memoryUsage?: NodeJS.MemoryUsage;
19
+ }
20
+ /**
21
+ * Queue metrics collector
22
+ */
23
+ export declare class QueueMetricsCollector {
24
+ private metrics;
25
+ private aggregatedStats;
26
+ /**
27
+ * Record job start
28
+ */
29
+ recordStart(jobId: string, queueName: string, attemptsMade: number): void;
30
+ /**
31
+ * Record job completion
32
+ */
33
+ recordCompletion(jobId: string, success: boolean, error?: string): void;
34
+ /**
35
+ * Get metrics for a specific job
36
+ */
37
+ getJobMetrics(jobId: string): JobMetrics | undefined;
38
+ /**
39
+ * Get aggregated stats for a queue
40
+ */
41
+ getQueueStats(queueName: string): QueueStats | undefined;
42
+ /**
43
+ * Get all queue stats
44
+ */
45
+ getAllStats(): Map<string, QueueStats>;
46
+ /**
47
+ * Clear old metrics (keep last N)
48
+ */
49
+ cleanup(maxMetrics?: number): void;
50
+ /**
51
+ * Update aggregated statistics
52
+ */
53
+ private updateStats;
54
+ }
55
+ /**
56
+ * Aggregated queue statistics
57
+ */
58
+ export interface QueueStats {
59
+ queueName: string;
60
+ totalJobs: number;
61
+ successfulJobs: number;
62
+ failedJobs: number;
63
+ totalDuration: number;
64
+ averageDuration: number;
65
+ minDuration: number;
66
+ maxDuration: number;
67
+ lastUpdated: number;
68
+ }
69
+ /**
70
+ * Monitoring middleware options
71
+ */
72
+ export interface MonitoringOptions {
73
+ collector?: QueueMetricsCollector;
74
+ logMetrics?: boolean;
75
+ trackMemory?: boolean;
76
+ }
77
+ /**
78
+ * Create a monitoring middleware
79
+ */
80
+ export declare function createMonitoringMiddleware<T = any, R = any>(handler: JobHandler<T, R>, options?: MonitoringOptions): JobHandler<T, R>;
81
+ /**
82
+ * Global metrics collector instance
83
+ */
84
+ export declare const globalMetricsCollector: QueueMetricsCollector;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Monitoring Middleware for Queue Processing
3
+ * Collects metrics and tracks job performance
4
+ */
5
+ /**
6
+ * Queue metrics collector
7
+ */
8
+ export class QueueMetricsCollector {
9
+ metrics = new Map();
10
+ aggregatedStats = new Map();
11
+ /**
12
+ * Record job start
13
+ */
14
+ recordStart(jobId, queueName, attemptsMade) {
15
+ this.metrics.set(jobId, {
16
+ jobId,
17
+ queueName,
18
+ startTime: Date.now(),
19
+ success: false,
20
+ attemptsMade,
21
+ memoryUsage: process.memoryUsage(),
22
+ });
23
+ }
24
+ /**
25
+ * Record job completion
26
+ */
27
+ recordCompletion(jobId, success, error) {
28
+ const metric = this.metrics.get(jobId);
29
+ if (!metric) {
30
+ return;
31
+ }
32
+ metric.endTime = Date.now();
33
+ metric.duration = metric.endTime - metric.startTime;
34
+ metric.success = success;
35
+ metric.error = error;
36
+ // Update aggregated stats
37
+ this.updateStats(metric);
38
+ }
39
+ /**
40
+ * Get metrics for a specific job
41
+ */
42
+ getJobMetrics(jobId) {
43
+ return this.metrics.get(jobId);
44
+ }
45
+ /**
46
+ * Get aggregated stats for a queue
47
+ */
48
+ getQueueStats(queueName) {
49
+ return this.aggregatedStats.get(queueName);
50
+ }
51
+ /**
52
+ * Get all queue stats
53
+ */
54
+ getAllStats() {
55
+ return new Map(this.aggregatedStats);
56
+ }
57
+ /**
58
+ * Clear old metrics (keep last N)
59
+ */
60
+ cleanup(maxMetrics = 1000) {
61
+ if (this.metrics.size <= maxMetrics) {
62
+ return;
63
+ }
64
+ const metricsArray = Array.from(this.metrics.entries());
65
+ const toKeep = metricsArray.slice(-maxMetrics);
66
+ this.metrics = new Map(toKeep);
67
+ }
68
+ /**
69
+ * Update aggregated statistics
70
+ */
71
+ updateStats(metric) {
72
+ const queueName = metric.queueName;
73
+ let stats = this.aggregatedStats.get(queueName);
74
+ if (!stats) {
75
+ stats = {
76
+ queueName,
77
+ totalJobs: 0,
78
+ successfulJobs: 0,
79
+ failedJobs: 0,
80
+ totalDuration: 0,
81
+ averageDuration: 0,
82
+ minDuration: Infinity,
83
+ maxDuration: 0,
84
+ lastUpdated: Date.now(),
85
+ };
86
+ this.aggregatedStats.set(queueName, stats);
87
+ }
88
+ stats.totalJobs++;
89
+ if (metric.success) {
90
+ stats.successfulJobs++;
91
+ }
92
+ else {
93
+ stats.failedJobs++;
94
+ }
95
+ if (metric.duration !== undefined) {
96
+ stats.totalDuration += metric.duration;
97
+ stats.averageDuration = stats.totalDuration / stats.totalJobs;
98
+ stats.minDuration = Math.min(stats.minDuration, metric.duration);
99
+ stats.maxDuration = Math.max(stats.maxDuration, metric.duration);
100
+ }
101
+ stats.lastUpdated = Date.now();
102
+ }
103
+ }
104
+ /**
105
+ * Create a monitoring middleware
106
+ */
107
+ export function createMonitoringMiddleware(handler, options = {}) {
108
+ const collector = options.collector || new QueueMetricsCollector();
109
+ return async (job) => {
110
+ // Record start
111
+ collector.recordStart(job.id, job.name, job.attemptsMade);
112
+ const startTime = Date.now();
113
+ const startMemory = options.trackMemory ? process.memoryUsage() : null;
114
+ try {
115
+ const result = await handler(job);
116
+ // Record success
117
+ collector.recordCompletion(job.id, true);
118
+ if (options.logMetrics) {
119
+ const duration = Date.now() - startTime;
120
+ job.log(`Job completed in ${duration}ms`);
121
+ if (startMemory && options.trackMemory) {
122
+ const endMemory = process.memoryUsage();
123
+ const heapDiff = endMemory.heapUsed - startMemory.heapUsed;
124
+ job.log(`Heap usage: ${(heapDiff / 1024 / 1024).toFixed(2)}MB`);
125
+ }
126
+ }
127
+ return result;
128
+ }
129
+ catch (error) {
130
+ // Record failure
131
+ const errorMessage = error instanceof Error ? error.message : String(error);
132
+ collector.recordCompletion(job.id, false, errorMessage);
133
+ if (options.logMetrics) {
134
+ const duration = Date.now() - startTime;
135
+ job.log(`Job failed after ${duration}ms: ${errorMessage}`);
136
+ }
137
+ throw error;
138
+ }
139
+ };
140
+ }
141
+ /**
142
+ * Global metrics collector instance
143
+ */
144
+ export const globalMetricsCollector = new QueueMetricsCollector();
145
+ //# sourceMappingURL=monitoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../../../../src/core/queue/middleware/monitoring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Priority Handling Middleware for Queue Processing
3
+ * Manages job priority and execution order
4
+ */
5
+ import type { JobHandler } from '../types.js';
6
+ /**
7
+ * Priority levels
8
+ */
9
+ export declare enum Priority {
10
+ CRITICAL = 1,
11
+ HIGH = 2,
12
+ NORMAL = 3,
13
+ LOW = 4,
14
+ VERY_LOW = 5
15
+ }
16
+ /**
17
+ * Priority middleware options
18
+ */
19
+ export interface PriorityOptions {
20
+ defaultPriority?: Priority;
21
+ logPriority?: boolean;
22
+ }
23
+ /**
24
+ * Create a priority-aware job handler
25
+ */
26
+ export declare function createPriorityMiddleware<T = any, R = any>(handler: JobHandler<T, R>, options?: PriorityOptions): JobHandler<T, R>;
27
+ /**
28
+ * Priority queue helper
29
+ * Sorts jobs by priority before processing
30
+ */
31
+ export declare class PriorityQueue<T> {
32
+ private items;
33
+ /**
34
+ * Add an item to the priority queue
35
+ */
36
+ enqueue(value: T, priority?: number): void;
37
+ /**
38
+ * Remove and return the highest priority item
39
+ */
40
+ dequeue(): T | undefined;
41
+ /**
42
+ * Peek at the highest priority item without removing it
43
+ */
44
+ peek(): T | undefined;
45
+ /**
46
+ * Get queue size
47
+ */
48
+ size(): number;
49
+ /**
50
+ * Check if queue is empty
51
+ */
52
+ isEmpty(): boolean;
53
+ /**
54
+ * Clear all items
55
+ */
56
+ clear(): void;
57
+ /**
58
+ * Get all items sorted by priority
59
+ */
60
+ toArray(): T[];
61
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Priority Handling Middleware for Queue Processing
3
+ * Manages job priority and execution order
4
+ */
5
+ /**
6
+ * Priority levels
7
+ */
8
+ export var Priority;
9
+ (function (Priority) {
10
+ Priority[Priority["CRITICAL"] = 1] = "CRITICAL";
11
+ Priority[Priority["HIGH"] = 2] = "HIGH";
12
+ Priority[Priority["NORMAL"] = 3] = "NORMAL";
13
+ Priority[Priority["LOW"] = 4] = "LOW";
14
+ Priority[Priority["VERY_LOW"] = 5] = "VERY_LOW";
15
+ })(Priority || (Priority = {}));
16
+ /**
17
+ * Create a priority-aware job handler
18
+ */
19
+ export function createPriorityMiddleware(handler, options = {}) {
20
+ return async (job) => {
21
+ const priority = job.opts.priority || options.defaultPriority || Priority.NORMAL;
22
+ if (options.logPriority) {
23
+ const priorityName = Priority[priority] || 'UNKNOWN';
24
+ job.log(`Processing job with priority: ${priorityName} (${priority})`);
25
+ }
26
+ return await handler(job);
27
+ };
28
+ }
29
+ /**
30
+ * Priority queue helper
31
+ * Sorts jobs by priority before processing
32
+ */
33
+ export class PriorityQueue {
34
+ items = [];
35
+ /**
36
+ * Add an item to the priority queue
37
+ */
38
+ enqueue(value, priority = Priority.NORMAL) {
39
+ const item = { priority, value };
40
+ // Find correct position based on priority
41
+ let added = false;
42
+ for (let i = 0; i < this.items.length; i++) {
43
+ if (item.priority < this.items[i].priority) {
44
+ this.items.splice(i, 0, item);
45
+ added = true;
46
+ break;
47
+ }
48
+ }
49
+ if (!added) {
50
+ this.items.push(item);
51
+ }
52
+ }
53
+ /**
54
+ * Remove and return the highest priority item
55
+ */
56
+ dequeue() {
57
+ return this.items.shift()?.value;
58
+ }
59
+ /**
60
+ * Peek at the highest priority item without removing it
61
+ */
62
+ peek() {
63
+ return this.items[0]?.value;
64
+ }
65
+ /**
66
+ * Get queue size
67
+ */
68
+ size() {
69
+ return this.items.length;
70
+ }
71
+ /**
72
+ * Check if queue is empty
73
+ */
74
+ isEmpty() {
75
+ return this.items.length === 0;
76
+ }
77
+ /**
78
+ * Clear all items
79
+ */
80
+ clear() {
81
+ this.items = [];
82
+ }
83
+ /**
84
+ * Get all items sorted by priority
85
+ */
86
+ toArray() {
87
+ return this.items.map(item => item.value);
88
+ }
89
+ }
90
+ //# sourceMappingURL=priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.js","sourceRoot":"","sources":["../../../../src/core/queue/middleware/priority.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,+CAAY,CAAA;IACZ,uCAAQ,CAAA;IACR,2CAAU,CAAA;IACV,qCAAO,CAAA;IACP,+CAAY,CAAA;AACd,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAUD;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAyB,EACzB,UAA2B,EAAE;IAE7B,OAAO,KAAK,EAAE,GAAkB,EAAc,EAAE;QAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,eAAe,IAAI,QAAQ,CAAC,MAAM,CAAC;QAEjF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,iCAAiC,YAAY,KAAK,QAAQ,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAA0C,EAAE,CAAC;IAE1D;;OAEG;IACH,OAAO,CAAC,KAAQ,EAAE,WAAmB,QAAQ,CAAC,MAAM;QAClD,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEjC,0CAA0C;QAC1C,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC9B,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Rate Limiting Middleware for Queue Processing
3
+ * Limits the rate at which jobs are processed
4
+ */
5
+ import type { JobHandler } from '../types.js';
6
+ /**
7
+ * Rate limiter configuration
8
+ */
9
+ export interface RateLimiterOptions {
10
+ max: number;
11
+ duration: number;
12
+ throwOnLimit?: boolean;
13
+ }
14
+ /**
15
+ * Create a rate-limited job handler
16
+ */
17
+ export declare function createRateLimitMiddleware<T = any, R = any>(handler: JobHandler<T, R>, options: RateLimiterOptions): JobHandler<T, R>;
18
+ /**
19
+ * Rate limiter factory for queue configuration
20
+ */
21
+ export declare class RateLimiter {
22
+ /**
23
+ * Create a rate limiter that allows X jobs per second
24
+ */
25
+ static perSecond(max: number): RateLimiterOptions;
26
+ /**
27
+ * Create a rate limiter that allows X jobs per minute
28
+ */
29
+ static perMinute(max: number): RateLimiterOptions;
30
+ /**
31
+ * Create a rate limiter that allows X jobs per hour
32
+ */
33
+ static perHour(max: number): RateLimiterOptions;
34
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Rate Limiting Middleware for Queue Processing
3
+ * Limits the rate at which jobs are processed
4
+ */
5
+ /**
6
+ * Token bucket implementation for rate limiting
7
+ */
8
+ class TokenBucket {
9
+ max;
10
+ refillRate;
11
+ tokens;
12
+ lastRefill;
13
+ constructor(max, refillRate) {
14
+ this.max = max;
15
+ this.refillRate = refillRate;
16
+ this.tokens = max;
17
+ this.lastRefill = Date.now();
18
+ }
19
+ /**
20
+ * Try to consume a token
21
+ */
22
+ consume() {
23
+ this.refill();
24
+ if (this.tokens >= 1) {
25
+ this.tokens -= 1;
26
+ return true;
27
+ }
28
+ return false;
29
+ }
30
+ /**
31
+ * Refill tokens based on time elapsed
32
+ */
33
+ refill() {
34
+ const now = Date.now();
35
+ const elapsed = now - this.lastRefill;
36
+ const tokensToAdd = (elapsed / 1000) * this.refillRate;
37
+ if (tokensToAdd > 0) {
38
+ this.tokens = Math.min(this.max, this.tokens + tokensToAdd);
39
+ this.lastRefill = now;
40
+ }
41
+ }
42
+ /**
43
+ * Get time until next token is available (in ms)
44
+ */
45
+ getWaitTime() {
46
+ if (this.tokens >= 1) {
47
+ return 0;
48
+ }
49
+ const tokensNeeded = 1 - this.tokens;
50
+ return (tokensNeeded / this.refillRate) * 1000;
51
+ }
52
+ }
53
+ /**
54
+ * Create a rate-limited job handler
55
+ */
56
+ export function createRateLimitMiddleware(handler, options) {
57
+ const refillRate = options.max / (options.duration / 1000);
58
+ const bucket = new TokenBucket(options.max, refillRate);
59
+ return async (job) => {
60
+ // Try to consume a token
61
+ if (!bucket.consume()) {
62
+ if (options.throwOnLimit) {
63
+ throw new Error('Rate limit exceeded');
64
+ }
65
+ // Wait for next token
66
+ const waitTime = bucket.getWaitTime();
67
+ job.log(`Rate limit reached, waiting ${Math.ceil(waitTime)}ms`);
68
+ await new Promise(resolve => setTimeout(resolve, waitTime));
69
+ // Try again after waiting
70
+ if (!bucket.consume()) {
71
+ throw new Error('Rate limit still exceeded after waiting');
72
+ }
73
+ }
74
+ return await handler(job);
75
+ };
76
+ }
77
+ /**
78
+ * Rate limiter factory for queue configuration
79
+ */
80
+ export class RateLimiter {
81
+ /**
82
+ * Create a rate limiter that allows X jobs per second
83
+ */
84
+ static perSecond(max) {
85
+ return {
86
+ max,
87
+ duration: 1000,
88
+ };
89
+ }
90
+ /**
91
+ * Create a rate limiter that allows X jobs per minute
92
+ */
93
+ static perMinute(max) {
94
+ return {
95
+ max,
96
+ duration: 60000,
97
+ };
98
+ }
99
+ /**
100
+ * Create a rate limiter that allows X jobs per hour
101
+ */
102
+ static perHour(max) {
103
+ return {
104
+ max,
105
+ duration: 3600000,
106
+ };
107
+ }
108
+ }
109
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../../src/core/queue/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Base Queue Adapter Interface
3
+ * Defines the contract that all queue adapters must implement
4
+ */
5
+ import type { IQueueAdapter, Job, JobOptions, JobHandler, JobStatus, QueueMetrics, BulkJobData } from './types.js';
6
+ /**
7
+ * Abstract base class for queue adapters
8
+ * Provides common functionality and enforces interface implementation
9
+ */
10
+ export declare abstract class QueueAdapter implements IQueueAdapter {
11
+ abstract name: string;
12
+ isReady: boolean;
13
+ /**
14
+ * Initialize the queue adapter
15
+ */
16
+ abstract initialize(): Promise<void>;
17
+ /**
18
+ * Add a single job to the queue
19
+ */
20
+ abstract addJob<T = any>(queueName: string, data: T, options?: JobOptions): Promise<Job<T>>;
21
+ /**
22
+ * Add multiple jobs to the queue in bulk
23
+ */
24
+ abstract addBulkJobs<T = any>(queueName: string, jobs: BulkJobData<T>[]): Promise<Job<T>[]>;
25
+ /**
26
+ * Register a processor for the queue
27
+ */
28
+ abstract process<T = any, R = any>(queueName: string, concurrency: number, handler: JobHandler<T, R>): Promise<void>;
29
+ /**
30
+ * Get a specific job by ID
31
+ */
32
+ abstract getJob(queueName: string, jobId: string): Promise<Job | null>;
33
+ /**
34
+ * Get jobs by status
35
+ */
36
+ abstract getJobs(queueName: string, status?: JobStatus, start?: number, end?: number): Promise<Job[]>;
37
+ /**
38
+ * Remove a job from the queue
39
+ */
40
+ abstract removeJob(queueName: string, jobId: string): Promise<void>;
41
+ /**
42
+ * Retry a failed job
43
+ */
44
+ abstract retryJob(queueName: string, jobId: string): Promise<void>;
45
+ /**
46
+ * Pause the queue
47
+ */
48
+ abstract pauseQueue(queueName: string): Promise<void>;
49
+ /**
50
+ * Resume the queue
51
+ */
52
+ abstract resumeQueue(queueName: string): Promise<void>;
53
+ /**
54
+ * Get queue metrics
55
+ */
56
+ abstract getMetrics(queueName: string): Promise<QueueMetrics>;
57
+ /**
58
+ * Clean old jobs from the queue
59
+ */
60
+ abstract clean(queueName: string, gracePeriod: number, status?: JobStatus): Promise<void>;
61
+ /**
62
+ * Completely remove a queue and all its data
63
+ */
64
+ abstract obliterate(queueName: string): Promise<void>;
65
+ /**
66
+ * Close the adapter and cleanup resources
67
+ */
68
+ abstract close(): Promise<void>;
69
+ /**
70
+ * Helper to ensure the adapter is initialized
71
+ */
72
+ protected ensureReady(): void;
73
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Base Queue Adapter Interface
3
+ * Defines the contract that all queue adapters must implement
4
+ */
5
+ /**
6
+ * Abstract base class for queue adapters
7
+ * Provides common functionality and enforces interface implementation
8
+ */
9
+ export class QueueAdapter {
10
+ isReady = false;
11
+ /**
12
+ * Helper to ensure the adapter is initialized
13
+ */
14
+ ensureReady() {
15
+ if (!this.isReady) {
16
+ throw new Error(`Queue adapter ${this.name} is not initialized`);
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=queue-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-adapter.js","sourceRoot":"","sources":["../../../src/core/queue/queue-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;;GAGG;AACH,MAAM,OAAgB,YAAY;IAEzB,OAAO,GAAY,KAAK,CAAC;IAiFhC;;OAEG;IACO,WAAW;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,qBAAqB,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF"}