alepha 0.13.7 → 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.
Files changed (424) hide show
  1. package/README.md +5 -2
  2. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  3. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  4. package/assets/swagger-ui/swagger-ui.css +1 -1
  5. package/dist/{api-audits → api/audits}/index.browser.js +4 -4
  6. package/dist/api/audits/index.browser.js.map +1 -0
  7. package/dist/{api-audits → api/audits}/index.d.ts +8 -8
  8. package/dist/{api-audits → api/audits}/index.js +8 -8
  9. package/dist/api/audits/index.js.map +1 -0
  10. package/dist/{api-files → api/files}/index.browser.js +5 -5
  11. package/dist/api/files/index.browser.js.map +1 -0
  12. package/dist/{api-files → api/files}/index.d.ts +16 -9
  13. package/dist/{api-files → api/files}/index.js +10 -10
  14. package/dist/api/files/index.js.map +1 -0
  15. package/dist/{api-jobs → api/jobs}/index.browser.js +5 -5
  16. package/dist/api/jobs/index.browser.js.map +1 -0
  17. package/dist/{api-jobs → api/jobs}/index.d.ts +35 -35
  18. package/dist/{api-jobs → api/jobs}/index.js +9 -9
  19. package/dist/api/jobs/index.js.map +1 -0
  20. package/dist/{api-notifications → api/notifications}/index.browser.js +11 -11
  21. package/dist/api/notifications/index.browser.js.map +1 -0
  22. package/dist/api/notifications/index.d.ts +327 -0
  23. package/dist/{api-notifications → api/notifications}/index.js +11 -11
  24. package/dist/api/notifications/index.js.map +1 -0
  25. package/dist/{api-parameters → api/parameters}/index.browser.js +2 -2
  26. package/dist/api/parameters/index.browser.js.map +1 -0
  27. package/dist/{api-parameters → api/parameters}/index.d.ts +7 -7
  28. package/dist/{api-parameters → api/parameters}/index.js +7 -7
  29. package/dist/api/parameters/index.js.map +1 -0
  30. package/dist/{api-users → api/users}/index.browser.js +6 -6
  31. package/dist/api/users/index.browser.js.map +1 -0
  32. package/dist/{api-users → api/users}/index.d.ts +844 -845
  33. package/dist/{api-users → api/users}/index.js +99 -766
  34. package/dist/api/users/index.js.map +1 -0
  35. package/dist/{api-verifications → api/verifications}/index.browser.js +5 -5
  36. package/dist/api/verifications/index.browser.js.map +1 -0
  37. package/dist/api/verifications/index.d.ts +248 -0
  38. package/dist/{api-verifications → api/verifications}/index.js +11 -11
  39. package/dist/api/verifications/index.js.map +1 -0
  40. package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
  41. package/dist/cache/{index.js → core/index.js} +5 -5
  42. package/dist/cache/core/index.js.map +1 -0
  43. package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
  44. package/dist/{cache-redis → cache/redis}/index.js +2 -2
  45. package/dist/cache/redis/index.js.map +1 -0
  46. package/dist/cli/index.d.ts +34 -26
  47. package/dist/cli/index.js +75 -46
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/command/index.d.ts +4 -4
  50. package/dist/core/index.browser.js.map +1 -1
  51. package/dist/core/index.js.map +1 -1
  52. package/dist/core/index.native.js.map +1 -1
  53. package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
  54. package/dist/lock/{index.js → core/index.js} +5 -5
  55. package/dist/lock/core/index.js.map +1 -0
  56. package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
  57. package/dist/{lock-redis → lock/redis}/index.js +2 -2
  58. package/dist/lock/redis/index.js.map +1 -0
  59. package/dist/queue/core/index.d.ts +548 -0
  60. package/dist/queue/core/index.js +391 -0
  61. package/dist/queue/core/index.js.map +1 -0
  62. package/dist/queue/redis/index.d.ts +28 -0
  63. package/dist/queue/redis/index.js +43 -0
  64. package/dist/queue/redis/index.js.map +1 -0
  65. package/dist/scheduler/index.d.ts +1 -1
  66. package/dist/scheduler/index.js +1 -393
  67. package/dist/scheduler/index.js.map +1 -1
  68. package/dist/security/index.d.ts +1 -1
  69. package/dist/security/index.js +2 -1413
  70. package/dist/security/index.js.map +1 -1
  71. package/dist/{server-auth → server/auth}/index.browser.js +6 -6
  72. package/dist/server/auth/index.browser.js.map +1 -0
  73. package/dist/{server-auth → server/auth}/index.d.ts +167 -167
  74. package/dist/server/auth/index.js +742 -0
  75. package/dist/server/auth/index.js.map +1 -0
  76. package/dist/{server-cache → server/cache}/index.d.ts +2 -2
  77. package/dist/{server-cache → server/cache}/index.js +2 -2
  78. package/dist/server/cache/index.js.map +1 -0
  79. package/dist/{server-compress → server/compress}/index.d.ts +2 -2
  80. package/dist/{server-compress → server/compress}/index.js +2 -2
  81. package/dist/server/compress/index.js.map +1 -0
  82. package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
  83. package/dist/server/cookies/index.browser.js.map +1 -0
  84. package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
  85. package/dist/{server-cookies → server/cookies}/index.js +4 -4
  86. package/dist/server/cookies/index.js.map +1 -0
  87. package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
  88. package/dist/server/core/index.browser.js.map +1 -0
  89. package/dist/server/{index.d.ts → core/index.d.ts} +36 -36
  90. package/dist/server/{index.js → core/index.js} +27 -27
  91. package/dist/server/core/index.js.map +1 -0
  92. package/dist/{server-cors → server/cors}/index.d.ts +3 -3
  93. package/dist/{server-cors → server/cors}/index.js +3 -3
  94. package/dist/server/cors/index.js.map +1 -0
  95. package/dist/{server-health → server/health}/index.d.ts +3 -3
  96. package/dist/{server-health → server/health}/index.js +3 -3
  97. package/dist/server/health/index.js.map +1 -0
  98. package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
  99. package/dist/{server-helmet → server/helmet}/index.js +2 -2
  100. package/dist/server/helmet/index.js.map +1 -0
  101. package/dist/{server-links → server/links}/index.browser.js +5 -5
  102. package/dist/server/links/index.browser.js.map +1 -0
  103. package/dist/{server-links → server/links}/index.d.ts +7 -7
  104. package/dist/{server-links → server/links}/index.js +7 -7
  105. package/dist/server/links/index.js.map +1 -0
  106. package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
  107. package/dist/server/metrics/index.js +74 -0
  108. package/dist/server/metrics/index.js.map +1 -0
  109. package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
  110. package/dist/{server-multipart → server/multipart}/index.js +2 -2
  111. package/dist/server/multipart/index.js.map +1 -0
  112. package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
  113. package/dist/{server-proxy → server/proxy}/index.js +3 -3
  114. package/dist/server/proxy/index.js.map +1 -0
  115. package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
  116. package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
  117. package/dist/server/rate-limit/index.js.map +1 -0
  118. package/dist/{server-security → server/security}/index.browser.js +1 -1
  119. package/dist/server/security/index.browser.js.map +1 -0
  120. package/dist/{server-security → server/security}/index.d.ts +13 -13
  121. package/dist/{server-security → server/security}/index.js +4 -4
  122. package/dist/server/security/index.js.map +1 -0
  123. package/dist/{server-static → server/static}/index.d.ts +3 -3
  124. package/dist/{server-static → server/static}/index.js +3 -3
  125. package/dist/server/static/index.js.map +1 -0
  126. package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
  127. package/dist/{server-swagger → server/swagger}/index.js +4 -4
  128. package/dist/server/swagger/index.js.map +1 -0
  129. package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
  130. package/dist/topic/{index.js → core/index.js} +6 -6
  131. package/dist/topic/core/index.js.map +1 -0
  132. package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
  133. package/dist/{topic-redis → topic/redis}/index.js +2 -2
  134. package/dist/topic/redis/index.js.map +1 -0
  135. package/dist/vite/index.d.ts +11 -0
  136. package/dist/vite/index.js +12 -5
  137. package/dist/vite/index.js.map +1 -1
  138. package/package.json +156 -157
  139. package/src/{api-files → api/files}/index.ts +1 -0
  140. package/src/{api-parameters → api/parameters}/index.ts +1 -1
  141. package/src/{api-users → api/users}/primitives/$userRealm.ts +1 -1
  142. package/src/{api-users → api/users}/providers/UserRealmProvider.ts +6 -7
  143. package/src/{api-verifications → api/verifications}/index.ts +2 -0
  144. package/src/cli/apps/AlephaPackageBuilderCli.ts +73 -48
  145. package/src/cli/assets/appRouterTs.ts +1 -1
  146. package/src/cli/assets/biomeJson.ts +1 -1
  147. package/src/cli/assets/indexHtml.ts +1 -1
  148. package/src/cli/assets/mainBrowserTs.ts +1 -1
  149. package/src/cli/assets/viteConfigTs.ts +1 -1
  150. package/src/cli/commands/CoreCommands.ts +10 -6
  151. package/src/cli/commands/VerifyCommands.ts +4 -1
  152. package/src/cli/commands/ViteCommands.ts +20 -9
  153. package/src/cli/services/AlephaCliUtils.ts +29 -14
  154. package/src/core/providers/SchemaValidator.ts +1 -1
  155. package/src/queue/{index.ts → core/index.ts} +2 -3
  156. package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
  157. package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
  158. package/src/queue/core/providers/QueueProvider.ts +23 -0
  159. package/src/queue/core/providers/WorkerProvider.ts +244 -0
  160. package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
  161. package/src/server/{index.ts → core/index.ts} +1 -0
  162. package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
  163. package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
  164. package/src/vite/tasks/copyAssets.ts +32 -8
  165. package/dist/api-audits/index.browser.js.map +0 -1
  166. package/dist/api-audits/index.js.map +0 -1
  167. package/dist/api-files/index.browser.js.map +0 -1
  168. package/dist/api-files/index.js.map +0 -1
  169. package/dist/api-jobs/index.browser.js.map +0 -1
  170. package/dist/api-jobs/index.js.map +0 -1
  171. package/dist/api-notifications/index.browser.js.map +0 -1
  172. package/dist/api-notifications/index.d.ts +0 -327
  173. package/dist/api-notifications/index.js.map +0 -1
  174. package/dist/api-parameters/index.browser.js.map +0 -1
  175. package/dist/api-parameters/index.js.map +0 -1
  176. package/dist/api-users/index.browser.js.map +0 -1
  177. package/dist/api-users/index.js.map +0 -1
  178. package/dist/api-verifications/index.browser.js.map +0 -1
  179. package/dist/api-verifications/index.d.ts +0 -229
  180. package/dist/api-verifications/index.js.map +0 -1
  181. package/dist/cache/index.js.map +0 -1
  182. package/dist/cache-redis/index.js.map +0 -1
  183. package/dist/lock/index.js.map +0 -1
  184. package/dist/lock-redis/index.js.map +0 -1
  185. package/dist/queue/index.d.ts +0 -1265
  186. package/dist/queue/index.js +0 -1037
  187. package/dist/queue/index.js.map +0 -1
  188. package/dist/queue-redis/index.d.ts +0 -82
  189. package/dist/queue-redis/index.js +0 -872
  190. package/dist/queue-redis/index.js.map +0 -1
  191. package/dist/server/index.browser.js.map +0 -1
  192. package/dist/server/index.js.map +0 -1
  193. package/dist/server-auth/index.browser.js.map +0 -1
  194. package/dist/server-auth/index.js +0 -1973
  195. package/dist/server-auth/index.js.map +0 -1
  196. package/dist/server-cache/index.js.map +0 -1
  197. package/dist/server-compress/index.js.map +0 -1
  198. package/dist/server-cookies/index.browser.js.map +0 -1
  199. package/dist/server-cookies/index.js.map +0 -1
  200. package/dist/server-cors/index.js.map +0 -1
  201. package/dist/server-health/index.js.map +0 -1
  202. package/dist/server-helmet/index.js.map +0 -1
  203. package/dist/server-links/index.browser.js.map +0 -1
  204. package/dist/server-links/index.js.map +0 -1
  205. package/dist/server-metrics/index.js +0 -4532
  206. package/dist/server-metrics/index.js.map +0 -1
  207. package/dist/server-multipart/index.js.map +0 -1
  208. package/dist/server-proxy/index.js.map +0 -1
  209. package/dist/server-rate-limit/index.js.map +0 -1
  210. package/dist/server-security/index.browser.js.map +0 -1
  211. package/dist/server-security/index.js.map +0 -1
  212. package/dist/server-static/index.js.map +0 -1
  213. package/dist/server-swagger/index.js.map +0 -1
  214. package/dist/topic/index.js.map +0 -1
  215. package/dist/topic-redis/index.js.map +0 -1
  216. package/src/queue/interfaces/QueueJob.ts +0 -459
  217. package/src/queue/providers/MemoryQueueProvider.ts +0 -850
  218. package/src/queue/providers/QueueProvider.ts +0 -319
  219. package/src/queue/providers/WorkerProvider.ts +0 -344
  220. package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
  221. /package/src/{api-audits → api/audits}/controllers/AuditController.ts +0 -0
  222. /package/src/{api-audits → api/audits}/entities/audits.ts +0 -0
  223. /package/src/{api-audits → api/audits}/index.browser.ts +0 -0
  224. /package/src/{api-audits → api/audits}/index.ts +0 -0
  225. /package/src/{api-audits → api/audits}/primitives/$audit.ts +0 -0
  226. /package/src/{api-audits → api/audits}/schemas/auditQuerySchema.ts +0 -0
  227. /package/src/{api-audits → api/audits}/schemas/auditResourceSchema.ts +0 -0
  228. /package/src/{api-audits → api/audits}/schemas/createAuditSchema.ts +0 -0
  229. /package/src/{api-audits → api/audits}/services/AuditService.ts +0 -0
  230. /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
  231. /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
  232. /package/src/{api-files → api/files}/entities/files.ts +0 -0
  233. /package/src/{api-files → api/files}/index.browser.ts +0 -0
  234. /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
  235. /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
  236. /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
  237. /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
  238. /package/src/{api-files → api/files}/services/FileService.ts +0 -0
  239. /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
  240. /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
  241. /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
  242. /package/src/{api-jobs → api/jobs}/index.ts +0 -0
  243. /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
  244. /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
  245. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
  246. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
  247. /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
  248. /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
  249. /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
  250. /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
  251. /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
  252. /package/src/{api-notifications → api/notifications}/index.ts +0 -0
  253. /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
  254. /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
  255. /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
  256. /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
  257. /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
  258. /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
  259. /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
  260. /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
  261. /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
  262. /package/src/{api-parameters → api/parameters}/controllers/ConfigController.ts +0 -0
  263. /package/src/{api-parameters → api/parameters}/entities/parameters.ts +0 -0
  264. /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
  265. /package/src/{api-parameters → api/parameters}/primitives/$config.ts +0 -0
  266. /package/src/{api-parameters → api/parameters}/schedulers/ConfigActivationScheduler.ts +0 -0
  267. /package/src/{api-parameters → api/parameters}/services/ConfigStore.ts +0 -0
  268. /package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +0 -0
  269. /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
  270. /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
  271. /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
  272. /package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -0
  273. /package/src/{api-users → api/users}/entities/identities.ts +0 -0
  274. /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
  275. /package/src/{api-users → api/users}/entities/users.ts +0 -0
  276. /package/src/{api-users → api/users}/index.browser.ts +0 -0
  277. /package/src/{api-users → api/users}/index.ts +0 -0
  278. /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
  279. /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
  280. /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
  281. /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
  282. /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
  283. /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
  284. /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
  285. /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
  286. /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
  287. /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
  288. /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
  289. /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
  290. /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
  291. /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
  292. /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
  293. /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
  294. /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
  295. /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
  296. /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
  297. /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
  298. /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
  299. /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
  300. /package/src/{api-users → api/users}/services/RegistrationService.ts +0 -0
  301. /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
  302. /package/src/{api-users → api/users}/services/SessionService.ts +0 -0
  303. /package/src/{api-users → api/users}/services/UserService.ts +0 -0
  304. /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
  305. /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
  306. /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
  307. /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
  308. /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
  309. /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
  310. /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
  311. /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
  312. /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
  313. /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
  314. /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
  315. /package/src/cache/{index.ts → core/index.ts} +0 -0
  316. /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
  317. /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
  318. /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
  319. /package/src/{cache-redis → cache/redis}/index.ts +0 -0
  320. /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
  321. /package/src/lock/{index.ts → core/index.ts} +0 -0
  322. /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
  323. /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
  324. /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
  325. /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
  326. /package/src/{lock-redis → lock/redis}/index.ts +0 -0
  327. /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
  328. /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
  329. /package/src/{queue-redis → queue/redis}/index.ts +0 -0
  330. /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
  331. /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
  332. /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
  333. /package/src/{server-auth → server/auth}/index.ts +0 -0
  334. /package/src/{server-auth → server/auth}/primitives/$auth.ts +0 -0
  335. /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
  336. /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
  337. /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
  338. /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
  339. /package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +0 -0
  340. /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
  341. /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
  342. /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
  343. /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
  344. /package/src/{server-cache → server/cache}/index.ts +0 -0
  345. /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
  346. /package/src/{server-compress → server/compress}/index.ts +0 -0
  347. /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
  348. /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
  349. /package/src/{server-cookies → server/cookies}/index.ts +0 -0
  350. /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
  351. /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
  352. /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
  353. /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
  354. /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
  355. /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
  356. /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
  357. /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
  358. /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
  359. /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
  360. /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
  361. /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
  362. /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
  363. /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
  364. /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
  365. /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
  366. /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
  367. /package/src/server/{primitives → core/primitives}/$action.ts +0 -0
  368. /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
  369. /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
  370. /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
  371. /package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +0 -0
  372. /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
  373. /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
  374. /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
  375. /package/src/server/{providers → core/providers}/ServerRouterProvider.ts +0 -0
  376. /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
  377. /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
  378. /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
  379. /package/src/server/{services → core/services}/HttpClient.ts +0 -0
  380. /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
  381. /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
  382. /package/src/{server-cors → server/cors}/index.ts +0 -0
  383. /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
  384. /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
  385. /package/src/{server-health → server/health}/index.ts +0 -0
  386. /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
  387. /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
  388. /package/src/{server-helmet → server/helmet}/index.ts +0 -0
  389. /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
  390. /package/src/{server-links → server/links}/index.browser.ts +0 -0
  391. /package/src/{server-links → server/links}/index.ts +0 -0
  392. /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
  393. /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
  394. /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
  395. /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
  396. /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
  397. /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
  398. /package/src/{server-metrics → server/metrics}/index.ts +0 -0
  399. /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
  400. /package/src/{server-multipart → server/multipart}/index.ts +0 -0
  401. /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
  402. /package/src/{server-proxy → server/proxy}/index.ts +0 -0
  403. /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
  404. /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
  405. /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
  406. /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
  407. /package/src/{server-security → server/security}/index.browser.ts +0 -0
  408. /package/src/{server-security → server/security}/index.ts +0 -0
  409. /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
  410. /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
  411. /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
  412. /package/src/{server-static → server/static}/index.ts +0 -0
  413. /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
  414. /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
  415. /package/src/{server-swagger → server/swagger}/index.ts +0 -0
  416. /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
  417. /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
  418. /package/src/topic/{index.ts → core/index.ts} +0 -0
  419. /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
  420. /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
  421. /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
  422. /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
  423. /package/src/{topic-redis → topic/redis}/index.ts +0 -0
  424. /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
@@ -1,850 +0,0 @@
1
- import { $logger } from "alepha/logger";
2
- import type {
3
- QueueAcquiredJob,
4
- QueueCleanOptions,
5
- QueueGetJobsOptions,
6
- QueueJob,
7
- QueueJobCounts,
8
- QueueJobOptions,
9
- QueueJobStatus,
10
- } from "../interfaces/QueueJob.ts";
11
- import { QueueProvider } from "./QueueProvider.ts";
12
-
13
- // Default job options
14
- const DEFAULT_MAX_ATTEMPTS = 1;
15
- const DEFAULT_LOCK_DURATION = 30000; // 30 seconds
16
- const DEFAULT_BACKOFF_DELAY = 1000; // 1 second
17
- const DEFAULT_BACKOFF_MAX_DELAY = 30000; // 30 seconds
18
-
19
- interface MessageWaiter {
20
- queues: Set<string>;
21
- resolve: (result: { queue: string; message: string } | undefined) => void;
22
- timer: ReturnType<typeof setTimeout>;
23
- }
24
-
25
- interface JobWaiter {
26
- queues: Set<string>;
27
- workerId: string;
28
- resolve: (result: QueueAcquiredJob | undefined) => void;
29
- timer: ReturnType<typeof setTimeout>;
30
- }
31
-
32
- /**
33
- * In-memory queue provider with full job support.
34
- *
35
- * This provider stores all data in memory and is suitable for:
36
- * - Development and testing
37
- * - Single-instance applications
38
- * - Scenarios where job persistence across restarts is not required
39
- */
40
- export class MemoryQueueProvider extends QueueProvider {
41
- protected readonly log = $logger();
42
-
43
- // Simple message API storage
44
- protected messageQueues: Record<string, string[]> = {};
45
- protected messageWaiters: Set<MessageWaiter> = new Set();
46
-
47
- // Job API storage (per queue)
48
- protected jobs: Map<string, Map<string, QueueJob>> = new Map(); // queue -> jobId -> job
49
- protected waiting: Map<string, string[]> = new Map(); // queue -> jobIds (sorted by priority)
50
- protected delayed: Map<string, string[]> = new Map(); // queue -> jobIds (sorted by availableAt)
51
- protected active: Map<string, Set<string>> = new Map(); // queue -> jobIds
52
- protected completed: Map<string, string[]> = new Map(); // queue -> jobIds (newest first)
53
- protected failed: Map<string, string[]> = new Map(); // queue -> jobIds (newest first)
54
- protected jobWaiters: Set<JobWaiter> = new Set();
55
-
56
- protected jobIdCounter = 0;
57
-
58
- // ===========================================
59
- // Simple Message API
60
- // ===========================================
61
-
62
- public async push(queue: string, ...messages: string[]): Promise<void> {
63
- if (this.messageQueues[queue] == null) {
64
- this.messageQueues[queue] = [];
65
- }
66
-
67
- for (const message of messages) {
68
- const waiter = this.findMessageWaiter(queue);
69
- if (waiter) {
70
- this.removeMessageWaiter(waiter);
71
- waiter.resolve({ queue, message });
72
- } else {
73
- this.messageQueues[queue].push(message);
74
- }
75
- }
76
- }
77
-
78
- public async pop(queue: string): Promise<string | undefined> {
79
- return this.messageQueues[queue]?.shift();
80
- }
81
-
82
- public async popBlocking(
83
- queues: string[],
84
- timeoutSeconds: number,
85
- ): Promise<{ queue: string; message: string } | undefined> {
86
- for (const queue of queues) {
87
- const message = this.messageQueues[queue]?.shift();
88
- if (message) {
89
- return { queue, message };
90
- }
91
- }
92
-
93
- return new Promise((resolve) => {
94
- const timer = setTimeout(() => {
95
- this.removeMessageWaiter(waiter);
96
- resolve(undefined);
97
- }, timeoutSeconds * 1000);
98
-
99
- const waiter: MessageWaiter = {
100
- queues: new Set(queues),
101
- resolve: (result) => {
102
- clearTimeout(timer);
103
- resolve(result);
104
- },
105
- timer,
106
- };
107
-
108
- this.messageWaiters.add(waiter);
109
- });
110
- }
111
-
112
- protected findMessageWaiter(queue: string): MessageWaiter | undefined {
113
- for (const waiter of this.messageWaiters) {
114
- if (waiter.queues.has(queue)) {
115
- return waiter;
116
- }
117
- }
118
- return undefined;
119
- }
120
-
121
- protected removeMessageWaiter(waiter: MessageWaiter): void {
122
- clearTimeout(waiter.timer);
123
- this.messageWaiters.delete(waiter);
124
- }
125
-
126
- // ===========================================
127
- // Job API Implementation
128
- // ===========================================
129
-
130
- protected generateJobId(): string {
131
- return `job_${++this.jobIdCounter}_${Date.now()}`;
132
- }
133
-
134
- protected ensureQueueStructures(queue: string): void {
135
- if (!this.jobs.has(queue)) {
136
- this.jobs.set(queue, new Map());
137
- this.waiting.set(queue, []);
138
- this.delayed.set(queue, []);
139
- this.active.set(queue, new Set());
140
- this.completed.set(queue, []);
141
- this.failed.set(queue, []);
142
- }
143
- }
144
-
145
- public async addJob<T>(
146
- queue: string,
147
- payload: T,
148
- options?: QueueJobOptions,
149
- ): Promise<QueueJob<T>> {
150
- this.ensureQueueStructures(queue);
151
-
152
- const now = Date.now();
153
- const delay = options?.delay ?? 0;
154
- const isDelayed = delay > 0;
155
-
156
- const job: QueueJob<T> = {
157
- id: this.generateJobId(),
158
- queue,
159
- payload,
160
- options: {
161
- priority: options?.priority ?? 0,
162
- delay: options?.delay ?? 0,
163
- maxAttempts: options?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
164
- backoff: options?.backoff,
165
- lockDuration: options?.lockDuration ?? DEFAULT_LOCK_DURATION,
166
- removeOnComplete: options?.removeOnComplete,
167
- removeOnFail: options?.removeOnFail,
168
- },
169
- state: {
170
- status: isDelayed ? "delayed" : "waiting",
171
- attempts: 0,
172
- createdAt: now,
173
- availableAt: isDelayed ? now + delay : now,
174
- },
175
- };
176
-
177
- this.jobs.get(queue)!.set(job.id, job);
178
-
179
- if (isDelayed) {
180
- this.insertDelayed(queue, job);
181
- } else {
182
- this.insertWaiting(queue, job);
183
- this.notifyJobWaiters(queue);
184
- }
185
-
186
- this.log.debug(`Added job ${job.id} to queue ${queue}`, {
187
- status: job.state.status,
188
- priority: job.options.priority,
189
- });
190
-
191
- // Emit waiting event
192
- if (!isDelayed) {
193
- await this.emit({
194
- type: "waiting",
195
- queue,
196
- jobId: job.id,
197
- timestamp: now,
198
- job,
199
- });
200
- }
201
-
202
- return job;
203
- }
204
-
205
- protected insertWaiting(queue: string, job: QueueJob): void {
206
- const waitingList = this.waiting.get(queue)!;
207
- const priority = job.options.priority ?? 0;
208
-
209
- // Insert in priority order (lower priority value = higher priority)
210
- let insertIndex = waitingList.length;
211
- for (let i = 0; i < waitingList.length; i++) {
212
- const existingJob = this.jobs.get(queue)!.get(waitingList[i]);
213
- if (existingJob && (existingJob.options.priority ?? 0) > priority) {
214
- insertIndex = i;
215
- break;
216
- }
217
- }
218
- waitingList.splice(insertIndex, 0, job.id);
219
- }
220
-
221
- protected insertDelayed(queue: string, job: QueueJob): void {
222
- const delayedList = this.delayed.get(queue)!;
223
- const availableAt = job.state.availableAt ?? 0;
224
-
225
- // Insert sorted by availableAt (ascending)
226
- let insertIndex = delayedList.length;
227
- for (let i = 0; i < delayedList.length; i++) {
228
- const existingJob = this.jobs.get(queue)!.get(delayedList[i]);
229
- if (existingJob && (existingJob.state.availableAt ?? 0) > availableAt) {
230
- insertIndex = i;
231
- break;
232
- }
233
- }
234
- delayedList.splice(insertIndex, 0, job.id);
235
- }
236
-
237
- protected notifyJobWaiters(queue: string): void {
238
- for (const waiter of this.jobWaiters) {
239
- if (waiter.queues.has(queue)) {
240
- // Try to acquire a job for this waiter
241
- const result = this.tryAcquireJob(
242
- Array.from(waiter.queues),
243
- waiter.workerId,
244
- );
245
- if (result) {
246
- this.removeJobWaiter(waiter);
247
- waiter.resolve(result);
248
- return;
249
- }
250
- }
251
- }
252
- }
253
-
254
- protected removeJobWaiter(waiter: JobWaiter): void {
255
- clearTimeout(waiter.timer);
256
- this.jobWaiters.delete(waiter);
257
- }
258
-
259
- protected tryAcquireJob(
260
- queues: string[],
261
- workerId: string,
262
- ): QueueAcquiredJob | undefined {
263
- const now = Date.now();
264
-
265
- for (const queue of queues) {
266
- const waitingList = this.waiting.get(queue);
267
- if (!waitingList || waitingList.length === 0) continue;
268
-
269
- const jobId = waitingList.shift()!;
270
- const job = this.jobs.get(queue)!.get(jobId);
271
- if (!job) continue;
272
-
273
- // Move to active
274
- job.state.status = "active";
275
- job.state.attempts += 1;
276
- job.state.lockedBy = workerId;
277
- job.state.lockedUntil =
278
- now + (job.options.lockDuration ?? DEFAULT_LOCK_DURATION);
279
- job.state.processedAt = now;
280
-
281
- this.active.get(queue)!.add(jobId);
282
-
283
- this.log.debug(`Worker ${workerId} acquired job ${jobId}`, {
284
- queue,
285
- attempt: job.state.attempts,
286
- });
287
-
288
- // Emit active event (fire and forget to not block acquisition)
289
- this.emit({
290
- type: "active",
291
- queue,
292
- jobId,
293
- timestamp: now,
294
- workerId,
295
- attempt: job.state.attempts,
296
- });
297
-
298
- return { queue, job };
299
- }
300
-
301
- return undefined;
302
- }
303
-
304
- public async acquireJob(
305
- queues: string[],
306
- workerId: string,
307
- timeoutSeconds: number,
308
- ): Promise<QueueAcquiredJob | undefined> {
309
- // Ensure queue structures exist
310
- for (const queue of queues) {
311
- this.ensureQueueStructures(queue);
312
- }
313
-
314
- // Try to acquire immediately
315
- const result = this.tryAcquireJob(queues, workerId);
316
- if (result) {
317
- return result;
318
- }
319
-
320
- // Wait for a job
321
- return new Promise((resolve) => {
322
- const timer = setTimeout(() => {
323
- this.removeJobWaiter(waiter);
324
- resolve(undefined);
325
- }, timeoutSeconds * 1000);
326
-
327
- const waiter: JobWaiter = {
328
- queues: new Set(queues),
329
- workerId,
330
- resolve: (result) => {
331
- clearTimeout(timer);
332
- resolve(result);
333
- },
334
- timer,
335
- };
336
-
337
- this.jobWaiters.add(waiter);
338
- });
339
- }
340
-
341
- public async completeJob(
342
- queue: string,
343
- jobId: string,
344
- result?: unknown,
345
- ): Promise<void> {
346
- const job = this.jobs.get(queue)?.get(jobId);
347
- if (!job) {
348
- this.log.warn(`Attempted to complete unknown job ${jobId}`);
349
- return;
350
- }
351
-
352
- const now = Date.now();
353
- const duration = now - (job.state.processedAt ?? now);
354
-
355
- // Remove from active
356
- this.active.get(queue)?.delete(jobId);
357
-
358
- // Update job state
359
- job.state.status = "completed";
360
- job.state.completedAt = now;
361
- job.state.result = result;
362
- job.state.lockedBy = undefined;
363
- job.state.lockedUntil = undefined;
364
-
365
- // Handle removeOnComplete
366
- const removeOnComplete = job.options.removeOnComplete;
367
- if (removeOnComplete === true) {
368
- // Remove immediately
369
- this.jobs.get(queue)?.delete(jobId);
370
- this.log.debug(`Job ${jobId} completed and removed`, { queue, result });
371
- } else {
372
- // Add to completed history (newest first)
373
- this.completed.get(queue)!.unshift(jobId);
374
-
375
- // If removeOnComplete is a number, trim the list (0 means keep none)
376
- if (typeof removeOnComplete === "number" && removeOnComplete >= 0) {
377
- await this.cleanJobs(queue, "completed", {
378
- maxCount: removeOnComplete,
379
- });
380
- }
381
-
382
- this.log.debug(`Job ${jobId} completed`, { queue, result });
383
- }
384
-
385
- // Emit completed event
386
- await this.emit({
387
- type: "completed",
388
- queue,
389
- jobId,
390
- timestamp: now,
391
- result,
392
- duration,
393
- });
394
- }
395
-
396
- public async failJob(
397
- queue: string,
398
- jobId: string,
399
- error: string,
400
- stackTrace?: string,
401
- ): Promise<void> {
402
- const job = this.jobs.get(queue)?.get(jobId);
403
- if (!job) {
404
- this.log.warn(`Attempted to fail unknown job ${jobId}`);
405
- return;
406
- }
407
-
408
- const now = Date.now();
409
-
410
- // Remove from active
411
- this.active.get(queue)?.delete(jobId);
412
-
413
- const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
414
- const hasMoreAttempts = job.state.attempts < maxAttempts;
415
-
416
- if (hasMoreAttempts) {
417
- // Calculate backoff delay for retry
418
- const backoffDelay = this.calculateBackoff(job);
419
-
420
- job.state.status = "delayed";
421
- job.state.availableAt = now + backoffDelay;
422
- job.state.error = error;
423
- job.state.stackTrace = stackTrace;
424
- job.state.lockedBy = undefined;
425
- job.state.lockedUntil = undefined;
426
-
427
- this.insertDelayed(queue, job);
428
-
429
- this.log.debug(`Job ${jobId} failed, will retry in ${backoffDelay}ms`, {
430
- queue,
431
- attempt: job.state.attempts,
432
- maxAttempts,
433
- error,
434
- });
435
-
436
- // Emit retrying event
437
- await this.emit({
438
- type: "retrying",
439
- queue,
440
- jobId,
441
- timestamp: now,
442
- error,
443
- attempt: job.state.attempts + 1,
444
- delay: backoffDelay,
445
- });
446
- } else {
447
- // No more retries, mark as permanently failed
448
- job.state.status = "failed";
449
- job.state.failedAt = now;
450
- job.state.error = error;
451
- job.state.stackTrace = stackTrace;
452
- job.state.lockedBy = undefined;
453
- job.state.lockedUntil = undefined;
454
-
455
- // Handle removeOnFail
456
- const removeOnFail = job.options.removeOnFail;
457
- if (removeOnFail === true) {
458
- // Remove immediately
459
- this.jobs.get(queue)?.delete(jobId);
460
- this.log.debug(
461
- `Job ${jobId} permanently failed and removed after ${job.state.attempts} attempts`,
462
- { queue, error },
463
- );
464
- } else {
465
- this.failed.get(queue)!.unshift(jobId);
466
-
467
- // If removeOnFail is a number, trim the list (0 means keep none)
468
- if (typeof removeOnFail === "number" && removeOnFail >= 0) {
469
- await this.cleanJobs(queue, "failed", { maxCount: removeOnFail });
470
- }
471
-
472
- this.log.debug(
473
- `Job ${jobId} permanently failed after ${job.state.attempts} attempts`,
474
- { queue, error },
475
- );
476
- }
477
-
478
- // Emit failed event
479
- await this.emit({
480
- type: "failed",
481
- queue,
482
- jobId,
483
- timestamp: now,
484
- error,
485
- stackTrace,
486
- attempts: job.state.attempts,
487
- });
488
- }
489
- }
490
-
491
- protected calculateBackoff(job: QueueJob): number {
492
- const backoff = job.options.backoff;
493
- const attempt = job.state.attempts;
494
-
495
- if (!backoff) {
496
- return DEFAULT_BACKOFF_DELAY;
497
- }
498
-
499
- const baseDelay = backoff.delay ?? DEFAULT_BACKOFF_DELAY;
500
- const maxDelay = backoff.maxDelay ?? DEFAULT_BACKOFF_MAX_DELAY;
501
-
502
- if (backoff.type === "fixed") {
503
- return baseDelay;
504
- }
505
-
506
- // Exponential backoff: delay * 2^(attempt-1)
507
- const exponentialDelay = baseDelay * 2 ** (attempt - 1);
508
- return Math.min(exponentialDelay, maxDelay);
509
- }
510
-
511
- public async renewJobLock(
512
- queue: string,
513
- jobId: string,
514
- workerId: string,
515
- ): Promise<boolean> {
516
- const job = this.jobs.get(queue)?.get(jobId);
517
- if (!job || job.state.lockedBy !== workerId) {
518
- return false;
519
- }
520
-
521
- job.state.lockedUntil =
522
- Date.now() + (job.options.lockDuration ?? DEFAULT_LOCK_DURATION);
523
- return true;
524
- }
525
-
526
- public async getJob(
527
- queue: string,
528
- jobId: string,
529
- ): Promise<QueueJob | undefined> {
530
- return this.jobs.get(queue)?.get(jobId);
531
- }
532
-
533
- public async getJobs(
534
- queue: string,
535
- status: QueueJobStatus,
536
- options?: QueueGetJobsOptions,
537
- ): Promise<QueueJob[]> {
538
- const limit = options?.limit ?? 100;
539
- const offset = options?.offset ?? 0;
540
-
541
- let jobIds: string[];
542
- switch (status) {
543
- case "waiting":
544
- jobIds = this.waiting.get(queue) ?? [];
545
- break;
546
- case "delayed":
547
- jobIds = this.delayed.get(queue) ?? [];
548
- break;
549
- case "active":
550
- jobIds = Array.from(this.active.get(queue) ?? []);
551
- break;
552
- case "completed":
553
- jobIds = this.completed.get(queue) ?? [];
554
- break;
555
- case "failed":
556
- jobIds = this.failed.get(queue) ?? [];
557
- break;
558
- default:
559
- jobIds = [];
560
- }
561
-
562
- const jobsMap = this.jobs.get(queue);
563
- if (!jobsMap) return [];
564
-
565
- return jobIds
566
- .slice(offset, offset + limit)
567
- .map((id) => jobsMap.get(id))
568
- .filter((job): job is QueueJob => job !== undefined);
569
- }
570
-
571
- public async getJobCounts(queue: string): Promise<QueueJobCounts> {
572
- return {
573
- waiting: this.waiting.get(queue)?.length ?? 0,
574
- delayed: this.delayed.get(queue)?.length ?? 0,
575
- active: this.active.get(queue)?.size ?? 0,
576
- completed: this.completed.get(queue)?.length ?? 0,
577
- failed: this.failed.get(queue)?.length ?? 0,
578
- };
579
- }
580
-
581
- public async promoteDelayedJobs(queue: string): Promise<number> {
582
- const delayedList = this.delayed.get(queue);
583
- if (!delayedList || delayedList.length === 0) return 0;
584
-
585
- const now = Date.now();
586
- let promoted = 0;
587
-
588
- while (delayedList.length > 0) {
589
- const jobId = delayedList[0];
590
- const job = this.jobs.get(queue)?.get(jobId);
591
-
592
- if (!job || (job.state.availableAt ?? 0) > now) {
593
- break; // No more jobs ready
594
- }
595
-
596
- // Remove from delayed
597
- delayedList.shift();
598
-
599
- // Move to waiting
600
- job.state.status = "waiting";
601
- this.insertWaiting(queue, job);
602
- promoted++;
603
-
604
- this.log.debug(`Promoted delayed job ${jobId}`, { queue });
605
-
606
- // Emit waiting event
607
- this.emit({
608
- type: "waiting",
609
- queue,
610
- jobId,
611
- timestamp: now,
612
- job,
613
- });
614
- }
615
-
616
- if (promoted > 0) {
617
- this.notifyJobWaiters(queue);
618
- }
619
-
620
- return promoted;
621
- }
622
-
623
- public async recoverStalledJobs(
624
- queue: string,
625
- stalledThresholdMs: number,
626
- ): Promise<string[]> {
627
- const activeSet = this.active.get(queue);
628
- if (!activeSet || activeSet.size === 0) return [];
629
-
630
- const now = Date.now();
631
- const stalledJobIds: string[] = [];
632
-
633
- for (const jobId of activeSet) {
634
- const job = this.jobs.get(queue)?.get(jobId);
635
- if (!job) continue;
636
-
637
- const lockExpired =
638
- (job.state.lockedUntil ?? 0) + stalledThresholdMs < now;
639
- if (lockExpired) {
640
- stalledJobIds.push(jobId);
641
- }
642
- }
643
-
644
- for (const jobId of stalledJobIds) {
645
- const job = this.jobs.get(queue)!.get(jobId)!;
646
- const workerId = job.state.lockedBy;
647
- activeSet.delete(jobId);
648
-
649
- const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
650
- const hasMoreAttempts = job.state.attempts < maxAttempts;
651
-
652
- // Emit stalled event
653
- await this.emit({
654
- type: "stalled",
655
- queue,
656
- jobId,
657
- timestamp: now,
658
- workerId,
659
- willRetry: hasMoreAttempts,
660
- });
661
-
662
- if (hasMoreAttempts) {
663
- // Return to waiting for retry
664
- job.state.status = "waiting";
665
- job.state.lockedBy = undefined;
666
- job.state.lockedUntil = undefined;
667
- job.state.error = "Job stalled (worker timeout)";
668
- this.insertWaiting(queue, job);
669
-
670
- this.log.warn(`Recovered stalled job ${jobId}, returning to waiting`, {
671
- queue,
672
- attempt: job.state.attempts,
673
- });
674
-
675
- // Emit waiting event
676
- await this.emit({
677
- type: "waiting",
678
- queue,
679
- jobId,
680
- timestamp: now,
681
- job,
682
- });
683
- } else {
684
- // No more retries
685
- job.state.status = "failed";
686
- job.state.failedAt = now;
687
- job.state.lockedBy = undefined;
688
- job.state.lockedUntil = undefined;
689
- job.state.error =
690
- "Job stalled (worker timeout) - max attempts exceeded";
691
-
692
- // Handle removeOnFail
693
- const removeOnFail = job.options.removeOnFail;
694
- if (removeOnFail === true) {
695
- this.jobs.get(queue)?.delete(jobId);
696
- } else {
697
- this.failed.get(queue)!.unshift(jobId);
698
- if (typeof removeOnFail === "number" && removeOnFail > 0) {
699
- await this.cleanJobs(queue, "failed", { maxCount: removeOnFail });
700
- }
701
- }
702
-
703
- this.log.warn(`Stalled job ${jobId} permanently failed`, {
704
- queue,
705
- attempts: job.state.attempts,
706
- });
707
-
708
- // Emit failed event
709
- await this.emit({
710
- type: "failed",
711
- queue,
712
- jobId,
713
- timestamp: now,
714
- error: job.state.error,
715
- attempts: job.state.attempts,
716
- });
717
- }
718
- }
719
-
720
- if (stalledJobIds.length > 0) {
721
- this.notifyJobWaiters(queue);
722
- }
723
-
724
- return stalledJobIds;
725
- }
726
-
727
- public async cleanJobs(
728
- queue: string,
729
- status: "completed" | "failed",
730
- options?: QueueCleanOptions,
731
- ): Promise<number> {
732
- const jobsList =
733
- status === "completed"
734
- ? this.completed.get(queue)
735
- : this.failed.get(queue);
736
-
737
- if (!jobsList || jobsList.length === 0) return 0;
738
-
739
- const jobsMap = this.jobs.get(queue);
740
- if (!jobsMap) return 0;
741
-
742
- const now = Date.now();
743
- const maxAge = options?.maxAge;
744
- const maxCount = options?.maxCount;
745
-
746
- let removed = 0;
747
-
748
- // Remove by age
749
- if (maxAge !== undefined) {
750
- const cutoff = now - maxAge;
751
- const toRemove: string[] = [];
752
-
753
- for (const jobId of jobsList) {
754
- const job = jobsMap.get(jobId);
755
- if (job) {
756
- const timestamp =
757
- status === "completed" ? job.state.completedAt : job.state.failedAt;
758
- if (timestamp && timestamp < cutoff) {
759
- toRemove.push(jobId);
760
- }
761
- }
762
- }
763
-
764
- for (const jobId of toRemove) {
765
- const idx = jobsList.indexOf(jobId);
766
- if (idx !== -1) {
767
- jobsList.splice(idx, 1);
768
- jobsMap.delete(jobId);
769
- removed++;
770
- }
771
- }
772
- }
773
-
774
- // Remove by count (keep only maxCount newest)
775
- if (maxCount !== undefined && jobsList.length > maxCount) {
776
- const toRemove = jobsList.splice(maxCount);
777
- for (const jobId of toRemove) {
778
- jobsMap.delete(jobId);
779
- removed++;
780
- }
781
- }
782
-
783
- return removed;
784
- }
785
-
786
- public async removeJob(queue: string, jobId: string): Promise<void> {
787
- const job = this.jobs.get(queue)?.get(jobId);
788
- if (!job) return;
789
-
790
- const previousStatus = job.state.status;
791
-
792
- // Remove from appropriate list based on status
793
- switch (job.state.status) {
794
- case "waiting": {
795
- const list = this.waiting.get(queue);
796
- const idx = list?.indexOf(jobId) ?? -1;
797
- if (idx !== -1) list!.splice(idx, 1);
798
- break;
799
- }
800
- case "delayed": {
801
- const list = this.delayed.get(queue);
802
- const idx = list?.indexOf(jobId) ?? -1;
803
- if (idx !== -1) list!.splice(idx, 1);
804
- break;
805
- }
806
- case "active":
807
- this.active.get(queue)?.delete(jobId);
808
- break;
809
- case "completed": {
810
- const list = this.completed.get(queue);
811
- const idx = list?.indexOf(jobId) ?? -1;
812
- if (idx !== -1) list!.splice(idx, 1);
813
- break;
814
- }
815
- case "failed": {
816
- const list = this.failed.get(queue);
817
- const idx = list?.indexOf(jobId) ?? -1;
818
- if (idx !== -1) list!.splice(idx, 1);
819
- break;
820
- }
821
- }
822
-
823
- this.jobs.get(queue)?.delete(jobId);
824
-
825
- // Emit removed event
826
- await this.emit({
827
- type: "removed",
828
- queue,
829
- jobId,
830
- timestamp: Date.now(),
831
- previousStatus,
832
- });
833
- }
834
-
835
- public cancelWaiters(): void {
836
- // Cancel all job waiters
837
- for (const waiter of this.jobWaiters) {
838
- clearTimeout(waiter.timer);
839
- waiter.resolve(undefined);
840
- }
841
- this.jobWaiters.clear();
842
-
843
- // Cancel all message waiters
844
- for (const waiter of this.messageWaiters) {
845
- clearTimeout(waiter.timer);
846
- waiter.resolve(undefined);
847
- }
848
- this.messageWaiters.clear();
849
- }
850
- }