@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.
- package/README.md +3 -1
- package/dist/core/auth/morojs-adapter.js +16 -6
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-sources.js +27 -15
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.js +201 -6
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/docs/openapi-generator.js +8 -9
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/events/event-bus.js +1 -1
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/framework.d.ts +4 -2
- package/dist/core/framework.js +25 -24
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/core.js +34 -8
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/grpc/adapters/grpc-js-adapter.d.ts +28 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js +449 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -0
- package/dist/core/grpc/adapters/index.d.ts +1 -0
- package/dist/core/grpc/adapters/index.js +6 -0
- package/dist/core/grpc/adapters/index.js.map +1 -0
- package/dist/core/grpc/grpc-adapter.d.ts +47 -0
- package/dist/core/grpc/grpc-adapter.js +4 -0
- package/dist/core/grpc/grpc-adapter.js.map +1 -0
- package/dist/core/grpc/grpc-manager.d.ts +59 -0
- package/dist/core/grpc/grpc-manager.js +218 -0
- package/dist/core/grpc/grpc-manager.js.map +1 -0
- package/dist/core/grpc/index.d.ts +7 -0
- package/dist/core/grpc/index.js +10 -0
- package/dist/core/grpc/index.js.map +1 -0
- package/dist/core/grpc/middleware/auth.d.ts +22 -0
- package/dist/core/grpc/middleware/auth.js +126 -0
- package/dist/core/grpc/middleware/auth.js.map +1 -0
- package/dist/core/grpc/middleware/logging.d.ts +19 -0
- package/dist/core/grpc/middleware/logging.js +57 -0
- package/dist/core/grpc/middleware/logging.js.map +1 -0
- package/dist/core/grpc/middleware/validation.d.ts +18 -0
- package/dist/core/grpc/middleware/validation.js +126 -0
- package/dist/core/grpc/middleware/validation.js.map +1 -0
- package/dist/core/grpc/types.d.ts +233 -0
- package/dist/core/grpc/types.js +36 -0
- package/dist/core/grpc/types.js.map +1 -0
- package/dist/core/http/http-server.d.ts +13 -84
- package/dist/core/http/http-server.js +338 -792
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.d.ts +131 -0
- package/dist/core/http/http2-server.js +936 -0
- package/dist/core/http/http2-server.js.map +1 -0
- package/dist/core/http/index.d.ts +3 -1
- package/dist/core/http/index.js +2 -1
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/uws-http-server.js +154 -26
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/jobs/job-executor.js +6 -1
- package/dist/core/jobs/job-executor.js.map +1 -1
- package/dist/core/jobs/job-scheduler.js +4 -1
- package/dist/core/jobs/job-scheduler.js.map +1 -1
- package/dist/core/jobs/leader-election.js +2 -1
- package/dist/core/jobs/leader-election.js.map +1 -1
- package/dist/core/logger/logger.js +41 -18
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.js +9 -3
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/mail/adapters/console-adapter.d.ts +14 -0
- package/dist/core/mail/adapters/console-adapter.js +89 -0
- package/dist/core/mail/adapters/console-adapter.js.map +1 -0
- package/dist/core/mail/adapters/index.d.ts +5 -0
- package/dist/core/mail/adapters/index.js +8 -0
- package/dist/core/mail/adapters/index.js.map +1 -0
- package/dist/core/mail/adapters/nodemailer-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/nodemailer-adapter.js +188 -0
- package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -0
- package/dist/core/mail/adapters/resend-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/resend-adapter.js +169 -0
- package/dist/core/mail/adapters/resend-adapter.js.map +1 -0
- package/dist/core/mail/adapters/sendgrid-adapter.d.ts +19 -0
- package/dist/core/mail/adapters/sendgrid-adapter.js +186 -0
- package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -0
- package/dist/core/mail/adapters/ses-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/ses-adapter.js +167 -0
- package/dist/core/mail/adapters/ses-adapter.js.map +1 -0
- package/dist/core/mail/index.d.ts +5 -0
- package/dist/core/mail/index.js +8 -0
- package/dist/core/mail/index.js.map +1 -0
- package/dist/core/mail/mail-adapter.d.ts +62 -0
- package/dist/core/mail/mail-adapter.js +83 -0
- package/dist/core/mail/mail-adapter.js.map +1 -0
- package/dist/core/mail/mail-manager.d.ts +63 -0
- package/dist/core/mail/mail-manager.js +302 -0
- package/dist/core/mail/mail-manager.js.map +1 -0
- package/dist/core/mail/template-engine.d.ts +43 -0
- package/dist/core/mail/template-engine.js +239 -0
- package/dist/core/mail/template-engine.js.map +1 -0
- package/dist/core/mail/types.d.ts +237 -0
- package/dist/core/mail/types.js +4 -0
- package/dist/core/mail/types.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/core.d.ts +12 -0
- package/dist/core/middleware/built-in/body-size/core.js +52 -0
- package/dist/core/middleware/built-in/body-size/core.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/body-size/hook.js +12 -0
- package/dist/core/middleware/built-in/body-size/hook.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/index.d.ts +6 -0
- package/dist/core/middleware/built-in/body-size/index.js +7 -0
- package/dist/core/middleware/built-in/body-size/index.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/middleware.d.ts +14 -0
- package/dist/core/middleware/built-in/body-size/middleware.js +22 -0
- package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cache/core.d.ts +20 -1
- package/dist/core/middleware/built-in/cache/core.js.map +1 -1
- package/dist/core/middleware/built-in/cache/hook.d.ts +38 -1
- package/dist/core/middleware/built-in/cache/hook.js +202 -16
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cache/index.js +1 -1
- package/dist/core/middleware/built-in/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/compression/core.d.ts +16 -0
- package/dist/core/middleware/built-in/compression/core.js +75 -0
- package/dist/core/middleware/built-in/compression/core.js.map +1 -0
- package/dist/core/middleware/built-in/compression/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/compression/hook.js +14 -0
- package/dist/core/middleware/built-in/compression/hook.js.map +1 -0
- package/dist/core/middleware/built-in/compression/index.d.ts +6 -0
- package/dist/core/middleware/built-in/compression/index.js +7 -0
- package/dist/core/middleware/built-in/compression/index.js.map +1 -0
- package/dist/core/middleware/built-in/compression/middleware.d.ts +20 -0
- package/dist/core/middleware/built-in/compression/middleware.js +28 -0
- package/dist/core/middleware/built-in/compression/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/core.js +37 -9
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/core.d.ts +19 -0
- package/dist/core/middleware/built-in/helmet/core.js +70 -0
- package/dist/core/middleware/built-in/helmet/core.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/helmet/hook.js +12 -0
- package/dist/core/middleware/built-in/helmet/hook.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/index.d.ts +6 -0
- package/dist/core/middleware/built-in/helmet/index.js +7 -0
- package/dist/core/middleware/built-in/helmet/index.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/middleware.d.ts +22 -0
- package/dist/core/middleware/built-in/helmet/middleware.js +28 -0
- package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/http2/core.d.ts +35 -0
- package/dist/core/middleware/built-in/http2/core.js +128 -0
- package/dist/core/middleware/built-in/http2/core.js.map +1 -0
- package/dist/core/middleware/built-in/http2/hook.d.ts +5 -0
- package/dist/core/middleware/built-in/http2/hook.js +34 -0
- package/dist/core/middleware/built-in/http2/hook.js.map +1 -0
- package/dist/core/middleware/built-in/http2/index.d.ts +8 -0
- package/dist/core/middleware/built-in/http2/index.js +10 -0
- package/dist/core/middleware/built-in/http2/index.js.map +1 -0
- package/dist/core/middleware/built-in/http2/middleware.d.ts +20 -0
- package/dist/core/middleware/built-in/http2/middleware.js +31 -0
- package/dist/core/middleware/built-in/http2/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +18 -0
- package/dist/core/middleware/built-in/index.js +28 -0
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/range/core.d.ts +16 -0
- package/dist/core/middleware/built-in/range/core.js +112 -0
- package/dist/core/middleware/built-in/range/core.js.map +1 -0
- package/dist/core/middleware/built-in/range/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/range/hook.js +12 -0
- package/dist/core/middleware/built-in/range/hook.js.map +1 -0
- package/dist/core/middleware/built-in/range/index.d.ts +6 -0
- package/dist/core/middleware/built-in/range/index.js +7 -0
- package/dist/core/middleware/built-in/range/index.js.map +1 -0
- package/dist/core/middleware/built-in/range/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/range/middleware.js +27 -0
- package/dist/core/middleware/built-in/range/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/session/core.js +14 -1
- package/dist/core/middleware/built-in/session/core.js.map +1 -1
- package/dist/core/middleware/built-in/static/core.d.ts +20 -0
- package/dist/core/middleware/built-in/static/core.js +143 -0
- package/dist/core/middleware/built-in/static/core.js.map +1 -0
- package/dist/core/middleware/built-in/static/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/static/hook.js +12 -0
- package/dist/core/middleware/built-in/static/hook.js.map +1 -0
- package/dist/core/middleware/built-in/static/index.d.ts +6 -0
- package/dist/core/middleware/built-in/static/index.js +7 -0
- package/dist/core/middleware/built-in/static/index.js.map +1 -0
- package/dist/core/middleware/built-in/static/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/static/middleware.js +26 -0
- package/dist/core/middleware/built-in/static/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/template/core.d.ts +19 -0
- package/dist/core/middleware/built-in/template/core.js +108 -0
- package/dist/core/middleware/built-in/template/core.js.map +1 -0
- package/dist/core/middleware/built-in/template/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/template/hook.js +12 -0
- package/dist/core/middleware/built-in/template/hook.js.map +1 -0
- package/dist/core/middleware/built-in/template/index.d.ts +6 -0
- package/dist/core/middleware/built-in/template/index.js +7 -0
- package/dist/core/middleware/built-in/template/index.js.map +1 -0
- package/dist/core/middleware/built-in/template/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/template/middleware.js +27 -0
- package/dist/core/middleware/built-in/template/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/upload/core.d.ts +29 -0
- package/dist/core/middleware/built-in/upload/core.js +66 -0
- package/dist/core/middleware/built-in/upload/core.js.map +1 -0
- package/dist/core/middleware/built-in/upload/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/upload/hook.js +25 -0
- package/dist/core/middleware/built-in/upload/hook.js.map +1 -0
- package/dist/core/middleware/built-in/upload/index.d.ts +6 -0
- package/dist/core/middleware/built-in/upload/index.js +7 -0
- package/dist/core/middleware/built-in/upload/index.js.map +1 -0
- package/dist/core/middleware/built-in/upload/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/upload/middleware.js +41 -0
- package/dist/core/middleware/built-in/upload/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/validation/middleware.js +2 -1
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.js +54 -6
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.js +56 -17
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.js +9 -1
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/queue/adapters/bull-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/bull-adapter.js +330 -0
- package/dist/core/queue/adapters/bull-adapter.js.map +1 -0
- package/dist/core/queue/adapters/index.d.ts +9 -0
- package/dist/core/queue/adapters/index.js +10 -0
- package/dist/core/queue/adapters/index.js.map +1 -0
- package/dist/core/queue/adapters/kafka-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/kafka-adapter.js +462 -0
- package/dist/core/queue/adapters/kafka-adapter.js.map +1 -0
- package/dist/core/queue/adapters/memory-adapter.d.ts +87 -0
- package/dist/core/queue/adapters/memory-adapter.js +419 -0
- package/dist/core/queue/adapters/memory-adapter.js.map +1 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js +436 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -0
- package/dist/core/queue/adapters/sqs-adapter.d.ts +102 -0
- package/dist/core/queue/adapters/sqs-adapter.js +522 -0
- package/dist/core/queue/adapters/sqs-adapter.js.map +1 -0
- package/dist/core/queue/index.d.ts +11 -0
- package/dist/core/queue/index.js +14 -0
- package/dist/core/queue/index.js.map +1 -0
- package/dist/core/queue/middleware/index.d.ts +7 -0
- package/dist/core/queue/middleware/index.js +8 -0
- package/dist/core/queue/middleware/index.js.map +1 -0
- package/dist/core/queue/middleware/monitoring.d.ts +84 -0
- package/dist/core/queue/middleware/monitoring.js +145 -0
- package/dist/core/queue/middleware/monitoring.js.map +1 -0
- package/dist/core/queue/middleware/priority.d.ts +61 -0
- package/dist/core/queue/middleware/priority.js +90 -0
- package/dist/core/queue/middleware/priority.js.map +1 -0
- package/dist/core/queue/middleware/rate-limit.d.ts +34 -0
- package/dist/core/queue/middleware/rate-limit.js +109 -0
- package/dist/core/queue/middleware/rate-limit.js.map +1 -0
- package/dist/core/queue/queue-adapter.d.ts +73 -0
- package/dist/core/queue/queue-adapter.js +20 -0
- package/dist/core/queue/queue-adapter.js.map +1 -0
- package/dist/core/queue/queue-manager.d.ts +92 -0
- package/dist/core/queue/queue-manager.js +327 -0
- package/dist/core/queue/queue-manager.js.map +1 -0
- package/dist/core/queue/types.d.ts +205 -0
- package/dist/core/queue/types.js +6 -0
- package/dist/core/queue/types.js.map +1 -0
- package/dist/core/routing/index.js +41 -10
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/radix-tree.d.ts +48 -0
- package/dist/core/routing/radix-tree.js +211 -0
- package/dist/core/routing/radix-tree.js.map +1 -0
- package/dist/core/routing/router.d.ts +10 -9
- package/dist/core/routing/router.js +3 -1
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +18 -12
- package/dist/core/routing/unified-router.js +220 -163
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.js +21 -10
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.js +15 -5
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.js +35 -12
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.js +16 -6
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/container.js +3 -1
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/index.d.ts +2 -0
- package/dist/core/utilities/index.js +2 -0
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/response-helpers.d.ts +280 -0
- package/dist/core/utilities/response-helpers.js +359 -0
- package/dist/core/utilities/response-helpers.js.map +1 -0
- package/dist/core/workers/facade.d.ts +74 -0
- package/dist/core/workers/facade.js +98 -0
- package/dist/core/workers/facade.js.map +1 -0
- package/dist/core/workers/index.d.ts +2 -0
- package/dist/core/workers/index.js +6 -0
- package/dist/core/workers/index.js.map +1 -0
- package/dist/core/workers/worker-manager.d.ts +124 -0
- package/dist/core/workers/worker-manager.js +299 -0
- package/dist/core/workers/worker-manager.js.map +1 -0
- package/dist/core/workers/worker.d.ts +1 -0
- package/dist/core/workers/worker.js +225 -0
- package/dist/core/workers/worker.js.map +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +345 -13
- package/dist/moro.js +820 -221
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +4 -0
- package/dist/types/config.d.ts +42 -0
- package/dist/types/core.d.ts +18 -1
- package/dist/types/http.d.ts +21 -0
- 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"}
|