@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,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Pattern Implementation
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascading failures by temporarily blocking execution
|
|
5
|
+
* of job types that are experiencing repeated failures.
|
|
6
|
+
*
|
|
7
|
+
* States:
|
|
8
|
+
* - CLOSED: Normal operation, requests pass through
|
|
9
|
+
* - OPEN: Blocking requests after threshold failures
|
|
10
|
+
* - HALF_OPEN: Testing if service has recovered
|
|
11
|
+
*/
|
|
12
|
+
import type { Registry } from "prom-client";
|
|
13
|
+
export interface CircuitBreakerConfig {
|
|
14
|
+
/**
|
|
15
|
+
* Number of consecutive failures before tripping to OPEN state
|
|
16
|
+
* Default: 5
|
|
17
|
+
*/
|
|
18
|
+
failureThreshold: number;
|
|
19
|
+
/**
|
|
20
|
+
* Number of consecutive successes needed to reset to CLOSED
|
|
21
|
+
* Default: 2
|
|
22
|
+
*/
|
|
23
|
+
successThreshold: number;
|
|
24
|
+
/**
|
|
25
|
+
* Time in ms before attempting reset from OPEN to HALF_OPEN
|
|
26
|
+
* Default: 30000 (30 seconds)
|
|
27
|
+
*/
|
|
28
|
+
resetTimeoutMs: number;
|
|
29
|
+
/**
|
|
30
|
+
* Maximum concurrent calls allowed in HALF_OPEN state
|
|
31
|
+
* Default: 3
|
|
32
|
+
*/
|
|
33
|
+
halfOpenMaxCalls: number;
|
|
34
|
+
}
|
|
35
|
+
export type CircuitState = "closed" | "open" | "half_open";
|
|
36
|
+
export interface CircuitBreakerState {
|
|
37
|
+
state: CircuitState;
|
|
38
|
+
failureCount: number;
|
|
39
|
+
successCount: number;
|
|
40
|
+
lastFailureTime: number;
|
|
41
|
+
lastStateChange: number;
|
|
42
|
+
halfOpenCalls: number;
|
|
43
|
+
}
|
|
44
|
+
export interface CircuitBreakerMetrics {
|
|
45
|
+
circuitBreakerState: any;
|
|
46
|
+
circuitBreakerOpened: any;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Error thrown when circuit breaker is OPEN
|
|
50
|
+
*/
|
|
51
|
+
export declare class CircuitBreakerOpenError extends Error {
|
|
52
|
+
constructor(jobName: string);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Circuit Breaker implementation for job execution protection
|
|
56
|
+
*/
|
|
57
|
+
export declare class CircuitBreaker {
|
|
58
|
+
private readonly config;
|
|
59
|
+
private readonly breakers;
|
|
60
|
+
private metrics?;
|
|
61
|
+
constructor(config: CircuitBreakerConfig, metricsRegistry?: Registry);
|
|
62
|
+
/**
|
|
63
|
+
* Execute a job with circuit breaker protection
|
|
64
|
+
*
|
|
65
|
+
* @param jobName - Name of the job type
|
|
66
|
+
* @param fn - Async function to execute
|
|
67
|
+
* @returns Result of the function
|
|
68
|
+
* @throws {CircuitBreakerOpenError} If circuit is open
|
|
69
|
+
* @throws {Error} If the function itself fails
|
|
70
|
+
*/
|
|
71
|
+
execute<T>(jobName: string, fn: () => Promise<T>): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Get or create a circuit breaker for a job type
|
|
74
|
+
*/
|
|
75
|
+
private getOrCreateBreaker;
|
|
76
|
+
/**
|
|
77
|
+
* Check if enough time has passed to attempt reset
|
|
78
|
+
*/
|
|
79
|
+
private shouldAttemptReset;
|
|
80
|
+
/**
|
|
81
|
+
* Transition breaker to half_open state
|
|
82
|
+
*/
|
|
83
|
+
private transitionToHalfOpen;
|
|
84
|
+
/**
|
|
85
|
+
* Handle successful execution
|
|
86
|
+
*/
|
|
87
|
+
private onSuccess;
|
|
88
|
+
/**
|
|
89
|
+
* Transition breaker to closed state
|
|
90
|
+
*/
|
|
91
|
+
private transitionToClosed;
|
|
92
|
+
/**
|
|
93
|
+
* Handle failed execution
|
|
94
|
+
*/
|
|
95
|
+
private onFailure;
|
|
96
|
+
/**
|
|
97
|
+
* Transition breaker to open state
|
|
98
|
+
*/
|
|
99
|
+
private transitionToOpen;
|
|
100
|
+
/**
|
|
101
|
+
* Get current state of circuit breaker for a job type
|
|
102
|
+
*/
|
|
103
|
+
getState(jobName: string): CircuitBreakerState | null;
|
|
104
|
+
/**
|
|
105
|
+
* Manually reset circuit breaker for a job type
|
|
106
|
+
*/
|
|
107
|
+
reset(jobName: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Get all circuit breaker states
|
|
110
|
+
*/
|
|
111
|
+
getAllStates(): Map<string, CircuitBreakerState>;
|
|
112
|
+
/**
|
|
113
|
+
* Get statistics about all circuit breakers
|
|
114
|
+
*/
|
|
115
|
+
getStats(): {
|
|
116
|
+
total: number;
|
|
117
|
+
byState: Record<CircuitState, number>;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/jobs/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IAClC,mBAAmB,EAAE,GAAG,CAAC;IACzB,oBAAoB,EAAE,GAAG,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI9B;AAED;;GAEG;AACH,qBAAa,cAAc;IAKnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+C;IACxE,OAAO,CAAC,OAAO,CAAC,CAAwB;gBAGnB,MAAM,EAAE,oBAAoB,EAC7C,eAAe,CAAC,EAAE,QAAQ;IA0B9B;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA8BnE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,OAAO,CAAC,SAAS;IAiBjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIrD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO5B;;OAEG;IACH,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAQhD;;OAEG;IACH,QAAQ,IAAI;QACR,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;KACzC;CAgBJ"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Circuit Breaker Pattern Implementation
|
|
4
|
+
*
|
|
5
|
+
* Prevents cascading failures by temporarily blocking execution
|
|
6
|
+
* of job types that are experiencing repeated failures.
|
|
7
|
+
*
|
|
8
|
+
* States:
|
|
9
|
+
* - CLOSED: Normal operation, requests pass through
|
|
10
|
+
* - OPEN: Blocking requests after threshold failures
|
|
11
|
+
* - HALF_OPEN: Testing if service has recovered
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.CircuitBreaker = exports.CircuitBreakerOpenError = void 0;
|
|
15
|
+
const logger_js_1 = require("../logging/logger.js");
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when circuit breaker is OPEN
|
|
18
|
+
*/
|
|
19
|
+
class CircuitBreakerOpenError extends Error {
|
|
20
|
+
constructor(jobName) {
|
|
21
|
+
super(`Circuit breaker is OPEN for job type: ${jobName}`);
|
|
22
|
+
this.name = "CircuitBreakerOpenError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.CircuitBreakerOpenError = CircuitBreakerOpenError;
|
|
26
|
+
/**
|
|
27
|
+
* Circuit Breaker implementation for job execution protection
|
|
28
|
+
*/
|
|
29
|
+
class CircuitBreaker {
|
|
30
|
+
config;
|
|
31
|
+
breakers = new Map();
|
|
32
|
+
metrics;
|
|
33
|
+
constructor(config, metricsRegistry) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
// Initialize metrics if registry provided
|
|
36
|
+
if (metricsRegistry) {
|
|
37
|
+
// Dynamic import to avoid issues if prom-client not available
|
|
38
|
+
import("prom-client").then(({ Gauge, Counter }) => {
|
|
39
|
+
this.metrics = {
|
|
40
|
+
circuitBreakerState: new Gauge({
|
|
41
|
+
name: "archlast_circuit_breaker_state",
|
|
42
|
+
help: "Circuit breaker state (0=closed, 1=half_open, 2=open)",
|
|
43
|
+
labelNames: ["job_name", "state"],
|
|
44
|
+
registers: [metricsRegistry],
|
|
45
|
+
}),
|
|
46
|
+
circuitBreakerOpened: new Counter({
|
|
47
|
+
name: "archlast_circuit_breaker_opened_total",
|
|
48
|
+
help: "Total number of times circuit breaker opened",
|
|
49
|
+
labelNames: ["job_name"],
|
|
50
|
+
registers: [metricsRegistry],
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
}).catch(() => {
|
|
54
|
+
// Silently fail if metrics not available
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Execute a job with circuit breaker protection
|
|
60
|
+
*
|
|
61
|
+
* @param jobName - Name of the job type
|
|
62
|
+
* @param fn - Async function to execute
|
|
63
|
+
* @returns Result of the function
|
|
64
|
+
* @throws {CircuitBreakerOpenError} If circuit is open
|
|
65
|
+
* @throws {Error} If the function itself fails
|
|
66
|
+
*/
|
|
67
|
+
async execute(jobName, fn) {
|
|
68
|
+
const breaker = this.getOrCreateBreaker(jobName);
|
|
69
|
+
// Check if circuit is open
|
|
70
|
+
if (breaker.state === "open") {
|
|
71
|
+
if (this.shouldAttemptReset(breaker)) {
|
|
72
|
+
this.transitionToHalfOpen(breaker, jobName);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw new CircuitBreakerOpenError(jobName);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check half-open call limit
|
|
79
|
+
if (breaker.state === "half_open") {
|
|
80
|
+
if (breaker.halfOpenCalls >= this.config.halfOpenMaxCalls) {
|
|
81
|
+
throw new CircuitBreakerOpenError(jobName);
|
|
82
|
+
}
|
|
83
|
+
breaker.halfOpenCalls++;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const result = await fn();
|
|
87
|
+
this.onSuccess(jobName);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.onFailure(jobName);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get or create a circuit breaker for a job type
|
|
97
|
+
*/
|
|
98
|
+
getOrCreateBreaker(jobName) {
|
|
99
|
+
if (!this.breakers.has(jobName)) {
|
|
100
|
+
const initialState = {
|
|
101
|
+
state: "closed",
|
|
102
|
+
failureCount: 0,
|
|
103
|
+
successCount: 0,
|
|
104
|
+
lastFailureTime: 0,
|
|
105
|
+
lastStateChange: Date.now(),
|
|
106
|
+
halfOpenCalls: 0,
|
|
107
|
+
};
|
|
108
|
+
this.breakers.set(jobName, initialState);
|
|
109
|
+
// Initialize state metric
|
|
110
|
+
if (this.metrics) {
|
|
111
|
+
this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "closed" }, 1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return this.breakers.get(jobName);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check if enough time has passed to attempt reset
|
|
118
|
+
*/
|
|
119
|
+
shouldAttemptReset(breaker) {
|
|
120
|
+
const timeSinceFailure = Date.now() - breaker.lastFailureTime;
|
|
121
|
+
return timeSinceFailure >= this.config.resetTimeoutMs;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Transition breaker to half_open state
|
|
125
|
+
*/
|
|
126
|
+
transitionToHalfOpen(breaker, jobName) {
|
|
127
|
+
breaker.state = "half_open";
|
|
128
|
+
breaker.successCount = 0;
|
|
129
|
+
breaker.halfOpenCalls = 0;
|
|
130
|
+
breaker.lastStateChange = Date.now();
|
|
131
|
+
logger_js_1.logger.log({
|
|
132
|
+
timestamp: Date.now(),
|
|
133
|
+
level: "warn",
|
|
134
|
+
kind: "system",
|
|
135
|
+
message: `[CircuitBreaker] Transitioned to HALF_OPEN for job: ${jobName}`,
|
|
136
|
+
});
|
|
137
|
+
// Emit metric
|
|
138
|
+
if (this.metrics) {
|
|
139
|
+
this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "half_open" }, 1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handle successful execution
|
|
144
|
+
*/
|
|
145
|
+
onSuccess(jobName) {
|
|
146
|
+
const breaker = this.breakers.get(jobName);
|
|
147
|
+
if (!breaker)
|
|
148
|
+
return;
|
|
149
|
+
if (breaker.state === "half_open") {
|
|
150
|
+
breaker.successCount++;
|
|
151
|
+
if (breaker.successCount >= this.config.successThreshold) {
|
|
152
|
+
// Reset to closed
|
|
153
|
+
this.transitionToClosed(breaker, jobName);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (breaker.state === "closed") {
|
|
157
|
+
// Reset failure count on success in closed state
|
|
158
|
+
breaker.failureCount = 0;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Transition breaker to closed state
|
|
163
|
+
*/
|
|
164
|
+
transitionToClosed(breaker, jobName) {
|
|
165
|
+
breaker.state = "closed";
|
|
166
|
+
breaker.failureCount = 0;
|
|
167
|
+
breaker.successCount = 0;
|
|
168
|
+
breaker.halfOpenCalls = 0;
|
|
169
|
+
breaker.lastStateChange = Date.now();
|
|
170
|
+
logger_js_1.logger.log({
|
|
171
|
+
timestamp: Date.now(),
|
|
172
|
+
level: "info",
|
|
173
|
+
kind: "system",
|
|
174
|
+
message: `[CircuitBreaker] Reset to CLOSED for job: ${jobName}`,
|
|
175
|
+
});
|
|
176
|
+
// Emit metric
|
|
177
|
+
if (this.metrics) {
|
|
178
|
+
this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "closed" }, 1);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Handle failed execution
|
|
183
|
+
*/
|
|
184
|
+
onFailure(jobName) {
|
|
185
|
+
const breaker = this.breakers.get(jobName);
|
|
186
|
+
if (!breaker)
|
|
187
|
+
return;
|
|
188
|
+
breaker.failureCount++;
|
|
189
|
+
breaker.lastFailureTime = Date.now();
|
|
190
|
+
// Check if should trip to open
|
|
191
|
+
if (breaker.state === "closed" &&
|
|
192
|
+
breaker.failureCount >= this.config.failureThreshold) {
|
|
193
|
+
this.transitionToOpen(breaker, jobName);
|
|
194
|
+
}
|
|
195
|
+
else if (breaker.state === "half_open") {
|
|
196
|
+
// Back to open on failure in half_open
|
|
197
|
+
this.transitionToOpen(breaker, jobName);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Transition breaker to open state
|
|
202
|
+
*/
|
|
203
|
+
transitionToOpen(breaker, jobName) {
|
|
204
|
+
breaker.state = "open";
|
|
205
|
+
breaker.lastStateChange = Date.now();
|
|
206
|
+
logger_js_1.logger.log({
|
|
207
|
+
timestamp: Date.now(),
|
|
208
|
+
level: "error",
|
|
209
|
+
kind: "system",
|
|
210
|
+
message: `[CircuitBreaker] Tripped to OPEN for job: ${jobName} after ${breaker.failureCount} failures`,
|
|
211
|
+
});
|
|
212
|
+
// Emit metrics
|
|
213
|
+
if (this.metrics) {
|
|
214
|
+
this.metrics.circuitBreakerOpened?.inc({ job_name: jobName });
|
|
215
|
+
this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "open" }, 1);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get current state of circuit breaker for a job type
|
|
220
|
+
*/
|
|
221
|
+
getState(jobName) {
|
|
222
|
+
return this.breakers.get(jobName) || null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Manually reset circuit breaker for a job type
|
|
226
|
+
*/
|
|
227
|
+
reset(jobName) {
|
|
228
|
+
const breaker = this.breakers.get(jobName);
|
|
229
|
+
if (breaker) {
|
|
230
|
+
this.transitionToClosed(breaker, jobName);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get all circuit breaker states
|
|
235
|
+
*/
|
|
236
|
+
getAllStates() {
|
|
237
|
+
const result = new Map();
|
|
238
|
+
this.breakers.forEach((value, key) => {
|
|
239
|
+
result.set(key, value);
|
|
240
|
+
});
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get statistics about all circuit breakers
|
|
245
|
+
*/
|
|
246
|
+
getStats() {
|
|
247
|
+
const byState = {
|
|
248
|
+
closed: 0,
|
|
249
|
+
open: 0,
|
|
250
|
+
half_open: 0,
|
|
251
|
+
};
|
|
252
|
+
this.breakers.forEach((breaker) => {
|
|
253
|
+
byState[breaker.state]++;
|
|
254
|
+
});
|
|
255
|
+
return {
|
|
256
|
+
total: this.breakers.size,
|
|
257
|
+
byState,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.CircuitBreaker = CircuitBreaker;
|
|
262
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/jobs/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ import { Scheduler, SchedulePreset, intervalToCron, type ScheduledJob } from "./
|
|
|
3
3
|
/**
|
|
4
4
|
* Public API for Archlast job system.
|
|
5
5
|
*/
|
|
6
|
-
export { JobQueue, Scheduler, SchedulePreset, intervalToCron, ScheduledJob
|
|
6
|
+
export { JobQueue, Scheduler, SchedulePreset, intervalToCron, ScheduledJob };
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/jobs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9F;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9F;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/jobs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAM7B,yFANA,mBAAQ,OAMA;AALjB,iDAA8F;AAK3E,0FALV,wBAAS,OAKU;AAAE,+FALV,6BAAc,OAKU;AAAE,+FALV,6BAAc,OAKU"}
|
package/dist/jobs/queue.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { IDatabaseClient } from "../db/interfaces.js";
|
|
2
2
|
import type { CacheClient } from "../cache/client.js";
|
|
3
3
|
export declare const JOBS_COLLECTION = "_jobs";
|
|
4
|
+
export declare const JOBS_DLQ_COLLECTION = "_jobs_dlq";
|
|
5
|
+
export interface JobDLQRecord<Payload = unknown> extends JobRecord<Payload> {
|
|
6
|
+
originalJobId: string;
|
|
7
|
+
deadLetteredAt: number;
|
|
8
|
+
errorCategory: "timeout" | "validation" | "dependency" | "system";
|
|
9
|
+
diagnostics: Record<string, unknown>;
|
|
10
|
+
reprocessCount: number;
|
|
11
|
+
}
|
|
4
12
|
export type JobStatus = "pending" | "active" | "completed" | "failed";
|
|
5
13
|
export interface JobRecord<Payload = unknown> {
|
|
6
14
|
_id: string;
|
|
@@ -14,10 +22,16 @@ export interface JobRecord<Payload = unknown> {
|
|
|
14
22
|
createdAt: number;
|
|
15
23
|
updatedAt: number;
|
|
16
24
|
lastError?: string | null;
|
|
25
|
+
priority?: number;
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
dependsOn?: string[];
|
|
17
28
|
}
|
|
18
29
|
export interface EnqueueOptions {
|
|
19
30
|
runAfterMs?: number;
|
|
20
31
|
maxAttempts?: number;
|
|
32
|
+
priority?: number;
|
|
33
|
+
timeoutMs?: number;
|
|
34
|
+
dependsOn?: string[];
|
|
21
35
|
}
|
|
22
36
|
export interface JobQueueOptions {
|
|
23
37
|
/**
|
|
@@ -47,16 +61,121 @@ export declare class JobQueue {
|
|
|
47
61
|
constructor(options: JobQueueOptions);
|
|
48
62
|
private emitRevalidation;
|
|
49
63
|
enqueue<Payload = unknown>(name: string, payload: Payload, options?: EnqueueOptions): Promise<string>;
|
|
64
|
+
/**
|
|
65
|
+
* Calculate effective priority with aging to prevent starvation.
|
|
66
|
+
* Low-priority jobs gain priority over time (1 point every 15 minutes, max 5 points).
|
|
67
|
+
*/
|
|
68
|
+
private calculateEffectivePriority;
|
|
69
|
+
/**
|
|
70
|
+
* Apply aging boost to old pending jobs to prevent starvation.
|
|
71
|
+
* This updates the priority field in the database for jobs that have been waiting too long.
|
|
72
|
+
*/
|
|
73
|
+
private applyAgingToPendingJobs;
|
|
50
74
|
/**
|
|
51
75
|
* Claim the next available job for execution.
|
|
52
76
|
* Returns null if none are ready.
|
|
53
77
|
*/
|
|
54
78
|
claimNext<Payload = unknown>(): Promise<JobRecord<Payload> | null>;
|
|
55
|
-
complete(id: string): Promise<void>;
|
|
79
|
+
complete(id: string, jobName?: string): Promise<void>;
|
|
56
80
|
fail(job: JobRecord, error: unknown, backoffMs?: number): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Categorize error for DLQ classification
|
|
83
|
+
*/
|
|
84
|
+
private categorizeError;
|
|
85
|
+
/**
|
|
86
|
+
* Extract diagnostic information from error
|
|
87
|
+
*/
|
|
88
|
+
private extractDiagnostics;
|
|
57
89
|
getJob<Payload = unknown>(id: string): Promise<JobRecord<Payload> | null>;
|
|
58
90
|
listJobs<Payload = unknown>(status?: JobStatus): Promise<JobRecord<Payload>[]>;
|
|
59
91
|
dispose(): void;
|
|
60
92
|
private mapDoc;
|
|
93
|
+
/**
|
|
94
|
+
* List DLQ jobs with optional filtering and pagination
|
|
95
|
+
*/
|
|
96
|
+
getDLQJobs<Payload = unknown>(options?: {
|
|
97
|
+
limit?: number;
|
|
98
|
+
offset?: number;
|
|
99
|
+
errorCategory?: string;
|
|
100
|
+
jobName?: string;
|
|
101
|
+
}): Promise<JobDLQRecord<Payload>[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Get specific DLQ job by ID
|
|
104
|
+
*/
|
|
105
|
+
getDLQJob<Payload = unknown>(id: string): Promise<JobDLQRecord<Payload> | null>;
|
|
106
|
+
/**
|
|
107
|
+
* Get DLQ statistics
|
|
108
|
+
*/
|
|
109
|
+
getDLQStats(): Promise<{
|
|
110
|
+
totalDLQJobs: number;
|
|
111
|
+
byStatus: Record<string, number>;
|
|
112
|
+
byErrorCategory: Record<string, number>;
|
|
113
|
+
byJobName: Record<string, number>;
|
|
114
|
+
oldestFailure: number | null;
|
|
115
|
+
recentFailures24h: number;
|
|
116
|
+
}>;
|
|
117
|
+
/**
|
|
118
|
+
* Reprocess a job from DLQ back to main queue
|
|
119
|
+
* @param dlqJobId - ID of DLQ job
|
|
120
|
+
* @param options - Reprocessing options
|
|
121
|
+
* @returns ID of new job in main queue
|
|
122
|
+
*/
|
|
123
|
+
reprocessFromDLQ(dlqJobId: string, options?: {
|
|
124
|
+
newMaxAttempts?: number;
|
|
125
|
+
priority?: number;
|
|
126
|
+
}): Promise<string>;
|
|
127
|
+
/**
|
|
128
|
+
* Delete specific DLQ job
|
|
129
|
+
*/
|
|
130
|
+
deleteFromDLQ(id: string): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Purge DLQ jobs older than specified time
|
|
133
|
+
* @param olderThanMs - Age in milliseconds (default: 30 days)
|
|
134
|
+
* @returns Number of jobs purged
|
|
135
|
+
*/
|
|
136
|
+
purgeDLQ(olderThanMs?: number): Promise<number>;
|
|
137
|
+
/**
|
|
138
|
+
* Get queue statistics
|
|
139
|
+
*/
|
|
140
|
+
getQueueStats(): Promise<{
|
|
141
|
+
totalJobs: number;
|
|
142
|
+
pendingJobs: number;
|
|
143
|
+
activeJobs: number;
|
|
144
|
+
completedJobs: number;
|
|
145
|
+
failedJobs: number;
|
|
146
|
+
dlqJobs: number;
|
|
147
|
+
avgProcessingTime: number;
|
|
148
|
+
priorityDistribution: Record<string, number>;
|
|
149
|
+
}>;
|
|
150
|
+
/**
|
|
151
|
+
* Get queue depth by priority level
|
|
152
|
+
*/
|
|
153
|
+
getQueueDepthByPriority(): Promise<Array<{
|
|
154
|
+
priority: number;
|
|
155
|
+
count: number;
|
|
156
|
+
label: string;
|
|
157
|
+
}>>;
|
|
158
|
+
/**
|
|
159
|
+
* Update job priority
|
|
160
|
+
*/
|
|
161
|
+
updateJobPriority(jobId: string, priority: number): Promise<void>;
|
|
162
|
+
private getPriorityLabel;
|
|
163
|
+
/**
|
|
164
|
+
* Find jobs that are stuck in "active" status (worker terminated)
|
|
165
|
+
* Returns jobs that have been active longer than the specified timeout
|
|
166
|
+
*/
|
|
167
|
+
findStuckJobs(timeoutMs?: number): Promise<JobRecord[]>;
|
|
168
|
+
/**
|
|
169
|
+
* Reset a stuck job from "active" to "pending" status
|
|
170
|
+
* Use this when a worker has terminated and left jobs in active state
|
|
171
|
+
*/
|
|
172
|
+
resetStuckJob(jobId: string): Promise<void>;
|
|
173
|
+
/**
|
|
174
|
+
* Bulk reset multiple stuck jobs
|
|
175
|
+
*/
|
|
176
|
+
resetStuckJobs(jobIds: string[]): Promise<{
|
|
177
|
+
reset: number;
|
|
178
|
+
failed: number;
|
|
179
|
+
}>;
|
|
61
180
|
}
|
|
62
181
|
//# sourceMappingURL=queue.d.ts.map
|
package/dist/jobs/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"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"}
|