@morojs/moro 1.7.30 → 1.8.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 +89 -46
- package/dist/core/auth/morojs-adapter.js +95 -45
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-manager.js.map +1 -1
- package/dist/core/config/config-sources.js +119 -48
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.js +189 -8
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.js +35 -4
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.js +2 -2
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -0
- package/dist/core/database/adapters/mongodb.js +16 -0
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -0
- package/dist/core/database/adapters/mysql.js +13 -2
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.js +2 -2
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sql-safety.js +5 -4
- package/dist/core/database/adapters/sql-safety.js.map +1 -1
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.js +11 -7
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.js +8 -6
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.js +3 -3
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +2 -2
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.js +14 -5
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +41 -3
- package/dist/core/framework.js +342 -95
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/adapter.js.map +1 -1
- package/dist/core/graphql/adapters/graphql-js-adapter.js.map +1 -1
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/graphql/index.js.map +1 -1
- package/dist/core/graphql/loader.js.map +1 -1
- package/dist/core/graphql/types.js.map +1 -1
- package/dist/core/grpc/adapters/grpc-js-adapter.js +4 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -1
- package/dist/core/grpc/adapters/index.js.map +1 -1
- package/dist/core/grpc/grpc-adapter.js.map +1 -1
- package/dist/core/grpc/grpc-manager.js.map +1 -1
- package/dist/core/grpc/index.js.map +1 -1
- package/dist/core/grpc/middleware/auth.js +1 -1
- package/dist/core/grpc/middleware/auth.js.map +1 -1
- package/dist/core/grpc/middleware/logging.js.map +1 -1
- package/dist/core/grpc/middleware/validation.js +1 -1
- package/dist/core/grpc/middleware/validation.js.map +1 -1
- package/dist/core/grpc/types.d.ts +7 -7
- package/dist/core/grpc/types.js.map +1 -1
- package/dist/core/http/http-server.d.ts +17 -23
- package/dist/core/http/http-server.js +109 -249
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.d.ts +6 -16
- package/dist/core/http/http2-server.js +40 -83
- package/dist/core/http/http2-server.js.map +1 -1
- package/dist/core/http/index.d.ts +1 -0
- package/dist/core/http/index.js +3 -0
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/moro-engine-server.d.ts +263 -0
- package/dist/core/http/moro-engine-server.js +1962 -0
- package/dist/core/http/moro-engine-server.js.map +1 -0
- package/dist/core/http/utils/compression.d.ts +47 -0
- package/dist/core/http/utils/compression.js +132 -0
- package/dist/core/http/utils/compression.js.map +1 -0
- package/dist/core/http/utils/lazy-event-emitter.d.ts +11 -0
- package/dist/core/http/utils/lazy-event-emitter.js +69 -0
- package/dist/core/http/utils/lazy-event-emitter.js.map +1 -0
- package/dist/core/http/utils/multipart-parser.d.ts +32 -0
- package/dist/core/http/utils/multipart-parser.js +215 -0
- package/dist/core/http/utils/multipart-parser.js.map +1 -0
- package/dist/core/http/utils/query-parser.d.ts +1 -0
- package/dist/core/http/utils/query-parser.js +44 -0
- package/dist/core/http/utils/query-parser.js.map +1 -0
- package/dist/core/http/utils/size.d.ts +33 -0
- package/dist/core/http/utils/size.js +37 -0
- package/dist/core/http/utils/size.js.map +1 -0
- package/dist/core/http/utils/ssl-config.d.ts +69 -0
- package/dist/core/http/utils/ssl-config.js +116 -0
- package/dist/core/http/utils/ssl-config.js.map +1 -0
- package/dist/core/http/utils/uws-worker-clustering.js +45 -32
- package/dist/core/http/utils/uws-worker-clustering.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +25 -3
- package/dist/core/http/uws-http-server.js +465 -86
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/jobs/cron-parser.js +7 -5
- package/dist/core/jobs/cron-parser.js.map +1 -1
- package/dist/core/jobs/index.js.map +1 -1
- package/dist/core/jobs/job-executor.d.ts +1 -1
- package/dist/core/jobs/job-executor.js.map +1 -1
- package/dist/core/jobs/job-scheduler.d.ts +3 -3
- package/dist/core/jobs/job-scheduler.js.map +1 -1
- package/dist/core/jobs/job-state-manager.d.ts +3 -3
- package/dist/core/jobs/job-state-manager.js +25 -4
- package/dist/core/jobs/job-state-manager.js.map +1 -1
- package/dist/core/jobs/leader-election.d.ts +15 -0
- package/dist/core/jobs/leader-election.js +158 -69
- package/dist/core/jobs/leader-election.js.map +1 -1
- package/dist/core/jobs/types.d.ts +4 -4
- package/dist/core/jobs/types.js.map +1 -1
- package/dist/core/jobs/utils.d.ts +1 -1
- package/dist/core/jobs/utils.js +7 -3
- package/dist/core/jobs/utils.js.map +1 -1
- package/dist/core/logger/filters.js +3 -2
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.js +56 -25
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/mail/adapters/console-adapter.js.map +1 -1
- package/dist/core/mail/adapters/index.js.map +1 -1
- package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -1
- package/dist/core/mail/adapters/resend-adapter.js.map +1 -1
- package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -1
- package/dist/core/mail/adapters/ses-adapter.js.map +1 -1
- package/dist/core/mail/index.js.map +1 -1
- package/dist/core/mail/mail-adapter.js.map +1 -1
- package/dist/core/mail/mail-manager.d.ts +10 -0
- package/dist/core/mail/mail-manager.js +21 -5
- package/dist/core/mail/mail-manager.js.map +1 -1
- package/dist/core/mail/template-engine.js.map +1 -1
- package/dist/core/mail/types.js.map +1 -1
- package/dist/core/middleware/built-in/auth/core.js +3 -3
- package/dist/core/middleware/built-in/auth/core.js.map +1 -1
- package/dist/core/middleware/built-in/auth/helpers.js +4 -4
- package/dist/core/middleware/built-in/auth/helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth/hook.js.map +1 -1
- package/dist/core/middleware/built-in/auth/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth/jwt-helpers.d.ts +4 -4
- package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/auth/providers.js.map +1 -1
- package/dist/core/middleware/built-in/body-parsers/index.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/core.js +2 -2
- package/dist/core/middleware/built-in/body-size/core.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/hook.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/index.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js +3 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/cache/core.js.map +1 -1
- package/dist/core/middleware/built-in/cache/hook.js +3 -3
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/cache/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/core.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/compression/core.d.ts +3 -0
- package/dist/core/middleware/built-in/compression/core.js +28 -34
- package/dist/core/middleware/built-in/compression/core.js.map +1 -1
- package/dist/core/middleware/built-in/compression/hook.js.map +1 -1
- package/dist/core/middleware/built-in/compression/index.js.map +1 -1
- package/dist/core/middleware/built-in/compression/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/index.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cors/core.js.map +1 -1
- package/dist/core/middleware/built-in/cors/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cors/index.js.map +1 -1
- package/dist/core/middleware/built-in/cors/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/csp/core.js.map +1 -1
- package/dist/core/middleware/built-in/csp/hook.js.map +1 -1
- package/dist/core/middleware/built-in/csp/index.js.map +1 -1
- package/dist/core/middleware/built-in/csp/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/core.js +1 -1
- package/dist/core/middleware/built-in/csrf/core.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/hook.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/index.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/core.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/helpers.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/hook.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/index.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/subscriptions.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/core.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/hook.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/index.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/http2/core.js.map +1 -1
- package/dist/core/middleware/built-in/http2/hook.js.map +1 -1
- package/dist/core/middleware/built-in/http2/index.js.map +1 -1
- package/dist/core/middleware/built-in/http2/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/range/core.js +4 -1
- package/dist/core/middleware/built-in/range/core.js.map +1 -1
- package/dist/core/middleware/built-in/range/hook.js.map +1 -1
- package/dist/core/middleware/built-in/range/index.js.map +1 -1
- package/dist/core/middleware/built-in/range/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/session/core.js +4 -4
- package/dist/core/middleware/built-in/session/core.js.map +1 -1
- package/dist/core/middleware/built-in/session/hook.js.map +1 -1
- package/dist/core/middleware/built-in/session/index.js.map +1 -1
- package/dist/core/middleware/built-in/session/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/sse/core.js.map +1 -1
- package/dist/core/middleware/built-in/sse/hook.js.map +1 -1
- package/dist/core/middleware/built-in/sse/index.js.map +1 -1
- package/dist/core/middleware/built-in/sse/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/static/core.js.map +1 -1
- package/dist/core/middleware/built-in/static/hook.js.map +1 -1
- package/dist/core/middleware/built-in/static/index.js.map +1 -1
- package/dist/core/middleware/built-in/static/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/template/core.js +1 -1
- package/dist/core/middleware/built-in/template/core.js.map +1 -1
- package/dist/core/middleware/built-in/template/hook.js.map +1 -1
- package/dist/core/middleware/built-in/template/index.js.map +1 -1
- package/dist/core/middleware/built-in/template/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/upload/core.js.map +1 -1
- package/dist/core/middleware/built-in/upload/hook.js.map +1 -1
- package/dist/core/middleware/built-in/upload/index.js.map +1 -1
- package/dist/core/middleware/built-in/upload/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/validation/core.js.map +1 -1
- package/dist/core/middleware/built-in/validation/hook.js.map +1 -1
- package/dist/core/middleware/built-in/validation/index.js.map +1 -1
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
- package/dist/core/middleware/index.js +2 -2
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.js +11 -7
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.js +18 -13
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/engine-adapter.d.ts +23 -0
- package/dist/core/networking/adapters/engine-adapter.js +365 -0
- package/dist/core/networking/adapters/engine-adapter.js.map +1 -0
- package/dist/core/networking/adapters/index.d.ts +1 -0
- package/dist/core/networking/adapters/index.js +1 -0
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -0
- package/dist/core/networking/adapters/socketio-adapter.js +12 -1
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.js +27 -16
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +15 -0
- package/dist/core/networking/adapters/ws-adapter.js +120 -6
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +7 -5
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.d.ts +22 -3
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.js +70 -67
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.js +6 -0
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/queue/adapters/bull-adapter.js.map +1 -1
- package/dist/core/queue/adapters/index.js.map +1 -1
- package/dist/core/queue/adapters/kafka-adapter.js +2 -2
- package/dist/core/queue/adapters/kafka-adapter.js.map +1 -1
- package/dist/core/queue/adapters/memory-adapter.js +6 -6
- package/dist/core/queue/adapters/memory-adapter.js.map +1 -1
- package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +50 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js +176 -20
- package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -1
- package/dist/core/queue/adapters/sqs-adapter.d.ts +12 -2
- package/dist/core/queue/adapters/sqs-adapter.js +75 -24
- package/dist/core/queue/adapters/sqs-adapter.js.map +1 -1
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/queue/middleware/index.js.map +1 -1
- package/dist/core/queue/middleware/monitoring.d.ts +1 -1
- package/dist/core/queue/middleware/monitoring.js.map +1 -1
- package/dist/core/queue/middleware/priority.js +2 -1
- package/dist/core/queue/middleware/priority.js.map +1 -1
- package/dist/core/queue/middleware/rate-limit.js.map +1 -1
- package/dist/core/queue/queue-adapter.js.map +1 -1
- package/dist/core/queue/queue-manager.js.map +1 -1
- package/dist/core/queue/types.d.ts +8 -8
- package/dist/core/queue/types.js.map +1 -1
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/create-router.js.map +1 -1
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/path-matcher.js.map +1 -1
- package/dist/core/routing/radix-tree.js.map +1 -1
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/unified-router.js +12 -4
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.js +2 -2
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.js +2 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.js +19 -17
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.js +2 -0
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.d.ts +1 -0
- package/dist/core/utilities/circuit-breaker.js +25 -2
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +9 -9
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.js +28 -6
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/module-path.js.map +1 -1
- package/dist/core/utilities/package-utils.d.ts +68 -0
- package/dist/core/utilities/package-utils.js +198 -1
- package/dist/core/utilities/package-utils.js.map +1 -1
- package/dist/core/utilities/response-helpers.js +1 -1
- package/dist/core/utilities/response-helpers.js.map +1 -1
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/error-handler.js.map +1 -1
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/core/workers/facade.js.map +1 -1
- package/dist/core/workers/index.js.map +1 -1
- package/dist/core/workers/worker-entry.d.ts +1 -0
- package/dist/core/workers/worker-entry.js +12 -0
- package/dist/core/workers/worker-entry.js.map +1 -0
- package/dist/core/workers/worker-manager.d.ts +23 -2
- package/dist/core/workers/worker-manager.js +117 -17
- package/dist/core/workers/worker-manager.js.map +1 -1
- package/dist/core/workers/worker.js +8 -6
- package/dist/core/workers/worker.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +20 -1
- package/dist/moro.js +230 -70
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.d.ts +4 -4
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js.map +1 -1
- package/dist/types/cdn.js.map +1 -1
- package/dist/types/config.d.ts +100 -15
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.js.map +1 -1
- package/dist/types/database.js.map +1 -1
- package/dist/types/discovery.js.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/hooks.js.map +1 -1
- package/dist/types/http.js.map +1 -1
- package/dist/types/logger.js.map +1 -1
- package/dist/types/module.js.map +1 -1
- package/dist/types/runtime.js.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/package.json +32 -17
|
@@ -21,6 +21,13 @@ export class RabbitMQAdapter extends QueueAdapter {
|
|
|
21
21
|
processors = new Map();
|
|
22
22
|
jobStore = new Map();
|
|
23
23
|
consumerTags = new Map();
|
|
24
|
+
// Concurrency (prefetch) per queue, retained so consumers can be replayed on reconnect
|
|
25
|
+
queueConcurrency = new Map();
|
|
26
|
+
isClosing = false;
|
|
27
|
+
reconnecting = false;
|
|
28
|
+
// Reconnect backoff bounds
|
|
29
|
+
static RECONNECT_BASE_DELAY_MS = 1000;
|
|
30
|
+
static RECONNECT_MAX_DELAY_MS = 30000;
|
|
24
31
|
constructor(connectionConfig = {}) {
|
|
25
32
|
super();
|
|
26
33
|
this.connectionConfig = connectionConfig;
|
|
@@ -39,21 +46,164 @@ export class RabbitMQAdapter extends QueueAdapter {
|
|
|
39
46
|
// Load amqplib
|
|
40
47
|
const amqpPath = resolveUserPackage('amqplib');
|
|
41
48
|
this.amqp = await import(amqpPath);
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
const port = this.connectionConfig.port || 5672;
|
|
45
|
-
const username = this.connectionConfig.username || 'guest';
|
|
46
|
-
const password = this.connectionConfig.password || 'guest';
|
|
47
|
-
const url = `amqp://${username}:${password}@${host}:${port}`;
|
|
48
|
-
// Create connection and channel
|
|
49
|
-
this.connection = await this.amqp.connect(url);
|
|
50
|
-
this.channel = await this.connection.createChannel();
|
|
49
|
+
// Create connection and channel (with error/close handlers attached)
|
|
50
|
+
await this.establishConnection();
|
|
51
51
|
this.isReady = true;
|
|
52
52
|
}
|
|
53
53
|
catch (error) {
|
|
54
54
|
throw new Error(`Failed to initialize RabbitMQ adapter: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Build the AMQP connection URL from config
|
|
59
|
+
*/
|
|
60
|
+
buildConnectionUrl() {
|
|
61
|
+
const host = this.connectionConfig.host || 'localhost';
|
|
62
|
+
const port = this.connectionConfig.port || 5672;
|
|
63
|
+
const username = this.connectionConfig.username || 'guest';
|
|
64
|
+
const password = this.connectionConfig.password || 'guest';
|
|
65
|
+
return `amqp://${username}:${password}@${host}:${port}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Open a fresh connection + channel and register lifecycle handlers on both.
|
|
69
|
+
*/
|
|
70
|
+
async establishConnection() {
|
|
71
|
+
const url = this.buildConnectionUrl();
|
|
72
|
+
this.connection = await this.amqp.connect(url);
|
|
73
|
+
this.registerConnectionHandlers(this.connection);
|
|
74
|
+
this.channel = await this.connection.createChannel();
|
|
75
|
+
this.registerChannelHandlers(this.channel);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Attach 'error'/'close' handlers to the connection. amqplib Connection is an
|
|
79
|
+
* EventEmitter, so an unhandled 'error' would otherwise crash the process.
|
|
80
|
+
*/
|
|
81
|
+
registerConnectionHandlers(connection) {
|
|
82
|
+
connection.on('error', (err) => {
|
|
83
|
+
logger.error('RabbitMQ connection error', 'Connection', {
|
|
84
|
+
error: err instanceof Error ? err.message : String(err),
|
|
85
|
+
});
|
|
86
|
+
this.handleConnectionFailure();
|
|
87
|
+
});
|
|
88
|
+
connection.on('close', () => {
|
|
89
|
+
logger.warn('RabbitMQ connection closed', 'Connection');
|
|
90
|
+
this.handleConnectionFailure();
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Attach 'error'/'close' handlers to the channel. amqplib Channel is an
|
|
95
|
+
* EventEmitter; an unhandled 'error' would otherwise crash the process.
|
|
96
|
+
*/
|
|
97
|
+
registerChannelHandlers(channel) {
|
|
98
|
+
channel.on('error', (err) => {
|
|
99
|
+
logger.error('RabbitMQ channel error', 'Channel', {
|
|
100
|
+
error: err instanceof Error ? err.message : String(err),
|
|
101
|
+
});
|
|
102
|
+
this.handleConnectionFailure();
|
|
103
|
+
});
|
|
104
|
+
channel.on('close', () => {
|
|
105
|
+
logger.warn('RabbitMQ channel closed', 'Channel');
|
|
106
|
+
this.handleConnectionFailure();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* React to a connection/channel error or close by marking the adapter not-ready
|
|
111
|
+
* and kicking off a single reconnect loop. Guarded so the many events a failure
|
|
112
|
+
* emits (connection error + close + channel error + close) trigger at most one
|
|
113
|
+
* reconnect at a time.
|
|
114
|
+
*/
|
|
115
|
+
handleConnectionFailure() {
|
|
116
|
+
if (this.isClosing || this.reconnecting) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.isReady = false;
|
|
120
|
+
this.reconnecting = true;
|
|
121
|
+
void this.reconnectWithBackoff();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Reconnect with exponential backoff, re-establishing the channel and replaying
|
|
125
|
+
* all registered consumers once connected.
|
|
126
|
+
*/
|
|
127
|
+
async reconnectWithBackoff() {
|
|
128
|
+
await this.cleanupConnection();
|
|
129
|
+
let attempt = 0;
|
|
130
|
+
while (!this.isClosing) {
|
|
131
|
+
attempt++;
|
|
132
|
+
const delay = Math.min(RabbitMQAdapter.RECONNECT_BASE_DELAY_MS * 2 ** (attempt - 1), RabbitMQAdapter.RECONNECT_MAX_DELAY_MS);
|
|
133
|
+
logger.warn(`Reconnecting to RabbitMQ in ${delay}ms (attempt ${attempt})`, 'Reconnect');
|
|
134
|
+
await new Promise(resolve => {
|
|
135
|
+
const timer = setTimeout(resolve, delay);
|
|
136
|
+
timer.unref();
|
|
137
|
+
});
|
|
138
|
+
if (this.isClosing) {
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
await this.establishConnection();
|
|
143
|
+
this.isReady = true;
|
|
144
|
+
this.reconnecting = false;
|
|
145
|
+
logger.info('RabbitMQ reconnected', 'Reconnect');
|
|
146
|
+
await this.replayConsumers();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logger.error(`RabbitMQ reconnect attempt ${attempt} failed`, 'Reconnect', {
|
|
151
|
+
error: error instanceof Error ? error.message : String(error),
|
|
152
|
+
});
|
|
153
|
+
await this.cleanupConnection();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
this.reconnecting = false;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Re-assert queues and re-register every consumer after a reconnect.
|
|
160
|
+
*/
|
|
161
|
+
async replayConsumers() {
|
|
162
|
+
const queues = Array.from(this.processors.keys());
|
|
163
|
+
this.consumerTags.clear();
|
|
164
|
+
for (const queueName of queues) {
|
|
165
|
+
const handler = this.processors.get(queueName);
|
|
166
|
+
const concurrency = this.queueConcurrency.get(queueName) ?? 1;
|
|
167
|
+
if (!handler) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
await this.registerConsumer(queueName, concurrency, handler);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
logger.error(`Failed to replay consumer for queue ${queueName}`, 'Reconnect', {
|
|
175
|
+
error: error instanceof Error ? error.message : String(error),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Best-effort close of the current channel + connection, clearing references.
|
|
182
|
+
* Handlers on the old objects are guarded by the reconnecting/isClosing flags,
|
|
183
|
+
* so the 'close' events these emit will not re-trigger another reconnect.
|
|
184
|
+
*/
|
|
185
|
+
async cleanupConnection() {
|
|
186
|
+
const channel = this.channel;
|
|
187
|
+
const connection = this.connection;
|
|
188
|
+
this.channel = null;
|
|
189
|
+
this.connection = null;
|
|
190
|
+
if (channel) {
|
|
191
|
+
try {
|
|
192
|
+
await channel.close();
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// ignore — channel may already be closed
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (connection) {
|
|
199
|
+
try {
|
|
200
|
+
await connection.close();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// ignore — connection may already be closed
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
57
207
|
/**
|
|
58
208
|
* Ensure queue exists in RabbitMQ
|
|
59
209
|
*/
|
|
@@ -150,6 +300,16 @@ export class RabbitMQAdapter extends QueueAdapter {
|
|
|
150
300
|
this.ensureReady();
|
|
151
301
|
await this.ensureQueueExists(queueName);
|
|
152
302
|
this.processors.set(queueName, handler);
|
|
303
|
+
// Retain concurrency so the consumer can be replayed after a reconnect
|
|
304
|
+
this.queueConcurrency.set(queueName, concurrency);
|
|
305
|
+
await this.registerConsumer(queueName, concurrency, handler);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Assert the queue, set prefetch and start consuming. Shared by process() and by
|
|
309
|
+
* replayConsumers() so a reconnect re-establishes consumers identically.
|
|
310
|
+
*/
|
|
311
|
+
async registerConsumer(queueName, concurrency, handler) {
|
|
312
|
+
await this.ensureQueueExists(queueName);
|
|
153
313
|
// Set prefetch count (concurrency)
|
|
154
314
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
155
315
|
await this.channel.prefetch(concurrency);
|
|
@@ -391,27 +551,23 @@ export class RabbitMQAdapter extends QueueAdapter {
|
|
|
391
551
|
// Clear job store
|
|
392
552
|
this.jobStore.delete(queueName);
|
|
393
553
|
this.processors.delete(queueName);
|
|
554
|
+
this.queueConcurrency.delete(queueName);
|
|
394
555
|
}
|
|
395
556
|
/**
|
|
396
557
|
* Close the adapter
|
|
397
558
|
*/
|
|
398
559
|
async close() {
|
|
560
|
+
// Signal intentional shutdown so lifecycle handlers don't trigger a reconnect
|
|
561
|
+
this.isClosing = true;
|
|
399
562
|
// Cancel all consumers
|
|
400
|
-
for (const queueName of this.consumerTags.keys()) {
|
|
563
|
+
for (const queueName of Array.from(this.consumerTags.keys())) {
|
|
401
564
|
await this.pauseQueue(queueName);
|
|
402
565
|
}
|
|
403
|
-
// Close channel
|
|
404
|
-
|
|
405
|
-
await this.channel.close();
|
|
406
|
-
this.channel = null;
|
|
407
|
-
}
|
|
408
|
-
// Close connection
|
|
409
|
-
if (this.connection) {
|
|
410
|
-
await this.connection.close();
|
|
411
|
-
this.connection = null;
|
|
412
|
-
}
|
|
566
|
+
// Close channel + connection (best-effort)
|
|
567
|
+
await this.cleanupConnection();
|
|
413
568
|
this.jobStore.clear();
|
|
414
569
|
this.processors.clear();
|
|
570
|
+
this.queueConcurrency.clear();
|
|
415
571
|
this.isReady = false;
|
|
416
572
|
}
|
|
417
573
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-adapter.js","sourceRoot":"","sources":["../../../../src/core/queue/adapters/rabbitmq-adapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rabbitmq-adapter.js","sourceRoot":"","sources":["../../../../src/core/queue/adapters/rabbitmq-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RabbitMQ Queue Adapter\n * Adapter for RabbitMQ/AMQP message broker\n * Uses lazy loading for optional dependencies\n */\n\nimport { QueueAdapter } from '../queue-adapter.js';\nimport type {\n Job,\n JobOptions,\n JobHandler,\n JobStatus,\n QueueMetrics,\n BulkJobData,\n QueueConnectionConfig,\n JobContext,\n} from '../types.js';\nimport { isPackageAvailable, resolveUserPackage } from '../../utilities/package-utils.js';\nimport { randomUUID } from 'crypto';\nimport { createFrameworkLogger } from '../../logger/index.js';\n\nconst logger = createFrameworkLogger('RabbitMQQueue');\n\n/**\n * Type definitions for amqplib (loaded dynamically)\n */\ntype AMQPConnection = any;\ntype AMQPChannel = any;\n\n/**\n * Stored job data\n */\ninterface StoredJob {\n id: string;\n name: string;\n data: any;\n options: JobOptions;\n attemptsMade: number;\n timestamp: number;\n processedOn?: number | undefined;\n finishedOn?: number | undefined;\n failedReason?: string | undefined;\n progress: number;\n}\n\n/**\n * RabbitMQ adapter for AMQP-based queues\n * Suitable for complex routing and pub/sub patterns\n */\nexport class RabbitMQAdapter extends QueueAdapter {\n public name = 'rabbitmq';\n\n private amqp: any = null;\n private connection: AMQPConnection | null = null;\n private channel: AMQPChannel | null = null;\n private connectionConfig: QueueConnectionConfig;\n private processors: Map<string, JobHandler<any, any>> = new Map();\n private jobStore: Map<string, Map<string, StoredJob>> = new Map();\n private consumerTags: Map<string, string> = new Map();\n // Concurrency (prefetch) per queue, retained so consumers can be replayed on reconnect\n private queueConcurrency: Map<string, number> = new Map();\n private isClosing = false;\n private reconnecting = false;\n\n // Reconnect backoff bounds\n private static readonly RECONNECT_BASE_DELAY_MS = 1000;\n private static readonly RECONNECT_MAX_DELAY_MS = 30000;\n\n constructor(connectionConfig: QueueConnectionConfig = {}) {\n super();\n this.connectionConfig = connectionConfig;\n }\n\n /**\n * Initialize the RabbitMQ adapter\n */\n async initialize(): Promise<void> {\n if (this.isReady) {\n return;\n }\n\n if (!isPackageAvailable('amqplib')) {\n throw new Error('amqplib is not installed. Install it with: npm install amqplib');\n }\n\n try {\n // Load amqplib\n const amqpPath = resolveUserPackage('amqplib');\n this.amqp = await import(amqpPath);\n\n // Create connection and channel (with error/close handlers attached)\n await this.establishConnection();\n\n this.isReady = true;\n } catch (error) {\n throw new Error(\n `Failed to initialize RabbitMQ adapter: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Build the AMQP connection URL from config\n */\n private buildConnectionUrl(): string {\n const host = this.connectionConfig.host || 'localhost';\n const port = this.connectionConfig.port || 5672;\n const username = this.connectionConfig.username || 'guest';\n const password = this.connectionConfig.password || 'guest';\n return `amqp://${username}:${password}@${host}:${port}`;\n }\n\n /**\n * Open a fresh connection + channel and register lifecycle handlers on both.\n */\n private async establishConnection(): Promise<void> {\n const url = this.buildConnectionUrl();\n\n this.connection = await this.amqp.connect(url);\n this.registerConnectionHandlers(this.connection);\n\n this.channel = await this.connection.createChannel();\n this.registerChannelHandlers(this.channel);\n }\n\n /**\n * Attach 'error'/'close' handlers to the connection. amqplib Connection is an\n * EventEmitter, so an unhandled 'error' would otherwise crash the process.\n */\n private registerConnectionHandlers(connection: AMQPConnection): void {\n connection.on('error', (err: Error) => {\n logger.error('RabbitMQ connection error', 'Connection', {\n error: err instanceof Error ? err.message : String(err),\n });\n this.handleConnectionFailure();\n });\n\n connection.on('close', () => {\n logger.warn('RabbitMQ connection closed', 'Connection');\n this.handleConnectionFailure();\n });\n }\n\n /**\n * Attach 'error'/'close' handlers to the channel. amqplib Channel is an\n * EventEmitter; an unhandled 'error' would otherwise crash the process.\n */\n private registerChannelHandlers(channel: AMQPChannel): void {\n channel.on('error', (err: Error) => {\n logger.error('RabbitMQ channel error', 'Channel', {\n error: err instanceof Error ? err.message : String(err),\n });\n this.handleConnectionFailure();\n });\n\n channel.on('close', () => {\n logger.warn('RabbitMQ channel closed', 'Channel');\n this.handleConnectionFailure();\n });\n }\n\n /**\n * React to a connection/channel error or close by marking the adapter not-ready\n * and kicking off a single reconnect loop. Guarded so the many events a failure\n * emits (connection error + close + channel error + close) trigger at most one\n * reconnect at a time.\n */\n private handleConnectionFailure(): void {\n if (this.isClosing || this.reconnecting) {\n return;\n }\n\n this.isReady = false;\n this.reconnecting = true;\n void this.reconnectWithBackoff();\n }\n\n /**\n * Reconnect with exponential backoff, re-establishing the channel and replaying\n * all registered consumers once connected.\n */\n private async reconnectWithBackoff(): Promise<void> {\n await this.cleanupConnection();\n\n let attempt = 0;\n while (!this.isClosing) {\n attempt++;\n const delay = Math.min(\n RabbitMQAdapter.RECONNECT_BASE_DELAY_MS * 2 ** (attempt - 1),\n RabbitMQAdapter.RECONNECT_MAX_DELAY_MS\n );\n\n logger.warn(`Reconnecting to RabbitMQ in ${delay}ms (attempt ${attempt})`, 'Reconnect');\n await new Promise<void>(resolve => {\n const timer = setTimeout(resolve, delay);\n timer.unref();\n });\n\n if (this.isClosing) {\n break;\n }\n\n try {\n await this.establishConnection();\n this.isReady = true;\n this.reconnecting = false;\n logger.info('RabbitMQ reconnected', 'Reconnect');\n await this.replayConsumers();\n return;\n } catch (error) {\n logger.error(`RabbitMQ reconnect attempt ${attempt} failed`, 'Reconnect', {\n error: error instanceof Error ? error.message : String(error),\n });\n await this.cleanupConnection();\n }\n }\n\n this.reconnecting = false;\n }\n\n /**\n * Re-assert queues and re-register every consumer after a reconnect.\n */\n private async replayConsumers(): Promise<void> {\n const queues = Array.from(this.processors.keys());\n this.consumerTags.clear();\n\n for (const queueName of queues) {\n const handler = this.processors.get(queueName);\n const concurrency = this.queueConcurrency.get(queueName) ?? 1;\n if (!handler) {\n continue;\n }\n try {\n await this.registerConsumer(queueName, concurrency, handler);\n } catch (error) {\n logger.error(`Failed to replay consumer for queue ${queueName}`, 'Reconnect', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n /**\n * Best-effort close of the current channel + connection, clearing references.\n * Handlers on the old objects are guarded by the reconnecting/isClosing flags,\n * so the 'close' events these emit will not re-trigger another reconnect.\n */\n private async cleanupConnection(): Promise<void> {\n const channel = this.channel;\n const connection = this.connection;\n this.channel = null;\n this.connection = null;\n\n if (channel) {\n try {\n await channel.close();\n } catch {\n // ignore — channel may already be closed\n }\n }\n if (connection) {\n try {\n await connection.close();\n } catch {\n // ignore — connection may already be closed\n }\n }\n }\n\n /**\n * Ensure queue exists in RabbitMQ\n */\n private async ensureQueueExists(queueName: string): Promise<void> {\n if (!this.channel) {\n throw new Error('Channel not initialized');\n }\n\n await this.channel.assertQueue(queueName, {\n durable: true,\n arguments: {},\n });\n\n if (!this.jobStore.has(queueName)) {\n this.jobStore.set(queueName, new Map());\n }\n }\n\n /**\n * Add a job to the queue\n */\n async addJob<T = any>(queueName: string, data: T, options: JobOptions = {}): Promise<Job<T>> {\n this.ensureReady();\n await this.ensureQueueExists(queueName);\n\n const jobId = options.jobId || randomUUID();\n const job: StoredJob = {\n id: jobId,\n name: queueName,\n data,\n options,\n attemptsMade: 0,\n timestamp: Date.now(),\n progress: 0,\n };\n\n // Store job metadata\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.jobStore.get(queueName)!.set(jobId, job);\n\n // Prepare message\n const message = {\n jobId,\n data,\n options,\n timestamp: job.timestamp,\n };\n\n const messageBuffer = Buffer.from(JSON.stringify(message));\n\n // Send to RabbitMQ with options\n const sendOptions: any = {\n persistent: true,\n priority: options.priority || 0,\n messageId: jobId,\n };\n\n if (options.delay && options.delay > 0) {\n // Use dead letter exchange for delayed messages\n const delayQueue = `${queueName}.delay`;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await this.channel!.assertQueue(delayQueue, {\n durable: true,\n arguments: {\n 'x-dead-letter-exchange': '',\n 'x-dead-letter-routing-key': queueName,\n 'x-message-ttl': options.delay,\n },\n });\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.sendToQueue(delayQueue, messageBuffer, sendOptions);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.sendToQueue(queueName, messageBuffer, sendOptions);\n }\n\n return {\n id: job.id,\n name: job.name,\n data: job.data,\n progress: job.progress,\n attemptsMade: job.attemptsMade,\n timestamp: job.timestamp,\n opts: job.options,\n };\n }\n\n /**\n * Add multiple jobs in bulk\n */\n async addBulkJobs<T = any>(queueName: string, jobs: BulkJobData<T>[]): Promise<Job<T>[]> {\n this.ensureReady();\n\n const addedJobs: Job<T>[] = [];\n for (const jobData of jobs) {\n const job = await this.addJob(queueName, jobData.data, jobData.options);\n addedJobs.push(job);\n }\n\n return addedJobs;\n }\n\n /**\n * Register a job processor\n */\n async process<T = any, R = any>(\n queueName: string,\n concurrency: number,\n handler: JobHandler<T, R>\n ): Promise<void> {\n this.ensureReady();\n await this.ensureQueueExists(queueName);\n\n this.processors.set(queueName, handler);\n // Retain concurrency so the consumer can be replayed after a reconnect\n this.queueConcurrency.set(queueName, concurrency);\n\n await this.registerConsumer(queueName, concurrency, handler);\n }\n\n /**\n * Assert the queue, set prefetch and start consuming. Shared by process() and by\n * replayConsumers() so a reconnect re-establishes consumers identically.\n */\n private async registerConsumer(\n queueName: string,\n concurrency: number,\n handler: JobHandler<any, any>\n ): Promise<void> {\n await this.ensureQueueExists(queueName);\n\n // Set prefetch count (concurrency)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await this.channel!.prefetch(concurrency);\n\n // Start consuming messages\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const consumer = await this.channel!.consume(\n queueName,\n async (msg: any) => {\n if (!msg) {\n return;\n }\n\n try {\n const message = JSON.parse(msg.content.toString());\n const { jobId, data, options } = message;\n\n const storedJob = this.jobStore.get(queueName)?.get(jobId);\n if (!storedJob) {\n // Job not found, acknowledge and skip\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.ack(msg);\n return;\n }\n\n storedJob.processedOn = Date.now();\n\n // Create job context\n const jobContext: JobContext = {\n id: jobId,\n name: queueName,\n data,\n progress: storedJob.progress,\n attemptsMade: storedJob.attemptsMade,\n timestamp: storedJob.timestamp,\n processedOn: storedJob.processedOn,\n finishedOn: storedJob.finishedOn,\n failedReason: storedJob.failedReason,\n opts: options,\n updateProgress: async (progress: number) => {\n storedJob.progress = progress;\n },\n log: (message: string) => {\n logger.debug(`[Job ${jobId}] ${message}`);\n },\n };\n\n // Execute handler\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const result = await handler(jobContext);\n\n // Mark as completed\n storedJob.finishedOn = Date.now();\n storedJob.progress = 100;\n\n // Acknowledge message\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.ack(msg);\n\n // Auto-remove if configured\n if (options.removeOnComplete) {\n setTimeout(\n () => {\n this.jobStore.get(queueName)?.delete(jobId);\n },\n typeof options.removeOnComplete === 'number' ? options.removeOnComplete : 0\n );\n }\n } catch (error) {\n const message = JSON.parse(msg.content.toString());\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { jobId, data, options } = message;\n\n const storedJob = this.jobStore.get(queueName)?.get(jobId);\n if (storedJob) {\n storedJob.attemptsMade++;\n storedJob.failedReason = error instanceof Error ? error.message : String(error);\n storedJob.finishedOn = Date.now();\n\n // Check if we should retry\n const maxAttempts = options.attempts || 1;\n if (storedJob.attemptsMade < maxAttempts) {\n // Reject and requeue\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.nack(msg, false, true);\n } else {\n // Max attempts reached, move to DLQ or acknowledge\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.ack(msg);\n\n // Auto-remove if configured\n if (options.removeOnFail) {\n setTimeout(\n () => {\n this.jobStore.get(queueName)?.delete(jobId);\n },\n typeof options.removeOnFail === 'number' ? options.removeOnFail : 0\n );\n }\n }\n } else {\n // Job not found, acknowledge\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.channel!.ack(msg);\n }\n }\n },\n { noAck: false }\n );\n\n this.consumerTags.set(queueName, consumer.consumerTag);\n }\n\n /**\n * Get a job by ID\n */\n async getJob(queueName: string, jobId: string): Promise<Job | null> {\n this.ensureReady();\n\n const storedJob = this.jobStore.get(queueName)?.get(jobId);\n if (!storedJob) {\n return null;\n }\n\n return {\n id: storedJob.id,\n name: storedJob.name,\n data: storedJob.data,\n progress: storedJob.progress,\n attemptsMade: storedJob.attemptsMade,\n timestamp: storedJob.timestamp,\n processedOn: storedJob.processedOn,\n finishedOn: storedJob.finishedOn,\n failedReason: storedJob.failedReason,\n opts: storedJob.options,\n };\n }\n\n /**\n * Get jobs by status\n */\n async getJobs(\n queueName: string,\n status?: JobStatus,\n start: number = 0,\n end: number = -1\n ): Promise<Job[]> {\n this.ensureReady();\n\n const jobs = Array.from(this.jobStore.get(queueName)?.values() || []);\n\n // Filter by status if provided\n const filteredJobs = status ? jobs.filter(job => this.getJobStatus(job) === status) : jobs;\n\n // Apply pagination\n const endIndex = end === -1 ? filteredJobs.length : end + 1;\n return filteredJobs.slice(start, endIndex).map(job => ({\n id: job.id,\n name: job.name,\n data: job.data,\n progress: job.progress,\n attemptsMade: job.attemptsMade,\n timestamp: job.timestamp,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n failedReason: job.failedReason,\n opts: job.options,\n }));\n }\n\n /**\n * Remove a job\n */\n async removeJob(queueName: string, jobId: string): Promise<void> {\n this.ensureReady();\n this.jobStore.get(queueName)?.delete(jobId);\n }\n\n /**\n * Retry a failed job\n */\n async retryJob(queueName: string, jobId: string): Promise<void> {\n this.ensureReady();\n\n const storedJob = this.jobStore.get(queueName)?.get(jobId);\n if (!storedJob) {\n return;\n }\n\n // Reset job state\n storedJob.failedReason = undefined;\n storedJob.processedOn = undefined;\n storedJob.finishedOn = undefined;\n storedJob.progress = 0;\n\n // Re-add to queue\n await this.addJob(queueName, storedJob.data, storedJob.options);\n }\n\n /**\n * Pause the queue\n */\n async pauseQueue(queueName: string): Promise<void> {\n this.ensureReady();\n\n const consumerTag = this.consumerTags.get(queueName);\n if (consumerTag && this.channel) {\n await this.channel.cancel(consumerTag);\n this.consumerTags.delete(queueName);\n }\n }\n\n /**\n * Resume the queue\n */\n async resumeQueue(queueName: string): Promise<void> {\n this.ensureReady();\n\n // Restart consuming\n const handler = this.processors.get(queueName);\n if (handler) {\n await this.process(queueName, 1, handler);\n }\n }\n\n /**\n * Get queue metrics\n */\n async getMetrics(queueName: string): Promise<QueueMetrics> {\n this.ensureReady();\n\n const jobs = Array.from(this.jobStore.get(queueName)?.values() || []);\n\n const metrics: QueueMetrics = {\n waiting: 0,\n active: 0,\n completed: 0,\n failed: 0,\n delayed: 0,\n paused: 0,\n };\n\n for (const job of jobs) {\n const status = this.getJobStatus(job);\n if (status in metrics) {\n metrics[status]++;\n }\n }\n\n return metrics;\n }\n\n /**\n * Clean old jobs\n */\n async clean(queueName: string, gracePeriod: number, status?: JobStatus): Promise<void> {\n this.ensureReady();\n\n const jobs = this.jobStore.get(queueName);\n if (!jobs) {\n return;\n }\n\n const cutoff = Date.now() - gracePeriod;\n const jobsToRemove: string[] = [];\n\n for (const [jobId, job] of jobs.entries()) {\n const jobStatus = this.getJobStatus(job);\n const shouldClean = !status || jobStatus === status;\n\n if (shouldClean && job.finishedOn && job.finishedOn < cutoff) {\n jobsToRemove.push(jobId);\n }\n }\n\n for (const jobId of jobsToRemove) {\n jobs.delete(jobId);\n }\n }\n\n /**\n * Obliterate a queue\n */\n async obliterate(queueName: string): Promise<void> {\n this.ensureReady();\n\n // Cancel consumer\n await this.pauseQueue(queueName);\n\n // Delete queue from RabbitMQ\n if (this.channel) {\n await this.channel.deleteQueue(queueName);\n }\n\n // Clear job store\n this.jobStore.delete(queueName);\n this.processors.delete(queueName);\n this.queueConcurrency.delete(queueName);\n }\n\n /**\n * Close the adapter\n */\n async close(): Promise<void> {\n // Signal intentional shutdown so lifecycle handlers don't trigger a reconnect\n this.isClosing = true;\n\n // Cancel all consumers\n for (const queueName of Array.from(this.consumerTags.keys())) {\n await this.pauseQueue(queueName);\n }\n\n // Close channel + connection (best-effort)\n await this.cleanupConnection();\n\n this.jobStore.clear();\n this.processors.clear();\n this.queueConcurrency.clear();\n this.isReady = false;\n }\n\n /**\n * Get job status\n */\n private getJobStatus(job: StoredJob): JobStatus {\n if (job.failedReason) {\n return 'failed';\n }\n if (job.finishedOn) {\n return 'completed';\n }\n if (job.processedOn) {\n return 'active';\n }\n if (job.options.delay && job.options.delay > 0) {\n return 'delayed';\n }\n return 'waiting';\n }\n}\n"]}
|
|
@@ -20,7 +20,7 @@ export declare class SQSAdapter extends QueueAdapter {
|
|
|
20
20
|
private connectionConfig;
|
|
21
21
|
private processors;
|
|
22
22
|
private jobStore;
|
|
23
|
-
private
|
|
23
|
+
private pollingState;
|
|
24
24
|
private queueUrls;
|
|
25
25
|
constructor(connectionConfig?: QueueConnectionConfig);
|
|
26
26
|
/**
|
|
@@ -88,9 +88,19 @@ export declare class SQSAdapter extends QueueAdapter {
|
|
|
88
88
|
*/
|
|
89
89
|
close(): Promise<void>;
|
|
90
90
|
/**
|
|
91
|
-
* Start polling for messages
|
|
91
|
+
* Start polling for messages.
|
|
92
|
+
*
|
|
93
|
+
* Runs a single self-scheduling loop instead of a fixed-rate interval: the next
|
|
94
|
+
* poll is only scheduled once the current one settles, so long-poll requests can
|
|
95
|
+
* never stack up. The scheduling timer is unref'd so it doesn't keep the process
|
|
96
|
+
* alive, and an in-flight promise is tracked so pause/close can await the active
|
|
97
|
+
* poll before returning.
|
|
92
98
|
*/
|
|
93
99
|
private startPolling;
|
|
100
|
+
/**
|
|
101
|
+
* Stop the polling loop for a queue and wait for any in-flight poll to settle.
|
|
102
|
+
*/
|
|
103
|
+
private stopPolling;
|
|
94
104
|
/**
|
|
95
105
|
* Process a single message
|
|
96
106
|
*/
|
|
@@ -23,7 +23,7 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
23
23
|
connectionConfig;
|
|
24
24
|
processors = new Map();
|
|
25
25
|
jobStore = new Map();
|
|
26
|
-
|
|
26
|
+
pollingState = new Map();
|
|
27
27
|
queueUrls = new Map();
|
|
28
28
|
constructor(connectionConfig = {}) {
|
|
29
29
|
super();
|
|
@@ -143,6 +143,9 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
143
143
|
const entries = [];
|
|
144
144
|
for (let i = 0; i < jobs.length; i++) {
|
|
145
145
|
const jobData = jobs[i];
|
|
146
|
+
if (!jobData) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
146
149
|
const jobId = jobData.options?.jobId || randomUUID();
|
|
147
150
|
const job = {
|
|
148
151
|
id: jobId,
|
|
@@ -294,11 +297,7 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
294
297
|
*/
|
|
295
298
|
async pauseQueue(queueName) {
|
|
296
299
|
this.ensureReady();
|
|
297
|
-
|
|
298
|
-
if (interval) {
|
|
299
|
-
clearInterval(interval);
|
|
300
|
-
this.pollingIntervals.delete(queueName);
|
|
301
|
-
}
|
|
300
|
+
await this.stopPolling(queueName);
|
|
302
301
|
}
|
|
303
302
|
/**
|
|
304
303
|
* Resume the queue
|
|
@@ -372,8 +371,8 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
372
371
|
*/
|
|
373
372
|
async close() {
|
|
374
373
|
// Stop all polling
|
|
375
|
-
for (const queueName of this.
|
|
376
|
-
await this.
|
|
374
|
+
for (const queueName of Array.from(this.pollingState.keys())) {
|
|
375
|
+
await this.stopPolling(queueName);
|
|
377
376
|
}
|
|
378
377
|
this.jobStore.clear();
|
|
379
378
|
this.processors.clear();
|
|
@@ -382,13 +381,21 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
382
381
|
this.isReady = false;
|
|
383
382
|
}
|
|
384
383
|
/**
|
|
385
|
-
* Start polling for messages
|
|
384
|
+
* Start polling for messages.
|
|
385
|
+
*
|
|
386
|
+
* Runs a single self-scheduling loop instead of a fixed-rate interval: the next
|
|
387
|
+
* poll is only scheduled once the current one settles, so long-poll requests can
|
|
388
|
+
* never stack up. The scheduling timer is unref'd so it doesn't keep the process
|
|
389
|
+
* alive, and an in-flight promise is tracked so pause/close can await the active
|
|
390
|
+
* poll before returning.
|
|
386
391
|
*/
|
|
387
392
|
startPolling(queueName, maxMessages) {
|
|
388
|
-
if (this.
|
|
393
|
+
if (this.pollingState.has(queueName)) {
|
|
389
394
|
return;
|
|
390
395
|
}
|
|
391
|
-
const
|
|
396
|
+
const state = { timer: null, stopped: false, inFlight: null };
|
|
397
|
+
this.pollingState.set(queueName, state);
|
|
398
|
+
const pollOnce = async () => {
|
|
392
399
|
try {
|
|
393
400
|
const command = new this.ReceiveMessageCommand({
|
|
394
401
|
QueueUrl: this.getQueueUrl(queueName),
|
|
@@ -407,11 +414,44 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
407
414
|
logger.error(`Error polling queue ${queueName}: ${error}`);
|
|
408
415
|
}
|
|
409
416
|
};
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
417
|
+
const runLoop = () => {
|
|
418
|
+
if (state.stopped) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const current = pollOnce();
|
|
422
|
+
state.inFlight = current;
|
|
423
|
+
void current.then(() => {
|
|
424
|
+
state.inFlight = null;
|
|
425
|
+
if (state.stopped) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
// Long polling already paces us; schedule the next iteration immediately.
|
|
429
|
+
const timer = setTimeout(runLoop, 0);
|
|
430
|
+
timer.unref();
|
|
431
|
+
state.timer = timer;
|
|
432
|
+
});
|
|
433
|
+
};
|
|
434
|
+
runLoop();
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Stop the polling loop for a queue and wait for any in-flight poll to settle.
|
|
438
|
+
*/
|
|
439
|
+
async stopPolling(queueName) {
|
|
440
|
+
const state = this.pollingState.get(queueName);
|
|
441
|
+
if (!state) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
state.stopped = true;
|
|
445
|
+
if (state.timer) {
|
|
446
|
+
clearTimeout(state.timer);
|
|
447
|
+
state.timer = null;
|
|
448
|
+
}
|
|
449
|
+
// Await the active poll so callers don't race with in-flight message processing.
|
|
450
|
+
const inFlight = state.inFlight;
|
|
451
|
+
if (inFlight) {
|
|
452
|
+
await inFlight.catch(() => { });
|
|
453
|
+
}
|
|
454
|
+
this.pollingState.delete(queueName);
|
|
415
455
|
}
|
|
416
456
|
/**
|
|
417
457
|
* Process a single message
|
|
@@ -423,16 +463,27 @@ export class SQSAdapter extends QueueAdapter {
|
|
|
423
463
|
}
|
|
424
464
|
try {
|
|
425
465
|
const body = JSON.parse(message.Body);
|
|
426
|
-
const { jobId, data, options } = body;
|
|
427
|
-
|
|
466
|
+
const { jobId, data, options, timestamp } = body;
|
|
467
|
+
// The SQS message body is the source of truth for the job. In the normal
|
|
468
|
+
// topology producers and consumers are separate processes (or the
|
|
469
|
+
// consumer restarted after enqueue), so this consumer's in-memory
|
|
470
|
+
// jobStore will not contain the job. Reconstruct and cache a local record
|
|
471
|
+
// from the body instead of deleting the message unprocessed — dropping it
|
|
472
|
+
// here silently loses the job and never runs the handler.
|
|
473
|
+
let storedJob = this.jobStore.get(queueName)?.get(jobId);
|
|
428
474
|
if (!storedJob) {
|
|
429
|
-
|
|
475
|
+
storedJob = {
|
|
476
|
+
id: jobId,
|
|
477
|
+
name: queueName,
|
|
478
|
+
data,
|
|
479
|
+
options: options || {},
|
|
480
|
+
attemptsMade: 0,
|
|
481
|
+
timestamp: timestamp || Date.now(),
|
|
482
|
+
progress: 0,
|
|
483
|
+
};
|
|
484
|
+
this.ensureJobStore(queueName);
|
|
430
485
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
431
|
-
|
|
432
|
-
QueueUrl: this.getQueueUrl(queueName),
|
|
433
|
-
ReceiptHandle: message.ReceiptHandle,
|
|
434
|
-
}));
|
|
435
|
-
return;
|
|
486
|
+
this.jobStore.get(queueName).set(jobId, storedJob);
|
|
436
487
|
}
|
|
437
488
|
storedJob.receiptHandle = message.ReceiptHandle;
|
|
438
489
|
storedJob.processedOn = Date.now();
|