alepha 0.13.6 → 0.13.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/api/audits/index.browser.js +116 -0
- package/dist/api/audits/index.browser.js.map +1 -0
- package/dist/api/audits/index.d.ts +1194 -0
- package/dist/api/audits/index.js +674 -0
- package/dist/api/audits/index.js.map +1 -0
- package/dist/{api-files → api/files}/index.browser.js +5 -5
- package/dist/api/files/index.browser.js.map +1 -0
- package/dist/{api-files → api/files}/index.d.ts +16 -9
- package/dist/{api-files → api/files}/index.js +10 -10
- package/dist/api/files/index.js.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.browser.js +5 -5
- package/dist/api/jobs/index.browser.js.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.d.ts +35 -35
- package/dist/{api-jobs → api/jobs}/index.js +9 -9
- package/dist/api/jobs/index.js.map +1 -0
- package/dist/{api-notifications → api/notifications}/index.browser.js +11 -11
- package/dist/api/notifications/index.browser.js.map +1 -0
- package/dist/api/notifications/index.d.ts +327 -0
- package/dist/{api-notifications → api/notifications}/index.js +11 -11
- package/dist/api/notifications/index.js.map +1 -0
- package/dist/api/parameters/index.browser.js +60 -0
- package/dist/api/parameters/index.browser.js.map +1 -0
- package/dist/api/parameters/index.d.ts +761 -0
- package/dist/api/parameters/index.js +877 -0
- package/dist/api/parameters/index.js.map +1 -0
- package/dist/{api-users → api/users}/index.browser.js +6 -6
- package/dist/api/users/index.browser.js.map +1 -0
- package/dist/{api-users → api/users}/index.d.ts +259 -247
- package/dist/{api-users → api/users}/index.js +125 -112
- package/dist/api/users/index.js.map +1 -0
- package/dist/{api-verifications → api/verifications}/index.browser.js +5 -5
- package/dist/api/verifications/index.browser.js.map +1 -0
- package/dist/api/verifications/index.d.ts +248 -0
- package/dist/{api-verifications → api/verifications}/index.js +13 -12
- package/dist/api/verifications/index.js.map +1 -0
- package/dist/bin/index.js +1 -0
- package/dist/bin/index.js.map +1 -1
- package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
- package/dist/cache/{index.js → core/index.js} +5 -5
- package/dist/cache/core/index.js.map +1 -0
- package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
- package/dist/{cache-redis → cache/redis}/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -0
- package/dist/cli/index.d.ts +71 -9
- package/dist/cli/index.js +280 -79
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +63 -2
- package/dist/command/index.js +30 -3
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +241 -61
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +170 -90
- package/dist/core/index.js +264 -67
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +248 -65
- package/dist/core/index.native.js.map +1 -1
- package/dist/email/index.js +15 -10554
- package/dist/email/index.js.map +1 -1
- package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
- package/dist/lock/{index.js → core/index.js} +5 -5
- package/dist/lock/core/index.js.map +1 -0
- package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
- package/dist/{lock-redis → lock/redis}/index.js +2 -2
- package/dist/lock/redis/index.js.map +1 -0
- package/dist/logger/index.d.ts +4 -4
- package/dist/logger/index.js +77 -72
- package/dist/logger/index.js.map +1 -1
- package/dist/orm/index.d.ts +5 -1
- package/dist/orm/index.js +24 -7
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +548 -0
- package/dist/queue/core/index.js +391 -0
- package/dist/queue/core/index.js.map +1 -0
- package/dist/queue/redis/index.d.ts +28 -0
- package/dist/queue/redis/index.js +43 -0
- package/dist/queue/redis/index.js.map +1 -0
- package/dist/scheduler/index.d.ts +7 -7
- package/dist/scheduler/index.js +1 -393
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.js +2 -1413
- package/dist/security/index.js.map +1 -1
- package/dist/{server-auth → server/auth}/index.browser.js +6 -6
- package/dist/server/auth/index.browser.js.map +1 -0
- package/dist/{server-auth → server/auth}/index.d.ts +175 -164
- package/dist/server/auth/index.js +742 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/{server-cache → server/cache}/index.d.ts +2 -2
- package/dist/{server-cache → server/cache}/index.js +2 -2
- package/dist/server/cache/index.js.map +1 -0
- package/dist/{server-compress → server/compress}/index.d.ts +2 -2
- package/dist/{server-compress → server/compress}/index.js +2 -2
- package/dist/server/compress/index.js.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
- package/dist/server/cookies/index.browser.js.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
- package/dist/{server-cookies → server/cookies}/index.js +9 -5
- package/dist/server/cookies/index.js.map +1 -0
- package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
- package/dist/server/core/index.browser.js.map +1 -0
- package/dist/server/{index.d.ts → core/index.d.ts} +46 -37
- package/dist/server/{index.js → core/index.js} +47 -33
- package/dist/server/core/index.js.map +1 -0
- package/dist/{server-cors → server/cors}/index.d.ts +3 -3
- package/dist/{server-cors → server/cors}/index.js +3 -3
- package/dist/server/cors/index.js.map +1 -0
- package/dist/{server-health → server/health}/index.d.ts +3 -3
- package/dist/{server-health → server/health}/index.js +3 -3
- package/dist/server/health/index.js.map +1 -0
- package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
- package/dist/{server-helmet → server/helmet}/index.js +2 -2
- package/dist/server/helmet/index.js.map +1 -0
- package/dist/{server-links → server/links}/index.browser.js +5 -5
- package/dist/server/links/index.browser.js.map +1 -0
- package/dist/{server-links → server/links}/index.d.ts +40 -40
- package/dist/{server-links → server/links}/index.js +7 -7
- package/dist/server/links/index.js.map +1 -0
- package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
- package/dist/server/metrics/index.js +74 -0
- package/dist/server/metrics/index.js.map +1 -0
- package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
- package/dist/{server-multipart → server/multipart}/index.js +2 -2
- package/dist/server/multipart/index.js.map +1 -0
- package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
- package/dist/{server-proxy → server/proxy}/index.js +3 -3
- package/dist/server/proxy/index.js.map +1 -0
- package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
- package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
- package/dist/server/rate-limit/index.js.map +1 -0
- package/dist/{server-security → server/security}/index.browser.js +1 -1
- package/dist/server/security/index.browser.js.map +1 -0
- package/dist/{server-security → server/security}/index.d.ts +4 -4
- package/dist/{server-security → server/security}/index.js +4 -4
- package/dist/server/security/index.js.map +1 -0
- package/dist/{server-static → server/static}/index.d.ts +3 -3
- package/dist/{server-static → server/static}/index.js +3 -3
- package/dist/server/static/index.js.map +1 -0
- package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
- package/dist/{server-swagger → server/swagger}/index.js +4 -4
- package/dist/server/swagger/index.js.map +1 -0
- package/dist/thread/index.js +2 -2
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
- package/dist/topic/{index.js → core/index.js} +6 -6
- package/dist/topic/core/index.js.map +1 -0
- package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
- package/dist/{topic-redis → topic/redis}/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -0
- package/dist/vite/index.d.ts +13 -2
- package/dist/vite/index.js +114 -50
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +3 -3
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.js +4 -4
- package/dist/websocket/index.js.map +1 -1
- package/package.json +160 -156
- package/src/api/audits/controllers/AuditController.ts +186 -0
- package/src/api/audits/entities/audits.ts +132 -0
- package/src/api/audits/index.browser.ts +18 -0
- package/src/api/audits/index.ts +58 -0
- package/src/api/audits/primitives/$audit.ts +159 -0
- package/src/api/audits/schemas/auditQuerySchema.ts +23 -0
- package/src/api/audits/schemas/auditResourceSchema.ts +9 -0
- package/src/api/audits/schemas/createAuditSchema.ts +27 -0
- package/src/api/audits/services/AuditService.ts +412 -0
- package/src/{api-files → api/files}/index.ts +1 -0
- package/src/api/parameters/controllers/ConfigController.ts +324 -0
- package/src/api/parameters/entities/parameters.ts +113 -0
- package/src/api/parameters/index.ts +60 -0
- package/src/api/parameters/primitives/$config.ts +351 -0
- package/src/api/parameters/schedulers/ConfigActivationScheduler.ts +30 -0
- package/src/api/parameters/services/ConfigStore.ts +491 -0
- package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +19 -0
- package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -2
- package/src/{api-users → api/users}/index.ts +2 -0
- package/src/{api-users → api/users}/primitives/$userRealm.ts +18 -3
- package/src/{api-users → api/users}/providers/UserRealmProvider.ts +12 -10
- package/src/{api-users → api/users}/services/RegistrationService.ts +2 -1
- package/src/{api-users → api/users}/services/SessionService.ts +4 -0
- package/src/{api-users → api/users}/services/UserService.ts +3 -0
- package/src/{api-verifications → api/verifications}/index.ts +9 -1
- package/src/bin/index.ts +1 -0
- package/src/cli/apps/AlephaPackageBuilderCli.ts +73 -48
- package/src/cli/assets/appRouterTs.ts +1 -1
- package/src/cli/assets/biomeJson.ts +2 -2
- package/src/cli/assets/dummySpecTs.ts +7 -0
- package/src/cli/assets/editorconfig.ts +13 -0
- package/src/cli/assets/indexHtml.ts +1 -1
- package/src/cli/assets/mainBrowserTs.ts +1 -1
- package/src/cli/assets/mainTs.ts +14 -0
- package/src/cli/assets/viteConfigTs.ts +1 -1
- package/src/cli/commands/BiomeCommands.ts +2 -0
- package/src/cli/commands/CoreCommands.ts +38 -15
- package/src/cli/commands/VerifyCommands.ts +6 -2
- package/src/cli/commands/ViteCommands.ts +28 -18
- package/src/cli/services/AlephaCliUtils.ts +243 -37
- package/src/command/helpers/Asker.ts +0 -1
- package/src/command/primitives/$command.ts +67 -0
- package/src/command/providers/CliProvider.ts +39 -8
- package/src/core/Alepha.ts +40 -30
- package/src/core/helpers/jsonSchemaToTypeBox.ts +307 -0
- package/src/core/index.shared.ts +1 -0
- package/src/core/index.ts +30 -3
- package/src/core/providers/EventManager.ts +1 -1
- package/src/core/providers/SchemaValidator.ts +1 -1
- package/src/core/providers/StateManager.ts +23 -12
- package/src/core/providers/TypeProvider.ts +26 -34
- package/src/logger/index.ts +8 -6
- package/src/logger/primitives/$logger.ts +1 -1
- package/src/logger/providers/{SimpleFormatterProvider.ts → PrettyFormatterProvider.ts} +10 -1
- package/src/orm/index.ts +6 -0
- package/src/orm/services/PgRelationManager.ts +2 -2
- package/src/orm/services/PostgresModelBuilder.ts +11 -7
- package/src/orm/services/Repository.ts +16 -7
- package/src/orm/services/SqliteModelBuilder.ts +10 -0
- package/src/queue/{index.ts → core/index.ts} +2 -3
- package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
- package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
- package/src/queue/core/providers/QueueProvider.ts +23 -0
- package/src/queue/core/providers/WorkerProvider.ts +244 -0
- package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
- package/src/{server-auth → server/auth}/primitives/$auth.ts +7 -0
- package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +51 -8
- package/src/{server-cookies → server/cookies}/index.ts +2 -1
- package/src/server/{index.ts → core/index.ts} +7 -0
- package/src/server/{primitives → core/primitives}/$action.ts +10 -1
- package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +11 -5
- package/src/server/{providers → core/providers}/ServerRouterProvider.ts +13 -7
- package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
- package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
- package/src/thread/primitives/$thread.ts +2 -2
- package/src/vite/index.ts +0 -2
- package/src/vite/tasks/buildServer.ts +3 -4
- package/src/vite/tasks/copyAssets.ts +32 -8
- package/src/vite/tasks/generateCloudflare.ts +35 -19
- package/src/vite/tasks/generateDocker.ts +18 -4
- package/src/vite/tasks/generateSitemap.ts +5 -7
- package/src/vite/tasks/generateVercel.ts +76 -41
- package/src/vite/tasks/runAlepha.ts +16 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +3 -11
- package/src/websocket/services/WebSocketClient.ts +3 -3
- package/dist/api-files/index.browser.js.map +0 -1
- package/dist/api-files/index.js.map +0 -1
- package/dist/api-jobs/index.browser.js.map +0 -1
- package/dist/api-jobs/index.js.map +0 -1
- package/dist/api-notifications/index.browser.js.map +0 -1
- package/dist/api-notifications/index.d.ts +0 -327
- package/dist/api-notifications/index.js.map +0 -1
- package/dist/api-parameters/index.browser.js +0 -29
- package/dist/api-parameters/index.browser.js.map +0 -1
- package/dist/api-parameters/index.d.ts +0 -83
- package/dist/api-parameters/index.js +0 -63
- package/dist/api-parameters/index.js.map +0 -1
- package/dist/api-users/index.browser.js.map +0 -1
- package/dist/api-users/index.js.map +0 -1
- package/dist/api-verifications/index.browser.js.map +0 -1
- package/dist/api-verifications/index.d.ts +0 -229
- package/dist/api-verifications/index.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache-redis/index.js.map +0 -1
- package/dist/cli/dist-BlfFtOk2.js +0 -2770
- package/dist/cli/dist-BlfFtOk2.js.map +0 -1
- package/dist/lock/index.js.map +0 -1
- package/dist/lock-redis/index.js.map +0 -1
- package/dist/queue/index.d.ts +0 -1265
- package/dist/queue/index.js +0 -1037
- package/dist/queue/index.js.map +0 -1
- package/dist/queue-redis/index.d.ts +0 -82
- package/dist/queue-redis/index.js +0 -872
- package/dist/queue-redis/index.js.map +0 -1
- package/dist/server/index.browser.js.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server-auth/index.browser.js.map +0 -1
- package/dist/server-auth/index.js +0 -1943
- package/dist/server-auth/index.js.map +0 -1
- package/dist/server-cache/index.js.map +0 -1
- package/dist/server-compress/index.js.map +0 -1
- package/dist/server-cookies/index.browser.js.map +0 -1
- package/dist/server-cookies/index.js.map +0 -1
- package/dist/server-cors/index.js.map +0 -1
- package/dist/server-health/index.js.map +0 -1
- package/dist/server-helmet/index.js.map +0 -1
- package/dist/server-links/index.browser.js.map +0 -1
- package/dist/server-links/index.js.map +0 -1
- package/dist/server-metrics/index.js +0 -4532
- package/dist/server-metrics/index.js.map +0 -1
- package/dist/server-multipart/index.js.map +0 -1
- package/dist/server-proxy/index.js.map +0 -1
- package/dist/server-rate-limit/index.js.map +0 -1
- package/dist/server-security/index.browser.js.map +0 -1
- package/dist/server-security/index.js.map +0 -1
- package/dist/server-static/index.js.map +0 -1
- package/dist/server-swagger/index.js.map +0 -1
- package/dist/topic/index.js.map +0 -1
- package/dist/topic-redis/index.js.map +0 -1
- package/src/api-parameters/controllers/ParameterController.ts +0 -45
- package/src/api-parameters/entities/parameters.ts +0 -30
- package/src/api-parameters/index.ts +0 -21
- package/src/api-parameters/primitives/$config.ts +0 -79
- package/src/api-parameters/services/ParameterStore.ts +0 -23
- package/src/queue/interfaces/QueueJob.ts +0 -459
- package/src/queue/providers/MemoryQueueProvider.ts +0 -850
- package/src/queue/providers/QueueProvider.ts +0 -319
- package/src/queue/providers/WorkerProvider.ts +0 -344
- package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
- /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
- /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
- /package/src/{api-files → api/files}/entities/files.ts +0 -0
- /package/src/{api-files → api/files}/index.browser.ts +0 -0
- /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
- /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
- /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
- /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
- /package/src/{api-files → api/files}/services/FileService.ts +0 -0
- /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
- /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
- /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
- /package/src/{api-jobs → api/jobs}/index.ts +0 -0
- /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
- /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
- /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
- /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
- /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
- /package/src/{api-notifications → api/notifications}/index.ts +0 -0
- /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
- /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
- /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
- /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
- /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
- /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
- /package/src/{api-users → api/users}/entities/identities.ts +0 -0
- /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
- /package/src/{api-users → api/users}/entities/users.ts +0 -0
- /package/src/{api-users → api/users}/index.browser.ts +0 -0
- /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
- /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
- /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
- /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
- /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
- /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
- /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
- /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
- /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
- /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
- /package/src/cache/{index.ts → core/index.ts} +0 -0
- /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
- /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
- /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
- /package/src/{cache-redis → cache/redis}/index.ts +0 -0
- /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
- /package/src/lock/{index.ts → core/index.ts} +0 -0
- /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
- /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
- /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
- /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
- /package/src/{lock-redis → lock/redis}/index.ts +0 -0
- /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
- /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
- /package/src/{queue-redis → queue/redis}/index.ts +0 -0
- /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
- /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
- /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
- /package/src/{server-auth → server/auth}/index.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
- /package/src/{server-cache → server/cache}/index.ts +0 -0
- /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
- /package/src/{server-compress → server/compress}/index.ts +0 -0
- /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
- /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
- /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
- /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
- /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
- /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
- /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
- /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
- /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
- /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
- /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
- /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
- /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
- /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
- /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
- /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
- /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
- /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
- /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
- /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
- /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
- /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
- /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
- /package/src/server/{services → core/services}/HttpClient.ts +0 -0
- /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
- /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
- /package/src/{server-cors → server/cors}/index.ts +0 -0
- /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
- /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
- /package/src/{server-health → server/health}/index.ts +0 -0
- /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
- /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
- /package/src/{server-helmet → server/helmet}/index.ts +0 -0
- /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
- /package/src/{server-links → server/links}/index.browser.ts +0 -0
- /package/src/{server-links → server/links}/index.ts +0 -0
- /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
- /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
- /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
- /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
- /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
- /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
- /package/src/{server-metrics → server/metrics}/index.ts +0 -0
- /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
- /package/src/{server-multipart → server/multipart}/index.ts +0 -0
- /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
- /package/src/{server-proxy → server/proxy}/index.ts +0 -0
- /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
- /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
- /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
- /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
- /package/src/{server-security → server/security}/index.browser.ts +0 -0
- /package/src/{server-security → server/security}/index.ts +0 -0
- /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
- /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
- /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
- /package/src/{server-static → server/static}/index.ts +0 -0
- /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
- /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
- /package/src/{server-swagger → server/swagger}/index.ts +0 -0
- /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
- /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
- /package/src/topic/{index.ts → core/index.ts} +0 -0
- /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
- /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
- /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
- /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
- /package/src/{topic-redis → topic/redis}/index.ts +0 -0
- /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
QueueAcquiredJob,
|
|
3
|
-
QueueCleanOptions,
|
|
4
|
-
QueueEvent,
|
|
5
|
-
QueueEventHandler,
|
|
6
|
-
QueueEventMap,
|
|
7
|
-
QueueEventType,
|
|
8
|
-
QueueGetJobsOptions,
|
|
9
|
-
QueueJob,
|
|
10
|
-
QueueJobCounts,
|
|
11
|
-
QueueJobOptions,
|
|
12
|
-
QueueJobStatus,
|
|
13
|
-
} from "../interfaces/QueueJob.ts";
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Queue provider interface supporting both simple message-based and advanced job-based operations.
|
|
17
|
-
*
|
|
18
|
-
* The simple API (push/pop/popBlocking) is for basic fire-and-forget messaging.
|
|
19
|
-
* The job API provides crash recovery, retries, delayed jobs, priorities, and job history.
|
|
20
|
-
*/
|
|
21
|
-
export abstract class QueueProvider {
|
|
22
|
-
// ===========================================
|
|
23
|
-
// Event System
|
|
24
|
-
// ===========================================
|
|
25
|
-
|
|
26
|
-
protected eventHandlers: Map<
|
|
27
|
-
QueueEventType | "*",
|
|
28
|
-
Set<QueueEventHandler<QueueEvent>>
|
|
29
|
-
> = new Map();
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Subscribe to queue events.
|
|
33
|
-
*
|
|
34
|
-
* @param event Event type to listen for, or "*" for all events.
|
|
35
|
-
* @param handler Handler function to call when event occurs.
|
|
36
|
-
* @returns Unsubscribe function.
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```ts
|
|
40
|
-
* // Listen for completed events
|
|
41
|
-
* const unsubscribe = provider.on("completed", (event) => {
|
|
42
|
-
* console.log(`Job ${event.jobId} completed in ${event.duration}ms`);
|
|
43
|
-
* });
|
|
44
|
-
*
|
|
45
|
-
* // Listen for all events
|
|
46
|
-
* provider.on("*", (event) => {
|
|
47
|
-
* console.log(`Event: ${event.type} for job ${event.jobId}`);
|
|
48
|
-
* });
|
|
49
|
-
*
|
|
50
|
-
* // Unsubscribe later
|
|
51
|
-
* unsubscribe();
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
public on<T extends QueueEventType>(
|
|
55
|
-
event: T,
|
|
56
|
-
handler: QueueEventHandler<QueueEventMap[T]>,
|
|
57
|
-
): () => void;
|
|
58
|
-
public on(event: "*", handler: QueueEventHandler<QueueEvent>): () => void;
|
|
59
|
-
public on(
|
|
60
|
-
event: QueueEventType | "*",
|
|
61
|
-
handler: QueueEventHandler<QueueEvent>,
|
|
62
|
-
): () => void {
|
|
63
|
-
if (!this.eventHandlers.has(event)) {
|
|
64
|
-
this.eventHandlers.set(event, new Set());
|
|
65
|
-
}
|
|
66
|
-
this.eventHandlers.get(event)!.add(handler);
|
|
67
|
-
|
|
68
|
-
return () => {
|
|
69
|
-
this.eventHandlers.get(event)?.delete(handler);
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Emit a queue event to all registered handlers.
|
|
75
|
-
*
|
|
76
|
-
* @param event The event to emit.
|
|
77
|
-
*/
|
|
78
|
-
protected async emit(event: QueueEvent): Promise<void> {
|
|
79
|
-
const handlers = [
|
|
80
|
-
...(this.eventHandlers.get(event.type) ?? []),
|
|
81
|
-
...(this.eventHandlers.get("*") ?? []),
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
await Promise.all(handlers.map((handler) => handler(event)));
|
|
85
|
-
}
|
|
86
|
-
// ===========================================
|
|
87
|
-
// Simple Message API (backward compatible)
|
|
88
|
-
// ===========================================
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Push a message to the queue.
|
|
92
|
-
*
|
|
93
|
-
* @param queue Name of the queue to push the message to.
|
|
94
|
-
* @param message String message to be pushed to the queue.
|
|
95
|
-
*/
|
|
96
|
-
public abstract push(queue: string, message: string): Promise<void>;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Pop a message from the queue.
|
|
100
|
-
*
|
|
101
|
-
* @param queue Name of the queue to pop the message from.
|
|
102
|
-
* @returns The message popped or `undefined` if the queue is empty.
|
|
103
|
-
*/
|
|
104
|
-
public abstract pop(queue: string): Promise<string | undefined>;
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Pop a message from one of the specified queues, blocking until available or timeout.
|
|
108
|
-
*
|
|
109
|
-
* @param queues Array of queue names to listen on.
|
|
110
|
-
* @param timeoutSeconds Maximum time to wait in seconds.
|
|
111
|
-
* @returns Object with queue name and message, or `undefined` if timeout expired.
|
|
112
|
-
*/
|
|
113
|
-
public abstract popBlocking(
|
|
114
|
-
queues: string[],
|
|
115
|
-
timeoutSeconds: number,
|
|
116
|
-
): Promise<{ queue: string; message: string } | undefined>;
|
|
117
|
-
|
|
118
|
-
// ===========================================
|
|
119
|
-
// Job-based API (advanced features)
|
|
120
|
-
// ===========================================
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Add a job to the queue.
|
|
124
|
-
*
|
|
125
|
-
* @param queue Queue name.
|
|
126
|
-
* @param payload Job data to process.
|
|
127
|
-
* @param options Job options (priority, delay, retries, etc.).
|
|
128
|
-
* @returns The created job.
|
|
129
|
-
*/
|
|
130
|
-
public abstract addJob<T>(
|
|
131
|
-
queue: string,
|
|
132
|
-
payload: T,
|
|
133
|
-
options?: QueueJobOptions,
|
|
134
|
-
): Promise<QueueJob<T>>;
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Acquire the next available job for processing.
|
|
138
|
-
*
|
|
139
|
-
* This atomically:
|
|
140
|
-
* 1. Finds the highest priority job that is ready for processing
|
|
141
|
-
* 2. Moves it to "active" status
|
|
142
|
-
* 3. Sets a lock with the worker ID
|
|
143
|
-
*
|
|
144
|
-
* @param queues Queue names to check (in order of preference).
|
|
145
|
-
* @param workerId Unique identifier for the worker acquiring the job.
|
|
146
|
-
* @param timeoutSeconds Maximum time to wait for a job.
|
|
147
|
-
* @returns The acquired job or undefined if timeout.
|
|
148
|
-
*/
|
|
149
|
-
public abstract acquireJob(
|
|
150
|
-
queues: string[],
|
|
151
|
-
workerId: string,
|
|
152
|
-
timeoutSeconds: number,
|
|
153
|
-
): Promise<QueueAcquiredJob | undefined>;
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Mark a job as completed successfully.
|
|
157
|
-
*
|
|
158
|
-
* @param queue Queue name.
|
|
159
|
-
* @param jobId Job ID.
|
|
160
|
-
* @param result Optional result data from processing.
|
|
161
|
-
*/
|
|
162
|
-
public abstract completeJob(
|
|
163
|
-
queue: string,
|
|
164
|
-
jobId: string,
|
|
165
|
-
result?: unknown,
|
|
166
|
-
): Promise<void>;
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Mark a job as failed.
|
|
170
|
-
*
|
|
171
|
-
* If the job has remaining retry attempts, it will be moved to "delayed" status
|
|
172
|
-
* (for backoff) or "waiting" status. Otherwise, it will be moved to "failed" status.
|
|
173
|
-
*
|
|
174
|
-
* @param queue Queue name.
|
|
175
|
-
* @param jobId Job ID.
|
|
176
|
-
* @param error Error message.
|
|
177
|
-
* @param stackTrace Optional stack trace.
|
|
178
|
-
*/
|
|
179
|
-
public abstract failJob(
|
|
180
|
-
queue: string,
|
|
181
|
-
jobId: string,
|
|
182
|
-
error: string,
|
|
183
|
-
stackTrace?: string,
|
|
184
|
-
): Promise<void>;
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Extend the lock on an active job.
|
|
188
|
-
*
|
|
189
|
-
* Workers should call this periodically while processing long-running jobs
|
|
190
|
-
* to prevent them from being considered stalled.
|
|
191
|
-
*
|
|
192
|
-
* @param queue Queue name.
|
|
193
|
-
* @param jobId Job ID.
|
|
194
|
-
* @param workerId Worker ID (must match the lock holder).
|
|
195
|
-
* @returns True if lock was extended, false if job is not locked by this worker.
|
|
196
|
-
*/
|
|
197
|
-
public abstract renewJobLock(
|
|
198
|
-
queue: string,
|
|
199
|
-
jobId: string,
|
|
200
|
-
workerId: string,
|
|
201
|
-
): Promise<boolean>;
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Get a job by ID.
|
|
205
|
-
*
|
|
206
|
-
* @param queue Queue name.
|
|
207
|
-
* @param jobId Job ID.
|
|
208
|
-
* @returns The job or undefined if not found.
|
|
209
|
-
*/
|
|
210
|
-
public abstract getJob(
|
|
211
|
-
queue: string,
|
|
212
|
-
jobId: string,
|
|
213
|
-
): Promise<QueueJob | undefined>;
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Get jobs by status.
|
|
217
|
-
*
|
|
218
|
-
* @param queue Queue name.
|
|
219
|
-
* @param status Job status to filter by.
|
|
220
|
-
* @param options Pagination options.
|
|
221
|
-
* @returns Array of jobs.
|
|
222
|
-
*/
|
|
223
|
-
public abstract getJobs(
|
|
224
|
-
queue: string,
|
|
225
|
-
status: QueueJobStatus,
|
|
226
|
-
options?: QueueGetJobsOptions,
|
|
227
|
-
): Promise<QueueJob[]>;
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Get job counts by status.
|
|
231
|
-
*
|
|
232
|
-
* @param queue Queue name.
|
|
233
|
-
* @returns Object with counts for each status.
|
|
234
|
-
*/
|
|
235
|
-
public abstract getJobCounts(queue: string): Promise<QueueJobCounts>;
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Promote delayed jobs that are ready for processing.
|
|
239
|
-
*
|
|
240
|
-
* Moves jobs from "delayed" to "waiting" status when their availableAt time has passed.
|
|
241
|
-
*
|
|
242
|
-
* @param queue Queue name.
|
|
243
|
-
* @returns Number of jobs promoted.
|
|
244
|
-
*/
|
|
245
|
-
public abstract promoteDelayedJobs(queue: string): Promise<number>;
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Recover stalled jobs.
|
|
249
|
-
*
|
|
250
|
-
* Finds jobs in "active" status whose locks have expired and either:
|
|
251
|
-
* - Moves them back to "waiting" for retry (if attempts remaining)
|
|
252
|
-
* - Moves them to "failed" (if no attempts remaining)
|
|
253
|
-
*
|
|
254
|
-
* @param queue Queue name.
|
|
255
|
-
* @param stalledThresholdMs Jobs with expired locks older than this are considered stalled.
|
|
256
|
-
* @returns Array of recovered job IDs.
|
|
257
|
-
*/
|
|
258
|
-
public abstract recoverStalledJobs(
|
|
259
|
-
queue: string,
|
|
260
|
-
stalledThresholdMs: number,
|
|
261
|
-
): Promise<string[]>;
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Remove old completed or failed jobs.
|
|
265
|
-
*
|
|
266
|
-
* @param queue Queue name.
|
|
267
|
-
* @param status Status to clean ("completed" or "failed").
|
|
268
|
-
* @param options Cleaning options (maxAge, maxCount).
|
|
269
|
-
* @returns Number of jobs removed.
|
|
270
|
-
*/
|
|
271
|
-
public abstract cleanJobs(
|
|
272
|
-
queue: string,
|
|
273
|
-
status: "completed" | "failed",
|
|
274
|
-
options?: QueueCleanOptions,
|
|
275
|
-
): Promise<number>;
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Remove a specific job.
|
|
279
|
-
*
|
|
280
|
-
* @param queue Queue name.
|
|
281
|
-
* @param jobId Job ID.
|
|
282
|
-
*/
|
|
283
|
-
public abstract removeJob(queue: string, jobId: string): Promise<void>;
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Cancel all pending waiters.
|
|
287
|
-
*
|
|
288
|
-
* This is called during shutdown to immediately release all blocking
|
|
289
|
-
* acquireJob calls, preventing shutdown delays.
|
|
290
|
-
*/
|
|
291
|
-
public abstract cancelWaiters(): void;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Re-export types for convenience
|
|
295
|
-
export type {
|
|
296
|
-
QueueAcquiredJob,
|
|
297
|
-
QueueAddJobOptions,
|
|
298
|
-
QueueCleanOptions,
|
|
299
|
-
QueueEvent,
|
|
300
|
-
QueueEventActive,
|
|
301
|
-
QueueEventBase,
|
|
302
|
-
QueueEventCompleted,
|
|
303
|
-
QueueEventFailed,
|
|
304
|
-
QueueEventHandler,
|
|
305
|
-
QueueEventMap,
|
|
306
|
-
QueueEventProgress,
|
|
307
|
-
QueueEventRemoved,
|
|
308
|
-
QueueEventRetrying,
|
|
309
|
-
QueueEventStalled,
|
|
310
|
-
QueueEventType,
|
|
311
|
-
QueueEventWaiting,
|
|
312
|
-
QueueGetJobsOptions,
|
|
313
|
-
QueueJob,
|
|
314
|
-
QueueJobBackoff,
|
|
315
|
-
QueueJobCounts,
|
|
316
|
-
QueueJobOptions,
|
|
317
|
-
QueueJobState,
|
|
318
|
-
QueueJobStatus,
|
|
319
|
-
} from "../interfaces/QueueJob.ts";
|
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
$env,
|
|
3
|
-
$hook,
|
|
4
|
-
$inject,
|
|
5
|
-
Alepha,
|
|
6
|
-
type Static,
|
|
7
|
-
type TSchema,
|
|
8
|
-
t,
|
|
9
|
-
} from "alepha";
|
|
10
|
-
import { DateTimeProvider } from "alepha/datetime";
|
|
11
|
-
import { $logger } from "alepha/logger";
|
|
12
|
-
import type { QueueAcquiredJob } from "../interfaces/QueueJob.ts";
|
|
13
|
-
import { $consumer } from "../primitives/$consumer.ts";
|
|
14
|
-
import {
|
|
15
|
-
$queue,
|
|
16
|
-
type QueueMessage,
|
|
17
|
-
type QueuePrimitive,
|
|
18
|
-
} from "../primitives/$queue.ts";
|
|
19
|
-
import { QueueProvider } from "./QueueProvider.ts";
|
|
20
|
-
|
|
21
|
-
const envSchema = t.object({
|
|
22
|
-
/**
|
|
23
|
-
* The timeout in seconds for blocking job acquisition.
|
|
24
|
-
* Workers will check for shutdown after each timeout period.
|
|
25
|
-
*/
|
|
26
|
-
QUEUE_WORKER_BLOCKING_TIMEOUT: t.integer({
|
|
27
|
-
default: 5,
|
|
28
|
-
}),
|
|
29
|
-
/**
|
|
30
|
-
* The number of workers to run concurrently. Defaults to 1.
|
|
31
|
-
* Useful only if you are doing a lot of I/O.
|
|
32
|
-
*/
|
|
33
|
-
QUEUE_WORKER_CONCURRENCY: t.integer({
|
|
34
|
-
default: 1,
|
|
35
|
-
}),
|
|
36
|
-
/**
|
|
37
|
-
* Interval in milliseconds for renewing job locks during processing.
|
|
38
|
-
* Should be less than the job's lock duration.
|
|
39
|
-
*/
|
|
40
|
-
QUEUE_WORKER_LOCK_RENEWAL_INTERVAL: t.integer({
|
|
41
|
-
default: 10000, // 10 seconds
|
|
42
|
-
}),
|
|
43
|
-
/**
|
|
44
|
-
* Interval in milliseconds for the scheduler to check delayed jobs and stalled jobs.
|
|
45
|
-
*/
|
|
46
|
-
QUEUE_SCHEDULER_INTERVAL: t.integer({
|
|
47
|
-
default: 5000, // 5 seconds
|
|
48
|
-
}),
|
|
49
|
-
/**
|
|
50
|
-
* Threshold in milliseconds after lock expiration to consider a job stalled.
|
|
51
|
-
*/
|
|
52
|
-
QUEUE_STALLED_THRESHOLD: t.integer({
|
|
53
|
-
default: 5000, // 5 seconds grace period after lock expires
|
|
54
|
-
}),
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
declare module "alepha" {
|
|
58
|
-
interface Env extends Partial<Static<typeof envSchema>> {}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export class WorkerProvider {
|
|
62
|
-
protected readonly log = $logger();
|
|
63
|
-
protected readonly env = $env(envSchema);
|
|
64
|
-
protected readonly alepha = $inject(Alepha);
|
|
65
|
-
protected readonly queueProvider = $inject(QueueProvider);
|
|
66
|
-
protected readonly dateTime = $inject(DateTimeProvider);
|
|
67
|
-
|
|
68
|
-
protected workerPromises: Array<Promise<void>> = [];
|
|
69
|
-
protected workersRunning = 0;
|
|
70
|
-
protected shouldStop = false;
|
|
71
|
-
protected consumers: Array<Consumer> = [];
|
|
72
|
-
protected consumersByProvider: Map<QueueProvider, Consumer[]> = new Map();
|
|
73
|
-
protected schedulerPromise: Promise<void> | undefined;
|
|
74
|
-
protected schedulerRunning = false;
|
|
75
|
-
protected abortController: AbortController | undefined;
|
|
76
|
-
protected workerId: string = `worker_${process.pid}_${Date.now()}`;
|
|
77
|
-
|
|
78
|
-
public get isRunning(): boolean {
|
|
79
|
-
return this.workersRunning > 0;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
protected readonly start = $hook({
|
|
83
|
-
on: "start",
|
|
84
|
-
priority: "last",
|
|
85
|
-
handler: () => {
|
|
86
|
-
for (const queue of this.alepha.primitives($queue)) {
|
|
87
|
-
const handler = queue.options.handler;
|
|
88
|
-
if (handler) {
|
|
89
|
-
this.consumers.push({
|
|
90
|
-
handler,
|
|
91
|
-
queue,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
for (const consumer of this.alepha.primitives($consumer)) {
|
|
97
|
-
this.consumers.push(consumer.options);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Group consumers by their provider for efficient blocking
|
|
101
|
-
for (const consumer of this.consumers) {
|
|
102
|
-
const provider = consumer.queue.provider;
|
|
103
|
-
const list = this.consumersByProvider.get(provider) ?? [];
|
|
104
|
-
list.push(consumer);
|
|
105
|
-
this.consumersByProvider.set(provider, list);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (this.consumers.length > 0) {
|
|
109
|
-
this.startWorkers();
|
|
110
|
-
this.startScheduler();
|
|
111
|
-
this.log.debug(
|
|
112
|
-
`Watching for ${this.consumers.length} queue${this.consumers.length > 1 ? "s" : ""} with ${this.env.QUEUE_WORKER_CONCURRENCY} worker${
|
|
113
|
-
this.env.QUEUE_WORKER_CONCURRENCY > 1 ? "s" : ""
|
|
114
|
-
}.`,
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// -------------------------------------------------------------------------------------------------------------------
|
|
121
|
-
|
|
122
|
-
// Engine part - this is the part that will run the workers and process the jobs
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Start the workers.
|
|
126
|
-
* Each worker acquires jobs and processes them with proper lifecycle management.
|
|
127
|
-
*/
|
|
128
|
-
protected startWorkers(): void {
|
|
129
|
-
const workerToStart =
|
|
130
|
-
this.env.QUEUE_WORKER_CONCURRENCY - this.workersRunning;
|
|
131
|
-
|
|
132
|
-
for (let i = 0; i < workerToStart; i++) {
|
|
133
|
-
this.workersRunning += 1;
|
|
134
|
-
const workerIndex = i;
|
|
135
|
-
const localWorkerId = `${this.workerId}_${workerIndex}`;
|
|
136
|
-
this.log.debug(`Starting worker n-${workerIndex}`);
|
|
137
|
-
|
|
138
|
-
const workerLoop = async () => {
|
|
139
|
-
while (!this.shouldStop) {
|
|
140
|
-
this.log.trace(`Worker n-${workerIndex} is waiting for jobs`);
|
|
141
|
-
const acquired = await this.acquireNextJob(localWorkerId);
|
|
142
|
-
if (acquired) {
|
|
143
|
-
await this.processJob(acquired, localWorkerId);
|
|
144
|
-
}
|
|
145
|
-
// If no job (timeout), loop continues and checks shouldStop
|
|
146
|
-
}
|
|
147
|
-
this.log.info(`Worker n-${workerIndex} has stopped`);
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
this.workerPromises.push(
|
|
151
|
-
workerLoop().catch((e) => {
|
|
152
|
-
this.log.error(`Worker n-${workerIndex} has crashed`, e);
|
|
153
|
-
this.workersRunning -= 1;
|
|
154
|
-
}),
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Start the scheduler for delayed job promotion and stalled job recovery.
|
|
161
|
-
*/
|
|
162
|
-
protected startScheduler(): void {
|
|
163
|
-
if (this.schedulerRunning) return;
|
|
164
|
-
this.schedulerRunning = true;
|
|
165
|
-
this.abortController = new AbortController();
|
|
166
|
-
this.log.debug("Starting scheduler");
|
|
167
|
-
|
|
168
|
-
const schedulerLoop = async () => {
|
|
169
|
-
while (!this.shouldStop) {
|
|
170
|
-
try {
|
|
171
|
-
await this.runSchedulerCycle();
|
|
172
|
-
} catch (e) {
|
|
173
|
-
this.log.error("Scheduler cycle failed", e);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Wait for next interval (interruptible via AbortController)
|
|
177
|
-
await this.dateTime.wait(this.env.QUEUE_SCHEDULER_INTERVAL, {
|
|
178
|
-
signal: this.abortController?.signal,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
this.log.debug("Scheduler stopped");
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
this.schedulerPromise = schedulerLoop();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Run one cycle of the scheduler.
|
|
189
|
-
* Promotes delayed jobs and recovers stalled jobs.
|
|
190
|
-
*/
|
|
191
|
-
protected async runSchedulerCycle(): Promise<void> {
|
|
192
|
-
for (const [provider, consumers] of this.consumersByProvider) {
|
|
193
|
-
const queues = new Set(consumers.map((c) => c.queue.name));
|
|
194
|
-
|
|
195
|
-
for (const queue of queues) {
|
|
196
|
-
// Promote delayed jobs
|
|
197
|
-
const promoted = await provider.promoteDelayedJobs(queue);
|
|
198
|
-
if (promoted > 0) {
|
|
199
|
-
this.log.debug(`Promoted ${promoted} delayed jobs in queue ${queue}`);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Recover stalled jobs
|
|
203
|
-
const recovered = await provider.recoverStalledJobs(
|
|
204
|
-
queue,
|
|
205
|
-
this.env.QUEUE_STALLED_THRESHOLD,
|
|
206
|
-
);
|
|
207
|
-
if (recovered.length > 0) {
|
|
208
|
-
this.log.warn(
|
|
209
|
-
`Recovered ${recovered.length} stalled jobs in queue ${queue}`,
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
protected readonly stop = $hook({
|
|
217
|
-
on: "stop",
|
|
218
|
-
handler: async () => {
|
|
219
|
-
if (this.consumers.length > 0) {
|
|
220
|
-
await this.stopWorkers();
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Acquire the next available job from any provider.
|
|
227
|
-
*/
|
|
228
|
-
protected async acquireNextJob(
|
|
229
|
-
localWorkerId: string,
|
|
230
|
-
): Promise<AcquiredJobWithConsumer | undefined> {
|
|
231
|
-
for (const [provider, consumers] of this.consumersByProvider) {
|
|
232
|
-
const queueNames = consumers.map((c) => c.queue.name);
|
|
233
|
-
const acquired = await provider.acquireJob(
|
|
234
|
-
queueNames,
|
|
235
|
-
localWorkerId,
|
|
236
|
-
this.env.QUEUE_WORKER_BLOCKING_TIMEOUT,
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
if (acquired) {
|
|
240
|
-
const consumer = consumers.find((c) => c.queue.name === acquired.queue);
|
|
241
|
-
if (consumer) {
|
|
242
|
-
return { acquired, consumer, provider };
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return undefined;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Process a job with proper lifecycle management.
|
|
252
|
-
* - Starts a lock renewal interval
|
|
253
|
-
* - Calls the handler
|
|
254
|
-
* - Marks job as completed or failed
|
|
255
|
-
*/
|
|
256
|
-
protected async processJob(
|
|
257
|
-
{ acquired, consumer, provider }: AcquiredJobWithConsumer,
|
|
258
|
-
localWorkerId: string,
|
|
259
|
-
): Promise<void> {
|
|
260
|
-
const { queue, job } = acquired;
|
|
261
|
-
|
|
262
|
-
// Start lock renewal heartbeat
|
|
263
|
-
const lockRenewalInterval = this.dateTime.createInterval(
|
|
264
|
-
async () => {
|
|
265
|
-
try {
|
|
266
|
-
const renewed = await provider.renewJobLock(
|
|
267
|
-
queue,
|
|
268
|
-
job.id,
|
|
269
|
-
localWorkerId,
|
|
270
|
-
);
|
|
271
|
-
if (!renewed) {
|
|
272
|
-
this.log.warn(
|
|
273
|
-
`Failed to renew lock for job ${job.id}, lock may have been stolen`,
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
} catch (e) {
|
|
277
|
-
this.log.error(`Error renewing lock for job ${job.id}`, e);
|
|
278
|
-
}
|
|
279
|
-
},
|
|
280
|
-
this.env.QUEUE_WORKER_LOCK_RENEWAL_INTERVAL,
|
|
281
|
-
true, // start immediately
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
try {
|
|
285
|
-
// Decode payload and run handler
|
|
286
|
-
const payload = this.alepha.codec.decode(
|
|
287
|
-
consumer.queue.options.schema,
|
|
288
|
-
job.payload,
|
|
289
|
-
);
|
|
290
|
-
|
|
291
|
-
await this.alepha.context.run(() => consumer.handler({ payload }));
|
|
292
|
-
|
|
293
|
-
// Mark as completed
|
|
294
|
-
await provider.completeJob(queue, job.id);
|
|
295
|
-
this.log.debug(`Job ${job.id} completed successfully`, { queue });
|
|
296
|
-
} catch (e) {
|
|
297
|
-
// Mark as failed (provider handles retry logic)
|
|
298
|
-
const error = e instanceof Error ? e.message : String(e);
|
|
299
|
-
const stackTrace = e instanceof Error ? e.stack : undefined;
|
|
300
|
-
await provider.failJob(queue, job.id, error, stackTrace);
|
|
301
|
-
this.log.error(`Job ${job.id} failed`, e);
|
|
302
|
-
} finally {
|
|
303
|
-
this.dateTime.clearInterval(lockRenewalInterval);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
/**
|
|
308
|
-
* Stop the workers and scheduler.
|
|
309
|
-
*/
|
|
310
|
-
protected async stopWorkers(): Promise<void> {
|
|
311
|
-
this.shouldStop = true;
|
|
312
|
-
this.workersRunning = 0;
|
|
313
|
-
this.schedulerRunning = false;
|
|
314
|
-
|
|
315
|
-
// Abort the scheduler's wait immediately
|
|
316
|
-
this.abortController?.abort();
|
|
317
|
-
|
|
318
|
-
// Cancel all pending acquireJob waiters to unblock workers immediately
|
|
319
|
-
for (const provider of this.consumersByProvider.keys()) {
|
|
320
|
-
provider.cancelWaiters();
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
this.log.trace("Stopping workers...");
|
|
324
|
-
this.log.trace("Waiting for workers to finish...");
|
|
325
|
-
|
|
326
|
-
const promises: Promise<void>[] = [...this.workerPromises];
|
|
327
|
-
if (this.schedulerPromise) {
|
|
328
|
-
promises.push(this.schedulerPromise);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
await Promise.all(promises);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
export interface Consumer<T extends TSchema = TSchema> {
|
|
336
|
-
queue: QueuePrimitive<T>;
|
|
337
|
-
handler: (message: QueueMessage<T>) => Promise<void>;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
export interface AcquiredJobWithConsumer {
|
|
341
|
-
acquired: QueueAcquiredJob;
|
|
342
|
-
consumer: Consumer;
|
|
343
|
-
provider: QueueProvider;
|
|
344
|
-
}
|