@kabyeon/nexusjs 0.6.5
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 -0
- package/README.md +860 -0
- package/dist/auth/auth.controller.d.ts +175 -0
- package/dist/auth/auth.controller.d.ts.map +1 -0
- package/dist/auth/auth.d.ts +47 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.module.d.ts +34 -0
- package/dist/auth/auth.module.d.ts.map +1 -0
- package/dist/auth/auth.service.d.ts +192 -0
- package/dist/auth/auth.service.d.ts.map +1 -0
- package/dist/auth/decorators/current-user.d.ts +58 -0
- package/dist/auth/decorators/current-user.d.ts.map +1 -0
- package/dist/auth/index.d.ts +43 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +730 -0
- package/dist/auth/index.js.map +25 -0
- package/dist/auth/middleware.d.ts +50 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/types.d.ts +135 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/cache/cache.module.d.ts +22 -0
- package/dist/cache/cache.module.d.ts.map +1 -0
- package/dist/cache/cache.service.d.ts +37 -0
- package/dist/cache/cache.service.d.ts.map +1 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +814 -0
- package/dist/cache/index.js.map +25 -0
- package/dist/cache/stores/drizzle.d.ts +76 -0
- package/dist/cache/stores/drizzle.d.ts.map +1 -0
- package/dist/cache/stores/index.d.ts +10 -0
- package/dist/cache/stores/index.d.ts.map +1 -0
- package/dist/cache/stores/memory.d.ts +34 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/redis.d.ts +46 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/types.d.ts +88 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cli/commands/config.d.ts +44 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/db-generate.d.ts +20 -0
- package/dist/cli/commands/db-generate.d.ts.map +1 -0
- package/dist/cli/commands/db-migrate.d.ts +33 -0
- package/dist/cli/commands/db-migrate.d.ts.map +1 -0
- package/dist/cli/commands/db-seed.d.ts +43 -0
- package/dist/cli/commands/db-seed.d.ts.map +1 -0
- package/dist/cli/commands/index.d.ts +11 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/info.d.ts +11 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +38 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/make-auth.d.ts +17 -0
- package/dist/cli/commands/make-auth.d.ts.map +1 -0
- package/dist/cli/commands/make-controller.d.ts +16 -0
- package/dist/cli/commands/make-controller.d.ts.map +1 -0
- package/dist/cli/commands/make-crud.d.ts +28 -0
- package/dist/cli/commands/make-crud.d.ts.map +1 -0
- package/dist/cli/commands/make-listener.d.ts +15 -0
- package/dist/cli/commands/make-listener.d.ts.map +1 -0
- package/dist/cli/commands/make-middleware.d.ts +7 -0
- package/dist/cli/commands/make-middleware.d.ts.map +1 -0
- package/dist/cli/commands/make-migration.d.ts +21 -0
- package/dist/cli/commands/make-migration.d.ts.map +1 -0
- package/dist/cli/commands/make-model.d.ts +22 -0
- package/dist/cli/commands/make-model.d.ts.map +1 -0
- package/dist/cli/commands/make-module.d.ts +11 -0
- package/dist/cli/commands/make-module.d.ts.map +1 -0
- package/dist/cli/commands/make-queue.d.ts +17 -0
- package/dist/cli/commands/make-queue.d.ts.map +1 -0
- package/dist/cli/commands/make-schedule.d.ts +17 -0
- package/dist/cli/commands/make-schedule.d.ts.map +1 -0
- package/dist/cli/commands/make-service.d.ts +7 -0
- package/dist/cli/commands/make-service.d.ts.map +1 -0
- package/dist/cli/commands/make-session.d.ts +15 -0
- package/dist/cli/commands/make-session.d.ts.map +1 -0
- package/dist/cli/commands/make-validator.d.ts +7 -0
- package/dist/cli/commands/make-validator.d.ts.map +1 -0
- package/dist/cli/commands/new.d.ts +14 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/repl.d.ts +42 -0
- package/dist/cli/commands/repl.d.ts.map +1 -0
- package/dist/cli/commands/route-list.d.ts +12 -0
- package/dist/cli/commands/route-list.d.ts.map +1 -0
- package/dist/cli/core/args.d.ts +29 -0
- package/dist/cli/core/args.d.ts.map +1 -0
- package/dist/cli/core/config.d.ts +137 -0
- package/dist/cli/core/config.d.ts.map +1 -0
- package/dist/cli/core/fs.d.ts +38 -0
- package/dist/cli/core/fs.d.ts.map +1 -0
- package/dist/cli/core/index.d.ts +42 -0
- package/dist/cli/core/index.d.ts.map +1 -0
- package/dist/cli/core/logger.d.ts +46 -0
- package/dist/cli/core/logger.d.ts.map +1 -0
- package/dist/cli/core/loose-json.d.ts +26 -0
- package/dist/cli/core/loose-json.d.ts.map +1 -0
- package/dist/cli/core/prompts.d.ts +22 -0
- package/dist/cli/core/prompts.d.ts.map +1 -0
- package/dist/cli/core/template.d.ts +26 -0
- package/dist/cli/core/template.d.ts.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +6136 -0
- package/dist/cli/index.js.map +91 -0
- package/dist/cli/templates/controller/adonis.d.ts +10 -0
- package/dist/cli/templates/controller/adonis.d.ts.map +1 -0
- package/dist/cli/templates/controller/functional.d.ts +9 -0
- package/dist/cli/templates/controller/functional.d.ts.map +1 -0
- package/dist/cli/templates/controller/nest.d.ts +17 -0
- package/dist/cli/templates/controller/nest.d.ts.map +1 -0
- package/dist/cli/templates/crud/controller.d.ts +8 -0
- package/dist/cli/templates/crud/controller.d.ts.map +1 -0
- package/dist/cli/templates/crud/dto.d.ts +8 -0
- package/dist/cli/templates/crud/dto.d.ts.map +1 -0
- package/dist/cli/templates/crud/index.d.ts +33 -0
- package/dist/cli/templates/crud/index.d.ts.map +1 -0
- package/dist/cli/templates/crud/module.d.ts +6 -0
- package/dist/cli/templates/crud/module.d.ts.map +1 -0
- package/dist/cli/templates/crud/test.d.ts +10 -0
- package/dist/cli/templates/crud/test.d.ts.map +1 -0
- package/dist/cli/templates/index.d.ts +39 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/middleware/middleware.d.ts +8 -0
- package/dist/cli/templates/middleware/middleware.d.ts.map +1 -0
- package/dist/cli/templates/migration/drizzle.d.ts +12 -0
- package/dist/cli/templates/migration/drizzle.d.ts.map +1 -0
- package/dist/cli/templates/migration/sql.d.ts +10 -0
- package/dist/cli/templates/migration/sql.d.ts.map +1 -0
- package/dist/cli/templates/model/drizzle-dialect.d.ts +29 -0
- package/dist/cli/templates/model/drizzle-dialect.d.ts.map +1 -0
- package/dist/cli/templates/model/drizzle.d.ts +14 -0
- package/dist/cli/templates/model/drizzle.d.ts.map +1 -0
- package/dist/cli/templates/model/kysely.d.ts +12 -0
- package/dist/cli/templates/model/kysely.d.ts.map +1 -0
- package/dist/cli/templates/model/prisma.d.ts +12 -0
- package/dist/cli/templates/model/prisma.d.ts.map +1 -0
- package/dist/cli/templates/module/module.d.ts +16 -0
- package/dist/cli/templates/module/module.d.ts.map +1 -0
- package/dist/cli/templates/project/drizzle.config.d.ts +12 -0
- package/dist/cli/templates/project/drizzle.config.d.ts.map +1 -0
- package/dist/cli/templates/project/nx.config.d.ts +7 -0
- package/dist/cli/templates/project/nx.config.d.ts.map +1 -0
- package/dist/cli/templates/repository/repository.d.ts +13 -0
- package/dist/cli/templates/repository/repository.d.ts.map +1 -0
- package/dist/cli/templates/service/service.d.ts +12 -0
- package/dist/cli/templates/service/service.d.ts.map +1 -0
- package/dist/cli/templates/validator/validator.d.ts +8 -0
- package/dist/cli/templates/validator/validator.d.ts.map +1 -0
- package/dist/config/config.module.d.ts +39 -0
- package/dist/config/config.module.d.ts.map +1 -0
- package/dist/config/config.service.d.ts +47 -0
- package/dist/config/config.service.d.ts.map +1 -0
- package/dist/config/index.d.ts +39 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +436 -0
- package/dist/config/index.js.map +21 -0
- package/dist/config/types.d.ts +78 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/core/application.d.ts +77 -0
- package/dist/core/application.d.ts.map +1 -0
- package/dist/core/constants.d.ts +48 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/decorators/controller.d.ts +21 -0
- package/dist/core/decorators/controller.d.ts.map +1 -0
- package/dist/core/decorators/http-methods.d.ts +33 -0
- package/dist/core/decorators/http-methods.d.ts.map +1 -0
- package/dist/core/decorators/index.d.ts +12 -0
- package/dist/core/decorators/index.d.ts.map +1 -0
- package/dist/core/decorators/injectable.d.ts +42 -0
- package/dist/core/decorators/injectable.d.ts.map +1 -0
- package/dist/core/decorators/metadata.d.ts +7 -0
- package/dist/core/decorators/metadata.d.ts.map +1 -0
- package/dist/core/decorators/module.d.ts +23 -0
- package/dist/core/decorators/module.d.ts.map +1 -0
- package/dist/core/decorators/params.d.ts +33 -0
- package/dist/core/decorators/params.d.ts.map +1 -0
- package/dist/core/decorators/repository.d.ts +24 -0
- package/dist/core/decorators/repository.d.ts.map +1 -0
- package/dist/core/decorators/validate.d.ts +21 -0
- package/dist/core/decorators/validate.d.ts.map +1 -0
- package/dist/core/di/container.d.ts +70 -0
- package/dist/core/di/container.d.ts.map +1 -0
- package/dist/core/di/index.d.ts +9 -0
- package/dist/core/di/index.d.ts.map +1 -0
- package/dist/core/di/request-middleware.d.ts +36 -0
- package/dist/core/di/request-middleware.d.ts.map +1 -0
- package/dist/core/di/request-scope.d.ts +45 -0
- package/dist/core/di/request-scope.d.ts.map +1 -0
- package/dist/core/di/scanner.d.ts +36 -0
- package/dist/core/di/scanner.d.ts.map +1 -0
- package/dist/core/di/tokens.d.ts +98 -0
- package/dist/core/di/tokens.d.ts.map +1 -0
- package/dist/core/http/context.d.ts +30 -0
- package/dist/core/http/context.d.ts.map +1 -0
- package/dist/core/http/index.d.ts +8 -0
- package/dist/core/http/index.d.ts.map +1 -0
- package/dist/core/http/middleware.d.ts +31 -0
- package/dist/core/http/middleware.d.ts.map +1 -0
- package/dist/core/http/router.d.ts +46 -0
- package/dist/core/http/router.d.ts.map +1 -0
- package/dist/core/http/server.d.ts +58 -0
- package/dist/core/http/server.d.ts.map +1 -0
- package/dist/core/index.d.ts +20 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/orm/drizzle-adapter.d.ts +73 -0
- package/dist/core/orm/drizzle-adapter.d.ts.map +1 -0
- package/dist/core/orm/index.d.ts +5 -0
- package/dist/core/orm/index.d.ts.map +1 -0
- package/dist/core/runtime/bun.d.ts +13 -0
- package/dist/core/runtime/bun.d.ts.map +1 -0
- package/dist/core/runtime/cloudflare.d.ts +18 -0
- package/dist/core/runtime/cloudflare.d.ts.map +1 -0
- package/dist/core/runtime/index.d.ts +11 -0
- package/dist/core/runtime/index.d.ts.map +1 -0
- package/dist/core/runtime/node.d.ts +10 -0
- package/dist/core/runtime/node.d.ts.map +1 -0
- package/dist/core/validation/index.d.ts +5 -0
- package/dist/core/validation/index.d.ts.map +1 -0
- package/dist/core/validation/validator.d.ts +46 -0
- package/dist/core/validation/validator.d.ts.map +1 -0
- package/dist/crypto/encryption.d.ts +71 -0
- package/dist/crypto/encryption.d.ts.map +1 -0
- package/dist/crypto/hash.d.ts +52 -0
- package/dist/crypto/hash.d.ts.map +1 -0
- package/dist/crypto/index.d.ts +49 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +533 -0
- package/dist/crypto/index.js.map +14 -0
- package/dist/crypto/module.d.ts +28 -0
- package/dist/crypto/module.d.ts.map +1 -0
- package/dist/crypto/types.d.ts +81 -0
- package/dist/crypto/types.d.ts.map +1 -0
- package/dist/drive/drive.module.d.ts +20 -0
- package/dist/drive/drive.module.d.ts.map +1 -0
- package/dist/drive/drive.service.d.ts +21 -0
- package/dist/drive/drive.service.d.ts.map +1 -0
- package/dist/drive/drivers/index.d.ts +9 -0
- package/dist/drive/drivers/index.d.ts.map +1 -0
- package/dist/drive/drivers/local.d.ts +24 -0
- package/dist/drive/drivers/local.d.ts.map +1 -0
- package/dist/drive/drivers/memory.d.ts +19 -0
- package/dist/drive/drivers/memory.d.ts.map +1 -0
- package/dist/drive/drivers/s3.d.ts +44 -0
- package/dist/drive/drivers/s3.d.ts.map +1 -0
- package/dist/drive/index.d.ts +9 -0
- package/dist/drive/index.d.ts.map +1 -0
- package/dist/drive/index.js +714 -0
- package/dist/drive/index.js.map +25 -0
- package/dist/drive/types.d.ts +97 -0
- package/dist/drive/types.d.ts.map +1 -0
- package/dist/drizzle/decorators/columns.d.ts +16 -0
- package/dist/drizzle/decorators/columns.d.ts.map +1 -0
- package/dist/drizzle/decorators/index.d.ts +6 -0
- package/dist/drizzle/decorators/index.d.ts.map +1 -0
- package/dist/drizzle/drivers/base.d.ts +32 -0
- package/dist/drizzle/drivers/base.d.ts.map +1 -0
- package/dist/drizzle/drivers/bun-sqlite.d.ts +6 -0
- package/dist/drizzle/drivers/bun-sqlite.d.ts.map +1 -0
- package/dist/drizzle/drivers/d1.d.ts +7 -0
- package/dist/drizzle/drivers/d1.d.ts.map +1 -0
- package/dist/drizzle/drivers/index.d.ts +14 -0
- package/dist/drizzle/drivers/index.d.ts.map +1 -0
- package/dist/drizzle/drivers/mysql.d.ts +6 -0
- package/dist/drizzle/drivers/mysql.d.ts.map +1 -0
- package/dist/drizzle/drivers/postgres.d.ts +12 -0
- package/dist/drizzle/drivers/postgres.d.ts.map +1 -0
- package/dist/drizzle/drivers/sqlite.d.ts +8 -0
- package/dist/drizzle/drivers/sqlite.d.ts.map +1 -0
- package/dist/drizzle/drizzle.module.d.ts +29 -0
- package/dist/drizzle/drizzle.module.d.ts.map +1 -0
- package/dist/drizzle/drizzle.service.d.ts +52 -0
- package/dist/drizzle/drizzle.service.d.ts.map +1 -0
- package/dist/drizzle/index.d.ts +13 -0
- package/dist/drizzle/index.d.ts.map +1 -0
- package/dist/drizzle/index.js +979 -0
- package/dist/drizzle/index.js.map +32 -0
- package/dist/drizzle/model.d.ts +26 -0
- package/dist/drizzle/model.d.ts.map +1 -0
- package/dist/drizzle/raw-query.d.ts +41 -0
- package/dist/drizzle/raw-query.d.ts.map +1 -0
- package/dist/drizzle/repository/index.d.ts +6 -0
- package/dist/drizzle/repository/index.d.ts.map +1 -0
- package/dist/drizzle/repository/repository.d.ts +60 -0
- package/dist/drizzle/repository/repository.d.ts.map +1 -0
- package/dist/drizzle/types.d.ts +160 -0
- package/dist/drizzle/types.d.ts.map +1 -0
- package/dist/events/decorators/on-event.d.ts +49 -0
- package/dist/events/decorators/on-event.d.ts.map +1 -0
- package/dist/events/emitter.d.ts +52 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/event.service.d.ts +27 -0
- package/dist/events/event.service.d.ts.map +1 -0
- package/dist/events/events.module.d.ts +35 -0
- package/dist/events/events.module.d.ts.map +1 -0
- package/dist/events/index.d.ts +43 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +646 -0
- package/dist/events/index.js.map +23 -0
- package/dist/events/types.d.ts +120 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/grpc/decorators.d.ts +34 -0
- package/dist/grpc/decorators.d.ts.map +1 -0
- package/dist/grpc/index.d.ts +70 -0
- package/dist/grpc/index.d.ts.map +1 -0
- package/dist/grpc/index.js +528 -0
- package/dist/grpc/index.js.map +22 -0
- package/dist/grpc/module.d.ts +32 -0
- package/dist/grpc/module.d.ts.map +1 -0
- package/dist/grpc/service.d.ts +60 -0
- package/dist/grpc/service.d.ts.map +1 -0
- package/dist/grpc/types.d.ts +79 -0
- package/dist/grpc/types.d.ts.map +1 -0
- package/dist/health/health.controller.d.ts +61 -0
- package/dist/health/health.controller.d.ts.map +1 -0
- package/dist/health/health.module.d.ts +29 -0
- package/dist/health/health.module.d.ts.map +1 -0
- package/dist/health/health.service.d.ts +34 -0
- package/dist/health/health.service.d.ts.map +1 -0
- package/dist/health/index.d.ts +38 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +599 -0
- package/dist/health/index.js.map +25 -0
- package/dist/health/indicators/drizzle.d.ts +18 -0
- package/dist/health/indicators/drizzle.d.ts.map +1 -0
- package/dist/health/indicators/index.d.ts +59 -0
- package/dist/health/indicators/index.d.ts.map +1 -0
- package/dist/health/types.d.ts +105 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/i18n/decorators.d.ts +14 -0
- package/dist/i18n/decorators.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +48 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +589 -0
- package/dist/i18n/index.js.map +17 -0
- package/dist/i18n/middleware.d.ts +26 -0
- package/dist/i18n/middleware.d.ts.map +1 -0
- package/dist/i18n/module.d.ts +39 -0
- package/dist/i18n/module.d.ts.map +1 -0
- package/dist/i18n/service.d.ts +130 -0
- package/dist/i18n/service.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +65 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2056 -0
- package/dist/index.js.map +53 -0
- package/dist/limiter/backends/drizzle.d.ts +40 -0
- package/dist/limiter/backends/drizzle.d.ts.map +1 -0
- package/dist/limiter/backends/index.d.ts +6 -0
- package/dist/limiter/backends/index.d.ts.map +1 -0
- package/dist/limiter/backends/memory.d.ts +28 -0
- package/dist/limiter/backends/memory.d.ts.map +1 -0
- package/dist/limiter/index.d.ts +9 -0
- package/dist/limiter/index.d.ts.map +1 -0
- package/dist/limiter/index.js +640 -0
- package/dist/limiter/index.js.map +25 -0
- package/dist/limiter/limiter.middleware.d.ts +11 -0
- package/dist/limiter/limiter.middleware.d.ts.map +1 -0
- package/dist/limiter/limiter.module.d.ts +23 -0
- package/dist/limiter/limiter.module.d.ts.map +1 -0
- package/dist/limiter/limiter.service.d.ts +18 -0
- package/dist/limiter/limiter.service.d.ts.map +1 -0
- package/dist/limiter/types.d.ts +99 -0
- package/dist/limiter/types.d.ts.map +1 -0
- package/dist/logger/index.d.ts +36 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +538 -0
- package/dist/logger/index.js.map +22 -0
- package/dist/logger/logger.module.d.ts +35 -0
- package/dist/logger/logger.module.d.ts.map +1 -0
- package/dist/logger/logger.service.d.ts +55 -0
- package/dist/logger/logger.service.d.ts.map +1 -0
- package/dist/logger/transports/index.d.ts +35 -0
- package/dist/logger/transports/index.d.ts.map +1 -0
- package/dist/logger/types.d.ts +58 -0
- package/dist/logger/types.d.ts.map +1 -0
- package/dist/mail/index.d.ts +9 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +479 -0
- package/dist/mail/index.js.map +25 -0
- package/dist/mail/mail.module.d.ts +21 -0
- package/dist/mail/mail.module.d.ts.map +1 -0
- package/dist/mail/mail.service.d.ts +18 -0
- package/dist/mail/mail.service.d.ts.map +1 -0
- package/dist/mail/transports/file.d.ts +19 -0
- package/dist/mail/transports/file.d.ts.map +1 -0
- package/dist/mail/transports/index.d.ts +9 -0
- package/dist/mail/transports/index.d.ts.map +1 -0
- package/dist/mail/transports/null.d.ts +11 -0
- package/dist/mail/transports/null.d.ts.map +1 -0
- package/dist/mail/transports/smtp.d.ts +40 -0
- package/dist/mail/transports/smtp.d.ts.map +1 -0
- package/dist/mail/types.d.ts +73 -0
- package/dist/mail/types.d.ts.map +1 -0
- package/dist/metrics/controller.d.ts +27 -0
- package/dist/metrics/controller.d.ts.map +1 -0
- package/dist/metrics/counter.d.ts +36 -0
- package/dist/metrics/counter.d.ts.map +1 -0
- package/dist/metrics/decorators/counted.d.ts +26 -0
- package/dist/metrics/decorators/counted.d.ts.map +1 -0
- package/dist/metrics/decorators/index.d.ts +3 -0
- package/dist/metrics/decorators/index.d.ts.map +1 -0
- package/dist/metrics/decorators/timed.d.ts +25 -0
- package/dist/metrics/decorators/timed.d.ts.map +1 -0
- package/dist/metrics/gauge.d.ts +38 -0
- package/dist/metrics/gauge.d.ts.map +1 -0
- package/dist/metrics/histogram.d.ts +52 -0
- package/dist/metrics/histogram.d.ts.map +1 -0
- package/dist/metrics/index.d.ts +35 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +1033 -0
- package/dist/metrics/index.js.map +21 -0
- package/dist/metrics/module.d.ts +33 -0
- package/dist/metrics/module.d.ts.map +1 -0
- package/dist/metrics/registry.d.ts +52 -0
- package/dist/metrics/registry.d.ts.map +1 -0
- package/dist/metrics/service.d.ts +42 -0
- package/dist/metrics/service.d.ts.map +1 -0
- package/dist/metrics/summary.d.ts +50 -0
- package/dist/metrics/summary.d.ts.map +1 -0
- package/dist/metrics/types.d.ts +115 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/openapi/decorators/body.d.ts +9 -0
- package/dist/openapi/decorators/body.d.ts.map +1 -0
- package/dist/openapi/decorators/index.d.ts +11 -0
- package/dist/openapi/decorators/index.d.ts.map +1 -0
- package/dist/openapi/decorators/operation.d.ts +9 -0
- package/dist/openapi/decorators/operation.d.ts.map +1 -0
- package/dist/openapi/decorators/param.d.ts +17 -0
- package/dist/openapi/decorators/param.d.ts.map +1 -0
- package/dist/openapi/decorators/property.d.ts +24 -0
- package/dist/openapi/decorators/property.d.ts.map +1 -0
- package/dist/openapi/decorators/response.d.ts +10 -0
- package/dist/openapi/decorators/response.d.ts.map +1 -0
- package/dist/openapi/decorators/security.d.ts +9 -0
- package/dist/openapi/decorators/security.d.ts.map +1 -0
- package/dist/openapi/decorators/tags.d.ts +2 -0
- package/dist/openapi/decorators/tags.d.ts.map +1 -0
- package/dist/openapi/index.d.ts +10 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +974 -0
- package/dist/openapi/index.js.map +31 -0
- package/dist/openapi/openapi.module.d.ts +46 -0
- package/dist/openapi/openapi.module.d.ts.map +1 -0
- package/dist/openapi/openapi.service.d.ts +55 -0
- package/dist/openapi/openapi.service.d.ts.map +1 -0
- package/dist/openapi/scalar.d.ts +16 -0
- package/dist/openapi/scalar.d.ts.map +1 -0
- package/dist/openapi/types.d.ts +266 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/openapi/zod-to-json-schema.d.ts +34 -0
- package/dist/openapi/zod-to-json-schema.d.ts.map +1 -0
- package/dist/package.json +59 -0
- package/dist/queue/backends/bullmq.d.ts +41 -0
- package/dist/queue/backends/bullmq.d.ts.map +1 -0
- package/dist/queue/backends/cloudflare.d.ts +84 -0
- package/dist/queue/backends/cloudflare.d.ts.map +1 -0
- package/dist/queue/backends/index.d.ts +7 -0
- package/dist/queue/backends/index.d.ts.map +1 -0
- package/dist/queue/backends/memory.d.ts +24 -0
- package/dist/queue/backends/memory.d.ts.map +1 -0
- package/dist/queue/decorators/on-queue-ready.d.ts +43 -0
- package/dist/queue/decorators/on-queue-ready.d.ts.map +1 -0
- package/dist/queue/index.d.ts +57 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +961 -0
- package/dist/queue/index.js.map +25 -0
- package/dist/queue/queue.module.d.ts +46 -0
- package/dist/queue/queue.module.d.ts.map +1 -0
- package/dist/queue/queue.service.d.ts +61 -0
- package/dist/queue/queue.service.d.ts.map +1 -0
- package/dist/queue/types.d.ts +204 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/redis/adapters/bun.d.ts +27 -0
- package/dist/redis/adapters/bun.d.ts.map +1 -0
- package/dist/redis/adapters/cloudflare.d.ts +51 -0
- package/dist/redis/adapters/cloudflare.d.ts.map +1 -0
- package/dist/redis/adapters/index.d.ts +29 -0
- package/dist/redis/adapters/index.d.ts.map +1 -0
- package/dist/redis/adapters/memory.d.ts +28 -0
- package/dist/redis/adapters/memory.d.ts.map +1 -0
- package/dist/redis/adapters/node.d.ts +36 -0
- package/dist/redis/adapters/node.d.ts.map +1 -0
- package/dist/redis/index.d.ts +33 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +667 -0
- package/dist/redis/index.js.map +25 -0
- package/dist/redis/module.d.ts +32 -0
- package/dist/redis/module.d.ts.map +1 -0
- package/dist/redis/types.d.ts +146 -0
- package/dist/redis/types.d.ts.map +1 -0
- package/dist/schedule/backends/cloudflare.d.ts +55 -0
- package/dist/schedule/backends/cloudflare.d.ts.map +1 -0
- package/dist/schedule/backends/index.d.ts +3 -0
- package/dist/schedule/backends/index.d.ts.map +1 -0
- package/dist/schedule/backends/memory.d.ts +39 -0
- package/dist/schedule/backends/memory.d.ts.map +1 -0
- package/dist/schedule/cron-parser.d.ts +48 -0
- package/dist/schedule/cron-parser.d.ts.map +1 -0
- package/dist/schedule/decorators/cron.d.ts +71 -0
- package/dist/schedule/decorators/cron.d.ts.map +1 -0
- package/dist/schedule/index.d.ts +51 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +1108 -0
- package/dist/schedule/index.js.map +25 -0
- package/dist/schedule/schedule.module.d.ts +44 -0
- package/dist/schedule/schedule.module.d.ts.map +1 -0
- package/dist/schedule/schedule.service.d.ts +51 -0
- package/dist/schedule/schedule.service.d.ts.map +1 -0
- package/dist/schedule/types.d.ts +150 -0
- package/dist/schedule/types.d.ts.map +1 -0
- package/dist/session/backends/cookie.d.ts +56 -0
- package/dist/session/backends/cookie.d.ts.map +1 -0
- package/dist/session/backends/drizzle.d.ts +65 -0
- package/dist/session/backends/drizzle.d.ts.map +1 -0
- package/dist/session/backends/index.d.ts +6 -0
- package/dist/session/backends/index.d.ts.map +1 -0
- package/dist/session/backends/memory.d.ts +32 -0
- package/dist/session/backends/memory.d.ts.map +1 -0
- package/dist/session/backends/redis.d.ts +53 -0
- package/dist/session/backends/redis.d.ts.map +1 -0
- package/dist/session/decorators/current-session.d.ts +56 -0
- package/dist/session/decorators/current-session.d.ts.map +1 -0
- package/dist/session/index.d.ts +42 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +1498 -0
- package/dist/session/index.js.map +28 -0
- package/dist/session/session-middleware.d.ts +29 -0
- package/dist/session/session-middleware.d.ts.map +1 -0
- package/dist/session/session.module.d.ts +35 -0
- package/dist/session/session.module.d.ts.map +1 -0
- package/dist/session/session.service.d.ts +49 -0
- package/dist/session/session.service.d.ts.map +1 -0
- package/dist/session/types.d.ts +201 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/shield/guards/csrf.d.ts +33 -0
- package/dist/shield/guards/csrf.d.ts.map +1 -0
- package/dist/shield/guards/headers.d.ts +22 -0
- package/dist/shield/guards/headers.d.ts.map +1 -0
- package/dist/shield/guards/index.d.ts +6 -0
- package/dist/shield/guards/index.d.ts.map +1 -0
- package/dist/shield/index.d.ts +8 -0
- package/dist/shield/index.d.ts.map +1 -0
- package/dist/shield/index.js +728 -0
- package/dist/shield/index.js.map +25 -0
- package/dist/shield/shield.module.d.ts +25 -0
- package/dist/shield/shield.module.d.ts.map +1 -0
- package/dist/shield/shield.service.d.ts +21 -0
- package/dist/shield/shield.service.d.ts.map +1 -0
- package/dist/shield/types.d.ts +95 -0
- package/dist/shield/types.d.ts.map +1 -0
- package/dist/sse/index.d.ts +7 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +214 -0
- package/dist/sse/index.js.map +13 -0
- package/dist/sse/sse-stream.d.ts +46 -0
- package/dist/sse/sse-stream.d.ts.map +1 -0
- package/dist/sse/sse.d.ts +24 -0
- package/dist/sse/sse.d.ts.map +1 -0
- package/dist/sse/types.d.ts +84 -0
- package/dist/sse/types.d.ts.map +1 -0
- package/dist/static/index.d.ts +41 -0
- package/dist/static/index.d.ts.map +1 -0
- package/dist/static/index.js +313 -0
- package/dist/static/index.js.map +13 -0
- package/dist/static/static.module.d.ts +41 -0
- package/dist/static/static.module.d.ts.map +1 -0
- package/dist/static/static.service.d.ts +38 -0
- package/dist/static/static.service.d.ts.map +1 -0
- package/dist/tracing/decorators/index.d.ts +2 -0
- package/dist/tracing/decorators/index.d.ts.map +1 -0
- package/dist/tracing/decorators/trace.d.ts +37 -0
- package/dist/tracing/decorators/trace.d.ts.map +1 -0
- package/dist/tracing/hono-instrumentation.d.ts +21 -0
- package/dist/tracing/hono-instrumentation.d.ts.map +1 -0
- package/dist/tracing/index.d.ts +29 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +782 -0
- package/dist/tracing/index.js.map +24 -0
- package/dist/tracing/module.d.ts +45 -0
- package/dist/tracing/module.d.ts.map +1 -0
- package/dist/tracing/propagation.d.ts +53 -0
- package/dist/tracing/propagation.d.ts.map +1 -0
- package/dist/tracing/service.d.ts +95 -0
- package/dist/tracing/service.d.ts.map +1 -0
- package/dist/tracing/types.d.ts +90 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/upload/decorators/index.d.ts +6 -0
- package/dist/upload/decorators/index.d.ts.map +1 -0
- package/dist/upload/decorators/upload.d.ts +16 -0
- package/dist/upload/decorators/upload.d.ts.map +1 -0
- package/dist/upload/decorators/uploaded-file.d.ts +10 -0
- package/dist/upload/decorators/uploaded-file.d.ts.map +1 -0
- package/dist/upload/index.d.ts +9 -0
- package/dist/upload/index.d.ts.map +1 -0
- package/dist/upload/index.js +553 -0
- package/dist/upload/index.js.map +25 -0
- package/dist/upload/types.d.ts +103 -0
- package/dist/upload/types.d.ts.map +1 -0
- package/dist/upload/upload.middleware.d.ts +15 -0
- package/dist/upload/upload.middleware.d.ts.map +1 -0
- package/dist/upload/upload.module.d.ts +33 -0
- package/dist/upload/upload.module.d.ts.map +1 -0
- package/dist/upload/upload.service.d.ts +29 -0
- package/dist/upload/upload.service.d.ts.map +1 -0
- package/dist/view/edge.d.ts +23 -0
- package/dist/view/edge.d.ts.map +1 -0
- package/dist/view/eta.d.ts +30 -0
- package/dist/view/eta.d.ts.map +1 -0
- package/dist/view/index.d.ts +34 -0
- package/dist/view/index.d.ts.map +1 -0
- package/dist/view/index.js +240 -0
- package/dist/view/index.js.map +14 -0
- package/dist/view/inertia/default-ssr.d.ts +15 -0
- package/dist/view/inertia/default-ssr.d.ts.map +1 -0
- package/dist/view/inertia/form-helper.d.ts +102 -0
- package/dist/view/inertia/form-helper.d.ts.map +1 -0
- package/dist/view/inertia/form-middleware.d.ts +53 -0
- package/dist/view/inertia/form-middleware.d.ts.map +1 -0
- package/dist/view/inertia/helpers.d.ts +149 -0
- package/dist/view/inertia/helpers.d.ts.map +1 -0
- package/dist/view/inertia/index.d.ts +18 -0
- package/dist/view/inertia/index.d.ts.map +1 -0
- package/dist/view/inertia/inertia-adapter.d.ts +93 -0
- package/dist/view/inertia/inertia-adapter.d.ts.map +1 -0
- package/dist/view/inertia/inertia-response.d.ts +51 -0
- package/dist/view/inertia/inertia-response.d.ts.map +1 -0
- package/dist/view/inertia/ssr/index.d.ts +13 -0
- package/dist/view/inertia/ssr/index.d.ts.map +1 -0
- package/dist/view/inertia/ssr/react-adapter.d.ts +33 -0
- package/dist/view/inertia/ssr/react-adapter.d.ts.map +1 -0
- package/dist/view/inertia/ssr/registry.d.ts +42 -0
- package/dist/view/inertia/ssr/registry.d.ts.map +1 -0
- package/dist/view/inertia/ssr/solid-adapter.d.ts +31 -0
- package/dist/view/inertia/ssr/solid-adapter.d.ts.map +1 -0
- package/dist/view/inertia/ssr/svelte-adapter.d.ts +31 -0
- package/dist/view/inertia/ssr/svelte-adapter.d.ts.map +1 -0
- package/dist/view/inertia/ssr/vue-adapter.d.ts +26 -0
- package/dist/view/inertia/ssr/vue-adapter.d.ts.map +1 -0
- package/dist/view/inertia/types.d.ts +131 -0
- package/dist/view/inertia/types.d.ts.map +1 -0
- package/dist/view/rendu.d.ts +11 -0
- package/dist/view/rendu.d.ts.map +1 -0
- package/dist/view/types.d.ts +52 -0
- package/dist/view/types.d.ts.map +1 -0
- package/dist/view/view-engine.d.ts +28 -0
- package/dist/view/view-engine.d.ts.map +1 -0
- package/dist/ws/client.d.ts +42 -0
- package/dist/ws/client.d.ts.map +1 -0
- package/dist/ws/decorators.d.ts +44 -0
- package/dist/ws/decorators.d.ts.map +1 -0
- package/dist/ws/index.d.ts +57 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +796 -0
- package/dist/ws/index.js.map +26 -0
- package/dist/ws/module.d.ts +48 -0
- package/dist/ws/module.d.ts.map +1 -0
- package/dist/ws/runtime/bun.d.ts +41 -0
- package/dist/ws/runtime/bun.d.ts.map +1 -0
- package/dist/ws/runtime/index.d.ts +14 -0
- package/dist/ws/runtime/index.d.ts.map +1 -0
- package/dist/ws/runtime/node.d.ts +46 -0
- package/dist/ws/runtime/node.d.ts.map +1 -0
- package/dist/ws/runtime/types.d.ts +18 -0
- package/dist/ws/runtime/types.d.ts.map +1 -0
- package/dist/ws/service.d.ts +65 -0
- package/dist/ws/service.d.ts.map +1 -0
- package/dist/ws/types.d.ts +77 -0
- package/dist/ws/types.d.ts.map +1 -0
- package/package.json +262 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/constants.ts", "../src/core/decorators/controller.ts", "../src/core/decorators/http-methods.ts", "../src/core/decorators/params.ts", "../src/core/decorators/validate.ts", "../src/queue/backends/memory.ts", "../src/queue/backends/bullmq.ts", "../src/queue/backends/cloudflare.ts", "../src/core/decorators/module.ts", "../src/core/decorators/index.ts", "../src/core/decorators/injectable.ts", "../src/core/decorators/repository.ts", "../src/core/decorators/metadata.ts", "../src/queue/queue.service.ts", "../src/queue/queue.module.ts", "../src/queue/decorators/on-queue-ready.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Metadata keys used by reflect-metadata for storing decorator data.\n *\n * These constants are the contract between decorators and the framework\n * core (DI container, router, validator).\n */\nexport const METADATA_KEY = {\n\t/** Marks a class as a Nest-style controller, stores route prefix. */\n\tCONTROLLER: \"nexus:controller\",\n\n\t/** Marks a class as an injectable provider. */\n\tINJECTABLE: \"nexus:injectable\",\n\n\t/** Marks a class as a repository. */\n\tREPOSITORY: \"nexus:repository\",\n\n\t/** Marks a class as a module. Stores module options. */\n\tMODULE: \"nexus:module\",\n\n\t/** HTTP method routes registered on a controller (Get/Post/...). */\n\tROUTES: \"nexus:routes\",\n\n\t/** Method parameter type metadata (body/query/param/headers/ctx). */\n\tPARAMS: \"nexus:params\",\n\n\t/** Validation schema per method (Zod schema or class). */\n\tVALIDATE: \"nexus:validate\",\n\n\t/** Class-level design:paramtypes (built-in). */\n\tPARAMTYPES: \"design:paramtypes\",\n\n\t/** Class-level design:type (built-in). */\n\tTYPE: \"design:type\",\n\n\t/** Class-level design:returntype (built-in). */\n\tRETURNTYPE: \"design:returntype\",\n\n\t/** Provider token to inject for a parameter (for custom tokens). */\n\tINJECT: \"nexus:inject\",\n} as const;\n\nexport type MetadataKey = (typeof METADATA_KEY)[keyof typeof METADATA_KEY];\n\n/** Available parameter decorator locations. */\nexport const PARAM_TYPES = {\n\tREQUEST: 0,\n\tRESPONSE: 1,\n\tNEXT: 2,\n\tBODY: 3,\n\tQUERY: 4,\n\tPARAM: 5,\n\tHEADERS: 6,\n\tCTX: 7,\n\tUSER: 8,\n} as const;\n\nexport type ParamType = (typeof PARAM_TYPES)[keyof typeof PARAM_TYPES];\n\n/** HTTP methods supported by the router. */\nexport const HTTP_METHODS = [\n\t\"GET\",\n\t\"POST\",\n\t\"PUT\",\n\t\"DELETE\",\n\t\"PATCH\",\n\t\"OPTIONS\",\n\t\"HEAD\",\n] as const;\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n",
|
|
6
|
+
"/**\n * @Controller decorator.\n *\n * Marks a class as a controller and registers a route prefix.\n * Routes inside the controller class are decorated with @Get/@Post/etc.\n *\n * @example\n * ```ts\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * list() { ... }\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ControllerMetadata } from \"../di/tokens.js\";\n\nexport function Controller(prefix: string = \"/\"): ClassDecorator {\n\treturn (target: object) => {\n\t\tconst normalized = normalizePrefix(prefix);\n\t\tconst meta: ControllerMetadata = { prefix: normalized };\n\t\tReflect.defineMetadata(METADATA_KEY.CONTROLLER, meta, target);\n\t};\n}\n\nexport function getControllerMetadata(target: any): ControllerMetadata {\n\treturn (\n\t\tReflect.getMetadata(METADATA_KEY.CONTROLLER, target) ?? { prefix: \"/\" }\n\t);\n}\n\nexport function isController(target: any): boolean {\n\treturn Reflect.hasMetadata(METADATA_KEY.CONTROLLER, target);\n}\n\n/**\n * Normalize a prefix so we can safely concatenate it with handler paths.\n * - Empty string becomes '/'.\n * - Trailing slashes are trimmed (we re-add them on the join).\n * - No leading slash is added; the router always joins with `/`.\n */\nfunction normalizePrefix(prefix: string): string {\n\tif (!prefix) return \"\";\n\tif (prefix !== \"/\" && prefix.endsWith(\"/\")) {\n\t\treturn prefix.slice(0, -1);\n\t}\n\treturn prefix;\n}\n",
|
|
7
|
+
"/**\n * HTTP method decorators.\n *\n * `@Get`, `@Post`, `@Put`, `@Delete`, `@Patch`, `@Options`, `@Head` mark a\n * controller method as a route handler. The path argument is appended to\n * the controller's prefix.\n *\n * @example\n * ```ts\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * list() {}\n *\n * @Post('/')\n * create(@Body() body: CreateUserDto) {}\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { HTTP_METHODS, METADATA_KEY, type HttpMethod } from \"../constants.js\";\nimport type { RouteMetadata } from \"../di/tokens.js\";\n\nfunction defineRoute(method: HttpMethod, path: string): MethodDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol,\n\t\tdescriptor: PropertyDescriptor,\n\t) => {\n\t\tconst routes: RouteMetadata[] =\n\t\t\tReflect.getMetadata(METADATA_KEY.ROUTES, target.constructor) ?? [];\n\n\t\troutes.push({\n\t\t\tmethod,\n\t\t\tpath: normalizePath(path),\n\t\t\tpropertyKey,\n\t\t\thandler: descriptor.value,\n\t\t});\n\n\t\tReflect.defineMetadata(METADATA_KEY.ROUTES, routes, target.constructor);\n\t};\n}\n\nfunction normalizePath(path: string): string {\n\tif (!path || path === \"/\") return \"/\";\n\treturn path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nexport const Get = (path: string = \"/\") => defineRoute(\"GET\", path);\nexport const Post = (path: string = \"/\") => defineRoute(\"POST\", path);\nexport const Put = (path: string = \"/\") => defineRoute(\"PUT\", path);\nexport const Delete = (path: string = \"/\") => defineRoute(\"DELETE\", path);\nexport const Patch = (path: string = \"/\") => defineRoute(\"PATCH\", path);\nexport const Options = (path: string = \"/\") => defineRoute(\"OPTIONS\", path);\nexport const Head = (path: string = \"/\") => defineRoute(\"HEAD\", path);\n\nexport function getRoutes(target: any): RouteMetadata[] {\n\treturn Reflect.getMetadata(METADATA_KEY.ROUTES, target) ?? [];\n}\n\nexport { HTTP_METHODS };\nexport type { RouteMetadata };\n",
|
|
8
|
+
"/**\n * Parameter decorators.\n *\n * These mark a controller method argument as a source of request data:\n * - `@Req()` → Hono context\n * - `@Res()` → Response helper\n * - `@Next()` → next() callback (for middleware-style handlers)\n * - `@Body()` → request body (parsed)\n * - `@Query('key')` → a single query param, or full query object\n * - `@Param('key')` → a single path param, or full params object\n * - `@Headers('k')` → a single header, or full headers object\n * - `@Ctx()` → Hono context (alias for @Req)\n * - `@User()` → authenticated user (resolved via auth provider)\n *\n * The metadata is read by the router at mount time to build the\n * handler invocation list.\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY, PARAM_TYPES } from \"../constants.js\";\nimport type { ParamMetadata } from \"../di/tokens.js\";\n\nexport function createParamDecorator(\n\ttype: number,\n\tdata?: string | object,\n): ParameterDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol | undefined,\n\t\tparameterIndex: number,\n\t) => {\n\t\t// Method parameter: target is the prototype, propertyKey is the method name.\n\t\t// Constructor parameter: target is the class, propertyKey is undefined.\n\t\tif (propertyKey !== undefined) {\n\t\t\tconst params: ParamMetadata[] =\n\t\t\t\tReflect.getMetadata(METADATA_KEY.PARAMS, target, propertyKey) ?? [];\n\t\t\tparams.push({\n\t\t\t\tindex: parameterIndex,\n\t\t\t\ttype,\n\t\t\t\tname: typeof data === \"string\" ? data : undefined,\n\t\t\t\tdata: typeof data === \"object\" ? data : undefined,\n\t\t\t});\n\t\t\tReflect.defineMetadata(METADATA_KEY.PARAMS, params, target, propertyKey);\n\t\t} else {\n\t\t\tconst params: ParamMetadata[] =\n\t\t\t\tReflect.getMetadata(METADATA_KEY.PARAMS, target) ?? [];\n\t\t\tparams.push({\n\t\t\t\tindex: parameterIndex,\n\t\t\t\ttype,\n\t\t\t\tname: typeof data === \"string\" ? data : undefined,\n\t\t\t\tdata: typeof data === \"object\" ? data : undefined,\n\t\t\t});\n\t\t\tReflect.defineMetadata(METADATA_KEY.PARAMS, params, target);\n\t\t}\n\t};\n}\n\nexport const Req = () => createParamDecorator(PARAM_TYPES.REQUEST);\nexport const Res = () => createParamDecorator(PARAM_TYPES.RESPONSE);\nexport const Next = () => createParamDecorator(PARAM_TYPES.NEXT);\nexport const Body = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.BODY, key);\nexport const Query = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.QUERY, key);\nexport const Param = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.PARAM, key);\nexport const Headers = (key?: string) =>\n\tcreateParamDecorator(PARAM_TYPES.HEADERS, key);\nexport const Ctx = () => createParamDecorator(PARAM_TYPES.CTX);\nexport const User = () => createParamDecorator(PARAM_TYPES.USER);\n\nexport function getParamMetadata(\n\ttarget: any,\n\tpropertyKey: string | symbol,\n): ParamMetadata[] {\n\treturn Reflect.getMetadata(METADATA_KEY.PARAMS, target, propertyKey) ?? [];\n}\n\nexport { PARAM_TYPES };\n",
|
|
9
|
+
"/**\n * @Validate decorator.\n *\n * Attaches Zod schemas (or class validators) to a route handler. Each\n * schema is run against the corresponding request part before the handler\n * executes; failed validation throws or returns a 400 response.\n *\n * @example\n * ```ts\n * const UserSchema = z.object({ name: z.string(), email: z.email() });\n *\n * @Post('/')\n * @Validate({ body: UserSchema })\n * create(@Body() body: z.infer<typeof UserSchema>) { ... }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ValidationMetadata } from \"../di/tokens.js\";\n\nexport function Validate(options: ValidationMetadata): MethodDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol,\n\t\tdescriptor: PropertyDescriptor,\n\t) => {\n\t\tReflect.defineMetadata(\n\t\t\tMETADATA_KEY.VALIDATE,\n\t\t\toptions,\n\t\t\ttarget.constructor,\n\t\t\tpropertyKey,\n\t\t);\n\t};\n}\n\nexport function getValidationMetadata(\n\ttarget: any,\n\tpropertyKey: string | symbol,\n): ValidationMetadata | undefined {\n\treturn Reflect.getMetadata(METADATA_KEY.VALIDATE, target, propertyKey);\n}\n",
|
|
10
|
+
"/**\n * In-memory queue backend — for tests, single-instance dev, and the\n * `bunx nx dev` workflow when Redis isn't running yet.\n *\n * NOT for production. It does not persist across restarts, does not\n * distribute across workers, and silently drops jobs on crash.\n */\n\nimport type {\n\tQueueBackend,\n\tJobHandler,\n\tWorkerHandle,\n\tWorkerOptions,\n\tAddedJob,\n\tAddOptions,\n\tQueueEvent,\n\tQueueEventListener,\n\tJobContext,\n} from \"../types.js\";\n\ninterface PendingJob {\n\tjobId: string;\n\tname: string;\n\tdata: unknown;\n\toptions: AddOptions;\n\tresolveAt: number; // ms epoch\n}\n\n/** Per-job worker handle. */\nclass MemoryWorkerHandle implements WorkerHandle {\n\t#running = true;\n\t#handler: JobHandler;\n\t#context: { jobId: string; name: string };\n\tconstructor(name: string, handler: JobHandler) {\n\t\tthis.#handler = handler;\n\t\tthis.#context = { jobId: \"\", name };\n\t}\n\tget name() {\n\t\treturn this.#context.name;\n\t}\n\tasync close() {\n\t\tthis.#running = false;\n\t}\n\tasync pause() {\n\t\tthis.#running = false;\n\t}\n\tasync resume() {\n\t\tthis.#running = true;\n\t}\n\tisRunning() {\n\t\treturn this.#running;\n\t}\n}\n\nexport class MemoryQueueBackend implements QueueBackend {\n\treadonly name = \"memory\" as const;\n\t#queue: PendingJob[] = [];\n\t#handlers = new Map<string, JobHandler>();\n\t#workerOptions = new Map<string, WorkerOptions>();\n\t#listeners = new Set<QueueEventListener>();\n\t#tickHandle: ReturnType<typeof setInterval> | null = null;\n\t#inFlight = 0;\n\n\tconstructor() {\n\t\t// Tick every 100 ms to dispatch due jobs.\n\t\tthis.#tickHandle = setInterval(() => this.#tick(), 100);\n\t\t// Allow Node to exit if only this timer is running.\n\t\tif (\n\t\t\ttypeof (this.#tickHandle as { unref?: () => void }).unref === \"function\"\n\t\t) {\n\t\t\t(this.#tickHandle as { unref: () => void }).unref();\n\t\t}\n\t}\n\n\t// ===========================================================================\n\t// Producer\n\t// ===========================================================================\n\n\tasync add(\n\t\tname: string,\n\t\tdata: unknown,\n\t\toptions: AddOptions = {},\n\t): Promise<AddedJob> {\n\t\tconst jobId = `mem-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n\t\tconst delayMs = (options.delaySeconds ?? 0) * 1000;\n\t\tthis.#queue.push({\n\t\t\tjobId,\n\t\t\tname,\n\t\t\tdata,\n\t\t\toptions,\n\t\t\tresolveAt: Date.now() + delayMs,\n\t\t});\n\t\tthis.#emit({ kind: \"job:added\", jobId, name });\n\t\treturn { jobId, name };\n\t}\n\n\tasync addBatch(\n\t\tjobs: Array<{ name: string; data: unknown; options?: AddOptions }>,\n\t): Promise<AddedJob[]> {\n\t\treturn Promise.all(jobs.map((j) => this.add(j.name, j.data, j.options)));\n\t}\n\n\t// ===========================================================================\n\t// Worker\n\t// ===========================================================================\n\n\tasync process<T>(\n\t\tname: string,\n\t\thandler: JobHandler<T>,\n\t\toptions: WorkerOptions = {},\n\t): Promise<WorkerHandle> {\n\t\tthis.#handlers.set(name, handler as JobHandler);\n\t\tthis.#workerOptions.set(name, options);\n\t\tconst handle = new MemoryWorkerHandle(name, handler as JobHandler);\n\t\tthis.#emit({\n\t\t\tkind: \"worker:started\",\n\t\t\tname,\n\t\t\tconcurrency: options.concurrency ?? 1,\n\t\t});\n\t\treturn handle;\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\tasync drain(): Promise<void> {\n\t\twhile (this.#inFlight > 0 || this.#queue.length > 0) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tfor (const name of this.#handlers.keys()) {\n\t\t\tthis.#emit({ kind: \"worker:stopped\", name });\n\t\t}\n\t\tif (this.#tickHandle) clearInterval(this.#tickHandle);\n\t\tthis.#tickHandle = null;\n\t}\n\n\t// ===========================================================================\n\t// Events\n\t// ===========================================================================\n\n\ton(listener: QueueEventListener): () => void {\n\t\tthis.#listeners.add(listener);\n\t\treturn () => this.#listeners.delete(listener);\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\tasync #tick() {\n\t\tif (this.#queue.length === 0) return;\n\t\tconst now = Date.now();\n\t\tconst due = this.#queue.filter((j) => j.resolveAt <= now);\n\t\tfor (const job of due) {\n\t\t\tthis.#queue = this.#queue.filter((j) => j !== job);\n\t\t\tconst handler = this.#handlers.get(job.name);\n\t\t\tif (!handler) continue;\n\t\t\tconst options = this.#workerOptions.get(job.name) ?? {};\n\t\t\tconst concurrency = options.concurrency ?? 1;\n\t\t\tif (this.#inFlight >= concurrency) {\n\t\t\t\t// Re-queue at the front.\n\t\t\t\tthis.#queue.unshift(job);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvoid this.#runJob(job, handler, options);\n\t\t}\n\t}\n\n\tasync #runJob(job: PendingJob, handler: JobHandler, options: WorkerOptions) {\n\t\tthis.#inFlight++;\n\t\tconst ctx: JobContext = {\n\t\t\tjobId: job.jobId,\n\t\t\tattempts: 1,\n\t\t\tjob: { name: job.name, data: job.data },\n\t\t\tprefix: `[queue:${job.name}]`,\n\t\t};\n\t\tthis.#emit({\n\t\t\tkind: \"job:active\",\n\t\t\tjobId: job.jobId,\n\t\t\tname: job.name,\n\t\t\tattempts: 1,\n\t\t});\n\t\ttry {\n\t\t\tconst result = await handler(job.data, ctx);\n\t\t\tif (result && typeof result === \"object\" && \"status\" in result) {\n\t\t\t\tconst r = result as {\n\t\t\t\t\tstatus: string;\n\t\t\t\t\treturnvalue?: unknown;\n\t\t\t\t\terror?: Error;\n\t\t\t\t};\n\t\t\t\tif (r.status === \"failed\") {\n\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\tkind: \"job:failed\",\n\t\t\t\t\t\tjobId: job.jobId,\n\t\t\t\t\t\tname: job.name,\n\t\t\t\t\t\terror: r.error ?? new Error(\"unknown\"),\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\tkind: \"job:completed\",\n\t\t\t\t\t\tjobId: job.jobId,\n\t\t\t\t\t\tname: job.name,\n\t\t\t\t\t\treturnvalue: r.returnvalue,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.#emit({\n\t\t\t\t\tkind: \"job:completed\",\n\t\t\t\t\tjobId: job.jobId,\n\t\t\t\t\tname: job.name,\n\t\t\t\t\treturnvalue: result,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\tconst willRetry = (job.options.attempts ?? 1) > 1;\n\t\t\tthis.#emit({\n\t\t\t\tkind: \"job:failed\",\n\t\t\t\tjobId: job.jobId,\n\t\t\t\tname: job.name,\n\t\t\t\terror,\n\t\t\t\twillRetry,\n\t\t\t});\n\t\t\tif (willRetry) {\n\t\t\t\tconst delayMs =\n\t\t\t\t\t(job.options.backoff?.delayMs ?? 1000) *\n\t\t\t\t\t(job.options.backoff?.type === \"exponential\" ? 2 ** ctx.attempts : 1);\n\t\t\t\tthis.#queue.push({\n\t\t\t\t\t...job,\n\t\t\t\t\tresolveAt: Date.now() + delayMs,\n\t\t\t\t});\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#inFlight--;\n\t\t}\n\t\t// Touch options to silence \"unused\" warnings in strict configs.\n\t\tvoid options;\n\t}\n\n\t#emit(event: QueueEvent) {\n\t\tfor (const l of this.#listeners) {\n\t\t\tvoid Promise.resolve(l(event));\n\t\t}\n\t}\n}\n",
|
|
11
|
+
"/**\n * BullMQ backend — Redis-backed queue for Bun / Node.\n *\n * Wraps `bullmq.Queue` (producer) and `bullmq.Worker` (consumer) with\n * the common `QueueBackend` interface. We use the `Job` wrapper class\n * (vs the lower-level `QueueBase`) so we can read job IDs back as\n * strings without leaking BullMQ types to user code.\n *\n * Usage:\n * const backend = new BullMQBackend({\n * connection: 'redis://localhost:6379',\n * prefix: 'nexusjs',\n * });\n * await backend.process('send-email', async (data) => {\n * // ...\n * });\n * await backend.add('send-email', { to: 'a@b.c' });\n */\n\nimport {\n\tQueue,\n\tWorker,\n\ttype ConnectionOptions,\n\ttype JobsOptions,\n} from \"bullmq\";\nimport IORedis from \"ioredis\";\nimport type {\n\tQueueBackend,\n\tJobHandler,\n\tWorkerHandle,\n\tWorkerOptions,\n\tAddedJob,\n\tAddOptions,\n\tQueueEvent,\n\tQueueEventListener,\n\tJobContext,\n} from \"../types.js\";\n\nexport interface BullMQBackendOptions {\n\tconnection: string | ConnectionOptions;\n\tprefix?: string;\n\tdefaultJobOptions?: AddOptions;\n}\n\nclass BullMQWorkerHandle implements WorkerHandle {\n\t#worker: Worker;\n\t#name: string;\n\tconstructor(name: string, worker: Worker) {\n\t\tthis.#name = name;\n\t\tthis.#worker = worker;\n\t}\n\tget name() {\n\t\treturn this.#name;\n\t}\n\tasync close() {\n\t\tawait this.#worker.close();\n\t}\n\tasync pause() {\n\t\tawait this.#worker.pause();\n\t}\n\tasync resume() {\n\t\tawait this.#worker.resume();\n\t}\n\tisRunning() {\n\t\treturn !this.#worker.closing;\n\t}\n}\n\nexport class BullMQBackend implements QueueBackend {\n\treadonly name = \"bullmq\" as const;\n\t#queue: Queue;\n\t#connection: ConnectionOptions;\n\t#prefix: string;\n\t#defaultJobOptions: AddOptions;\n\t#workers = new Map<string, Worker>();\n\t#listeners = new Set<QueueEventListener>();\n\t#closed = false;\n\n\tconstructor(options: BullMQBackendOptions) {\n\t\tthis.#connection =\n\t\t\ttypeof options.connection === \"string\"\n\t\t\t\t? (new IORedis(options.connection, {\n\t\t\t\t\t\tmaxRetriesPerRequest: null,\n\t\t\t\t\t}) as unknown as ConnectionOptions)\n\t\t\t\t: options.connection;\n\t\tthis.#prefix = options.prefix ?? \"nexusjs\";\n\t\tthis.#defaultJobOptions = options.defaultJobOptions ?? {};\n\n\t\tthis.#queue = new Queue(\"nexus-queue\", {\n\t\t\tconnection: this.#connection,\n\t\t\tprefix: this.#prefix,\n\t\t\tdefaultJobOptions: this.#toBullJobOptions(this.#defaultJobOptions),\n\t\t});\n\t}\n\n\t// ===========================================================================\n\t// Producer\n\t// ===========================================================================\n\n\tasync add(\n\t\tname: string,\n\t\tdata: unknown,\n\t\toptions: AddOptions = {},\n\t): Promise<AddedJob> {\n\t\tconst merged = { ...this.#defaultJobOptions, ...options };\n\t\tconst job = await this.#queue.add(\n\t\t\tname,\n\t\t\tdata,\n\t\t\tthis.#toBullJobOptions(merged),\n\t\t);\n\t\tthis.#emit({ kind: \"job:added\", jobId: String(job.id ?? \"\"), name });\n\t\treturn { jobId: String(job.id ?? \"\"), name, handle: job };\n\t}\n\n\tasync addBatch(\n\t\tjobs: Array<{ name: string; data: unknown; options?: AddOptions }>,\n\t): Promise<AddedJob[]> {\n\t\tconst bullJobs = jobs.map((j) => ({\n\t\t\tname: j.name,\n\t\t\tdata: j.data,\n\t\t\topts: this.#toBullJobOptions({\n\t\t\t\t...this.#defaultJobOptions,\n\t\t\t\t...j.options,\n\t\t\t}),\n\t\t}));\n\t\tconst added = await this.#queue.addBulk(bullJobs);\n\t\tfor (const job of added) {\n\t\t\tthis.#emit({\n\t\t\t\tkind: \"job:added\",\n\t\t\t\tjobId: String(job.id ?? \"\"),\n\t\t\t\tname: job.name,\n\t\t\t});\n\t\t}\n\t\treturn added.map((job) => ({\n\t\t\tjobId: String(job.id ?? \"\"),\n\t\t\tname: job.name,\n\t\t\thandle: job,\n\t\t}));\n\t}\n\n\t// ===========================================================================\n\t// Worker\n\t// ===========================================================================\n\n\tasync process<T = unknown>(\n\t\tname: string,\n\t\thandler: JobHandler<T>,\n\t\toptions: WorkerOptions = {},\n\t): Promise<WorkerHandle> {\n\t\tconst worker = new Worker(\n\t\t\t\"nexus-queue\",\n\t\t\tasync (job) => {\n\t\t\t\tconst ctx: JobContext = {\n\t\t\t\t\tjobId: String(job.id ?? \"\"),\n\t\t\t\t\tattempts: job.attemptsMade + 1,\n\t\t\t\t\tjob: { name: job.name, data: job.data },\n\t\t\t\t\tprefix: `[queue:${job.name}]`,\n\t\t\t\t};\n\t\t\t\tthis.#emit({\n\t\t\t\t\tkind: \"job:active\",\n\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\tname: job.name,\n\t\t\t\t\tattempts: ctx.attempts,\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await handler(job.data as T, ctx);\n\t\t\t\t\tif (result && typeof result === \"object\" && \"status\" in result) {\n\t\t\t\t\t\tconst r = result as { status: string; returnvalue?: unknown };\n\t\t\t\t\t\tif (r.status === \"completed\") {\n\t\t\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\t\t\tkind: \"job:completed\",\n\t\t\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\t\t\tname: job.name,\n\t\t\t\t\t\t\t\treturnvalue: r.returnvalue,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn r.returnvalue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (r.status === \"retry\") {\n\t\t\t\t\t\t\tconst r2 = result as { delaySeconds?: number; reason?: string };\n\t\t\t\t\t\t\tthrow new RetryError(\n\t\t\t\t\t\t\t\tr2.reason ?? \"retry requested\",\n\t\t\t\t\t\t\t\tr2.delaySeconds,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\tkind: \"job:completed\",\n\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\tname: job.name,\n\t\t\t\t\t\treturnvalue: result,\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof RetryError) {\n\t\t\t\t\t\t// Force a retry with optional delay.\n\t\t\t\t\t\tawait job.moveToDelayed(\n\t\t\t\t\t\t\tDate.now() + (err.delaySeconds ?? 0) * 1000,\n\t\t\t\t\t\t\tjob.token!,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\t\t\tconst willRetry = (job.opts.attempts ?? 1) > job.attemptsMade;\n\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\tkind: \"job:failed\",\n\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\tname: job.name,\n\t\t\t\t\t\terror,\n\t\t\t\t\t\twillRetry,\n\t\t\t\t\t});\n\t\t\t\t\tthrow err; // let BullMQ handle the retry\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tconnection: this.#connection,\n\t\t\t\tprefix: this.#prefix,\n\t\t\t\tconcurrency: options.concurrency ?? 1,\n\t\t\t\tlockDuration: options.lockDurationMs ?? 30000,\n\t\t\t\tlimiter: options.limiter\n\t\t\t\t\t? { max: options.limiter.max, duration: options.limiter.durationMs }\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t);\n\n\t\tthis.#workers.set(name, worker);\n\t\tthis.#emit({\n\t\t\tkind: \"worker:started\",\n\t\t\tname,\n\t\t\tconcurrency: options.concurrency ?? 1,\n\t\t});\n\t\treturn new BullMQWorkerHandle(name, worker);\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\tasync drain(): Promise<void> {\n\t\t// Wait for active jobs on every worker to reach zero.\n\t\tconst workers = [...this.#workers.values()];\n\t\tawait Promise.all(workers.map((w) => w.waitUntilReady()));\n\t\twhile (\n\t\t\tworkers.some(\n\t\t\t\t(w) => (w as unknown as { _job?: unknown })._job !== undefined,\n\t\t\t)\n\t\t) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tfor (const [name, worker] of this.#workers) {\n\t\t\tawait worker.close();\n\t\t\tthis.#emit({ kind: \"worker:stopped\", name });\n\t\t}\n\t\tawait this.#queue.close();\n\t\t// If we own the connection, close it.\n\t\ttry {\n\t\t\tconst conn = this.#connection as { quit?: () => Promise<unknown> };\n\t\t\tif (typeof conn?.quit === \"function\") await conn.quit();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t// ===========================================================================\n\t// Events\n\t// ===========================================================================\n\n\ton(listener: QueueEventListener): () => void {\n\t\tthis.#listeners.add(listener);\n\t\treturn () => this.#listeners.delete(listener);\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\t#toBullJobOptions(opts: AddOptions): JobsOptions {\n\t\tconst out: JobsOptions = {};\n\t\tif (opts.delaySeconds !== undefined) out.delay = opts.delaySeconds * 1000;\n\t\tif (opts.attempts !== undefined) out.attempts = opts.attempts;\n\t\tif (opts.backoff)\n\t\t\tout.backoff = { type: opts.backoff.type, delay: opts.backoff.delayMs };\n\t\tif (opts.priority !== undefined) out.priority = opts.priority;\n\t\tif (opts.jobId !== undefined) out.jobId = opts.jobId;\n\t\tif (opts.removeOnComplete !== undefined)\n\t\t\tout.removeOnComplete = opts.removeOnComplete;\n\t\tif (opts.removeOnFail !== undefined) out.removeOnFail = opts.removeOnFail;\n\t\treturn out;\n\t}\n\n\t#emit(event: QueueEvent) {\n\t\tfor (const l of this.#listeners) {\n\t\t\tvoid Promise.resolve(l(event));\n\t\t}\n\t}\n}\n\n/** Internal marker error to ask BullMQ to retry with optional delay. */\nclass RetryError extends Error {\n\treadonly __retry = true;\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly delaySeconds?: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"RetryError\";\n\t}\n}\n",
|
|
12
|
+
"/**\n * Cloudflare Queues backend — Workers-native, edge-friendly.\n *\n * Cloudflare Queues has a different shape from BullMQ:\n * - The producer calls `queue.send(body)` / `queue.sendBatch(...)`.\n * - The consumer is a Worker's `queue()` handler that receives a\n * `MessageBatch`.\n *\n * We adapt the two halves to our common `QueueBackend` interface:\n * - `add(name, data)` calls `queue.send({ name, data })` so the\n * consumer knows which handler to route to.\n * - `process(name, handler)` registers the handler in a local\n * `Map`. When the consumer's `queue()` callback fires, we\n * dispatch each message to the matching handler.\n *\n * Because Workers can't start a long-running process, `process()` is\n * a no-op on the producer side. The actual `queue()` handler must be\n * registered separately by the user (or by `QueueModule`'s\n * `workerHandler(env, ctx, batch)` export).\n */\n\nimport type {\n\tQueueBackend,\n\tJobHandler,\n\tWorkerHandle,\n\tWorkerOptions,\n\tAddedJob,\n\tAddOptions,\n\tQueueEvent,\n\tQueueEventListener,\n\tJobContext,\n} from \"../types.js\";\n\n// ---------------------------------------------------------------------------\n// Cloudflare type stubs (mirrored from @cloudflare/workers-types).\n// We don't import the package to keep the queue module light.\n// ---------------------------------------------------------------------------\n\ninterface CFQueue<Body = unknown> {\n\tsend(\n\t\tbody: Body,\n\t\toptions?: { contentType?: string; delaySeconds?: number },\n\t): Promise<unknown>;\n\tsendBatch(\n\t\tmessages: Array<{\n\t\t\tbody: unknown;\n\t\t\tcontentType?: string;\n\t\t\tdelaySeconds?: number;\n\t\t}>,\n\t\toptions?: { delaySeconds?: number },\n\t): Promise<unknown>;\n}\n\ninterface CFMessage<Body = unknown> {\n\treadonly id: string;\n\treadonly timestamp: Date;\n\treadonly body: Body;\n\treadonly attempts: number;\n\tack(): void;\n\tretry(options?: { delaySeconds?: number }): void;\n}\n\ninterface CFMessageBatch<Body = unknown> {\n\treadonly queue: string;\n\treadonly messages: readonly CFMessage<Body>[];\n\tackAll(): void;\n\tretryAll(options?: { delaySeconds?: number }): void;\n}\n\n// ---------------------------------------------------------------------------\n// Worker handle\n// ---------------------------------------------------------------------------\n\nclass CloudflareWorkerHandle implements WorkerHandle {\n\t#name: string;\n\t#running = true;\n\tconstructor(name: string) {\n\t\tthis.#name = name;\n\t}\n\tget name() {\n\t\treturn this.#name;\n\t}\n\tasync close() {\n\t\tthis.#running = false;\n\t}\n\tasync pause() {\n\t\tthis.#running = false;\n\t}\n\tasync resume() {\n\t\tthis.#running = true;\n\t}\n\tisRunning() {\n\t\treturn this.#running;\n\t}\n}\n\nexport interface CloudflareBackendOptions {\n\t/** Resolver that pulls the Queue binding from the Worker's env. */\n\tresolveBinding: (env: Record<string, unknown>) => CFQueue;\n\t/** Queue name (for diagnostics + MessageBatch.queue matching). */\n\tname?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Backend\n// ---------------------------------------------------------------------------\n\nexport class CloudflareQueueBackend implements QueueBackend {\n\treadonly name = \"cloudflare\" as const;\n\t#queue: CFQueue | null = null;\n\t#resolveBinding: (env: Record<string, unknown>) => CFQueue;\n\t#handlers = new Map<string, JobHandler>();\n\t#workerOptions = new Map<string, WorkerOptions>();\n\t#listeners = new Set<QueueEventListener>();\n\t#queueName: string;\n\n\tconstructor(options: CloudflareBackendOptions) {\n\t\tthis.#resolveBinding = options.resolveBinding;\n\t\tthis.#queueName = options.name ?? \"queue\";\n\t}\n\n\t/** Bind to the Worker's `env` once it's available. */\n\tbind(env: Record<string, unknown>): void {\n\t\tthis.#queue = this.#resolveBinding(env);\n\t}\n\n\t// ===========================================================================\n\t// Producer\n\t// ===========================================================================\n\n\tasync add(\n\t\tname: string,\n\t\tdata: unknown,\n\t\toptions: AddOptions = {},\n\t): Promise<AddedJob> {\n\t\tif (!this.#queue)\n\t\t\tthrow new Error(\"[queue/cloudflare] bind() must be called before add()\");\n\t\tconst id = `cf-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n\t\tawait this.#queue.send(\n\t\t\t{ name, data, jobId: id, options },\n\t\t\t{ delaySeconds: options.delaySeconds },\n\t\t);\n\t\tthis.#emit({ kind: \"job:added\", jobId: id, name });\n\t\treturn { jobId: id, name };\n\t}\n\n\tasync addBatch(\n\t\tjobs: Array<{ name: string; data: unknown; options?: AddOptions }>,\n\t): Promise<AddedJob[]> {\n\t\tif (!this.#queue)\n\t\t\tthrow new Error(\n\t\t\t\t\"[queue/cloudflare] bind() must be called before addBatch()\",\n\t\t\t);\n\t\tconst ids = jobs.map(\n\t\t\t() => `cf-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n\t\t);\n\t\tawait this.#queue.sendBatch(\n\t\t\tjobs.map((j, i) => ({\n\t\t\t\tbody: { name: j.name, data: j.data, jobId: ids[i], options: j.options },\n\t\t\t\tdelaySeconds: j.options?.delaySeconds,\n\t\t\t})),\n\t\t);\n\t\tfor (let i = 0; i < jobs.length; i++) {\n\t\t\tconst j = jobs[i]!;\n\t\t\tthis.#emit({ kind: \"job:added\", jobId: ids[i]!, name: j.name });\n\t\t}\n\t\treturn jobs.map((j, i) => ({ jobId: ids[i]!, name: j.name }));\n\t}\n\n\t// ===========================================================================\n\t// Worker registration\n\t// ===========================================================================\n\n\tasync process<T = unknown>(\n\t\tname: string,\n\t\thandler: JobHandler<T>,\n\t\toptions: WorkerOptions = {},\n\t): Promise<WorkerHandle> {\n\t\tthis.#handlers.set(name, handler as JobHandler);\n\t\tthis.#workerOptions.set(name, options);\n\t\tthis.#emit({\n\t\t\tkind: \"worker:started\",\n\t\t\tname,\n\t\t\tconcurrency: options.concurrency ?? 1,\n\t\t});\n\t\treturn new CloudflareWorkerHandle(name);\n\t}\n\n\t// ===========================================================================\n\t// Cloudflare consumer entry point\n\t// ===========================================================================\n\n\t/**\n\t * Build the Worker's `queue()` handler. Mount it as\n\t * `export default { queue: backend.consumerHandler() }` in the\n\t * Worker entry file.\n\t */\n\tconsumerHandler(): (batch: CFMessageBatch<unknown>) => Promise<void> {\n\t\treturn async (batch: CFMessageBatch<unknown>) => {\n\t\t\tfor (const message of batch.messages) {\n\t\t\t\tconst body = (message.body ?? {}) as {\n\t\t\t\t\tname?: string;\n\t\t\t\t\tdata?: unknown;\n\t\t\t\t\tjobId?: string;\n\t\t\t\t\toptions?: AddOptions;\n\t\t\t\t};\n\t\t\t\tconst jobName = body.name ?? \"\";\n\t\t\t\tconst handler = this.#handlers.get(jobName);\n\t\t\t\tif (!handler) {\n\t\t\t\t\t// No handler registered — fail so the message is retried.\n\t\t\t\t\tmessage.retry();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ctx: JobContext = {\n\t\t\t\t\tjobId: body.jobId ?? message.id,\n\t\t\t\t\tattempts: message.attempts,\n\t\t\t\t\tjob: { name: jobName, data: body.data },\n\t\t\t\t\tprefix: `[queue:${jobName}]`,\n\t\t\t\t};\n\t\t\t\tthis.#emit({\n\t\t\t\t\tkind: \"job:active\",\n\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\tname: jobName,\n\t\t\t\t\tattempts: ctx.attempts,\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await handler(body.data, ctx);\n\t\t\t\t\tif (result && typeof result === \"object\" && \"status\" in result) {\n\t\t\t\t\t\tconst r = result as {\n\t\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\t\treturnvalue?: unknown;\n\t\t\t\t\t\t\terror?: Error;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (r.status === \"failed\") {\n\t\t\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\t\t\tkind: \"job:failed\",\n\t\t\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\t\t\tname: jobName,\n\t\t\t\t\t\t\t\terror: r.error ?? new Error(\"failed\"),\n\t\t\t\t\t\t\t\twillRetry: true,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tmessage.retry();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (r.status === \"retry\") {\n\t\t\t\t\t\t\tconst r2 = result as { delaySeconds?: number };\n\t\t\t\t\t\t\tmessage.retry({ delaySeconds: r2.delaySeconds });\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\t\tkind: \"job:completed\",\n\t\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\t\tname: jobName,\n\t\t\t\t\t\t\treturnvalue: r.returnvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\t\tkind: \"job:completed\",\n\t\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\t\tname: jobName,\n\t\t\t\t\t\t\treturnvalue: result,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\t\t\tconst willRetry = (body.options?.attempts ?? 1) > message.attempts;\n\t\t\t\t\tthis.#emit({\n\t\t\t\t\t\tkind: \"job:failed\",\n\t\t\t\t\t\tjobId: ctx.jobId,\n\t\t\t\t\t\tname: jobName,\n\t\t\t\t\t\terror,\n\t\t\t\t\t\twillRetry,\n\t\t\t\t\t});\n\t\t\t\t\tif (willRetry) message.retry();\n\t\t\t\t\telse message.ack();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\tasync drain(): Promise<void> {\n\t\t// Cloudflare handles draining at the platform level (between\n\t\t// requests, the isolate is torn down). Nothing to do here.\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tfor (const name of this.#handlers.keys()) {\n\t\t\tthis.#emit({ kind: \"worker:stopped\", name });\n\t\t}\n\t\tthis.#handlers.clear();\n\t\tthis.#workerOptions.clear();\n\t}\n\n\t// ===========================================================================\n\t// Events\n\t// ===========================================================================\n\n\ton(listener: QueueEventListener): () => void {\n\t\tthis.#listeners.add(listener);\n\t\treturn () => this.#listeners.delete(listener);\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\t#emit(event: QueueEvent) {\n\t\tfor (const l of this.#listeners) {\n\t\t\tvoid Promise.resolve(l(event));\n\t\t}\n\t}\n\n\tget queueName() {\n\t\treturn this.#queueName;\n\t}\n}\n",
|
|
13
|
+
"/**\n * @Module decorator.\n *\n * Marks a class as a Nest-style module: a logical grouping of\n * controllers and providers with explicit imports/exports.\n *\n * @example\n * ```ts\n * @Module({\n * imports: [UserModule],\n * controllers: [UserController],\n * providers: [UserService],\n * exports: [UserService],\n * })\n * class AppModule {}\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ModuleOptions, Type } from \"../di/tokens.js\";\n\nexport function Module(options: ModuleOptions = {}): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(METADATA_KEY.MODULE, options, target);\n\t};\n}\n\n/** Read the @Module options from a class. */\nexport function getModuleOptions(target: Type<any>): ModuleOptions {\n\treturn Reflect.getMetadata(METADATA_KEY.MODULE, target) ?? {};\n}\n",
|
|
14
|
+
"/**\n * Convenience barrel for all decorators.\n */\nexport * from \"./module.js\";\nexport * from \"./controller.js\";\nexport * from \"./injectable.js\";\nexport * from \"./http-methods.js\";\nexport * from \"./params.js\";\nexport * from \"./validate.js\";\nexport * from \"./repository.js\";\nexport * from \"./metadata.js\";\n",
|
|
15
|
+
"/**\n * @Injectable decorator.\n *\n * Marks a class as available for DI. The container uses reflect-metadata's\n * `design:paramtypes` to read constructor parameter types and resolve them\n * automatically.\n *\n * @example\n * ```ts\n * @Injectable()\n * class UserService {\n * constructor(private repo: UserRepository) {}\n * }\n *\n * @Injectable({ scope: 'request' })\n * class RequestContext {\n * constructor(@Inject(REQUEST) private req: any) {}\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\n\nexport interface InjectableOptions {\n\tscope?: \"singleton\" | \"request\" | \"transient\";\n}\n\nexport function Injectable(options: InjectableOptions = {}): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(METADATA_KEY.INJECTABLE, true, target);\n\t\tif (options.scope) {\n\t\t\tReflect.defineMetadata(\n\t\t\t\t\"nexus:di:scope\",\n\t\t\t\toptions.scope,\n\t\t\t\ttarget,\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isInjectable(target: any): boolean {\n\treturn Reflect.hasMetadata(METADATA_KEY.INJECTABLE, target);\n}\n\n/**\n * Read the scope declared on a class via `@Injectable({ scope })`.\n * Returns undefined when no scope is declared (defaults to singleton).\n */\nexport function getScope(\n\ttarget: any,\n): \"singleton\" | \"request\" | \"transient\" | undefined {\n\treturn Reflect.getMetadata(\"nexus:di:scope\", target);\n}\n\n/**\n * Mark a parameter as resolved by a specific token instead of its declared\n * type. Useful for interfaces, abstract classes, or string tokens.\n *\n * @example\n * ```ts\n * constructor(@Inject('CONFIG') private config: AppConfig) {}\n * ```\n */\nexport function Inject<T = any>(token: any): ParameterDecorator {\n\treturn (\n\t\ttarget: object,\n\t\tpropertyKey: string | symbol | undefined,\n\t\tparameterIndex: number,\n\t) => {\n\t\tconst existing: Map<number, any> =\n\t\t\tReflect.getMetadata(METADATA_KEY.INJECT, target) ?? new Map();\n\t\texisting.set(parameterIndex, token);\n\t\tReflect.defineMetadata(METADATA_KEY.INJECT, existing, target);\n\t};\n}",
|
|
16
|
+
"/**\n * @Repository decorator.\n *\n * Marks a class as a Spring-style repository. Repositories are normal\n * `@Injectable()` classes; the decorator is a marker so the framework\n * can register them with a database adapter (Drizzle/Prisma) and emit\n * a friendly error if you forget to wire one.\n *\n * @example\n * ```ts\n * @Repository()\n * class UserRepository {\n * findAll() { return db.select().from(users); }\n * }\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { InjectionToken } from \"../di/tokens.js\";\n\nexport function Repository(entityToken?: InjectionToken<any>): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(\n\t\t\tMETADATA_KEY.REPOSITORY,\n\t\t\t{ entity: entityToken },\n\t\t\ttarget,\n\t\t);\n\t\tReflect.defineMetadata(METADATA_KEY.INJECTABLE, true, target);\n\t};\n}\n\nexport function getRepositoryMetadata(\n\ttarget: any,\n): { entity?: InjectionToken<any> } | undefined {\n\treturn Reflect.getMetadata(METADATA_KEY.REPOSITORY, target);\n}\n\nexport function isRepository(target: any): boolean {\n\treturn Reflect.hasMetadata(METADATA_KEY.REPOSITORY, target);\n}\n",
|
|
17
|
+
"/**\n * Reflect-metadata helper. Centralizes the keys the framework uses so\n * decorator files stay clean.\n */\nexport { METADATA_KEY, PARAM_TYPES, HTTP_METHODS } from \"../constants.js\";\nexport type { MetadataKey, ParamType, HttpMethod } from \"../constants.js\";\n",
|
|
18
|
+
"/**\n * `QueueService` — DI-friendly facade over a `QueueBackend`.\n *\n * Controllers and other services inject this via `@Inject(QueueService.TOKEN)`\n * (or just `@Inject(QueueService)`) and call high-level methods without\n * caring whether the underlying backend is BullMQ, Cloudflare Queues,\n * or the in-memory test backend.\n *\n * Two layers:\n * - `QueueService.add(name, data, options?)` → schedule a job\n * - `QueueService.process(name, handler)` → register a worker\n *\n * The lifecycle is owned by `QueueService.start()` (called by\n * `QueueModule.forRoot` when the application boots) and\n * `QueueService.stop()` (called on shutdown).\n */\n\nimport { Inject, Injectable } from '../core/decorators/index.js';\nimport type {\n\tQueueBackend,\n\tQueueConfig,\n\tJobHandler,\n\tWorkerHandle,\n\tAddedJob,\n\tAddOptions,\n\tQueueEvent,\n\tQueueEventListener,\n} from './types.js';\nimport {\n\tMemoryQueueBackend,\n\tBullMQBackend,\n\tCloudflareQueueBackend,\n} from './backends/index.js';\n\n@Injectable()\nexport class QueueService {\n\t/** DI token — use with `@Inject(QueueService.TOKEN)`. */\n\tstatic readonly TOKEN = Symbol.for('nexus:QueueService');\n\n\t/** The underlying backend. */\n\treadonly backend: QueueBackend;\n\t#workers = new Map<string, WorkerHandle>();\n\t#listeners = new Set<QueueEventListener>();\n\t#started = false;\n\n\tconstructor(@Inject('QUEUE_CONFIG') private readonly config: QueueConfig) {\n\t\tthis.backend = this.#createBackend(config);\n\t}\n\n\t// ===========================================================================\n\t// Producer API\n\t// ===========================================================================\n\n\t/**\n\t * Enqueue a job. Returns immediately (the backend may still be\n\t * persisting). On Cloudflare, returns once the message is on disk.\n\t */\n\tasync add<T = unknown>(\n\t\tname: string,\n\t\tdata: T,\n\t\toptions: AddOptions = {},\n\t): Promise<AddedJob> {\n\t\tconst merged = { ...this.config.defaults, ...options };\n\t\treturn this.backend.add(name, data, merged);\n\t}\n\n\t/** Enqueue many jobs at once (atomic on Cloudflare; batched on BullMQ). */\n\tasync addBatch<T = unknown>(\n\t\tjobs: Array<{ name: string; data: T; options?: AddOptions }>,\n\t): Promise<AddedJob[]> {\n\t\treturn this.backend.addBatch(jobs);\n\t}\n\n\t// ===========================================================================\n\t// Worker API\n\t// ===========================================================================\n\n\t/**\n\t * Register a worker for the given job name. Call this from\n\t * `Application.bootstrap` (or a feature module's `onInit`) — the\n\t * module wires it via DI so user code doesn't have to call this\n\t * manually.\n\t */\n\tasync process<T = unknown>(\n\t\tname: string,\n\t\thandler: JobHandler<T>,\n\t): Promise<WorkerHandle> {\n\t\tconst handle = await this.backend.process(name, handler);\n\t\tthis.#workers.set(name, handle);\n\t\treturn handle;\n\t}\n\n\t// ===========================================================================\n\t// Events\n\t// ===========================================================================\n\n\ton(listener: QueueEventListener): () => void {\n\t\tthis.#listeners.add(listener);\n\t\treturn () => this.#listeners.delete(listener);\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\t/** Called by `QueueModule.forRoot` when the app boots. */\n\tasync start(): Promise<void> {\n\t\tif (this.#started) return;\n\t\tthis.#started = true;\n\t\t// Bridge backend events through our listener set.\n\t\tthis.backend.on((event) => this.#broadcast(event));\n\t}\n\n\t/** Drain in-flight jobs and close all workers. */\n\tasync stop(): Promise<void> {\n\t\tif (!this.#started) return;\n\t\tthis.#started = false;\n\t\tawait this.backend.drain();\n\t\tfor (const handle of this.#workers.values()) {\n\t\t\tawait handle.close();\n\t\t}\n\t\tawait this.backend.stop();\n\t\tthis.#workers.clear();\n\t}\n\n\t// ===========================================================================\n\t// Cloudflare binding helper\n\t// ===========================================================================\n\n\t/**\n\t * For Cloudflare backends, call this once with the Worker's env so\n\t * the producer can find the Queue binding.\n\t *\n\t * const service = app.container.resolve(QueueService.TOKEN);\n\t * if (service.backend.name === 'cloudflare') {\n\t * (service.backend as CloudflareQueueBackend).bind(env);\n\t * }\n\t */\n\tgetCloudflareBackend(): CloudflareQueueBackend | null {\n\t\treturn this.backend instanceof CloudflareQueueBackend ? this.backend : null;\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\t#createBackend(config: QueueConfig): QueueBackend {\n\t\tswitch (config.backend) {\n\t\t\tcase 'memory':\n\t\t\t\treturn new MemoryQueueBackend();\n\t\t\tcase 'bullmq': {\n\t\t\t\tif (!config.bullmq) {\n\t\t\t\t\tthrow new Error('[queue] backend=bullmq requires `bullmq.connection` in config.');\n\t\t\t\t}\n\t\t\t\treturn new BullMQBackend({\n\t\t\t\t\tconnection: config.bullmq.connection,\n\t\t\t\t\tprefix: config.bullmq.prefix,\n\t\t\t\t\tdefaultJobOptions: config.bullmq.defaultJobOptions,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'cloudflare': {\n\t\t\t\tif (!config.cloudflare) {\n\t\t\t\t\tthrow new Error('[queue] backend=cloudflare requires `cloudflare.resolveBinding` in config.');\n\t\t\t\t}\n\t\t\t\treturn new CloudflareQueueBackend({\n\t\t\t\t\tresolveBinding: config.cloudflare.resolveBinding as never,\n\t\t\t\t\tname: config.cloudflare.name,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t#broadcast(event: QueueEvent) {\n\t\tfor (const l of this.#listeners) {\n\t\t\tvoid Promise.resolve(l(event));\n\t\t}\n\t}\n}",
|
|
19
|
+
"/**\n * `QueueModule` — drop-in module for adding background jobs to a\n * NexusJS app.\n *\n * Usage:\n * // src/app/app.module.ts\n * @Module({\n * imports: [\n * QueueModule.forRoot({\n * backend: 'bullmq',\n * bullmq: { connection: 'redis://localhost:6379' },\n * }),\n * ],\n * })\n * export class AppModule {}\n *\n * // any controller or service\n * constructor(@Inject(QueueService.TOKEN) private queue: QueueService) {}\n * await this.queue.add('send-email', { to: 'a@b.c' });\n *\n * // any service — register a worker\n * class EmailWorker {\n * constructor(@Inject(QueueService.TOKEN) private queue: QueueService) {}\n * async onInit() {\n * await this.queue.process('send-email', async (data) => {\n * // ... send the email\n * return { status: 'completed' };\n * });\n * }\n * }\n */\n\nimport \"reflect-metadata\";\nimport { Module } from \"../core/decorators/module.js\";\nimport { QueueService } from \"./queue.service.js\";\nimport type { QueueConfig } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tQueueService,\n\t\t{ provide: QueueService.TOKEN, useExisting: QueueService },\n\t],\n\texports: [QueueService, QueueService.TOKEN],\n})\nexport class QueueModule {\n\t/**\n\t * Build a configured `QueueModule` class with the given queue config.\n\t *\n\t * The returned class can be `imports`-ed by any other module and\n\t * will provide the `QueueService` (and a `QUEUE_CONFIG` value\n\t * provider) to its container.\n\t */\n\tstatic forRoot(config: QueueConfig) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tQueueService,\n\t\t\t\t{ provide: QueueService.TOKEN, useExisting: QueueService },\n\t\t\t\t{ provide: \"QUEUE_CONFIG\", useValue: config },\n\t\t\t],\n\t\t\texports: [QueueService, QueueService.TOKEN],\n\t\t})\n\t\tclass ConfiguredQueueModule {}\n\n\t\tObject.defineProperty(ConfiguredQueueModule, \"name\", {\n\t\t\tvalue: \"ConfiguredQueueModule\",\n\t\t});\n\n\t\treturn ConfiguredQueueModule;\n\t}\n}\n",
|
|
20
|
+
"/**\n * `@OnQueueReady()` — lifecycle hook that runs once when the\n * application has booted and the queue service is ready.\n *\n * Use this to register workers without coupling to the `Application`\n * lifecycle directly.\n *\n * Usage:\n * class EmailWorker {\n * constructor(@Inject(QueueService.TOKEN) private queue: QueueService) {}\n *\n * @OnQueueReady()\n * async register() {\n * await this.queue.process('send-email', this.handle);\n * }\n *\n * handle = async (data: { to: string }) => { ... };\n * }\n *\n * @Module({\n * providers: [EmailWorker],\n * })\n * class WorkerModule {}\n */\n\nimport \"reflect-metadata\";\nimport type { QueueService } from \"../queue.service.js\";\n\n/**\n * Method decorator. The decorated method is invoked once with no\n * arguments after the application has booted. Pair it with\n * `QueueService.start()` — typically called by `Application.bootstrap`.\n */\nexport function OnQueueReady(): MethodDecorator {\n\treturn (target, propertyKey, descriptor) => {\n\t\tif (!descriptor || typeof descriptor.value !== \"function\") {\n\t\t\tthrow new Error(\"@OnQueueReady can only decorate methods.\");\n\t\t}\n\t\t// Register the hook in a per-class metadata slot. The bootstrap\n\t\t// code reads METADATA_KEY.QUEUE_READY_HOOKS and calls each.\n\t\tconst ctor = target.constructor as object;\n\t\tconst hooks: Array<string | symbol> =\n\t\t\t(Reflect.getMetadata(\"nexus:queue:ready-hooks\", ctor) as\n\t\t\t\t| Array<string | symbol>\n\t\t\t\t| undefined) ?? [];\n\t\thooks.push(propertyKey!);\n\t\tReflect.defineMetadata(\"nexus:queue:ready-hooks\", hooks, ctor);\n\t};\n}\n\n/**\n * Get the queue-ready hooks declared on a class.\n */\nexport function getQueueReadyHooks(target: unknown): Array<string | symbol> {\n\tconst ctor =\n\t\t(target as { constructor?: object }).constructor ?? (target as object);\n\treturn (\n\t\t(Reflect.getMetadata(\"nexus:queue:ready-hooks\", ctor) as\n\t\t\t| Array<string | symbol>\n\t\t\t| undefined) ?? []\n\t);\n}\n\n/**\n * Helper — invoke all `@OnQueueReady` hooks on an instance.\n * Pair this with `QueueService.start()` for a complete bootstrap.\n */\nexport async function invokeQueueReadyHooks(instance: object): Promise<void> {\n\tconst hooks = getQueueReadyHooks(instance);\n\tfor (const key of hooks) {\n\t\tconst fn = (instance as Record<string | symbol, unknown>)[key] as\n\t\t\t| ((...args: unknown[]) => Promise<void> | void)\n\t\t\t| undefined;\n\t\tif (typeof fn === \"function\") {\n\t\t\tawait fn.call(instance);\n\t\t}\n\t}\n}\n\n// Re-export for convenience.\nexport type { QueueService };\n"
|
|
21
|
+
],
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "A7D10A8ACACCA70164756E2164756E21",
|
|
24
|
+
"names": []
|
|
25
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `QueueModule` — drop-in module for adding background jobs to a
|
|
3
|
+
* NexusJS app.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* // src/app/app.module.ts
|
|
7
|
+
* @Module({
|
|
8
|
+
* imports: [
|
|
9
|
+
* QueueModule.forRoot({
|
|
10
|
+
* backend: 'bullmq',
|
|
11
|
+
* bullmq: { connection: 'redis://localhost:6379' },
|
|
12
|
+
* }),
|
|
13
|
+
* ],
|
|
14
|
+
* })
|
|
15
|
+
* export class AppModule {}
|
|
16
|
+
*
|
|
17
|
+
* // any controller or service
|
|
18
|
+
* constructor(@Inject(QueueService.TOKEN) private queue: QueueService) {}
|
|
19
|
+
* await this.queue.add('send-email', { to: 'a@b.c' });
|
|
20
|
+
*
|
|
21
|
+
* // any service — register a worker
|
|
22
|
+
* class EmailWorker {
|
|
23
|
+
* constructor(@Inject(QueueService.TOKEN) private queue: QueueService) {}
|
|
24
|
+
* async onInit() {
|
|
25
|
+
* await this.queue.process('send-email', async (data) => {
|
|
26
|
+
* // ... send the email
|
|
27
|
+
* return { status: 'completed' };
|
|
28
|
+
* });
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
*/
|
|
32
|
+
import "reflect-metadata";
|
|
33
|
+
import type { QueueConfig } from "./types.js";
|
|
34
|
+
export declare class QueueModule {
|
|
35
|
+
/**
|
|
36
|
+
* Build a configured `QueueModule` class with the given queue config.
|
|
37
|
+
*
|
|
38
|
+
* The returned class can be `imports`-ed by any other module and
|
|
39
|
+
* will provide the `QueueService` (and a `QUEUE_CONFIG` value
|
|
40
|
+
* provider) to its container.
|
|
41
|
+
*/
|
|
42
|
+
static forRoot(config: QueueConfig): {
|
|
43
|
+
new (): {};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=queue.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.module.d.ts","sourceRoot":"","sources":["../../src/queue/queue.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAOa,WAAW;IACvB;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW;;;CAiBlC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `QueueService` — DI-friendly facade over a `QueueBackend`.
|
|
3
|
+
*
|
|
4
|
+
* Controllers and other services inject this via `@Inject(QueueService.TOKEN)`
|
|
5
|
+
* (or just `@Inject(QueueService)`) and call high-level methods without
|
|
6
|
+
* caring whether the underlying backend is BullMQ, Cloudflare Queues,
|
|
7
|
+
* or the in-memory test backend.
|
|
8
|
+
*
|
|
9
|
+
* Two layers:
|
|
10
|
+
* - `QueueService.add(name, data, options?)` → schedule a job
|
|
11
|
+
* - `QueueService.process(name, handler)` → register a worker
|
|
12
|
+
*
|
|
13
|
+
* The lifecycle is owned by `QueueService.start()` (called by
|
|
14
|
+
* `QueueModule.forRoot` when the application boots) and
|
|
15
|
+
* `QueueService.stop()` (called on shutdown).
|
|
16
|
+
*/
|
|
17
|
+
import type { QueueBackend, QueueConfig, JobHandler, WorkerHandle, AddedJob, AddOptions, QueueEventListener } from './types.js';
|
|
18
|
+
import { CloudflareQueueBackend } from './backends/index.js';
|
|
19
|
+
export declare class QueueService {
|
|
20
|
+
#private;
|
|
21
|
+
private readonly config;
|
|
22
|
+
/** DI token — use with `@Inject(QueueService.TOKEN)`. */
|
|
23
|
+
static readonly TOKEN: unique symbol;
|
|
24
|
+
/** The underlying backend. */
|
|
25
|
+
readonly backend: QueueBackend;
|
|
26
|
+
constructor(config: QueueConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Enqueue a job. Returns immediately (the backend may still be
|
|
29
|
+
* persisting). On Cloudflare, returns once the message is on disk.
|
|
30
|
+
*/
|
|
31
|
+
add<T = unknown>(name: string, data: T, options?: AddOptions): Promise<AddedJob>;
|
|
32
|
+
/** Enqueue many jobs at once (atomic on Cloudflare; batched on BullMQ). */
|
|
33
|
+
addBatch<T = unknown>(jobs: Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
data: T;
|
|
36
|
+
options?: AddOptions;
|
|
37
|
+
}>): Promise<AddedJob[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Register a worker for the given job name. Call this from
|
|
40
|
+
* `Application.bootstrap` (or a feature module's `onInit`) — the
|
|
41
|
+
* module wires it via DI so user code doesn't have to call this
|
|
42
|
+
* manually.
|
|
43
|
+
*/
|
|
44
|
+
process<T = unknown>(name: string, handler: JobHandler<T>): Promise<WorkerHandle>;
|
|
45
|
+
on(listener: QueueEventListener): () => void;
|
|
46
|
+
/** Called by `QueueModule.forRoot` when the app boots. */
|
|
47
|
+
start(): Promise<void>;
|
|
48
|
+
/** Drain in-flight jobs and close all workers. */
|
|
49
|
+
stop(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* For Cloudflare backends, call this once with the Worker's env so
|
|
52
|
+
* the producer can find the Queue binding.
|
|
53
|
+
*
|
|
54
|
+
* const service = app.container.resolve(QueueService.TOKEN);
|
|
55
|
+
* if (service.backend.name === 'cloudflare') {
|
|
56
|
+
* (service.backend as CloudflareQueueBackend).bind(env);
|
|
57
|
+
* }
|
|
58
|
+
*/
|
|
59
|
+
getCloudflareBackend(): CloudflareQueueBackend | null;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=queue.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.service.d.ts","sourceRoot":"","sources":["../../src/queue/queue.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,UAAU,EAEV,kBAAkB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGN,sBAAsB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,qBACa,YAAY;;IAUY,OAAO,CAAC,QAAQ,CAAC,MAAM;IAT3D,yDAAyD;IACzD,MAAM,CAAC,QAAQ,CAAC,KAAK,gBAAoC;IAEzD,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;gBAKsB,MAAM,EAAE,WAAW;IAQxE;;;OAGG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,GAAE,UAAe,GACtB,OAAO,CAAC,QAAQ,CAAC;IAKpB,2EAA2E;IACrE,QAAQ,CAAC,CAAC,GAAG,OAAO,EACzB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,GAC1D,OAAO,CAAC,QAAQ,EAAE,CAAC;IAQtB;;;;;OAKG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,YAAY,CAAC;IAUxB,EAAE,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI;IAS5C,0DAA0D;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,kDAAkD;IAC5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;;;;;;;OAQG;IACH,oBAAoB,IAAI,sBAAsB,GAAG,IAAI;CAuCrD"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue types — the public contract for `nexusjs/queue`.
|
|
3
|
+
*
|
|
4
|
+
* The queue module provides an abstraction over two backends:
|
|
5
|
+
* - BullMQ (Redis-backed, for Bun / Node / long-running servers)
|
|
6
|
+
* - Cloudflare Queues (Workers-native, edge-friendly)
|
|
7
|
+
*
|
|
8
|
+
* Both share a common `QueueBackend` interface so user code never
|
|
9
|
+
* knows which one is configured — just like `ViewAdapter` for views.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The payload sent to a worker. `name` selects the handler; `data` is
|
|
13
|
+
* the typed payload.
|
|
14
|
+
*/
|
|
15
|
+
export interface Job<T = unknown> {
|
|
16
|
+
name: string;
|
|
17
|
+
data: T;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A job's outcome. `completed` is the normal path; `failed` triggers
|
|
21
|
+
* the configured retry policy; `retry` explicitly asks for one more
|
|
22
|
+
* attempt (BullMQ only — Cloudflare retries via `message.retry()`).
|
|
23
|
+
*/
|
|
24
|
+
export type JobResult<T = unknown> = {
|
|
25
|
+
status: "completed";
|
|
26
|
+
returnvalue?: T;
|
|
27
|
+
} | {
|
|
28
|
+
status: "failed";
|
|
29
|
+
error: Error;
|
|
30
|
+
willRetry: boolean;
|
|
31
|
+
} | {
|
|
32
|
+
status: "retry";
|
|
33
|
+
reason?: string;
|
|
34
|
+
delaySeconds?: number;
|
|
35
|
+
};
|
|
36
|
+
/** A registered worker handler. */
|
|
37
|
+
export type JobHandler<T = unknown> = (data: T, ctx: JobContext) => Promise<JobResult<T> | void> | JobResult<T> | void;
|
|
38
|
+
/** Per-job execution context. */
|
|
39
|
+
export interface JobContext {
|
|
40
|
+
/** The unique BullMQ / Cloudflare job ID. */
|
|
41
|
+
jobId: string;
|
|
42
|
+
/** Number of attempts so far (1-indexed). */
|
|
43
|
+
attempts: number;
|
|
44
|
+
/** Original `Job` envelope (name + data). */
|
|
45
|
+
job: Job;
|
|
46
|
+
/** Logger-friendly prefix: `[queue:name]`. */
|
|
47
|
+
prefix: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Options for `add()`. Mirrors BullMQ's JobOpts plus our
|
|
51
|
+
* edge-friendly extensions.
|
|
52
|
+
*/
|
|
53
|
+
export interface AddOptions {
|
|
54
|
+
/** Delay before the job is available. Seconds. */
|
|
55
|
+
delaySeconds?: number;
|
|
56
|
+
/** Max attempts before the job is dead-lettered. */
|
|
57
|
+
attempts?: number;
|
|
58
|
+
/** Backoff strategy between retries. */
|
|
59
|
+
backoff?: BackoffConfig;
|
|
60
|
+
/** Priority — lower runs first. Cloudflare ignores this. */
|
|
61
|
+
priority?: number;
|
|
62
|
+
/** Job ID for idempotency (BullMQ). */
|
|
63
|
+
jobId?: string;
|
|
64
|
+
/** Remove from the queue on completion. */
|
|
65
|
+
removeOnComplete?: boolean | number;
|
|
66
|
+
/** Remove from the queue on failure. */
|
|
67
|
+
removeOnFail?: boolean | number;
|
|
68
|
+
}
|
|
69
|
+
export interface BackoffConfig {
|
|
70
|
+
/** 'fixed' | 'exponential'. */
|
|
71
|
+
type: "fixed" | "exponential";
|
|
72
|
+
/** Base delay in milliseconds. */
|
|
73
|
+
delayMs: number;
|
|
74
|
+
}
|
|
75
|
+
/** Returned by `add()` — enough info to track or cancel. */
|
|
76
|
+
export interface AddedJob {
|
|
77
|
+
jobId: string;
|
|
78
|
+
name: string;
|
|
79
|
+
/** Backend-specific handle (BullMQ Job, Cloudflare Message, ...). */
|
|
80
|
+
handle?: unknown;
|
|
81
|
+
}
|
|
82
|
+
/** Options for `process()`. */
|
|
83
|
+
export interface WorkerOptions {
|
|
84
|
+
/** How many jobs this worker handles in parallel. Default: 1. */
|
|
85
|
+
concurrency?: number;
|
|
86
|
+
/** Rate limit — jobs per second. */
|
|
87
|
+
limiter?: {
|
|
88
|
+
max: number;
|
|
89
|
+
durationMs: number;
|
|
90
|
+
};
|
|
91
|
+
/** Lock duration in ms — how long a worker holds the job. Default: 30000. */
|
|
92
|
+
lockDurationMs?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Backend contract. Each backend (BullMQ, Cloudflare) implements this.
|
|
96
|
+
*
|
|
97
|
+
* User code talks to `QueueService`, not to the backend directly —
|
|
98
|
+
* but advanced users can `@Inject(QueueService.BACKEND_TOKEN)` if they
|
|
99
|
+
* need a specific backend's native API.
|
|
100
|
+
*/
|
|
101
|
+
export interface QueueBackend {
|
|
102
|
+
/** Backend name for diagnostics. */
|
|
103
|
+
readonly name: "bullmq" | "cloudflare" | "memory";
|
|
104
|
+
/** Add a job to the queue. */
|
|
105
|
+
add(name: string, data: unknown, options?: AddOptions): Promise<AddedJob>;
|
|
106
|
+
/** Add many jobs at once. */
|
|
107
|
+
addBatch(jobs: Array<{
|
|
108
|
+
name: string;
|
|
109
|
+
data: unknown;
|
|
110
|
+
options?: AddOptions;
|
|
111
|
+
}>): Promise<AddedJob[]>;
|
|
112
|
+
/** Register a worker. Returns a handle that can be closed. */
|
|
113
|
+
process<T = unknown>(name: string, handler: JobHandler<T>, options?: WorkerOptions): Promise<WorkerHandle>;
|
|
114
|
+
/** Drain — wait for in-flight jobs to finish. */
|
|
115
|
+
drain(): Promise<void>;
|
|
116
|
+
/** Stop all workers gracefully. */
|
|
117
|
+
stop(): Promise<void>;
|
|
118
|
+
/** Subscribe to queue events. Returns an unsubscribe function. */
|
|
119
|
+
on(listener: QueueEventListener): () => void;
|
|
120
|
+
}
|
|
121
|
+
/** Handle for a running worker. */
|
|
122
|
+
export interface WorkerHandle {
|
|
123
|
+
/** The job name this worker handles. */
|
|
124
|
+
name: string;
|
|
125
|
+
/** Stop the worker (wait for in-flight jobs). */
|
|
126
|
+
close(): Promise<void>;
|
|
127
|
+
/** Pause accepting new jobs. */
|
|
128
|
+
pause(): Promise<void>;
|
|
129
|
+
/** Resume accepting jobs. */
|
|
130
|
+
resume(): Promise<void>;
|
|
131
|
+
/** True if the worker is running. */
|
|
132
|
+
isRunning(): boolean;
|
|
133
|
+
}
|
|
134
|
+
export type QueueBackendKind = "bullmq" | "cloudflare" | "memory";
|
|
135
|
+
export interface QueueConfig {
|
|
136
|
+
/**
|
|
137
|
+
* Backend to use.
|
|
138
|
+
* - 'bullmq' → Redis-backed, works on Bun / Node
|
|
139
|
+
* - 'cloudflare' → Cloudflare Queues binding
|
|
140
|
+
* - 'memory' → in-process queue (tests, single-instance dev)
|
|
141
|
+
*/
|
|
142
|
+
backend: QueueBackendKind;
|
|
143
|
+
/**
|
|
144
|
+
* BullMQ-specific configuration. Ignored by other backends.
|
|
145
|
+
*/
|
|
146
|
+
bullmq?: BullMQConfig;
|
|
147
|
+
/**
|
|
148
|
+
* Cloudflare-specific configuration. Ignored by other backends.
|
|
149
|
+
*/
|
|
150
|
+
cloudflare?: CloudflareQueueConfig;
|
|
151
|
+
/** Global default options for `add()`. */
|
|
152
|
+
defaults?: AddOptions;
|
|
153
|
+
}
|
|
154
|
+
export interface BullMQConfig {
|
|
155
|
+
/** Redis connection URL (e.g. redis://localhost:6379). */
|
|
156
|
+
connection: string | {
|
|
157
|
+
host: string;
|
|
158
|
+
port: number;
|
|
159
|
+
password?: string;
|
|
160
|
+
};
|
|
161
|
+
/** Prefix for all queue keys. Default: 'nexusjs'. */
|
|
162
|
+
prefix?: string;
|
|
163
|
+
/** Default job options. */
|
|
164
|
+
defaultJobOptions?: AddOptions;
|
|
165
|
+
}
|
|
166
|
+
export interface CloudflareQueueConfig {
|
|
167
|
+
/**
|
|
168
|
+
* Resolver for the Queue binding from the Worker's `env`.
|
|
169
|
+
* Called once at boot with the env object.
|
|
170
|
+
*/
|
|
171
|
+
resolveBinding: (env: Record<string, unknown>) => unknown;
|
|
172
|
+
/** Queue name (used for diagnostics). */
|
|
173
|
+
name: string;
|
|
174
|
+
}
|
|
175
|
+
export type QueueEvent = {
|
|
176
|
+
kind: "job:added";
|
|
177
|
+
jobId: string;
|
|
178
|
+
name: string;
|
|
179
|
+
} | {
|
|
180
|
+
kind: "job:active";
|
|
181
|
+
jobId: string;
|
|
182
|
+
name: string;
|
|
183
|
+
attempts: number;
|
|
184
|
+
} | {
|
|
185
|
+
kind: "job:completed";
|
|
186
|
+
jobId: string;
|
|
187
|
+
name: string;
|
|
188
|
+
returnvalue?: unknown;
|
|
189
|
+
} | {
|
|
190
|
+
kind: "job:failed";
|
|
191
|
+
jobId: string;
|
|
192
|
+
name: string;
|
|
193
|
+
error: Error;
|
|
194
|
+
willRetry: boolean;
|
|
195
|
+
} | {
|
|
196
|
+
kind: "worker:started";
|
|
197
|
+
name: string;
|
|
198
|
+
concurrency: number;
|
|
199
|
+
} | {
|
|
200
|
+
kind: "worker:stopped";
|
|
201
|
+
name: string;
|
|
202
|
+
};
|
|
203
|
+
export type QueueEventListener = (event: QueueEvent) => void | Promise<void>;
|
|
204
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/queue/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun runtime adapter for `nexusjs/redis`.
|
|
3
|
+
*
|
|
4
|
+
* Uses the built-in `Bun.redis` client. No extra package needed.
|
|
5
|
+
* The client is lazily opened on first use.
|
|
6
|
+
*/
|
|
7
|
+
import type { RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue } from "../types.js";
|
|
8
|
+
export declare class BunRedisAdapter implements RedisClient {
|
|
9
|
+
readonly adapter: "bun";
|
|
10
|
+
private client;
|
|
11
|
+
private readonly url;
|
|
12
|
+
private readonly keyPrefix;
|
|
13
|
+
private readonly defaultTtlSeconds;
|
|
14
|
+
constructor(config?: RedisConfig);
|
|
15
|
+
private getClient;
|
|
16
|
+
private k;
|
|
17
|
+
get(key: string): Promise<RedisValue>;
|
|
18
|
+
set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
|
|
19
|
+
del(key: string): Promise<number>;
|
|
20
|
+
exists(key: string): Promise<boolean>;
|
|
21
|
+
incr(key: string, by?: number, options?: {
|
|
22
|
+
ex?: number;
|
|
23
|
+
}): Promise<number>;
|
|
24
|
+
scan(options?: RedisScanOptions): Promise<RedisScanResult>;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=bun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../../../src/redis/adapters/bun.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,UAAU,EACV,MAAM,aAAa,CAAC;AAoBrB,qBAAa,eAAgB,YAAW,WAAW;IAClD,QAAQ,CAAC,OAAO,EAAG,KAAK,CAAU;IAClC,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAE/B,MAAM,GAAE,WAAgB;IAMpC,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,CAAC;IAIH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIrC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAI,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAWrE,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgB9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM5B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers KV adapter for `nexusjs/redis`.
|
|
3
|
+
*
|
|
4
|
+
* Workers KV is **not** Redis, but the surface is close enough
|
|
5
|
+
* that the same `RedisClient` API can sit on top of it. The
|
|
6
|
+
* adapter:
|
|
7
|
+
*
|
|
8
|
+
* - Maps `set(key, value, { ex })` to `KVNamespace.put()` with
|
|
9
|
+
* `expirationTtl` (seconds).
|
|
10
|
+
* - Maps `scan({ match })` to `KVNamespace.list({ prefix })`,
|
|
11
|
+
* which is the closest thing KV offers to Redis `SCAN MATCH`.
|
|
12
|
+
* The `cursor` field is a Cloudflare opaque string.
|
|
13
|
+
* - `del` uses `KVNamespace.delete()`.
|
|
14
|
+
* - `incr` falls back to a small read-modify-write: get the
|
|
15
|
+
* value, parse as int, add, put back. (KV doesn't have
|
|
16
|
+
* atomic INCR.) Use with care — concurrent writes can lose
|
|
17
|
+
* updates. For high-contention counters use a real Redis.
|
|
18
|
+
*
|
|
19
|
+
* Cloudflare imposes a 25 MB value limit per key and a global
|
|
20
|
+
* 100k reads / 1000 writes per second per KV namespace. Don't
|
|
21
|
+
* store large objects in KV.
|
|
22
|
+
*
|
|
23
|
+
* To use:
|
|
24
|
+
*
|
|
25
|
+
* // In a Worker request handler:
|
|
26
|
+
* const client = createRedisClient({
|
|
27
|
+
* adapter: "cloudflare",
|
|
28
|
+
* kv: c.env.SESSIONS, // KVNamespace binding from wrangler.toml
|
|
29
|
+
* });
|
|
30
|
+
*/
|
|
31
|
+
import type { RedisClient, RedisConfig, RedisScanOptions, RedisScanResult, RedisSetOptions, RedisValue } from "../types.js";
|
|
32
|
+
export declare class CloudflareKVAdapter implements RedisClient {
|
|
33
|
+
readonly adapter: "cloudflare";
|
|
34
|
+
private kv;
|
|
35
|
+
private readonly keyPrefix;
|
|
36
|
+
private readonly defaultTtlSeconds;
|
|
37
|
+
constructor(config?: RedisConfig);
|
|
38
|
+
private getKV;
|
|
39
|
+
private k;
|
|
40
|
+
private stripPrefix;
|
|
41
|
+
get(key: string): Promise<RedisValue>;
|
|
42
|
+
set(key: string, value: string, options?: RedisSetOptions): Promise<void>;
|
|
43
|
+
del(key: string): Promise<number>;
|
|
44
|
+
exists(key: string): Promise<boolean>;
|
|
45
|
+
incr(key: string, by?: number, options?: {
|
|
46
|
+
ex?: number;
|
|
47
|
+
}): Promise<number>;
|
|
48
|
+
scan(options?: RedisScanOptions): Promise<RedisScanResult>;
|
|
49
|
+
close(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/redis/adapters/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAEX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,UAAU,EACV,MAAM,aAAa,CAAC;AAErB,qBAAa,mBAAoB,YAAW,WAAW;IACtD,QAAQ,CAAC,OAAO,EAAG,YAAY,CAAU;IACzC,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAE/B,MAAM,GAAE,WAAgB;IAMpC,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,CAAC;IAIT,OAAO,CAAC,WAAW;IAMb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIrC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IASzE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAI,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBrE,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|