@archlast/server 0.1.7 → 0.1.9
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/LICENSE +21 -21
- package/README.md +14 -10
- package/dist/admin/auth.d.ts +24 -5
- package/dist/admin/auth.js +49 -25
- package/dist/admin/schema.d.ts +122 -32
- package/dist/admin/schema.js +131 -95
- package/dist/admin/seed.d.ts +1 -1
- package/dist/admin/seed.js +79 -47
- package/dist/auth/api-key-resolver.d.ts +1 -1
- package/dist/auth/api-key-resolver.js +7 -3
- package/dist/auth/archlast-auth-adapter.d.ts +2 -5
- package/dist/auth/archlast-auth-adapter.js +1 -1
- package/dist/auth/better-auth-adapter.d.ts.map +1 -1
- package/dist/auth/better-auth-adapter.js +41 -26
- package/dist/auth/better-auth-adapter.js.map +1 -1
- package/dist/auth/better-auth-admin.d.ts.map +1 -1
- package/dist/auth/better-auth-admin.js +1 -1
- package/dist/auth/better-auth-admin.js.map +1 -1
- package/dist/auth/better-auth-api-key-resolver.js +1 -1
- package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
- package/dist/auth/better-auth-instance.d.ts +247 -303
- package/dist/auth/better-auth-instance.d.ts.map +1 -1
- package/dist/auth/better-auth-instance.js +11 -0
- package/dist/auth/better-auth-instance.js.map +1 -1
- package/dist/auth/better-auth-seed.d.ts +5 -2
- package/dist/auth/better-auth-seed.js +31 -22
- package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
- package/dist/auth/better-auth-session-adapter.js +14 -10
- package/dist/auth/better-auth-session-adapter.js.map +1 -1
- package/dist/auth/errors.d.ts.map +1 -1
- package/dist/auth/errors.js +11 -11
- package/dist/auth/errors.js.map +1 -1
- package/dist/auth/oauth-proxy.d.ts +5 -2
- package/dist/auth/oauth-proxy.js +23 -27
- package/dist/auth/resolver.d.ts.map +1 -1
- package/dist/auth/resolver.js.map +1 -1
- package/dist/auth/role-helpers.d.ts +1 -1
- package/dist/auth/role-helpers.d.ts.map +1 -1
- package/dist/auth/role-helpers.js.map +1 -1
- package/dist/auth/session-manager.d.ts +2 -5
- package/dist/auth/session-manager.js +16 -6
- package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
- package/dist/auth/system/better-auth-schema.js +6 -23
- package/dist/auth/system/better-auth-schema.js.map +1 -1
- package/dist/cache/circuit-breaker.d.ts +81 -0
- package/dist/cache/circuit-breaker.d.ts.map +1 -0
- package/dist/cache/circuit-breaker.js +170 -0
- package/dist/cache/circuit-breaker.js.map +1 -0
- package/dist/cache/client.d.ts +6 -3
- package/dist/cache/client.d.ts.map +1 -1
- package/dist/cache/client.js +12 -53
- package/dist/cache/client.js.map +1 -1
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +5 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/invalidation-queue.d.ts +63 -0
- package/dist/cache/invalidation-queue.d.ts.map +1 -0
- package/dist/cache/invalidation-queue.js +196 -0
- package/dist/cache/invalidation-queue.js.map +1 -0
- package/dist/cache/layers.d.ts +14 -4
- package/dist/cache/layers.d.ts.map +1 -1
- package/dist/cache/layers.js +66 -72
- package/dist/cache/layers.js.map +1 -1
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js +6 -41
- package/dist/cache/manager.js.map +1 -1
- package/dist/cache/protocol.d.ts +4 -39
- package/dist/cache/protocol.d.ts.map +1 -1
- package/dist/cache/protocol.js.map +1 -1
- package/dist/cache/redis-adapter.d.ts +103 -0
- package/dist/cache/redis-adapter.d.ts.map +1 -0
- package/dist/cache/redis-adapter.js +424 -0
- package/dist/cache/redis-adapter.js.map +1 -0
- package/dist/cache/run-sidecar.js +10 -1
- package/dist/cache/run-sidecar.js.map +1 -1
- package/dist/cache/sidecar-server.d.ts +51 -1
- package/dist/cache/sidecar-server.d.ts.map +1 -1
- package/dist/cache/sidecar-server.js +368 -22
- package/dist/cache/sidecar-server.js.map +1 -1
- package/dist/cache/store.d.ts +43 -0
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +69 -76
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/strategies.d.ts +2 -9
- package/dist/cache/strategies.d.ts.map +1 -1
- package/dist/cache/types.d.ts +130 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +60 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/config/bullmq.d.ts +16 -0
- package/dist/config/bullmq.d.ts.map +1 -0
- package/dist/config/bullmq.js +103 -0
- package/dist/config/bullmq.js.map +1 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +80 -6
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +71 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/config/service.d.ts +54 -4
- package/dist/config/service.d.ts.map +1 -1
- package/dist/config/service.js +56 -2
- package/dist/config/service.js.map +1 -1
- package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
- package/dist/controllers/admin/admin-tokens.controller.js +117 -98
- package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
- package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
- package/dist/controllers/admin/api-keys.controller.js.map +1 -1
- package/dist/controllers/admin/app-users.controller.d.ts +274 -243
- package/dist/controllers/admin/app-users.controller.js +301 -257
- package/dist/controllers/admin/auth.controller.d.ts +260 -236
- package/dist/controllers/admin/auth.controller.js +197 -174
- package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
- package/dist/controllers/admin/backup.controller.js.map +1 -1
- package/dist/controllers/admin/settings.controller.d.ts +1 -1
- package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
- package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
- package/dist/controllers/admin/storage-stats.controller.js +33 -0
- package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
- package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
- package/dist/controllers/admin/tenants.controller.js.map +1 -1
- package/dist/controllers/admin/users.controller.d.ts +1 -1
- package/dist/controllers/admin/users.controller.d.ts.map +1 -1
- package/dist/controllers/admin/users.controller.js.map +1 -1
- package/dist/controllers/auth.controller.d.ts +289 -271
- package/dist/controllers/auth.controller.js +275 -226
- package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
- package/dist/controllers/crud-generator.controller.js +4 -2
- package/dist/controllers/crud-generator.controller.js.map +1 -1
- package/dist/controllers/index.d.ts +1 -1
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/introspection.controller.d.ts +666 -0
- package/dist/controllers/introspection.controller.d.ts.map +1 -1
- package/dist/controllers/introspection.controller.js +628 -0
- package/dist/controllers/introspection.controller.js.map +1 -1
- package/dist/controllers/invite.controller.d.ts +190 -170
- package/dist/controllers/invite.controller.js +183 -164
- package/dist/controllers/mfa.controller.d.ts +205 -183
- package/dist/controllers/mfa.controller.js +131 -111
- package/dist/controllers/otp.controller.d.ts +194 -171
- package/dist/controllers/otp.controller.js +192 -175
- package/dist/controllers/storage.controller.d.ts.map +1 -1
- package/dist/controllers/storage.controller.js.map +1 -1
- package/dist/controllers/system.controller.d.ts +21 -3
- package/dist/controllers/system.controller.d.ts.map +1 -1
- package/dist/controllers/system.controller.js +32 -2
- package/dist/controllers/system.controller.js.map +1 -1
- package/dist/controllers/tenant.controller.d.ts +258 -227
- package/dist/controllers/tenant.controller.js +224 -200
- package/dist/db/cachedclient.d.ts +6 -11
- package/dist/db/cachedclient.d.ts.map +1 -1
- package/dist/db/cachedclient.js +79 -43
- package/dist/db/cachedclient.js.map +1 -1
- package/dist/db/distributed-client.d.ts +79 -24
- package/dist/db/distributed-client.js +23 -24
- package/dist/db/factory.d.ts +3 -8
- package/dist/db/factory.d.ts.map +1 -1
- package/dist/db/factory.js +3 -22
- package/dist/db/factory.js.map +1 -1
- package/dist/db/socket-client.d.ts +7 -0
- package/dist/db/socket-client.d.ts.map +1 -1
- package/dist/db/socket-client.js +140 -11
- package/dist/db/socket-client.js.map +1 -1
- package/dist/deployment/handler.d.ts +10 -2
- package/dist/deployment/handler.d.ts.map +1 -1
- package/dist/deployment/handler.js +103 -21
- package/dist/deployment/handler.js.map +1 -1
- package/dist/deployment/persistence.d.ts.map +1 -1
- package/dist/deployment/persistence.js +6 -1
- package/dist/deployment/persistence.js.map +1 -1
- package/dist/docker/compose.d.ts.map +1 -1
- package/dist/docker/compose.js +76 -0
- package/dist/docker/compose.js.map +1 -1
- package/dist/engine/runner.d.ts.map +1 -1
- package/dist/engine/runner.js +0 -43
- package/dist/engine/runner.js.map +1 -1
- package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
- package/dist/functions/built-in/auth-apikey.js.map +1 -1
- package/dist/functions/built-in/system-cache.d.ts.map +1 -1
- package/dist/functions/built-in/system-cache.js +6 -31
- package/dist/functions/built-in/system-cache.js.map +1 -1
- package/dist/functions/built-in/system-data.d.ts.map +1 -1
- package/dist/functions/built-in/system-data.js +4 -2
- package/dist/functions/built-in/system-data.js.map +1 -1
- package/dist/functions/definition.d.ts.map +1 -1
- package/dist/functions/definition.js +6 -2
- package/dist/functions/definition.js.map +1 -1
- package/dist/http/router.d.ts +1 -0
- package/dist/http/router.d.ts.map +1 -1
- package/dist/http/router.js +14 -3
- package/dist/http/router.js.map +1 -1
- package/dist/http/routes/metrics.d.ts +42 -0
- package/dist/http/routes/metrics.d.ts.map +1 -0
- package/dist/http/routes/metrics.js +29 -0
- package/dist/http/routes/metrics.js.map +1 -0
- package/dist/http/server.d.ts +1 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +63 -22
- package/dist/http/server.js.map +1 -1
- package/dist/ipc/socket-bridge.d.ts +1 -0
- package/dist/ipc/socket-bridge.d.ts.map +1 -1
- package/dist/ipc/socket-bridge.js +5 -1
- package/dist/ipc/socket-bridge.js.map +1 -1
- package/dist/jobs/bullmq-adapter.d.ts +154 -0
- package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
- package/dist/jobs/bullmq-adapter.js +688 -0
- package/dist/jobs/bullmq-adapter.js.map +1 -0
- package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
- package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
- package/dist/jobs/bullmq-circuit-breaker.js +323 -0
- package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
- package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
- package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
- package/dist/jobs/bullmq-dlq-manager.js +325 -0
- package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
- package/dist/jobs/bullmq-metrics.d.ts +104 -0
- package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
- package/dist/jobs/bullmq-metrics.js +323 -0
- package/dist/jobs/bullmq-metrics.js.map +1 -0
- package/dist/jobs/bullmq-priority-service.d.ts +173 -0
- package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
- package/dist/jobs/bullmq-priority-service.js +390 -0
- package/dist/jobs/bullmq-priority-service.js.map +1 -0
- package/dist/jobs/bullmq-scheduler.d.ts +111 -0
- package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
- package/dist/jobs/bullmq-scheduler.js +300 -0
- package/dist/jobs/bullmq-scheduler.js.map +1 -0
- package/dist/jobs/bullmq-worker.d.ts +155 -0
- package/dist/jobs/bullmq-worker.d.ts.map +1 -0
- package/dist/jobs/bullmq-worker.js +651 -0
- package/dist/jobs/bullmq-worker.js.map +1 -0
- package/dist/jobs/circuit-breaker.d.ts +120 -0
- package/dist/jobs/circuit-breaker.d.ts.map +1 -0
- package/dist/jobs/circuit-breaker.js +262 -0
- package/dist/jobs/circuit-breaker.js.map +1 -0
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/queue.d.ts +120 -1
- package/dist/jobs/queue.d.ts.map +1 -1
- package/dist/jobs/queue.js +487 -9
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/redis-connection.d.ts +50 -0
- package/dist/jobs/redis-connection.d.ts.map +1 -0
- package/dist/jobs/redis-connection.js +123 -0
- package/dist/jobs/redis-connection.js.map +1 -0
- package/dist/jobs/run-scheduler.js +163 -10
- package/dist/jobs/run-scheduler.js.map +1 -1
- package/dist/jobs/run-worker.js +101 -9
- package/dist/jobs/run-worker.js.map +1 -1
- package/dist/jobs/worker-thread.d.ts +6 -0
- package/dist/jobs/worker-thread.d.ts.map +1 -1
- package/dist/jobs/worker-thread.js +37 -8
- package/dist/jobs/worker-thread.js.map +1 -1
- package/dist/jobs/worker.d.ts +33 -0
- package/dist/jobs/worker.d.ts.map +1 -1
- package/dist/jobs/worker.js +358 -115
- package/dist/jobs/worker.js.map +1 -1
- package/dist/linq/async-enumerable.d.ts.map +1 -1
- package/dist/linq/async-enumerable.js.map +1 -1
- package/dist/linq/enumerable.d.ts.map +1 -1
- package/dist/linq/enumerable.js +10 -10
- package/dist/linq/enumerable.js.map +1 -1
- package/dist/metrics/collector.d.ts +26 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +103 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/polling/updates.controller.d.ts +57 -0
- package/dist/polling/updates.controller.d.ts.map +1 -0
- package/dist/polling/updates.controller.js +70 -0
- package/dist/polling/updates.controller.js.map +1 -0
- package/dist/repository/db-set.d.ts.map +1 -1
- package/dist/repository/db-set.js +12 -8
- package/dist/repository/db-set.js.map +1 -1
- package/dist/repository/ef-core.d.ts.map +1 -1
- package/dist/repository/ef-core.js +6 -6
- package/dist/repository/ef-core.js.map +1 -1
- package/dist/repository/factory.d.ts +1 -1
- package/dist/repository/factory.d.ts.map +1 -1
- package/dist/repository/factory.js.map +1 -1
- package/dist/repository/interfaces.d.ts.map +1 -1
- package/dist/repository/interfaces.js.map +1 -1
- package/dist/repository/queryable.d.ts.map +1 -1
- package/dist/repository/queryable.js.map +1 -1
- package/dist/rpc/adapter.d.ts.map +1 -1
- package/dist/rpc/adapter.js.map +1 -1
- package/dist/rpc/router.d.ts +2 -2
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/router.js +1 -1
- package/dist/rpc/router.js.map +1 -1
- package/dist/schema/input-types.d.ts +1 -1
- package/dist/schema/input-types.d.ts.map +1 -1
- package/dist/schema/input-types.js +4 -3
- package/dist/schema/input-types.js.map +1 -1
- package/dist/schema/modifiers.d.ts +2 -1
- package/dist/schema/modifiers.d.ts.map +1 -1
- package/dist/schema/modifiers.js +41 -5
- package/dist/schema/modifiers.js.map +1 -1
- package/dist/schema/relationship-types.d.ts +7 -2
- package/dist/schema/relationship-types.js +1 -1
- package/dist/schema/type-helpers.d.ts +35 -0
- package/dist/schema/type-helpers.d.ts.map +1 -1
- package/dist/schema/type-helpers.js +32 -21
- package/dist/schema/type-helpers.js.map +1 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/validators.d.ts +1 -1
- package/dist/schema/validators.d.ts.map +1 -1
- package/dist/schema/validators.js +27 -16
- package/dist/schema/validators.js.map +1 -1
- package/dist/services/admin/app-users.service.d.ts +1 -1
- package/dist/services/admin/app-users.service.js +31 -38
- package/dist/services/admin/auth.service.d.ts +1 -1
- package/dist/services/admin/auth.service.js +11 -5
- package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
- package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
- package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
- package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
- package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
- package/dist/services/admin/backup/StorageStreamer.js +16 -55
- package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
- package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
- package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
- package/dist/services/admin/backup/ZipComposer.js +23 -0
- package/dist/services/admin/backup/ZipComposer.js.map +1 -1
- package/dist/services/admin/backup.service.d.ts.map +1 -1
- package/dist/services/admin/backup.service.js.map +1 -1
- package/dist/services/admin/data.service.d.ts.map +1 -1
- package/dist/services/admin/data.service.js +287 -286
- package/dist/services/admin/data.service.js.map +1 -1
- package/dist/services/admin/tenants.service.d.ts.map +1 -1
- package/dist/services/admin/tenants.service.js.map +1 -1
- package/dist/services/auth.service.d.ts +2 -3
- package/dist/services/auth.service.js +16 -16
- package/dist/services/introspection.service.d.ts.map +1 -1
- package/dist/services/introspection.service.js +6 -3
- package/dist/services/introspection.service.js.map +1 -1
- package/dist/services/invite.service.d.ts +1 -1
- package/dist/services/invite.service.js +17 -15
- package/dist/services/storage.service.d.ts.map +1 -1
- package/dist/services/storage.service.js +35 -4
- package/dist/services/storage.service.js.map +1 -1
- package/dist/services/system.service.d.ts +4 -0
- package/dist/services/system.service.d.ts.map +1 -1
- package/dist/services/system.service.js +43 -1
- package/dist/services/system.service.js.map +1 -1
- package/dist/services/tenant.service.d.ts +1 -1
- package/dist/services/tenant.service.js +43 -31
- package/dist/sse/subscriptions.controller.d.ts +57 -0
- package/dist/sse/subscriptions.controller.d.ts.map +1 -0
- package/dist/sse/subscriptions.controller.js +127 -0
- package/dist/sse/subscriptions.controller.js.map +1 -0
- package/dist/startup/bootstrap.d.ts +13 -2
- package/dist/startup/bootstrap.d.ts.map +1 -1
- package/dist/startup/bootstrap.js +85 -13
- package/dist/startup/bootstrap.js.map +1 -1
- package/dist/storage/s3-backend.d.ts.map +1 -1
- package/dist/storage/s3-backend.js +3 -3
- package/dist/storage/s3-backend.js.map +1 -1
- package/dist/websocket/server.d.ts.map +1 -1
- package/dist/websocket/server.js +14 -3
- package/dist/websocket/server.js.map +1 -1
- package/docker/README.md +299 -1
- package/package.json +5 -1
- package/templates/.env.example +76 -16
- package/templates/archlast.config.js +15 -1
- package/templates/docker-compose.dev.yml +8 -8
- package/templates/docker-compose.prod.yml +29 -12
- package/templates/docker-compose.yml +112 -28
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Queue, Job } from "bullmq";
|
|
2
|
+
import type Redis from "ioredis";
|
|
3
|
+
/**
|
|
4
|
+
* Dead Letter Queue entry with rich metadata
|
|
5
|
+
* Provides comprehensive information about failed jobs beyond BullMQ's built-in failed jobs
|
|
6
|
+
*/
|
|
7
|
+
export interface DLQEntry {
|
|
8
|
+
/** Original job ID reference */
|
|
9
|
+
originalJobId: string;
|
|
10
|
+
/** Name of the queue the job came from */
|
|
11
|
+
queueName: string;
|
|
12
|
+
/** Name of the job handler/function */
|
|
13
|
+
jobName: string;
|
|
14
|
+
/** Original job payload */
|
|
15
|
+
payload: unknown;
|
|
16
|
+
/** Timestamp when job was moved to DLQ */
|
|
17
|
+
deadLetteredAt: number;
|
|
18
|
+
/** Error categorization for filtering and analysis */
|
|
19
|
+
errorCategory: "timeout" | "validation" | "dependency" | "system";
|
|
20
|
+
/** Detailed diagnostic information */
|
|
21
|
+
diagnostics: {
|
|
22
|
+
/** Error message */
|
|
23
|
+
message: string;
|
|
24
|
+
/** Stack trace (if available) */
|
|
25
|
+
stack?: string;
|
|
26
|
+
/** Timestamp when the error occurred */
|
|
27
|
+
timestamp: number;
|
|
28
|
+
/** Number of attempts made before failing */
|
|
29
|
+
attempts: number;
|
|
30
|
+
};
|
|
31
|
+
/** Number of times this entry has been reprocessed */
|
|
32
|
+
reprocessCount: number;
|
|
33
|
+
/** Whether the entry has been archived (marked as reviewed) */
|
|
34
|
+
archived: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for filtering DLQ entries
|
|
38
|
+
*/
|
|
39
|
+
export interface DLQFilterOptions {
|
|
40
|
+
/** Maximum number of entries to return */
|
|
41
|
+
limit?: number;
|
|
42
|
+
/** Number of entries to skip (for pagination) */
|
|
43
|
+
offset?: number;
|
|
44
|
+
/** Filter by error category */
|
|
45
|
+
errorCategory?: string;
|
|
46
|
+
/** Filter by job name */
|
|
47
|
+
jobName?: string;
|
|
48
|
+
/** Filter by archived status */
|
|
49
|
+
archived?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Options for reprocessing a DLQ entry
|
|
53
|
+
*/
|
|
54
|
+
export interface ReprocessOptions {
|
|
55
|
+
/** New maximum attempts for the reprocessed job */
|
|
56
|
+
newMaxAttempts?: number;
|
|
57
|
+
/** Priority for the reprocessed job */
|
|
58
|
+
priority?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* DLQ statistics
|
|
62
|
+
*/
|
|
63
|
+
export interface DLQStatistics {
|
|
64
|
+
/** Total number of entries in DLQ */
|
|
65
|
+
total: number;
|
|
66
|
+
/** Count grouped by error category */
|
|
67
|
+
byCategory: Record<string, number>;
|
|
68
|
+
/** Count grouped by job name */
|
|
69
|
+
byJobName: Record<string, number>;
|
|
70
|
+
/** Number of failures in the last 24 hours */
|
|
71
|
+
recentFailures24h: number;
|
|
72
|
+
/** Timestamp of the oldest failure (null if no entries) */
|
|
73
|
+
oldestFailure: number | null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* BullMQ-based Dead Letter Queue Manager
|
|
77
|
+
* Provides rich metadata and management capabilities for failed jobs
|
|
78
|
+
*/
|
|
79
|
+
export declare class BullMQDLQManager {
|
|
80
|
+
private dlqQueue;
|
|
81
|
+
private mainQueueName;
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new DLQ manager
|
|
84
|
+
* @param mainQueueName - Name of the main queue (DLQ will be {mainQueueName}-dlq)
|
|
85
|
+
* @param connection - Redis connection for BullMQ
|
|
86
|
+
*/
|
|
87
|
+
constructor(mainQueueName: string, connection: Redis);
|
|
88
|
+
/**
|
|
89
|
+
* Add a failed job to the DLQ with rich metadata
|
|
90
|
+
* @param job - The BullMQ job that failed
|
|
91
|
+
* @param error - The error that caused the failure
|
|
92
|
+
* @param errorCategory - Category of the error
|
|
93
|
+
* @returns ID of the created DLQ entry
|
|
94
|
+
*/
|
|
95
|
+
addToDLQ(job: Job, error: Error, errorCategory: DLQEntry["errorCategory"]): Promise<string>;
|
|
96
|
+
/**
|
|
97
|
+
* Get DLQ entries with optional filtering
|
|
98
|
+
* @param options - Filter and pagination options
|
|
99
|
+
* @returns Array of DLQ entries matching the criteria
|
|
100
|
+
*/
|
|
101
|
+
getDLQJobs(options?: DLQFilterOptions): Promise<DLQEntry[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Get a single DLQ entry by ID
|
|
104
|
+
* @param id - DLQ entry ID
|
|
105
|
+
* @returns DLQ entry or null if not found
|
|
106
|
+
*/
|
|
107
|
+
getDLQEntry(id: string): Promise<DLQEntry | null>;
|
|
108
|
+
/**
|
|
109
|
+
* Reprocess a DLQ entry back to the main queue
|
|
110
|
+
* @param dlqEntryId - ID of the DLQ entry to reprocess
|
|
111
|
+
* @param mainQueue - The main BullMQ queue to add the job to
|
|
112
|
+
* @param options - Reprocessing options
|
|
113
|
+
* @returns ID of the new job in the main queue
|
|
114
|
+
*/
|
|
115
|
+
reprocessEntry(dlqEntryId: string, mainQueue: Queue, options?: ReprocessOptions): Promise<string>;
|
|
116
|
+
/**
|
|
117
|
+
* Delete a DLQ entry permanently
|
|
118
|
+
* @param id - ID of the DLQ entry to delete
|
|
119
|
+
*/
|
|
120
|
+
deleteEntry(id: string): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Archive a DLQ entry (mark as reviewed)
|
|
123
|
+
* @param id - ID of the DLQ entry to archive
|
|
124
|
+
*/
|
|
125
|
+
archiveEntry(id: string): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Purge old DLQ entries
|
|
128
|
+
* @param olderThanMs - Age threshold in milliseconds (default: 30 days)
|
|
129
|
+
* @returns Number of entries purged
|
|
130
|
+
*/
|
|
131
|
+
purgeEntries(olderThanMs?: number): Promise<number>;
|
|
132
|
+
/**
|
|
133
|
+
* Get DLQ statistics
|
|
134
|
+
* @returns Statistics about DLQ entries
|
|
135
|
+
*/
|
|
136
|
+
getDLQStats(): Promise<DLQStatistics>;
|
|
137
|
+
/**
|
|
138
|
+
* Map a BullMQ Job to DLQEntry
|
|
139
|
+
* @param job - BullMQ job from the DLQ queue
|
|
140
|
+
* @returns DLQEntry or null if invalid
|
|
141
|
+
*/
|
|
142
|
+
private mapJobToDLQEntry;
|
|
143
|
+
/**
|
|
144
|
+
* Close the DLQ queue connection
|
|
145
|
+
*/
|
|
146
|
+
dispose(): Promise<void>;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Categorize an error based on its message
|
|
150
|
+
* @param error - Error to categorize
|
|
151
|
+
* @returns Error category: 'timeout' | 'validation' | 'dependency' | 'system'
|
|
152
|
+
*/
|
|
153
|
+
export declare function categorizeError(error: Error): DLQEntry["errorCategory"];
|
|
154
|
+
export default BullMQDLQManager;
|
|
155
|
+
//# sourceMappingURL=bullmq-dlq-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bullmq-dlq-manager.d.ts","sourceRoot":"","sources":["../../src/jobs/bullmq-dlq-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BullMQDLQManager = void 0;
|
|
4
|
+
exports.categorizeError = categorizeError;
|
|
5
|
+
const bullmq_1 = require("bullmq");
|
|
6
|
+
const cuid2_1 = require("@paralleldrive/cuid2");
|
|
7
|
+
const logger_js_1 = require("../logging/logger.js");
|
|
8
|
+
/**
|
|
9
|
+
* BullMQ-based Dead Letter Queue Manager
|
|
10
|
+
* Provides rich metadata and management capabilities for failed jobs
|
|
11
|
+
*/
|
|
12
|
+
class BullMQDLQManager {
|
|
13
|
+
dlqQueue;
|
|
14
|
+
mainQueueName;
|
|
15
|
+
/**
|
|
16
|
+
* Creates a new DLQ manager
|
|
17
|
+
* @param mainQueueName - Name of the main queue (DLQ will be {mainQueueName}-dlq)
|
|
18
|
+
* @param connection - Redis connection for BullMQ
|
|
19
|
+
*/
|
|
20
|
+
constructor(mainQueueName, connection) {
|
|
21
|
+
this.mainQueueName = mainQueueName;
|
|
22
|
+
const dlqQueueName = `${mainQueueName}-dlq`;
|
|
23
|
+
this.dlqQueue = new bullmq_1.Queue(dlqQueueName, {
|
|
24
|
+
connection,
|
|
25
|
+
defaultJobOptions: {
|
|
26
|
+
removeOnComplete: false,
|
|
27
|
+
removeOnFail: false,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
logger_js_1.logger.log({
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
level: "info",
|
|
33
|
+
kind: "system",
|
|
34
|
+
message: `[BullMQDLQManager] Initialized DLQ queue: ${dlqQueueName}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Add a failed job to the DLQ with rich metadata
|
|
39
|
+
* @param job - The BullMQ job that failed
|
|
40
|
+
* @param error - The error that caused the failure
|
|
41
|
+
* @param errorCategory - Category of the error
|
|
42
|
+
* @returns ID of the created DLQ entry
|
|
43
|
+
*/
|
|
44
|
+
async addToDLQ(job, error, errorCategory) {
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
const originalJobId = job.id ?? (0, cuid2_1.createId)();
|
|
47
|
+
const dlqEntry = {
|
|
48
|
+
originalJobId,
|
|
49
|
+
queueName: this.mainQueueName,
|
|
50
|
+
jobName: job.name,
|
|
51
|
+
payload: job.data,
|
|
52
|
+
deadLetteredAt: now,
|
|
53
|
+
errorCategory,
|
|
54
|
+
diagnostics: {
|
|
55
|
+
message: error.message,
|
|
56
|
+
stack: error.stack,
|
|
57
|
+
timestamp: now,
|
|
58
|
+
attempts: job.attemptsMade,
|
|
59
|
+
},
|
|
60
|
+
reprocessCount: 0,
|
|
61
|
+
archived: false,
|
|
62
|
+
};
|
|
63
|
+
// Store as BullMQ job in DLQ queue using original job ID for easy lookup
|
|
64
|
+
const dlqJob = await this.dlqQueue.add("dlq-entry", dlqEntry, {
|
|
65
|
+
jobId: originalJobId,
|
|
66
|
+
});
|
|
67
|
+
const dlqEntryId = dlqJob.id ?? originalJobId;
|
|
68
|
+
logger_js_1.logger.log({
|
|
69
|
+
timestamp: Date.now(),
|
|
70
|
+
level: "error",
|
|
71
|
+
kind: "system",
|
|
72
|
+
message: `[BullMQDLQManager] Job added to DLQ: ${dlqEntryId} (${job.name}) - ${errorCategory}: ${error.message}`,
|
|
73
|
+
});
|
|
74
|
+
return dlqEntryId;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get DLQ entries with optional filtering
|
|
78
|
+
* @param options - Filter and pagination options
|
|
79
|
+
* @returns Array of DLQ entries matching the criteria
|
|
80
|
+
*/
|
|
81
|
+
async getDLQJobs(options = {}) {
|
|
82
|
+
const { limit = 100, offset = 0, errorCategory, jobName, archived } = options;
|
|
83
|
+
// Get all DLQ jobs (BullMQ doesn't support offset/limit natively for getJobs)
|
|
84
|
+
const jobs = await this.dlqQueue.getJobs(["waiting", "active", "completed", "failed"]);
|
|
85
|
+
// Map and filter
|
|
86
|
+
let dlqEntries = jobs
|
|
87
|
+
.map((job) => this.mapJobToDLQEntry(job))
|
|
88
|
+
.filter((entry) => entry !== null);
|
|
89
|
+
if (errorCategory) {
|
|
90
|
+
dlqEntries = dlqEntries.filter((entry) => entry.errorCategory === errorCategory);
|
|
91
|
+
}
|
|
92
|
+
if (jobName) {
|
|
93
|
+
dlqEntries = dlqEntries.filter((entry) => entry.jobName === jobName);
|
|
94
|
+
}
|
|
95
|
+
if (archived !== undefined) {
|
|
96
|
+
dlqEntries = dlqEntries.filter((entry) => entry.archived === archived);
|
|
97
|
+
}
|
|
98
|
+
// Sort by deadLetteredAt descending (newest first)
|
|
99
|
+
dlqEntries.sort((a, b) => b.deadLetteredAt - a.deadLetteredAt);
|
|
100
|
+
// Apply pagination
|
|
101
|
+
const paginatedEntries = dlqEntries.slice(offset, offset + limit);
|
|
102
|
+
logger_js_1.logger.log({
|
|
103
|
+
timestamp: Date.now(),
|
|
104
|
+
level: "info",
|
|
105
|
+
kind: "system",
|
|
106
|
+
message: `[BullMQDLQManager] Retrieved ${paginatedEntries.length} DLQ entries (total: ${dlqEntries.length})`,
|
|
107
|
+
});
|
|
108
|
+
return paginatedEntries;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get a single DLQ entry by ID
|
|
112
|
+
* @param id - DLQ entry ID
|
|
113
|
+
* @returns DLQ entry or null if not found
|
|
114
|
+
*/
|
|
115
|
+
async getDLQEntry(id) {
|
|
116
|
+
const job = await this.dlqQueue.getJob(id);
|
|
117
|
+
if (!job)
|
|
118
|
+
return null;
|
|
119
|
+
return this.mapJobToDLQEntry(job);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Reprocess a DLQ entry back to the main queue
|
|
123
|
+
* @param dlqEntryId - ID of the DLQ entry to reprocess
|
|
124
|
+
* @param mainQueue - The main BullMQ queue to add the job to
|
|
125
|
+
* @param options - Reprocessing options
|
|
126
|
+
* @returns ID of the new job in the main queue
|
|
127
|
+
*/
|
|
128
|
+
async reprocessEntry(dlqEntryId, mainQueue, options = {}) {
|
|
129
|
+
// Get DLQ entry
|
|
130
|
+
const dlqJob = await this.dlqQueue.getJob(dlqEntryId);
|
|
131
|
+
if (!dlqJob) {
|
|
132
|
+
throw new Error(`DLQ entry not found: ${dlqEntryId}`);
|
|
133
|
+
}
|
|
134
|
+
const dlqEntry = this.mapJobToDLQEntry(dlqJob);
|
|
135
|
+
if (!dlqEntry) {
|
|
136
|
+
throw new Error(`Invalid DLQ entry data for: ${dlqEntryId}`);
|
|
137
|
+
}
|
|
138
|
+
// Add to main queue with same name and payload
|
|
139
|
+
const newJob = await mainQueue.add(dlqEntry.jobName, dlqEntry.payload, {
|
|
140
|
+
attempts: options.newMaxAttempts ?? 5,
|
|
141
|
+
priority: options.priority,
|
|
142
|
+
});
|
|
143
|
+
const newJobId = newJob.id ?? (0, cuid2_1.createId)();
|
|
144
|
+
// Update reprocess count in DLQ entry
|
|
145
|
+
dlqEntry.reprocessCount++;
|
|
146
|
+
// Note: BullMQ doesn't support updating job data directly in a clean way,
|
|
147
|
+
// so we track the reprocess count in memory. For persistence, we would need
|
|
148
|
+
// to remove and re-add, but that changes the ID.
|
|
149
|
+
logger_js_1.logger.log({
|
|
150
|
+
timestamp: Date.now(),
|
|
151
|
+
level: "info",
|
|
152
|
+
kind: "system",
|
|
153
|
+
message: `[BullMQDLQManager] Reprocessed DLQ entry ${dlqEntryId} -> new job ${newJobId}`,
|
|
154
|
+
});
|
|
155
|
+
return newJobId;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Delete a DLQ entry permanently
|
|
159
|
+
* @param id - ID of the DLQ entry to delete
|
|
160
|
+
*/
|
|
161
|
+
async deleteEntry(id) {
|
|
162
|
+
const job = await this.dlqQueue.getJob(id);
|
|
163
|
+
if (!job) {
|
|
164
|
+
throw new Error(`DLQ entry not found: ${id}`);
|
|
165
|
+
}
|
|
166
|
+
await job.remove();
|
|
167
|
+
logger_js_1.logger.log({
|
|
168
|
+
timestamp: Date.now(),
|
|
169
|
+
level: "info",
|
|
170
|
+
kind: "system",
|
|
171
|
+
message: `[BullMQDLQManager] Deleted DLQ entry: ${id}`,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Archive a DLQ entry (mark as reviewed)
|
|
176
|
+
* @param id - ID of the DLQ entry to archive
|
|
177
|
+
*/
|
|
178
|
+
async archiveEntry(id) {
|
|
179
|
+
const job = await this.dlqQueue.getJob(id);
|
|
180
|
+
if (!job) {
|
|
181
|
+
throw new Error(`DLQ entry not found: ${id}`);
|
|
182
|
+
}
|
|
183
|
+
const entry = job.data;
|
|
184
|
+
entry.archived = true;
|
|
185
|
+
// Note: Similar to reprocess count, we modify in memory
|
|
186
|
+
// A full implementation would need to remove and re-add the job
|
|
187
|
+
logger_js_1.logger.log({
|
|
188
|
+
timestamp: Date.now(),
|
|
189
|
+
level: "info",
|
|
190
|
+
kind: "system",
|
|
191
|
+
message: `[BullMQDLQManager] Archived DLQ entry: ${id}`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Purge old DLQ entries
|
|
196
|
+
* @param olderThanMs - Age threshold in milliseconds (default: 30 days)
|
|
197
|
+
* @returns Number of entries purged
|
|
198
|
+
*/
|
|
199
|
+
async purgeEntries(olderThanMs = 30 * 24 * 60 * 60 * 1000) {
|
|
200
|
+
const now = Date.now();
|
|
201
|
+
const cutoffTime = now - olderThanMs;
|
|
202
|
+
// Get all DLQ jobs
|
|
203
|
+
const jobs = await this.dlqQueue.getJobs(["waiting", "active", "completed", "failed"]);
|
|
204
|
+
// Filter jobs older than cutoff
|
|
205
|
+
const toDelete = jobs.filter((job) => {
|
|
206
|
+
const entry = job.data;
|
|
207
|
+
return entry.deadLetteredAt < cutoffTime;
|
|
208
|
+
});
|
|
209
|
+
// Delete each job
|
|
210
|
+
for (const job of toDelete) {
|
|
211
|
+
await job.remove();
|
|
212
|
+
}
|
|
213
|
+
logger_js_1.logger.log({
|
|
214
|
+
timestamp: Date.now(),
|
|
215
|
+
level: "info",
|
|
216
|
+
kind: "system",
|
|
217
|
+
message: `[BullMQDLQManager] Purged ${toDelete.length} DLQ entries older than ${olderThanMs}ms`,
|
|
218
|
+
});
|
|
219
|
+
return toDelete.length;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get DLQ statistics
|
|
223
|
+
* @returns Statistics about DLQ entries
|
|
224
|
+
*/
|
|
225
|
+
async getDLQStats() {
|
|
226
|
+
const jobs = await this.dlqQueue.getJobs(["waiting", "active", "completed", "failed"]);
|
|
227
|
+
const byCategory = {};
|
|
228
|
+
const byJobName = {};
|
|
229
|
+
const now = Date.now();
|
|
230
|
+
const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;
|
|
231
|
+
let oldestFailure = null;
|
|
232
|
+
let recentFailures24h = 0;
|
|
233
|
+
for (const job of jobs) {
|
|
234
|
+
const entry = job.data;
|
|
235
|
+
// Count by category
|
|
236
|
+
const category = entry.errorCategory ?? "system";
|
|
237
|
+
byCategory[category] = (byCategory[category] ?? 0) + 1;
|
|
238
|
+
// Count by job name
|
|
239
|
+
const name = entry.jobName ?? "unnamed";
|
|
240
|
+
byJobName[name] = (byJobName[name] ?? 0) + 1;
|
|
241
|
+
// Track oldest failure
|
|
242
|
+
const deadLetteredAt = entry.deadLetteredAt ?? now;
|
|
243
|
+
if (oldestFailure === null || deadLetteredAt < oldestFailure) {
|
|
244
|
+
oldestFailure = deadLetteredAt;
|
|
245
|
+
}
|
|
246
|
+
// Count recent failures
|
|
247
|
+
if (deadLetteredAt >= twentyFourHoursAgo) {
|
|
248
|
+
recentFailures24h++;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
total: jobs.length,
|
|
253
|
+
byCategory,
|
|
254
|
+
byJobName,
|
|
255
|
+
recentFailures24h,
|
|
256
|
+
oldestFailure,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Map a BullMQ Job to DLQEntry
|
|
261
|
+
* @param job - BullMQ job from the DLQ queue
|
|
262
|
+
* @returns DLQEntry or null if invalid
|
|
263
|
+
*/
|
|
264
|
+
mapJobToDLQEntry(job) {
|
|
265
|
+
const data = job.data;
|
|
266
|
+
if (!data || typeof data !== "object") {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
originalJobId: data.originalJobId ?? job.id ?? (0, cuid2_1.createId)(),
|
|
271
|
+
queueName: data.queueName ?? this.mainQueueName,
|
|
272
|
+
jobName: data.jobName ?? "unknown",
|
|
273
|
+
payload: data.payload,
|
|
274
|
+
deadLetteredAt: data.deadLetteredAt ?? Date.now(),
|
|
275
|
+
errorCategory: data.errorCategory ?? "system",
|
|
276
|
+
diagnostics: data.diagnostics ?? {
|
|
277
|
+
message: "Unknown error",
|
|
278
|
+
timestamp: Date.now(),
|
|
279
|
+
attempts: 0,
|
|
280
|
+
},
|
|
281
|
+
reprocessCount: data.reprocessCount ?? 0,
|
|
282
|
+
archived: data.archived ?? false,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Close the DLQ queue connection
|
|
287
|
+
*/
|
|
288
|
+
async dispose() {
|
|
289
|
+
await this.dlqQueue.close();
|
|
290
|
+
logger_js_1.logger.log({
|
|
291
|
+
timestamp: Date.now(),
|
|
292
|
+
level: "info",
|
|
293
|
+
kind: "system",
|
|
294
|
+
message: `[BullMQDLQManager] Disposed DLQ queue: ${this.mainQueueName}-dlq`,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
exports.BullMQDLQManager = BullMQDLQManager;
|
|
299
|
+
/**
|
|
300
|
+
* Categorize an error based on its message
|
|
301
|
+
* @param error - Error to categorize
|
|
302
|
+
* @returns Error category: 'timeout' | 'validation' | 'dependency' | 'system'
|
|
303
|
+
*/
|
|
304
|
+
function categorizeError(error) {
|
|
305
|
+
if (!error || !error.message) {
|
|
306
|
+
return "system";
|
|
307
|
+
}
|
|
308
|
+
const message = error.message.toLowerCase();
|
|
309
|
+
// Check for timeout errors
|
|
310
|
+
if (message.includes("timeout") || message.includes("timed out")) {
|
|
311
|
+
return "timeout";
|
|
312
|
+
}
|
|
313
|
+
// Check for validation errors
|
|
314
|
+
if (message.includes("validation") || message.includes("invalid")) {
|
|
315
|
+
return "validation";
|
|
316
|
+
}
|
|
317
|
+
// Check for dependency errors
|
|
318
|
+
if (message.includes("dependency") || message.includes("depends on")) {
|
|
319
|
+
return "dependency";
|
|
320
|
+
}
|
|
321
|
+
// Default to system error
|
|
322
|
+
return "system";
|
|
323
|
+
}
|
|
324
|
+
exports.default = BullMQDLQManager;
|
|
325
|
+
//# sourceMappingURL=bullmq-dlq-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bullmq-dlq-manager.js","sourceRoot":"","sources":["../../src/jobs/bullmq-dlq-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { Redis } from "ioredis";
|
|
2
|
+
import { Registry } from "prom-client";
|
|
3
|
+
/**
|
|
4
|
+
* Metrics data structure for BullMQ queue operations
|
|
5
|
+
*/
|
|
6
|
+
export interface BullMQMetrics {
|
|
7
|
+
jobsCompleted: number;
|
|
8
|
+
jobsFailed: number;
|
|
9
|
+
jobsDelayed: number;
|
|
10
|
+
jobsStalled: number;
|
|
11
|
+
processingTimeMs: number[];
|
|
12
|
+
queueWaitTimeMs: number[];
|
|
13
|
+
pendingJobs: number;
|
|
14
|
+
activeJobs: number;
|
|
15
|
+
completedJobs: number;
|
|
16
|
+
failedJobs: number;
|
|
17
|
+
delayedJobs: number;
|
|
18
|
+
errorTypes: Record<string, number>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for the BullMQMetricsCollector
|
|
22
|
+
*/
|
|
23
|
+
export interface BullMQMetricsCollectorOptions {
|
|
24
|
+
/** Prometheus registry to register metrics with */
|
|
25
|
+
prometheusRegistry?: Registry;
|
|
26
|
+
/** Enable histogram collection for timing metrics */
|
|
27
|
+
enableHistograms?: boolean;
|
|
28
|
+
/** Interval in ms for updating gauge values (default: 10000) */
|
|
29
|
+
gaugeUpdateIntervalMs?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Collects metrics from BullMQ queues and exports to Prometheus.
|
|
33
|
+
* Tracks job lifecycle events, processing times, and queue state.
|
|
34
|
+
*/
|
|
35
|
+
export declare class BullMQMetricsCollector {
|
|
36
|
+
private queueEvents;
|
|
37
|
+
private metrics;
|
|
38
|
+
private startTimes;
|
|
39
|
+
private queue;
|
|
40
|
+
private gaugeUpdateInterval;
|
|
41
|
+
private options;
|
|
42
|
+
private prometheusMetrics;
|
|
43
|
+
constructor(queueName: string, connection: Redis, options?: BullMQMetricsCollectorOptions);
|
|
44
|
+
/**
|
|
45
|
+
* Creates an empty metrics object with initial values
|
|
46
|
+
*/
|
|
47
|
+
private createEmptyMetrics;
|
|
48
|
+
/**
|
|
49
|
+
* Sets up Prometheus metrics with the registry
|
|
50
|
+
*/
|
|
51
|
+
private setupPrometheusMetrics;
|
|
52
|
+
/**
|
|
53
|
+
* Categorizes error messages into types for metrics
|
|
54
|
+
*/
|
|
55
|
+
private categorizeError;
|
|
56
|
+
/**
|
|
57
|
+
* Gets the job name from the job object or returns 'unknown'
|
|
58
|
+
*/
|
|
59
|
+
private getJobName;
|
|
60
|
+
/**
|
|
61
|
+
* Starts collecting metrics from the queue.
|
|
62
|
+
* Sets up event listeners and begins periodic gauge updates.
|
|
63
|
+
*/
|
|
64
|
+
start(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Stops collecting metrics and cleans up resources.
|
|
67
|
+
*/
|
|
68
|
+
stop(): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Gets a snapshot of the current metrics.
|
|
71
|
+
*/
|
|
72
|
+
getMetrics(): BullMQMetrics;
|
|
73
|
+
/**
|
|
74
|
+
* Resets all metrics to their initial values.
|
|
75
|
+
*/
|
|
76
|
+
reset(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Updates gauge values by fetching current queue state.
|
|
79
|
+
*/
|
|
80
|
+
updateGauges(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Gets the Prometheus registry associated with this collector.
|
|
83
|
+
*/
|
|
84
|
+
getPrometheusRegistry(): Registry;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Convenience function to set up a BullMQ metrics collector with Prometheus export.
|
|
88
|
+
*
|
|
89
|
+
* @param queueName - Name of the BullMQ queue to monitor
|
|
90
|
+
* @param connection - Redis connection (optional, will create default if not provided)
|
|
91
|
+
* @param register - Prometheus registry to use
|
|
92
|
+
* @returns Configured BullMQMetricsCollector instance
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* const collector = setupBullMQPrometheusExporter('my-queue', redis, register);
|
|
97
|
+
* await collector.start();
|
|
98
|
+
*
|
|
99
|
+
* // Later...
|
|
100
|
+
* await collector.stop();
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function setupBullMQPrometheusExporter(queueName: string, connection: Redis, register: Registry): BullMQMetricsCollector;
|
|
104
|
+
//# sourceMappingURL=bullmq-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bullmq-metrics.d.ts","sourceRoot":"","sources":["../../src/jobs/bullmq-metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAA6B,MAAM,aAAa,CAAC;AAGlE;;GAEG;AACH,MAAM,WAAW,aAAa;IAE1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAG1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IAGpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,QAAQ,CAAC;IAC9B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,OAAO,CAA0C;IAGzD,OAAO,CAAC,iBAAiB,CAUT;gBAEJ,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAE,6BAAkC;IAc7F;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmH5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;IACH,UAAU,IAAI,aAAa;IAI3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BnC;;OAEG;IACH,qBAAqB,IAAI,QAAQ;CAGpC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CACzC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,KAAK,EACjB,QAAQ,EAAE,QAAQ,GACnB,sBAAsB,CAKxB"}
|