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,1037 +0,0 @@
1
- import { $env, $hook, $inject, $module, Alepha, KIND, Primitive, createPrimitive, t } from "alepha";
2
- import { $logger } from "alepha/logger";
3
- import { DateTimeProvider } from "alepha/datetime";
4
-
5
- //#region ../../src/queue/primitives/$consumer.ts
6
- /**
7
- * Creates a consumer primitive to process messages from a specific queue.
8
- *
9
- * Provides a dedicated message consumer that connects to a queue and processes messages
10
- * with custom handler logic, enabling scalable architectures where multiple consumers
11
- * can process messages from the same queue.
12
- *
13
- * **Key Features**
14
- * - Seamless integration with any $queue primitive
15
- * - Full type safety inherited from queue schema
16
- * - Automatic worker management for background processing
17
- * - Built-in error handling and retry mechanisms
18
- * - Support for multiple consumers per queue for horizontal scaling
19
- *
20
- * **Common Use Cases**
21
- * - Email sending and notification services
22
- * - Image and media processing workers
23
- * - Data synchronization and background jobs
24
- *
25
- * @example
26
- * ```ts
27
- * class EmailService {
28
- * emailQueue = $queue({
29
- * name: "emails",
30
- * schema: t.object({
31
- * to: t.text(),
32
- * subject: t.text(),
33
- * body: t.text()
34
- * })
35
- * });
36
- *
37
- * emailConsumer = $consumer({
38
- * queue: this.emailQueue,
39
- * handler: async (message) => {
40
- * const { to, subject, body } = message.payload;
41
- * await this.sendEmail(to, subject, body);
42
- * }
43
- * });
44
- *
45
- * async sendWelcomeEmail(userEmail: string) {
46
- * await this.emailQueue.push({
47
- * to: userEmail,
48
- * subject: "Welcome!",
49
- * body: "Thanks for joining."
50
- * });
51
- * }
52
- * }
53
- * ```
54
- */
55
- const $consumer = (options) => {
56
- return createPrimitive(ConsumerPrimitive, options);
57
- };
58
- var ConsumerPrimitive = class extends Primitive {};
59
- $consumer[KIND] = ConsumerPrimitive;
60
-
61
- //#endregion
62
- //#region ../../src/queue/providers/QueueProvider.ts
63
- /**
64
- * Queue provider interface supporting both simple message-based and advanced job-based operations.
65
- *
66
- * The simple API (push/pop/popBlocking) is for basic fire-and-forget messaging.
67
- * The job API provides crash recovery, retries, delayed jobs, priorities, and job history.
68
- */
69
- var QueueProvider = class {
70
- eventHandlers = /* @__PURE__ */ new Map();
71
- on(event, handler) {
72
- if (!this.eventHandlers.has(event)) this.eventHandlers.set(event, /* @__PURE__ */ new Set());
73
- this.eventHandlers.get(event).add(handler);
74
- return () => {
75
- this.eventHandlers.get(event)?.delete(handler);
76
- };
77
- }
78
- /**
79
- * Emit a queue event to all registered handlers.
80
- *
81
- * @param event The event to emit.
82
- */
83
- async emit(event) {
84
- const handlers = [...this.eventHandlers.get(event.type) ?? [], ...this.eventHandlers.get("*") ?? []];
85
- await Promise.all(handlers.map((handler) => handler(event)));
86
- }
87
- };
88
-
89
- //#endregion
90
- //#region ../../src/queue/providers/MemoryQueueProvider.ts
91
- const DEFAULT_MAX_ATTEMPTS = 1;
92
- const DEFAULT_LOCK_DURATION = 3e4;
93
- const DEFAULT_BACKOFF_DELAY = 1e3;
94
- const DEFAULT_BACKOFF_MAX_DELAY = 3e4;
95
- /**
96
- * In-memory queue provider with full job support.
97
- *
98
- * This provider stores all data in memory and is suitable for:
99
- * - Development and testing
100
- * - Single-instance applications
101
- * - Scenarios where job persistence across restarts is not required
102
- */
103
- var MemoryQueueProvider = class extends QueueProvider {
104
- log = $logger();
105
- messageQueues = {};
106
- messageWaiters = /* @__PURE__ */ new Set();
107
- jobs = /* @__PURE__ */ new Map();
108
- waiting = /* @__PURE__ */ new Map();
109
- delayed = /* @__PURE__ */ new Map();
110
- active = /* @__PURE__ */ new Map();
111
- completed = /* @__PURE__ */ new Map();
112
- failed = /* @__PURE__ */ new Map();
113
- jobWaiters = /* @__PURE__ */ new Set();
114
- jobIdCounter = 0;
115
- async push(queue, ...messages) {
116
- if (this.messageQueues[queue] == null) this.messageQueues[queue] = [];
117
- for (const message of messages) {
118
- const waiter = this.findMessageWaiter(queue);
119
- if (waiter) {
120
- this.removeMessageWaiter(waiter);
121
- waiter.resolve({
122
- queue,
123
- message
124
- });
125
- } else this.messageQueues[queue].push(message);
126
- }
127
- }
128
- async pop(queue) {
129
- return this.messageQueues[queue]?.shift();
130
- }
131
- async popBlocking(queues, timeoutSeconds) {
132
- for (const queue of queues) {
133
- const message = this.messageQueues[queue]?.shift();
134
- if (message) return {
135
- queue,
136
- message
137
- };
138
- }
139
- return new Promise((resolve) => {
140
- const timer = setTimeout(() => {
141
- this.removeMessageWaiter(waiter);
142
- resolve(void 0);
143
- }, timeoutSeconds * 1e3);
144
- const waiter = {
145
- queues: new Set(queues),
146
- resolve: (result) => {
147
- clearTimeout(timer);
148
- resolve(result);
149
- },
150
- timer
151
- };
152
- this.messageWaiters.add(waiter);
153
- });
154
- }
155
- findMessageWaiter(queue) {
156
- for (const waiter of this.messageWaiters) if (waiter.queues.has(queue)) return waiter;
157
- }
158
- removeMessageWaiter(waiter) {
159
- clearTimeout(waiter.timer);
160
- this.messageWaiters.delete(waiter);
161
- }
162
- generateJobId() {
163
- return `job_${++this.jobIdCounter}_${Date.now()}`;
164
- }
165
- ensureQueueStructures(queue) {
166
- if (!this.jobs.has(queue)) {
167
- this.jobs.set(queue, /* @__PURE__ */ new Map());
168
- this.waiting.set(queue, []);
169
- this.delayed.set(queue, []);
170
- this.active.set(queue, /* @__PURE__ */ new Set());
171
- this.completed.set(queue, []);
172
- this.failed.set(queue, []);
173
- }
174
- }
175
- async addJob(queue, payload, options) {
176
- this.ensureQueueStructures(queue);
177
- const now = Date.now();
178
- const delay = options?.delay ?? 0;
179
- const isDelayed = delay > 0;
180
- const job = {
181
- id: this.generateJobId(),
182
- queue,
183
- payload,
184
- options: {
185
- priority: options?.priority ?? 0,
186
- delay: options?.delay ?? 0,
187
- maxAttempts: options?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
188
- backoff: options?.backoff,
189
- lockDuration: options?.lockDuration ?? DEFAULT_LOCK_DURATION,
190
- removeOnComplete: options?.removeOnComplete,
191
- removeOnFail: options?.removeOnFail
192
- },
193
- state: {
194
- status: isDelayed ? "delayed" : "waiting",
195
- attempts: 0,
196
- createdAt: now,
197
- availableAt: isDelayed ? now + delay : now
198
- }
199
- };
200
- this.jobs.get(queue).set(job.id, job);
201
- if (isDelayed) this.insertDelayed(queue, job);
202
- else {
203
- this.insertWaiting(queue, job);
204
- this.notifyJobWaiters(queue);
205
- }
206
- this.log.debug(`Added job ${job.id} to queue ${queue}`, {
207
- status: job.state.status,
208
- priority: job.options.priority
209
- });
210
- if (!isDelayed) await this.emit({
211
- type: "waiting",
212
- queue,
213
- jobId: job.id,
214
- timestamp: now,
215
- job
216
- });
217
- return job;
218
- }
219
- insertWaiting(queue, job) {
220
- const waitingList = this.waiting.get(queue);
221
- const priority = job.options.priority ?? 0;
222
- let insertIndex = waitingList.length;
223
- for (let i = 0; i < waitingList.length; i++) {
224
- const existingJob = this.jobs.get(queue).get(waitingList[i]);
225
- if (existingJob && (existingJob.options.priority ?? 0) > priority) {
226
- insertIndex = i;
227
- break;
228
- }
229
- }
230
- waitingList.splice(insertIndex, 0, job.id);
231
- }
232
- insertDelayed(queue, job) {
233
- const delayedList = this.delayed.get(queue);
234
- const availableAt = job.state.availableAt ?? 0;
235
- let insertIndex = delayedList.length;
236
- for (let i = 0; i < delayedList.length; i++) {
237
- const existingJob = this.jobs.get(queue).get(delayedList[i]);
238
- if (existingJob && (existingJob.state.availableAt ?? 0) > availableAt) {
239
- insertIndex = i;
240
- break;
241
- }
242
- }
243
- delayedList.splice(insertIndex, 0, job.id);
244
- }
245
- notifyJobWaiters(queue) {
246
- for (const waiter of this.jobWaiters) if (waiter.queues.has(queue)) {
247
- const result = this.tryAcquireJob(Array.from(waiter.queues), waiter.workerId);
248
- if (result) {
249
- this.removeJobWaiter(waiter);
250
- waiter.resolve(result);
251
- return;
252
- }
253
- }
254
- }
255
- removeJobWaiter(waiter) {
256
- clearTimeout(waiter.timer);
257
- this.jobWaiters.delete(waiter);
258
- }
259
- tryAcquireJob(queues, workerId) {
260
- const now = Date.now();
261
- for (const queue of queues) {
262
- const waitingList = this.waiting.get(queue);
263
- if (!waitingList || waitingList.length === 0) continue;
264
- const jobId = waitingList.shift();
265
- const job = this.jobs.get(queue).get(jobId);
266
- if (!job) continue;
267
- job.state.status = "active";
268
- job.state.attempts += 1;
269
- job.state.lockedBy = workerId;
270
- job.state.lockedUntil = now + (job.options.lockDuration ?? DEFAULT_LOCK_DURATION);
271
- job.state.processedAt = now;
272
- this.active.get(queue).add(jobId);
273
- this.log.debug(`Worker ${workerId} acquired job ${jobId}`, {
274
- queue,
275
- attempt: job.state.attempts
276
- });
277
- this.emit({
278
- type: "active",
279
- queue,
280
- jobId,
281
- timestamp: now,
282
- workerId,
283
- attempt: job.state.attempts
284
- });
285
- return {
286
- queue,
287
- job
288
- };
289
- }
290
- }
291
- async acquireJob(queues, workerId, timeoutSeconds) {
292
- for (const queue of queues) this.ensureQueueStructures(queue);
293
- const result = this.tryAcquireJob(queues, workerId);
294
- if (result) return result;
295
- return new Promise((resolve) => {
296
- const timer = setTimeout(() => {
297
- this.removeJobWaiter(waiter);
298
- resolve(void 0);
299
- }, timeoutSeconds * 1e3);
300
- const waiter = {
301
- queues: new Set(queues),
302
- workerId,
303
- resolve: (result$1) => {
304
- clearTimeout(timer);
305
- resolve(result$1);
306
- },
307
- timer
308
- };
309
- this.jobWaiters.add(waiter);
310
- });
311
- }
312
- async completeJob(queue, jobId, result) {
313
- const job = this.jobs.get(queue)?.get(jobId);
314
- if (!job) {
315
- this.log.warn(`Attempted to complete unknown job ${jobId}`);
316
- return;
317
- }
318
- const now = Date.now();
319
- const duration = now - (job.state.processedAt ?? now);
320
- this.active.get(queue)?.delete(jobId);
321
- job.state.status = "completed";
322
- job.state.completedAt = now;
323
- job.state.result = result;
324
- job.state.lockedBy = void 0;
325
- job.state.lockedUntil = void 0;
326
- const removeOnComplete = job.options.removeOnComplete;
327
- if (removeOnComplete === true) {
328
- this.jobs.get(queue)?.delete(jobId);
329
- this.log.debug(`Job ${jobId} completed and removed`, {
330
- queue,
331
- result
332
- });
333
- } else {
334
- this.completed.get(queue).unshift(jobId);
335
- if (typeof removeOnComplete === "number" && removeOnComplete >= 0) await this.cleanJobs(queue, "completed", { maxCount: removeOnComplete });
336
- this.log.debug(`Job ${jobId} completed`, {
337
- queue,
338
- result
339
- });
340
- }
341
- await this.emit({
342
- type: "completed",
343
- queue,
344
- jobId,
345
- timestamp: now,
346
- result,
347
- duration
348
- });
349
- }
350
- async failJob(queue, jobId, error, stackTrace) {
351
- const job = this.jobs.get(queue)?.get(jobId);
352
- if (!job) {
353
- this.log.warn(`Attempted to fail unknown job ${jobId}`);
354
- return;
355
- }
356
- const now = Date.now();
357
- this.active.get(queue)?.delete(jobId);
358
- const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
359
- if (job.state.attempts < maxAttempts) {
360
- const backoffDelay = this.calculateBackoff(job);
361
- job.state.status = "delayed";
362
- job.state.availableAt = now + backoffDelay;
363
- job.state.error = error;
364
- job.state.stackTrace = stackTrace;
365
- job.state.lockedBy = void 0;
366
- job.state.lockedUntil = void 0;
367
- this.insertDelayed(queue, job);
368
- this.log.debug(`Job ${jobId} failed, will retry in ${backoffDelay}ms`, {
369
- queue,
370
- attempt: job.state.attempts,
371
- maxAttempts,
372
- error
373
- });
374
- await this.emit({
375
- type: "retrying",
376
- queue,
377
- jobId,
378
- timestamp: now,
379
- error,
380
- attempt: job.state.attempts + 1,
381
- delay: backoffDelay
382
- });
383
- } else {
384
- job.state.status = "failed";
385
- job.state.failedAt = now;
386
- job.state.error = error;
387
- job.state.stackTrace = stackTrace;
388
- job.state.lockedBy = void 0;
389
- job.state.lockedUntil = void 0;
390
- const removeOnFail = job.options.removeOnFail;
391
- if (removeOnFail === true) {
392
- this.jobs.get(queue)?.delete(jobId);
393
- this.log.debug(`Job ${jobId} permanently failed and removed after ${job.state.attempts} attempts`, {
394
- queue,
395
- error
396
- });
397
- } else {
398
- this.failed.get(queue).unshift(jobId);
399
- if (typeof removeOnFail === "number" && removeOnFail >= 0) await this.cleanJobs(queue, "failed", { maxCount: removeOnFail });
400
- this.log.debug(`Job ${jobId} permanently failed after ${job.state.attempts} attempts`, {
401
- queue,
402
- error
403
- });
404
- }
405
- await this.emit({
406
- type: "failed",
407
- queue,
408
- jobId,
409
- timestamp: now,
410
- error,
411
- stackTrace,
412
- attempts: job.state.attempts
413
- });
414
- }
415
- }
416
- calculateBackoff(job) {
417
- const backoff = job.options.backoff;
418
- const attempt = job.state.attempts;
419
- if (!backoff) return DEFAULT_BACKOFF_DELAY;
420
- const baseDelay = backoff.delay ?? DEFAULT_BACKOFF_DELAY;
421
- const maxDelay = backoff.maxDelay ?? DEFAULT_BACKOFF_MAX_DELAY;
422
- if (backoff.type === "fixed") return baseDelay;
423
- const exponentialDelay = baseDelay * 2 ** (attempt - 1);
424
- return Math.min(exponentialDelay, maxDelay);
425
- }
426
- async renewJobLock(queue, jobId, workerId) {
427
- const job = this.jobs.get(queue)?.get(jobId);
428
- if (!job || job.state.lockedBy !== workerId) return false;
429
- job.state.lockedUntil = Date.now() + (job.options.lockDuration ?? DEFAULT_LOCK_DURATION);
430
- return true;
431
- }
432
- async getJob(queue, jobId) {
433
- return this.jobs.get(queue)?.get(jobId);
434
- }
435
- async getJobs(queue, status, options) {
436
- const limit = options?.limit ?? 100;
437
- const offset = options?.offset ?? 0;
438
- let jobIds;
439
- switch (status) {
440
- case "waiting":
441
- jobIds = this.waiting.get(queue) ?? [];
442
- break;
443
- case "delayed":
444
- jobIds = this.delayed.get(queue) ?? [];
445
- break;
446
- case "active":
447
- jobIds = Array.from(this.active.get(queue) ?? []);
448
- break;
449
- case "completed":
450
- jobIds = this.completed.get(queue) ?? [];
451
- break;
452
- case "failed":
453
- jobIds = this.failed.get(queue) ?? [];
454
- break;
455
- default: jobIds = [];
456
- }
457
- const jobsMap = this.jobs.get(queue);
458
- if (!jobsMap) return [];
459
- return jobIds.slice(offset, offset + limit).map((id) => jobsMap.get(id)).filter((job) => job !== void 0);
460
- }
461
- async getJobCounts(queue) {
462
- return {
463
- waiting: this.waiting.get(queue)?.length ?? 0,
464
- delayed: this.delayed.get(queue)?.length ?? 0,
465
- active: this.active.get(queue)?.size ?? 0,
466
- completed: this.completed.get(queue)?.length ?? 0,
467
- failed: this.failed.get(queue)?.length ?? 0
468
- };
469
- }
470
- async promoteDelayedJobs(queue) {
471
- const delayedList = this.delayed.get(queue);
472
- if (!delayedList || delayedList.length === 0) return 0;
473
- const now = Date.now();
474
- let promoted = 0;
475
- while (delayedList.length > 0) {
476
- const jobId = delayedList[0];
477
- const job = this.jobs.get(queue)?.get(jobId);
478
- if (!job || (job.state.availableAt ?? 0) > now) break;
479
- delayedList.shift();
480
- job.state.status = "waiting";
481
- this.insertWaiting(queue, job);
482
- promoted++;
483
- this.log.debug(`Promoted delayed job ${jobId}`, { queue });
484
- this.emit({
485
- type: "waiting",
486
- queue,
487
- jobId,
488
- timestamp: now,
489
- job
490
- });
491
- }
492
- if (promoted > 0) this.notifyJobWaiters(queue);
493
- return promoted;
494
- }
495
- async recoverStalledJobs(queue, stalledThresholdMs) {
496
- const activeSet = this.active.get(queue);
497
- if (!activeSet || activeSet.size === 0) return [];
498
- const now = Date.now();
499
- const stalledJobIds = [];
500
- for (const jobId of activeSet) {
501
- const job = this.jobs.get(queue)?.get(jobId);
502
- if (!job) continue;
503
- if ((job.state.lockedUntil ?? 0) + stalledThresholdMs < now) stalledJobIds.push(jobId);
504
- }
505
- for (const jobId of stalledJobIds) {
506
- const job = this.jobs.get(queue).get(jobId);
507
- const workerId = job.state.lockedBy;
508
- activeSet.delete(jobId);
509
- const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
510
- const hasMoreAttempts = job.state.attempts < maxAttempts;
511
- await this.emit({
512
- type: "stalled",
513
- queue,
514
- jobId,
515
- timestamp: now,
516
- workerId,
517
- willRetry: hasMoreAttempts
518
- });
519
- if (hasMoreAttempts) {
520
- job.state.status = "waiting";
521
- job.state.lockedBy = void 0;
522
- job.state.lockedUntil = void 0;
523
- job.state.error = "Job stalled (worker timeout)";
524
- this.insertWaiting(queue, job);
525
- this.log.warn(`Recovered stalled job ${jobId}, returning to waiting`, {
526
- queue,
527
- attempt: job.state.attempts
528
- });
529
- await this.emit({
530
- type: "waiting",
531
- queue,
532
- jobId,
533
- timestamp: now,
534
- job
535
- });
536
- } else {
537
- job.state.status = "failed";
538
- job.state.failedAt = now;
539
- job.state.lockedBy = void 0;
540
- job.state.lockedUntil = void 0;
541
- job.state.error = "Job stalled (worker timeout) - max attempts exceeded";
542
- const removeOnFail = job.options.removeOnFail;
543
- if (removeOnFail === true) this.jobs.get(queue)?.delete(jobId);
544
- else {
545
- this.failed.get(queue).unshift(jobId);
546
- if (typeof removeOnFail === "number" && removeOnFail > 0) await this.cleanJobs(queue, "failed", { maxCount: removeOnFail });
547
- }
548
- this.log.warn(`Stalled job ${jobId} permanently failed`, {
549
- queue,
550
- attempts: job.state.attempts
551
- });
552
- await this.emit({
553
- type: "failed",
554
- queue,
555
- jobId,
556
- timestamp: now,
557
- error: job.state.error,
558
- attempts: job.state.attempts
559
- });
560
- }
561
- }
562
- if (stalledJobIds.length > 0) this.notifyJobWaiters(queue);
563
- return stalledJobIds;
564
- }
565
- async cleanJobs(queue, status, options) {
566
- const jobsList = status === "completed" ? this.completed.get(queue) : this.failed.get(queue);
567
- if (!jobsList || jobsList.length === 0) return 0;
568
- const jobsMap = this.jobs.get(queue);
569
- if (!jobsMap) return 0;
570
- const now = Date.now();
571
- const maxAge = options?.maxAge;
572
- const maxCount = options?.maxCount;
573
- let removed = 0;
574
- if (maxAge !== void 0) {
575
- const cutoff = now - maxAge;
576
- const toRemove = [];
577
- for (const jobId of jobsList) {
578
- const job = jobsMap.get(jobId);
579
- if (job) {
580
- const timestamp = status === "completed" ? job.state.completedAt : job.state.failedAt;
581
- if (timestamp && timestamp < cutoff) toRemove.push(jobId);
582
- }
583
- }
584
- for (const jobId of toRemove) {
585
- const idx = jobsList.indexOf(jobId);
586
- if (idx !== -1) {
587
- jobsList.splice(idx, 1);
588
- jobsMap.delete(jobId);
589
- removed++;
590
- }
591
- }
592
- }
593
- if (maxCount !== void 0 && jobsList.length > maxCount) {
594
- const toRemove = jobsList.splice(maxCount);
595
- for (const jobId of toRemove) {
596
- jobsMap.delete(jobId);
597
- removed++;
598
- }
599
- }
600
- return removed;
601
- }
602
- async removeJob(queue, jobId) {
603
- const job = this.jobs.get(queue)?.get(jobId);
604
- if (!job) return;
605
- const previousStatus = job.state.status;
606
- switch (job.state.status) {
607
- case "waiting": {
608
- const list = this.waiting.get(queue);
609
- const idx = list?.indexOf(jobId) ?? -1;
610
- if (idx !== -1) list.splice(idx, 1);
611
- break;
612
- }
613
- case "delayed": {
614
- const list = this.delayed.get(queue);
615
- const idx = list?.indexOf(jobId) ?? -1;
616
- if (idx !== -1) list.splice(idx, 1);
617
- break;
618
- }
619
- case "active":
620
- this.active.get(queue)?.delete(jobId);
621
- break;
622
- case "completed": {
623
- const list = this.completed.get(queue);
624
- const idx = list?.indexOf(jobId) ?? -1;
625
- if (idx !== -1) list.splice(idx, 1);
626
- break;
627
- }
628
- case "failed": {
629
- const list = this.failed.get(queue);
630
- const idx = list?.indexOf(jobId) ?? -1;
631
- if (idx !== -1) list.splice(idx, 1);
632
- break;
633
- }
634
- }
635
- this.jobs.get(queue)?.delete(jobId);
636
- await this.emit({
637
- type: "removed",
638
- queue,
639
- jobId,
640
- timestamp: Date.now(),
641
- previousStatus
642
- });
643
- }
644
- cancelWaiters() {
645
- for (const waiter of this.jobWaiters) {
646
- clearTimeout(waiter.timer);
647
- waiter.resolve(void 0);
648
- }
649
- this.jobWaiters.clear();
650
- for (const waiter of this.messageWaiters) {
651
- clearTimeout(waiter.timer);
652
- waiter.resolve(void 0);
653
- }
654
- this.messageWaiters.clear();
655
- }
656
- };
657
-
658
- //#endregion
659
- //#region ../../src/queue/primitives/$queue.ts
660
- /**
661
- * Creates a queue primitive for asynchronous message processing with background workers.
662
- *
663
- * The $queue primitive enables powerful asynchronous communication patterns in your application.
664
- * It provides type-safe message queuing with automatic worker processing, making it perfect for
665
- * decoupling components and handling background tasks efficiently.
666
- *
667
- * **Background Processing**
668
- * - Automatic worker threads for non-blocking message processing
669
- * - Built-in retry mechanisms and error handling
670
- * - Dead letter queues for failed message handling
671
- * - Graceful shutdown and worker lifecycle management
672
- *
673
- * **Type Safety**
674
- * - Full TypeScript support with schema validation using TypeBox
675
- * - Type-safe message payloads with automatic inference
676
- * - Runtime validation of all queued messages
677
- * - Compile-time errors for invalid message structures
678
- *
679
- * **Storage Flexibility**
680
- * - Memory provider for development and testing
681
- * - Redis provider for production scalability and persistence
682
- * - Custom provider support for specialized backends
683
- * - Automatic failover and connection pooling
684
- *
685
- * **Performance & Scalability**
686
- * - Batch processing support for high-throughput scenarios
687
- * - Horizontal scaling with distributed queue backends
688
- * - Configurable concurrency and worker pools
689
- * - Efficient serialization and message routing
690
- *
691
- * **Reliability**
692
- * - Message persistence across application restarts
693
- * - Automatic retry with exponential backoff
694
- * - Dead letter handling for permanently failed messages
695
- * - Comprehensive logging and monitoring integration
696
- *
697
- * @example Basic notification queue
698
- * ```typescript
699
- * const emailQueue = $queue({
700
- * name: "email-notifications",
701
- * schema: t.object({
702
- * to: t.text(),
703
- * subject: t.text(),
704
- * body: t.text(),
705
- * priority: t.optional(t.enum(["high", "normal"]))
706
- * }),
707
- * handler: async (message) => {
708
- * await emailService.send(message.payload);
709
- * console.log(`Email sent to ${message.payload.to}`);
710
- * }
711
- * });
712
- *
713
- * // Push messages for background processing
714
- * await emailQueue.push({
715
- * to: "user@example.com",
716
- * subject: "Welcome!",
717
- * body: "Welcome to our platform",
718
- * priority: "high"
719
- * });
720
- * ```
721
- *
722
- * @example Batch processing with Redis
723
- * ```typescript
724
- * const imageQueue = $queue({
725
- * name: "image-processing",
726
- * provider: RedisQueueProvider,
727
- * schema: t.object({
728
- * imageId: t.text(),
729
- * operations: t.array(t.enum(["resize", "compress", "thumbnail"]))
730
- * }),
731
- * handler: async (message) => {
732
- * for (const op of message.payload.operations) {
733
- * await processImage(message.payload.imageId, op);
734
- * }
735
- * }
736
- * });
737
- *
738
- * // Batch processing multiple images
739
- * await imageQueue.push(
740
- * { imageId: "img1", operations: ["resize", "thumbnail"] },
741
- * { imageId: "img2", operations: ["compress"] },
742
- * { imageId: "img3", operations: ["resize", "compress", "thumbnail"] }
743
- * );
744
- * ```
745
- *
746
- * @example Development with memory provider
747
- * ```typescript
748
- * const taskQueue = $queue({
749
- * name: "dev-tasks",
750
- * provider: "memory",
751
- * schema: t.object({
752
- * taskType: t.enum(["cleanup", "backup", "report"]),
753
- * data: t.record(t.text(), t.any())
754
- * }),
755
- * handler: async (message) => {
756
- * switch (message.payload.taskType) {
757
- * case "cleanup":
758
- * await performCleanup(message.payload.data);
759
- * break;
760
- * case "backup":
761
- * await createBackup(message.payload.data);
762
- * break;
763
- * case "report":
764
- * await generateReport(message.payload.data);
765
- * break;
766
- * }
767
- * }
768
- * });
769
- * ```
770
- */
771
- const $queue = (options) => {
772
- return createPrimitive(QueuePrimitive, options);
773
- };
774
- var QueuePrimitive = class extends Primitive {
775
- log = $logger();
776
- provider = this.$provider();
777
- async push(payloadOrFirst, optionsOrSecond, ...rest) {
778
- if (optionsOrSecond != null && typeof optionsOrSecond === "object" && ("priority" in optionsOrSecond || "delay" in optionsOrSecond)) {
779
- const payload = this.alepha.codec.decode(this.options.schema, payloadOrFirst);
780
- await this.provider.addJob(this.name, payload, {
781
- ...this.getDefaultJobOptions(),
782
- priority: optionsOrSecond.priority,
783
- delay: optionsOrSecond.delay
784
- });
785
- this.log.debug(`Pushed job to queue ${this.name}`, {
786
- payload,
787
- options: optionsOrSecond
788
- });
789
- } else {
790
- const payloads = optionsOrSecond != null ? [
791
- payloadOrFirst,
792
- optionsOrSecond,
793
- ...rest
794
- ] : [payloadOrFirst, ...rest];
795
- await Promise.all(payloads.map((p) => {
796
- const payload = this.alepha.codec.decode(this.options.schema, p);
797
- return this.provider.addJob(this.name, payload, this.getDefaultJobOptions());
798
- }));
799
- this.log.debug(`Pushed ${payloads.length} job(s) to queue ${this.name}`, payloads);
800
- }
801
- }
802
- /**
803
- * Get default job options from primitive configuration.
804
- */
805
- getDefaultJobOptions() {
806
- return {
807
- maxAttempts: this.options.maxAttempts,
808
- backoff: this.options.backoff,
809
- lockDuration: this.options.lockDuration,
810
- removeOnComplete: this.options.removeOnComplete,
811
- removeOnFail: this.options.removeOnFail
812
- };
813
- }
814
- get name() {
815
- return this.options.name || this.config.propertyKey;
816
- }
817
- $provider() {
818
- if (!this.options.provider) return this.alepha.inject(QueueProvider);
819
- if (this.options.provider === "memory") return this.alepha.inject(MemoryQueueProvider);
820
- return this.alepha.inject(this.options.provider);
821
- }
822
- };
823
- $queue[KIND] = QueuePrimitive;
824
-
825
- //#endregion
826
- //#region ../../src/queue/providers/WorkerProvider.ts
827
- const envSchema = t.object({
828
- QUEUE_WORKER_BLOCKING_TIMEOUT: t.integer({ default: 5 }),
829
- QUEUE_WORKER_CONCURRENCY: t.integer({ default: 1 }),
830
- QUEUE_WORKER_LOCK_RENEWAL_INTERVAL: t.integer({ default: 1e4 }),
831
- QUEUE_SCHEDULER_INTERVAL: t.integer({ default: 5e3 }),
832
- QUEUE_STALLED_THRESHOLD: t.integer({ default: 5e3 })
833
- });
834
- var WorkerProvider = class {
835
- log = $logger();
836
- env = $env(envSchema);
837
- alepha = $inject(Alepha);
838
- queueProvider = $inject(QueueProvider);
839
- dateTime = $inject(DateTimeProvider);
840
- workerPromises = [];
841
- workersRunning = 0;
842
- shouldStop = false;
843
- consumers = [];
844
- consumersByProvider = /* @__PURE__ */ new Map();
845
- schedulerPromise;
846
- schedulerRunning = false;
847
- abortController;
848
- workerId = `worker_${process.pid}_${Date.now()}`;
849
- get isRunning() {
850
- return this.workersRunning > 0;
851
- }
852
- start = $hook({
853
- on: "start",
854
- priority: "last",
855
- handler: () => {
856
- for (const queue of this.alepha.primitives($queue)) {
857
- const handler = queue.options.handler;
858
- if (handler) this.consumers.push({
859
- handler,
860
- queue
861
- });
862
- }
863
- for (const consumer of this.alepha.primitives($consumer)) this.consumers.push(consumer.options);
864
- for (const consumer of this.consumers) {
865
- const provider = consumer.queue.provider;
866
- const list = this.consumersByProvider.get(provider) ?? [];
867
- list.push(consumer);
868
- this.consumersByProvider.set(provider, list);
869
- }
870
- if (this.consumers.length > 0) {
871
- this.startWorkers();
872
- this.startScheduler();
873
- this.log.debug(`Watching for ${this.consumers.length} queue${this.consumers.length > 1 ? "s" : ""} with ${this.env.QUEUE_WORKER_CONCURRENCY} worker${this.env.QUEUE_WORKER_CONCURRENCY > 1 ? "s" : ""}.`);
874
- }
875
- }
876
- });
877
- /**
878
- * Start the workers.
879
- * Each worker acquires jobs and processes them with proper lifecycle management.
880
- */
881
- startWorkers() {
882
- const workerToStart = this.env.QUEUE_WORKER_CONCURRENCY - this.workersRunning;
883
- for (let i = 0; i < workerToStart; i++) {
884
- this.workersRunning += 1;
885
- const workerIndex = i;
886
- const localWorkerId = `${this.workerId}_${workerIndex}`;
887
- this.log.debug(`Starting worker n-${workerIndex}`);
888
- const workerLoop = async () => {
889
- while (!this.shouldStop) {
890
- this.log.trace(`Worker n-${workerIndex} is waiting for jobs`);
891
- const acquired = await this.acquireNextJob(localWorkerId);
892
- if (acquired) await this.processJob(acquired, localWorkerId);
893
- }
894
- this.log.info(`Worker n-${workerIndex} has stopped`);
895
- };
896
- this.workerPromises.push(workerLoop().catch((e) => {
897
- this.log.error(`Worker n-${workerIndex} has crashed`, e);
898
- this.workersRunning -= 1;
899
- }));
900
- }
901
- }
902
- /**
903
- * Start the scheduler for delayed job promotion and stalled job recovery.
904
- */
905
- startScheduler() {
906
- if (this.schedulerRunning) return;
907
- this.schedulerRunning = true;
908
- this.abortController = new AbortController();
909
- this.log.debug("Starting scheduler");
910
- const schedulerLoop = async () => {
911
- while (!this.shouldStop) {
912
- try {
913
- await this.runSchedulerCycle();
914
- } catch (e) {
915
- this.log.error("Scheduler cycle failed", e);
916
- }
917
- await this.dateTime.wait(this.env.QUEUE_SCHEDULER_INTERVAL, { signal: this.abortController?.signal });
918
- }
919
- this.log.debug("Scheduler stopped");
920
- };
921
- this.schedulerPromise = schedulerLoop();
922
- }
923
- /**
924
- * Run one cycle of the scheduler.
925
- * Promotes delayed jobs and recovers stalled jobs.
926
- */
927
- async runSchedulerCycle() {
928
- for (const [provider, consumers] of this.consumersByProvider) {
929
- const queues = new Set(consumers.map((c) => c.queue.name));
930
- for (const queue of queues) {
931
- const promoted = await provider.promoteDelayedJobs(queue);
932
- if (promoted > 0) this.log.debug(`Promoted ${promoted} delayed jobs in queue ${queue}`);
933
- const recovered = await provider.recoverStalledJobs(queue, this.env.QUEUE_STALLED_THRESHOLD);
934
- if (recovered.length > 0) this.log.warn(`Recovered ${recovered.length} stalled jobs in queue ${queue}`);
935
- }
936
- }
937
- }
938
- stop = $hook({
939
- on: "stop",
940
- handler: async () => {
941
- if (this.consumers.length > 0) await this.stopWorkers();
942
- }
943
- });
944
- /**
945
- * Acquire the next available job from any provider.
946
- */
947
- async acquireNextJob(localWorkerId) {
948
- for (const [provider, consumers] of this.consumersByProvider) {
949
- const queueNames = consumers.map((c) => c.queue.name);
950
- const acquired = await provider.acquireJob(queueNames, localWorkerId, this.env.QUEUE_WORKER_BLOCKING_TIMEOUT);
951
- if (acquired) {
952
- const consumer = consumers.find((c) => c.queue.name === acquired.queue);
953
- if (consumer) return {
954
- acquired,
955
- consumer,
956
- provider
957
- };
958
- }
959
- }
960
- }
961
- /**
962
- * Process a job with proper lifecycle management.
963
- * - Starts a lock renewal interval
964
- * - Calls the handler
965
- * - Marks job as completed or failed
966
- */
967
- async processJob({ acquired, consumer, provider }, localWorkerId) {
968
- const { queue, job } = acquired;
969
- const lockRenewalInterval = this.dateTime.createInterval(async () => {
970
- try {
971
- if (!await provider.renewJobLock(queue, job.id, localWorkerId)) this.log.warn(`Failed to renew lock for job ${job.id}, lock may have been stolen`);
972
- } catch (e) {
973
- this.log.error(`Error renewing lock for job ${job.id}`, e);
974
- }
975
- }, this.env.QUEUE_WORKER_LOCK_RENEWAL_INTERVAL, true);
976
- try {
977
- const payload = this.alepha.codec.decode(consumer.queue.options.schema, job.payload);
978
- await this.alepha.context.run(() => consumer.handler({ payload }));
979
- await provider.completeJob(queue, job.id);
980
- this.log.debug(`Job ${job.id} completed successfully`, { queue });
981
- } catch (e) {
982
- const error = e instanceof Error ? e.message : String(e);
983
- const stackTrace = e instanceof Error ? e.stack : void 0;
984
- await provider.failJob(queue, job.id, error, stackTrace);
985
- this.log.error(`Job ${job.id} failed`, e);
986
- } finally {
987
- this.dateTime.clearInterval(lockRenewalInterval);
988
- }
989
- }
990
- /**
991
- * Stop the workers and scheduler.
992
- */
993
- async stopWorkers() {
994
- this.shouldStop = true;
995
- this.workersRunning = 0;
996
- this.schedulerRunning = false;
997
- this.abortController?.abort();
998
- for (const provider of this.consumersByProvider.keys()) provider.cancelWaiters();
999
- this.log.trace("Stopping workers...");
1000
- this.log.trace("Waiting for workers to finish...");
1001
- const promises = [...this.workerPromises];
1002
- if (this.schedulerPromise) promises.push(this.schedulerPromise);
1003
- await Promise.all(promises);
1004
- }
1005
- };
1006
-
1007
- //#endregion
1008
- //#region ../../src/queue/index.ts
1009
- /**
1010
- * Provides asynchronous message queuing and processing capabilities through declarative queue primitives.
1011
- *
1012
- * The queue module enables reliable background job processing and message passing using the `$queue` primitive
1013
- * on class properties. It supports schema validation, automatic retries, and multiple queue backends for
1014
- * building scalable, decoupled applications with robust error handling.
1015
- *
1016
- * @see {@link $queue}
1017
- * @see {@link $consumer}
1018
- * @module alepha.queue
1019
- */
1020
- const AlephaQueue = $module({
1021
- name: "alepha.queue",
1022
- primitives: [$queue, $consumer],
1023
- services: [
1024
- QueueProvider,
1025
- MemoryQueueProvider,
1026
- WorkerProvider
1027
- ],
1028
- register: (alepha) => alepha.with({
1029
- optional: true,
1030
- provide: QueueProvider,
1031
- use: MemoryQueueProvider
1032
- }).with(WorkerProvider)
1033
- });
1034
-
1035
- //#endregion
1036
- export { $consumer, $queue, AlephaQueue, ConsumerPrimitive, MemoryQueueProvider, QueuePrimitive, QueueProvider, WorkerProvider };
1037
- //# sourceMappingURL=index.js.map