alepha 0.13.6 → 0.13.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) 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/index.browser.js +116 -0
  6. package/dist/api/audits/index.browser.js.map +1 -0
  7. package/dist/api/audits/index.d.ts +1194 -0
  8. package/dist/api/audits/index.js +674 -0
  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/index.browser.js +60 -0
  26. package/dist/api/parameters/index.browser.js.map +1 -0
  27. package/dist/api/parameters/index.d.ts +761 -0
  28. package/dist/api/parameters/index.js +877 -0
  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 +259 -247
  33. package/dist/{api-users → api/users}/index.js +125 -112
  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 +13 -12
  39. package/dist/api/verifications/index.js.map +1 -0
  40. package/dist/bin/index.js +1 -0
  41. package/dist/bin/index.js.map +1 -1
  42. package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
  43. package/dist/cache/{index.js → core/index.js} +5 -5
  44. package/dist/cache/core/index.js.map +1 -0
  45. package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
  46. package/dist/{cache-redis → cache/redis}/index.js +2 -2
  47. package/dist/cache/redis/index.js.map +1 -0
  48. package/dist/cli/index.d.ts +71 -9
  49. package/dist/cli/index.js +280 -79
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/command/index.d.ts +63 -2
  52. package/dist/command/index.js +30 -3
  53. package/dist/command/index.js.map +1 -1
  54. package/dist/core/index.browser.js +241 -61
  55. package/dist/core/index.browser.js.map +1 -1
  56. package/dist/core/index.d.ts +170 -90
  57. package/dist/core/index.js +264 -67
  58. package/dist/core/index.js.map +1 -1
  59. package/dist/core/index.native.js +248 -65
  60. package/dist/core/index.native.js.map +1 -1
  61. package/dist/email/index.js +15 -10554
  62. package/dist/email/index.js.map +1 -1
  63. package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
  64. package/dist/lock/{index.js → core/index.js} +5 -5
  65. package/dist/lock/core/index.js.map +1 -0
  66. package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
  67. package/dist/{lock-redis → lock/redis}/index.js +2 -2
  68. package/dist/lock/redis/index.js.map +1 -0
  69. package/dist/logger/index.d.ts +4 -4
  70. package/dist/logger/index.js +77 -72
  71. package/dist/logger/index.js.map +1 -1
  72. package/dist/orm/index.d.ts +5 -1
  73. package/dist/orm/index.js +24 -7
  74. package/dist/orm/index.js.map +1 -1
  75. package/dist/queue/core/index.d.ts +548 -0
  76. package/dist/queue/core/index.js +391 -0
  77. package/dist/queue/core/index.js.map +1 -0
  78. package/dist/queue/redis/index.d.ts +28 -0
  79. package/dist/queue/redis/index.js +43 -0
  80. package/dist/queue/redis/index.js.map +1 -0
  81. package/dist/scheduler/index.d.ts +7 -7
  82. package/dist/scheduler/index.js +1 -393
  83. package/dist/scheduler/index.js.map +1 -1
  84. package/dist/security/index.d.ts +1 -1
  85. package/dist/security/index.js +2 -1413
  86. package/dist/security/index.js.map +1 -1
  87. package/dist/{server-auth → server/auth}/index.browser.js +6 -6
  88. package/dist/server/auth/index.browser.js.map +1 -0
  89. package/dist/{server-auth → server/auth}/index.d.ts +175 -164
  90. package/dist/server/auth/index.js +742 -0
  91. package/dist/server/auth/index.js.map +1 -0
  92. package/dist/{server-cache → server/cache}/index.d.ts +2 -2
  93. package/dist/{server-cache → server/cache}/index.js +2 -2
  94. package/dist/server/cache/index.js.map +1 -0
  95. package/dist/{server-compress → server/compress}/index.d.ts +2 -2
  96. package/dist/{server-compress → server/compress}/index.js +2 -2
  97. package/dist/server/compress/index.js.map +1 -0
  98. package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
  99. package/dist/server/cookies/index.browser.js.map +1 -0
  100. package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
  101. package/dist/{server-cookies → server/cookies}/index.js +9 -5
  102. package/dist/server/cookies/index.js.map +1 -0
  103. package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
  104. package/dist/server/core/index.browser.js.map +1 -0
  105. package/dist/server/{index.d.ts → core/index.d.ts} +46 -37
  106. package/dist/server/{index.js → core/index.js} +47 -33
  107. package/dist/server/core/index.js.map +1 -0
  108. package/dist/{server-cors → server/cors}/index.d.ts +3 -3
  109. package/dist/{server-cors → server/cors}/index.js +3 -3
  110. package/dist/server/cors/index.js.map +1 -0
  111. package/dist/{server-health → server/health}/index.d.ts +3 -3
  112. package/dist/{server-health → server/health}/index.js +3 -3
  113. package/dist/server/health/index.js.map +1 -0
  114. package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
  115. package/dist/{server-helmet → server/helmet}/index.js +2 -2
  116. package/dist/server/helmet/index.js.map +1 -0
  117. package/dist/{server-links → server/links}/index.browser.js +5 -5
  118. package/dist/server/links/index.browser.js.map +1 -0
  119. package/dist/{server-links → server/links}/index.d.ts +40 -40
  120. package/dist/{server-links → server/links}/index.js +7 -7
  121. package/dist/server/links/index.js.map +1 -0
  122. package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
  123. package/dist/server/metrics/index.js +74 -0
  124. package/dist/server/metrics/index.js.map +1 -0
  125. package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
  126. package/dist/{server-multipart → server/multipart}/index.js +2 -2
  127. package/dist/server/multipart/index.js.map +1 -0
  128. package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
  129. package/dist/{server-proxy → server/proxy}/index.js +3 -3
  130. package/dist/server/proxy/index.js.map +1 -0
  131. package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
  132. package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
  133. package/dist/server/rate-limit/index.js.map +1 -0
  134. package/dist/{server-security → server/security}/index.browser.js +1 -1
  135. package/dist/server/security/index.browser.js.map +1 -0
  136. package/dist/{server-security → server/security}/index.d.ts +4 -4
  137. package/dist/{server-security → server/security}/index.js +4 -4
  138. package/dist/server/security/index.js.map +1 -0
  139. package/dist/{server-static → server/static}/index.d.ts +3 -3
  140. package/dist/{server-static → server/static}/index.js +3 -3
  141. package/dist/server/static/index.js.map +1 -0
  142. package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
  143. package/dist/{server-swagger → server/swagger}/index.js +4 -4
  144. package/dist/server/swagger/index.js.map +1 -0
  145. package/dist/thread/index.js +2 -2
  146. package/dist/thread/index.js.map +1 -1
  147. package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
  148. package/dist/topic/{index.js → core/index.js} +6 -6
  149. package/dist/topic/core/index.js.map +1 -0
  150. package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
  151. package/dist/{topic-redis → topic/redis}/index.js +2 -2
  152. package/dist/topic/redis/index.js.map +1 -0
  153. package/dist/vite/index.d.ts +13 -2
  154. package/dist/vite/index.js +114 -50
  155. package/dist/vite/index.js.map +1 -1
  156. package/dist/websocket/index.browser.js +3 -3
  157. package/dist/websocket/index.browser.js.map +1 -1
  158. package/dist/websocket/index.js +4 -4
  159. package/dist/websocket/index.js.map +1 -1
  160. package/package.json +160 -156
  161. package/src/api/audits/controllers/AuditController.ts +186 -0
  162. package/src/api/audits/entities/audits.ts +132 -0
  163. package/src/api/audits/index.browser.ts +18 -0
  164. package/src/api/audits/index.ts +58 -0
  165. package/src/api/audits/primitives/$audit.ts +159 -0
  166. package/src/api/audits/schemas/auditQuerySchema.ts +23 -0
  167. package/src/api/audits/schemas/auditResourceSchema.ts +9 -0
  168. package/src/api/audits/schemas/createAuditSchema.ts +27 -0
  169. package/src/api/audits/services/AuditService.ts +412 -0
  170. package/src/{api-files → api/files}/index.ts +1 -0
  171. package/src/api/parameters/controllers/ConfigController.ts +324 -0
  172. package/src/api/parameters/entities/parameters.ts +113 -0
  173. package/src/api/parameters/index.ts +60 -0
  174. package/src/api/parameters/primitives/$config.ts +351 -0
  175. package/src/api/parameters/schedulers/ConfigActivationScheduler.ts +30 -0
  176. package/src/api/parameters/services/ConfigStore.ts +491 -0
  177. package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +19 -0
  178. package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -2
  179. package/src/{api-users → api/users}/index.ts +2 -0
  180. package/src/{api-users → api/users}/primitives/$userRealm.ts +18 -3
  181. package/src/{api-users → api/users}/providers/UserRealmProvider.ts +12 -10
  182. package/src/{api-users → api/users}/services/RegistrationService.ts +2 -1
  183. package/src/{api-users → api/users}/services/SessionService.ts +4 -0
  184. package/src/{api-users → api/users}/services/UserService.ts +3 -0
  185. package/src/{api-verifications → api/verifications}/index.ts +9 -1
  186. package/src/bin/index.ts +1 -0
  187. package/src/cli/apps/AlephaPackageBuilderCli.ts +73 -48
  188. package/src/cli/assets/appRouterTs.ts +1 -1
  189. package/src/cli/assets/biomeJson.ts +2 -2
  190. package/src/cli/assets/dummySpecTs.ts +7 -0
  191. package/src/cli/assets/editorconfig.ts +13 -0
  192. package/src/cli/assets/indexHtml.ts +1 -1
  193. package/src/cli/assets/mainBrowserTs.ts +1 -1
  194. package/src/cli/assets/mainTs.ts +14 -0
  195. package/src/cli/assets/viteConfigTs.ts +1 -1
  196. package/src/cli/commands/BiomeCommands.ts +2 -0
  197. package/src/cli/commands/CoreCommands.ts +38 -15
  198. package/src/cli/commands/VerifyCommands.ts +6 -2
  199. package/src/cli/commands/ViteCommands.ts +28 -18
  200. package/src/cli/services/AlephaCliUtils.ts +243 -37
  201. package/src/command/helpers/Asker.ts +0 -1
  202. package/src/command/primitives/$command.ts +67 -0
  203. package/src/command/providers/CliProvider.ts +39 -8
  204. package/src/core/Alepha.ts +40 -30
  205. package/src/core/helpers/jsonSchemaToTypeBox.ts +307 -0
  206. package/src/core/index.shared.ts +1 -0
  207. package/src/core/index.ts +30 -3
  208. package/src/core/providers/EventManager.ts +1 -1
  209. package/src/core/providers/SchemaValidator.ts +1 -1
  210. package/src/core/providers/StateManager.ts +23 -12
  211. package/src/core/providers/TypeProvider.ts +26 -34
  212. package/src/logger/index.ts +8 -6
  213. package/src/logger/primitives/$logger.ts +1 -1
  214. package/src/logger/providers/{SimpleFormatterProvider.ts → PrettyFormatterProvider.ts} +10 -1
  215. package/src/orm/index.ts +6 -0
  216. package/src/orm/services/PgRelationManager.ts +2 -2
  217. package/src/orm/services/PostgresModelBuilder.ts +11 -7
  218. package/src/orm/services/Repository.ts +16 -7
  219. package/src/orm/services/SqliteModelBuilder.ts +10 -0
  220. package/src/queue/{index.ts → core/index.ts} +2 -3
  221. package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
  222. package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
  223. package/src/queue/core/providers/QueueProvider.ts +23 -0
  224. package/src/queue/core/providers/WorkerProvider.ts +244 -0
  225. package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
  226. package/src/{server-auth → server/auth}/primitives/$auth.ts +7 -0
  227. package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +51 -8
  228. package/src/{server-cookies → server/cookies}/index.ts +2 -1
  229. package/src/server/{index.ts → core/index.ts} +7 -0
  230. package/src/server/{primitives → core/primitives}/$action.ts +10 -1
  231. package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +11 -5
  232. package/src/server/{providers → core/providers}/ServerRouterProvider.ts +13 -7
  233. package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
  234. package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
  235. package/src/thread/primitives/$thread.ts +2 -2
  236. package/src/vite/index.ts +0 -2
  237. package/src/vite/tasks/buildServer.ts +3 -4
  238. package/src/vite/tasks/copyAssets.ts +32 -8
  239. package/src/vite/tasks/generateCloudflare.ts +35 -19
  240. package/src/vite/tasks/generateDocker.ts +18 -4
  241. package/src/vite/tasks/generateSitemap.ts +5 -7
  242. package/src/vite/tasks/generateVercel.ts +76 -41
  243. package/src/vite/tasks/runAlepha.ts +16 -1
  244. package/src/websocket/providers/NodeWebSocketServerProvider.ts +3 -11
  245. package/src/websocket/services/WebSocketClient.ts +3 -3
  246. package/dist/api-files/index.browser.js.map +0 -1
  247. package/dist/api-files/index.js.map +0 -1
  248. package/dist/api-jobs/index.browser.js.map +0 -1
  249. package/dist/api-jobs/index.js.map +0 -1
  250. package/dist/api-notifications/index.browser.js.map +0 -1
  251. package/dist/api-notifications/index.d.ts +0 -327
  252. package/dist/api-notifications/index.js.map +0 -1
  253. package/dist/api-parameters/index.browser.js +0 -29
  254. package/dist/api-parameters/index.browser.js.map +0 -1
  255. package/dist/api-parameters/index.d.ts +0 -83
  256. package/dist/api-parameters/index.js +0 -63
  257. package/dist/api-parameters/index.js.map +0 -1
  258. package/dist/api-users/index.browser.js.map +0 -1
  259. package/dist/api-users/index.js.map +0 -1
  260. package/dist/api-verifications/index.browser.js.map +0 -1
  261. package/dist/api-verifications/index.d.ts +0 -229
  262. package/dist/api-verifications/index.js.map +0 -1
  263. package/dist/cache/index.js.map +0 -1
  264. package/dist/cache-redis/index.js.map +0 -1
  265. package/dist/cli/dist-BlfFtOk2.js +0 -2770
  266. package/dist/cli/dist-BlfFtOk2.js.map +0 -1
  267. package/dist/lock/index.js.map +0 -1
  268. package/dist/lock-redis/index.js.map +0 -1
  269. package/dist/queue/index.d.ts +0 -1265
  270. package/dist/queue/index.js +0 -1037
  271. package/dist/queue/index.js.map +0 -1
  272. package/dist/queue-redis/index.d.ts +0 -82
  273. package/dist/queue-redis/index.js +0 -872
  274. package/dist/queue-redis/index.js.map +0 -1
  275. package/dist/server/index.browser.js.map +0 -1
  276. package/dist/server/index.js.map +0 -1
  277. package/dist/server-auth/index.browser.js.map +0 -1
  278. package/dist/server-auth/index.js +0 -1943
  279. package/dist/server-auth/index.js.map +0 -1
  280. package/dist/server-cache/index.js.map +0 -1
  281. package/dist/server-compress/index.js.map +0 -1
  282. package/dist/server-cookies/index.browser.js.map +0 -1
  283. package/dist/server-cookies/index.js.map +0 -1
  284. package/dist/server-cors/index.js.map +0 -1
  285. package/dist/server-health/index.js.map +0 -1
  286. package/dist/server-helmet/index.js.map +0 -1
  287. package/dist/server-links/index.browser.js.map +0 -1
  288. package/dist/server-links/index.js.map +0 -1
  289. package/dist/server-metrics/index.js +0 -4532
  290. package/dist/server-metrics/index.js.map +0 -1
  291. package/dist/server-multipart/index.js.map +0 -1
  292. package/dist/server-proxy/index.js.map +0 -1
  293. package/dist/server-rate-limit/index.js.map +0 -1
  294. package/dist/server-security/index.browser.js.map +0 -1
  295. package/dist/server-security/index.js.map +0 -1
  296. package/dist/server-static/index.js.map +0 -1
  297. package/dist/server-swagger/index.js.map +0 -1
  298. package/dist/topic/index.js.map +0 -1
  299. package/dist/topic-redis/index.js.map +0 -1
  300. package/src/api-parameters/controllers/ParameterController.ts +0 -45
  301. package/src/api-parameters/entities/parameters.ts +0 -30
  302. package/src/api-parameters/index.ts +0 -21
  303. package/src/api-parameters/primitives/$config.ts +0 -79
  304. package/src/api-parameters/services/ParameterStore.ts +0 -23
  305. package/src/queue/interfaces/QueueJob.ts +0 -459
  306. package/src/queue/providers/MemoryQueueProvider.ts +0 -850
  307. package/src/queue/providers/QueueProvider.ts +0 -319
  308. package/src/queue/providers/WorkerProvider.ts +0 -344
  309. package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
  310. /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
  311. /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
  312. /package/src/{api-files → api/files}/entities/files.ts +0 -0
  313. /package/src/{api-files → api/files}/index.browser.ts +0 -0
  314. /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
  315. /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
  316. /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
  317. /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
  318. /package/src/{api-files → api/files}/services/FileService.ts +0 -0
  319. /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
  320. /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
  321. /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
  322. /package/src/{api-jobs → api/jobs}/index.ts +0 -0
  323. /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
  324. /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
  325. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
  326. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
  327. /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
  328. /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
  329. /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
  330. /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
  331. /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
  332. /package/src/{api-notifications → api/notifications}/index.ts +0 -0
  333. /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
  334. /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
  335. /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
  336. /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
  337. /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
  338. /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
  339. /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
  340. /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
  341. /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
  342. /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
  343. /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
  344. /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
  345. /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
  346. /package/src/{api-users → api/users}/entities/identities.ts +0 -0
  347. /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
  348. /package/src/{api-users → api/users}/entities/users.ts +0 -0
  349. /package/src/{api-users → api/users}/index.browser.ts +0 -0
  350. /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
  351. /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
  352. /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
  353. /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
  354. /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
  355. /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
  356. /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
  357. /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
  358. /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
  359. /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
  360. /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
  361. /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
  362. /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
  363. /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
  364. /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
  365. /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
  366. /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
  367. /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
  368. /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
  369. /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
  370. /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
  371. /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
  372. /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
  373. /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
  374. /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
  375. /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
  376. /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
  377. /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
  378. /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
  379. /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
  380. /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
  381. /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
  382. /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
  383. /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
  384. /package/src/cache/{index.ts → core/index.ts} +0 -0
  385. /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
  386. /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
  387. /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
  388. /package/src/{cache-redis → cache/redis}/index.ts +0 -0
  389. /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
  390. /package/src/lock/{index.ts → core/index.ts} +0 -0
  391. /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
  392. /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
  393. /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
  394. /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
  395. /package/src/{lock-redis → lock/redis}/index.ts +0 -0
  396. /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
  397. /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
  398. /package/src/{queue-redis → queue/redis}/index.ts +0 -0
  399. /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
  400. /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
  401. /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
  402. /package/src/{server-auth → server/auth}/index.ts +0 -0
  403. /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
  404. /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
  405. /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
  406. /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
  407. /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
  408. /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
  409. /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
  410. /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
  411. /package/src/{server-cache → server/cache}/index.ts +0 -0
  412. /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
  413. /package/src/{server-compress → server/compress}/index.ts +0 -0
  414. /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
  415. /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
  416. /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
  417. /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
  418. /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
  419. /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
  420. /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
  421. /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
  422. /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
  423. /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
  424. /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
  425. /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
  426. /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
  427. /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
  428. /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
  429. /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
  430. /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
  431. /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
  432. /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
  433. /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
  434. /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
  435. /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
  436. /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
  437. /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
  438. /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
  439. /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
  440. /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
  441. /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
  442. /package/src/server/{services → core/services}/HttpClient.ts +0 -0
  443. /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
  444. /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
  445. /package/src/{server-cors → server/cors}/index.ts +0 -0
  446. /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
  447. /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
  448. /package/src/{server-health → server/health}/index.ts +0 -0
  449. /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
  450. /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
  451. /package/src/{server-helmet → server/helmet}/index.ts +0 -0
  452. /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
  453. /package/src/{server-links → server/links}/index.browser.ts +0 -0
  454. /package/src/{server-links → server/links}/index.ts +0 -0
  455. /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
  456. /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
  457. /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
  458. /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
  459. /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
  460. /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
  461. /package/src/{server-metrics → server/metrics}/index.ts +0 -0
  462. /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
  463. /package/src/{server-multipart → server/multipart}/index.ts +0 -0
  464. /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
  465. /package/src/{server-proxy → server/proxy}/index.ts +0 -0
  466. /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
  467. /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
  468. /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
  469. /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
  470. /package/src/{server-security → server/security}/index.browser.ts +0 -0
  471. /package/src/{server-security → server/security}/index.ts +0 -0
  472. /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
  473. /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
  474. /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
  475. /package/src/{server-static → server/static}/index.ts +0 -0
  476. /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
  477. /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
  478. /package/src/{server-swagger → server/swagger}/index.ts +0 -0
  479. /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
  480. /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
  481. /package/src/topic/{index.ts → core/index.ts} +0 -0
  482. /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
  483. /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
  484. /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
  485. /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
  486. /package/src/{topic-redis → topic/redis}/index.ts +0 -0
  487. /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
@@ -1,872 +0,0 @@
1
- import { $env, $hook, $inject, $module, t } from "alepha";
2
- import { AlephaQueue, QueueProvider } from "alepha/queue";
3
- import { $logger } from "alepha/logger";
4
- import { RedisProvider } from "alepha/redis";
5
-
6
- //#region ../../src/queue-redis/providers/RedisQueueProvider.ts
7
- const DEFAULT_MAX_ATTEMPTS = 1;
8
- const DEFAULT_LOCK_DURATION = 3e4;
9
- const DEFAULT_BACKOFF_DELAY = 1e3;
10
- const DEFAULT_BACKOFF_MAX_DELAY = 3e4;
11
- const envSchema = t.object({ REDIS_QUEUE_PREFIX: t.text({ default: "queue" }) });
12
- const ACQUIRE_JOB_SCRIPT = `
13
- local waitingKey = KEYS[1]
14
- local activeKey = KEYS[2]
15
- local jobKeyPrefix = KEYS[3]
16
- local workerId = ARGV[1]
17
- local now = tonumber(ARGV[2])
18
- local lockDuration = tonumber(ARGV[3])
19
-
20
- -- Get highest priority job (lowest score)
21
- local jobs = redis.call('ZRANGE', waitingKey, 0, 0)
22
- if #jobs == 0 then
23
- return nil
24
- end
25
-
26
- local jobId = jobs[1]
27
- local jobKey = jobKeyPrefix .. ':' .. jobId
28
-
29
- -- Remove from waiting (atomic check)
30
- local removed = redis.call('ZREM', waitingKey, jobId)
31
- if removed == 0 then
32
- return nil
33
- end
34
-
35
- -- Get current job data
36
- local jobData = redis.call('HGETALL', jobKey)
37
- if #jobData == 0 then
38
- return nil
39
- end
40
-
41
- -- Parse job data into table
42
- local job = {}
43
- for i = 1, #jobData, 2 do
44
- job[jobData[i]] = jobData[i + 1]
45
- end
46
-
47
- -- Parse current state
48
- local state = cjson.decode(job['state'])
49
- local options = cjson.decode(job['options'])
50
-
51
- -- Update state
52
- state['status'] = 'active'
53
- state['attempts'] = state['attempts'] + 1
54
- state['lockedBy'] = workerId
55
- state['lockedUntil'] = now + (options['lockDuration'] or lockDuration)
56
- state['processedAt'] = now
57
-
58
- -- Save updated state
59
- redis.call('HSET', jobKey, 'state', cjson.encode(state))
60
-
61
- -- Add to active set
62
- redis.call('SADD', activeKey, jobId)
63
-
64
- -- Return job data
65
- return cjson.encode({
66
- id = job['id'],
67
- queue = job['queue'],
68
- payload = cjson.decode(job['payload']),
69
- options = options,
70
- state = state
71
- })
72
- `;
73
- const COMPLETE_JOB_SCRIPT = `
74
- local jobKey = KEYS[1]
75
- local activeKey = KEYS[2]
76
- local completedKey = KEYS[3]
77
- local jobId = ARGV[1]
78
- local now = tonumber(ARGV[2])
79
- local result = ARGV[3]
80
-
81
- -- Get job data
82
- local jobData = redis.call('HGETALL', jobKey)
83
- if #jobData == 0 then
84
- return nil
85
- end
86
-
87
- -- Parse job data
88
- local job = {}
89
- for i = 1, #jobData, 2 do
90
- job[jobData[i]] = jobData[i + 1]
91
- end
92
-
93
- local state = cjson.decode(job['state'])
94
- local options = cjson.decode(job['options'])
95
- local processedAt = state['processedAt'] or now
96
-
97
- -- Remove from active
98
- redis.call('SREM', activeKey, jobId)
99
-
100
- -- Update state
101
- state['status'] = 'completed'
102
- state['completedAt'] = now
103
- state['result'] = result ~= '' and cjson.decode(result) or nil
104
- state['lockedBy'] = nil
105
- state['lockedUntil'] = nil
106
-
107
- local removeOnComplete = options['removeOnComplete']
108
-
109
- if removeOnComplete == true then
110
- -- Remove job immediately
111
- redis.call('DEL', jobKey)
112
- return cjson.encode({ removed = true, duration = now - processedAt })
113
- else
114
- -- Update job state
115
- redis.call('HSET', jobKey, 'state', cjson.encode(state))
116
-
117
- -- Add to completed list (newest first)
118
- redis.call('LPUSH', completedKey, jobId)
119
-
120
- -- If removeOnComplete is a number, trim the list (0 means keep none)
121
- if type(removeOnComplete) == 'number' and removeOnComplete >= 0 then
122
- -- Get jobs to remove
123
- local toRemove = redis.call('LRANGE', completedKey, removeOnComplete, -1)
124
- for _, oldJobId in ipairs(toRemove) do
125
- redis.call('DEL', jobKey:gsub(jobId, oldJobId))
126
- end
127
- redis.call('LTRIM', completedKey, 0, removeOnComplete - 1)
128
- end
129
-
130
- return cjson.encode({ removed = false, duration = now - processedAt })
131
- end
132
- `;
133
- const FAIL_JOB_SCRIPT = `
134
- local jobKey = KEYS[1]
135
- local activeKey = KEYS[2]
136
- local delayedKey = KEYS[3]
137
- local failedKey = KEYS[4]
138
- local jobId = ARGV[1]
139
- local now = tonumber(ARGV[2])
140
- local errorMsg = ARGV[3]
141
- local stackTrace = ARGV[4]
142
- local backoffDelay = tonumber(ARGV[5])
143
-
144
- -- Get job data
145
- local jobData = redis.call('HGETALL', jobKey)
146
- if #jobData == 0 then
147
- return nil
148
- end
149
-
150
- -- Parse job data
151
- local job = {}
152
- for i = 1, #jobData, 2 do
153
- job[jobData[i]] = jobData[i + 1]
154
- end
155
-
156
- local state = cjson.decode(job['state'])
157
- local options = cjson.decode(job['options'])
158
-
159
- -- Remove from active
160
- redis.call('SREM', activeKey, jobId)
161
-
162
- local maxAttempts = options['maxAttempts'] or 1
163
- local hasMoreAttempts = state['attempts'] < maxAttempts
164
-
165
- if hasMoreAttempts then
166
- -- Schedule for retry
167
- state['status'] = 'delayed'
168
- state['availableAt'] = now + backoffDelay
169
- state['error'] = errorMsg
170
- state['stackTrace'] = stackTrace ~= '' and stackTrace or nil
171
- state['lockedBy'] = nil
172
- state['lockedUntil'] = nil
173
-
174
- redis.call('HSET', jobKey, 'state', cjson.encode(state))
175
- redis.call('ZADD', delayedKey, now + backoffDelay, jobId)
176
-
177
- return cjson.encode({ status = 'retrying', delay = backoffDelay, attempt = state['attempts'] + 1 })
178
- else
179
- -- Permanently failed
180
- state['status'] = 'failed'
181
- state['failedAt'] = now
182
- state['error'] = errorMsg
183
- state['stackTrace'] = stackTrace ~= '' and stackTrace or nil
184
- state['lockedBy'] = nil
185
- state['lockedUntil'] = nil
186
-
187
- local removeOnFail = options['removeOnFail']
188
-
189
- if removeOnFail == true then
190
- redis.call('DEL', jobKey)
191
- return cjson.encode({ status = 'failed', removed = true, attempts = state['attempts'] })
192
- else
193
- redis.call('HSET', jobKey, 'state', cjson.encode(state))
194
- redis.call('LPUSH', failedKey, jobId)
195
-
196
- if type(removeOnFail) == 'number' and removeOnFail >= 0 then
197
- local toRemove = redis.call('LRANGE', failedKey, removeOnFail, -1)
198
- for _, oldJobId in ipairs(toRemove) do
199
- redis.call('DEL', jobKey:gsub(jobId, oldJobId))
200
- end
201
- redis.call('LTRIM', failedKey, 0, removeOnFail - 1)
202
- end
203
-
204
- return cjson.encode({ status = 'failed', removed = false, attempts = state['attempts'] })
205
- end
206
- end
207
- `;
208
- /**
209
- * Redis-based queue provider with full job support.
210
- *
211
- * Features:
212
- * - Atomic job acquisition using Lua scripts
213
- * - Blocking wait using Redis BZPOPMIN (no polling)
214
- * - Event emission for job lifecycle
215
- * - removeOnComplete/removeOnFail support
216
- *
217
- * Uses the following Redis data structures:
218
- * - HASH `{prefix}:job:{queue}:{id}` - Job data
219
- * - ZSET `{prefix}:waiting:{queue}` - Waiting jobs (score = priority)
220
- * - ZSET `{prefix}:delayed:{queue}` - Delayed jobs (score = availableAt timestamp)
221
- * - SET `{prefix}:active:{queue}` - Active jobs
222
- * - LIST `{prefix}:completed:{queue}` - Completed jobs (newest first)
223
- * - LIST `{prefix}:failed:{queue}` - Failed jobs (newest first)
224
- * - LIST `{prefix}:messages:{queue}` - Simple message queue (backward compat)
225
- * - LIST `{prefix}:notify:{queue}` - Notification list for blocking wait
226
- */
227
- var RedisQueueProvider = class extends QueueProvider {
228
- log = $logger();
229
- env = $env(envSchema);
230
- redisProvider = $inject(RedisProvider);
231
- blockingClient;
232
- shouldStop = false;
233
- acquireJobSha;
234
- completeJobSha;
235
- failJobSha;
236
- start = $hook({
237
- on: "start",
238
- handler: async () => {
239
- this.shouldStop = false;
240
- this.blockingClient = this.redisProvider.duplicate();
241
- await this.blockingClient.connect();
242
- const redis = this.redisProvider.publisher;
243
- const acquireSha = await redis.scriptLoad(ACQUIRE_JOB_SCRIPT);
244
- const completeSha = await redis.scriptLoad(COMPLETE_JOB_SCRIPT);
245
- const failSha = await redis.scriptLoad(FAIL_JOB_SCRIPT);
246
- this.acquireJobSha = acquireSha.toString();
247
- this.completeJobSha = completeSha.toString();
248
- this.failJobSha = failSha.toString();
249
- }
250
- });
251
- stop = $hook({
252
- on: "stop",
253
- handler: async () => {
254
- this.shouldStop = true;
255
- if (this.blockingClient?.isOpen) await this.blockingClient.close();
256
- }
257
- });
258
- key(type, queue, id) {
259
- const base = `${this.env.REDIS_QUEUE_PREFIX}:${type}:${queue}`;
260
- return id ? `${base}:${id}` : base;
261
- }
262
- messageKey(queue) {
263
- return `${this.env.REDIS_QUEUE_PREFIX}:${queue}`;
264
- }
265
- notifyKey(queue) {
266
- return `${this.env.REDIS_QUEUE_PREFIX}:notify:${queue}`;
267
- }
268
- async push(queue, message) {
269
- await this.redisProvider.publisher.LPUSH(this.messageKey(queue), message);
270
- }
271
- async pop(queue) {
272
- const value = await this.redisProvider.publisher.RPOP(this.messageKey(queue));
273
- if (value == null) return void 0;
274
- return String(value);
275
- }
276
- async popBlocking(queues, timeoutSeconds) {
277
- if (queues.length === 0 || !this.blockingClient) return;
278
- const prefixedQueues = queues.map((q) => this.messageKey(q));
279
- const result = await this.blockingClient.BRPOP(prefixedQueues, timeoutSeconds);
280
- if (result == null) return void 0;
281
- const key = result.key.toString();
282
- const prefixLength = this.env.REDIS_QUEUE_PREFIX.length + 1;
283
- return {
284
- queue: key.substring(prefixLength),
285
- message: result.element.toString()
286
- };
287
- }
288
- async generateJobId() {
289
- return `job_${await this.redisProvider.publisher.INCR(`${this.env.REDIS_QUEUE_PREFIX}:job_counter`)}_${Date.now()}`;
290
- }
291
- serializeJob(job) {
292
- return {
293
- id: job.id,
294
- queue: job.queue,
295
- payload: JSON.stringify(job.payload),
296
- options: JSON.stringify(job.options),
297
- state: JSON.stringify(job.state)
298
- };
299
- }
300
- deserializeJob(data) {
301
- if (!data.id) return void 0;
302
- return {
303
- id: data.id,
304
- queue: data.queue,
305
- payload: JSON.parse(data.payload),
306
- options: JSON.parse(data.options),
307
- state: JSON.parse(data.state)
308
- };
309
- }
310
- async addJob(queue, payload, options) {
311
- const redis = this.redisProvider.publisher;
312
- const now = Date.now();
313
- const delay = options?.delay ?? 0;
314
- const isDelayed = delay > 0;
315
- const job = {
316
- id: await this.generateJobId(),
317
- queue,
318
- payload,
319
- options: {
320
- priority: options?.priority ?? 0,
321
- delay: options?.delay ?? 0,
322
- maxAttempts: options?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
323
- backoff: options?.backoff,
324
- lockDuration: options?.lockDuration ?? DEFAULT_LOCK_DURATION,
325
- removeOnComplete: options?.removeOnComplete,
326
- removeOnFail: options?.removeOnFail
327
- },
328
- state: {
329
- status: isDelayed ? "delayed" : "waiting",
330
- attempts: 0,
331
- createdAt: now,
332
- availableAt: isDelayed ? now + delay : now
333
- }
334
- };
335
- await redis.HSET(this.key("job", queue, job.id), this.serializeJob(job));
336
- if (isDelayed) await redis.ZADD(this.key("delayed", queue), {
337
- score: job.state.availableAt,
338
- value: job.id
339
- });
340
- else {
341
- await redis.ZADD(this.key("waiting", queue), {
342
- score: job.options.priority ?? 0,
343
- value: job.id
344
- });
345
- await redis.LPUSH(this.notifyKey(queue), job.id);
346
- }
347
- this.log.debug(`Added job ${job.id} to queue ${queue}`, {
348
- status: job.state.status,
349
- priority: job.options.priority
350
- });
351
- if (!isDelayed) await this.emit({
352
- type: "waiting",
353
- queue,
354
- jobId: job.id,
355
- timestamp: now,
356
- job
357
- });
358
- return job;
359
- }
360
- async acquireJob(queues, workerId, timeoutSeconds) {
361
- if (!this.blockingClient || this.shouldStop) return;
362
- const redis = this.redisProvider.publisher;
363
- const endTime = Date.now() + timeoutSeconds * 1e3;
364
- while (Date.now() < endTime && !this.shouldStop) {
365
- for (const queue of queues) try {
366
- const result = await redis.evalSha(this.acquireJobSha, {
367
- keys: [
368
- this.key("waiting", queue),
369
- this.key("active", queue),
370
- this.key("job", queue)
371
- ],
372
- arguments: [
373
- workerId,
374
- String(Date.now()),
375
- String(DEFAULT_LOCK_DURATION)
376
- ]
377
- });
378
- if (result) {
379
- const job = JSON.parse(result);
380
- this.log.debug(`Worker ${workerId} acquired job ${job.id}`, {
381
- queue,
382
- attempt: job.state.attempts
383
- });
384
- await this.emit({
385
- type: "active",
386
- queue,
387
- jobId: job.id,
388
- timestamp: Date.now(),
389
- workerId,
390
- attempt: job.state.attempts
391
- });
392
- return {
393
- queue,
394
- job
395
- };
396
- }
397
- } catch (error) {
398
- this.log.warn(`Failed to acquire job from ${queue}`, error);
399
- }
400
- const notifyKeys = queues.map((q) => this.notifyKey(q));
401
- const remainingTimeout = Math.max(1, Math.ceil((endTime - Date.now()) / 1e3));
402
- try {
403
- if (await this.blockingClient.BRPOP(notifyKeys, Math.min(remainingTimeout, 5))) {}
404
- } catch {
405
- if (this.shouldStop) return;
406
- }
407
- }
408
- }
409
- bufferRecordToString(record) {
410
- const result = {};
411
- for (const [key, value] of Object.entries(record)) result[key] = value?.toString() ?? "";
412
- return result;
413
- }
414
- async completeJob(queue, jobId, result) {
415
- const redis = this.redisProvider.publisher;
416
- const now = Date.now();
417
- try {
418
- const luaResult = await redis.evalSha(this.completeJobSha, {
419
- keys: [
420
- this.key("job", queue, jobId),
421
- this.key("active", queue),
422
- this.key("completed", queue)
423
- ],
424
- arguments: [
425
- jobId,
426
- String(now),
427
- result !== void 0 ? JSON.stringify(result) : ""
428
- ]
429
- });
430
- if (!luaResult) {
431
- this.log.warn(`Attempted to complete unknown job ${jobId}`);
432
- return;
433
- }
434
- const { removed, duration } = JSON.parse(luaResult);
435
- this.log.debug(`Job ${jobId} completed${removed ? " and removed" : ""}`, {
436
- queue,
437
- result
438
- });
439
- await this.emit({
440
- type: "completed",
441
- queue,
442
- jobId,
443
- timestamp: now,
444
- result,
445
- duration
446
- });
447
- } catch (error) {
448
- this.log.warn(`Lua completeJob failed, using fallback`, error);
449
- await this.completeJobFallback(queue, jobId, result);
450
- }
451
- }
452
- async completeJobFallback(queue, jobId, result) {
453
- const redis = this.redisProvider.publisher;
454
- const now = Date.now();
455
- const jobData = await redis.HGETALL(this.key("job", queue, jobId));
456
- const job = this.deserializeJob(this.bufferRecordToString(jobData));
457
- if (!job) {
458
- this.log.warn(`Attempted to complete unknown job ${jobId}`);
459
- return;
460
- }
461
- const duration = now - (job.state.processedAt ?? now);
462
- await redis.SREM(this.key("active", queue), jobId);
463
- job.state.status = "completed";
464
- job.state.completedAt = now;
465
- job.state.result = result;
466
- job.state.lockedBy = void 0;
467
- job.state.lockedUntil = void 0;
468
- const removeOnComplete = job.options.removeOnComplete;
469
- if (removeOnComplete === true) await redis.DEL(this.key("job", queue, jobId));
470
- else {
471
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
472
- await redis.LPUSH(this.key("completed", queue), jobId);
473
- if (typeof removeOnComplete === "number" && removeOnComplete >= 0) await this.cleanJobs(queue, "completed", { maxCount: removeOnComplete });
474
- }
475
- this.log.debug(`Job ${jobId} completed`, { queue });
476
- await this.emit({
477
- type: "completed",
478
- queue,
479
- jobId,
480
- timestamp: now,
481
- result,
482
- duration
483
- });
484
- }
485
- async failJob(queue, jobId, error, stackTrace) {
486
- const redis = this.redisProvider.publisher;
487
- const now = Date.now();
488
- const jobData = await redis.HGETALL(this.key("job", queue, jobId));
489
- const job = this.deserializeJob(this.bufferRecordToString(jobData));
490
- if (!job) {
491
- this.log.warn(`Attempted to fail unknown job ${jobId}`);
492
- return;
493
- }
494
- const backoffDelay = this.calculateBackoff(job);
495
- try {
496
- const luaResult = await redis.evalSha(this.failJobSha, {
497
- keys: [
498
- this.key("job", queue, jobId),
499
- this.key("active", queue),
500
- this.key("delayed", queue),
501
- this.key("failed", queue)
502
- ],
503
- arguments: [
504
- jobId,
505
- String(now),
506
- error,
507
- stackTrace ?? "",
508
- String(backoffDelay)
509
- ]
510
- });
511
- if (!luaResult) {
512
- this.log.warn(`Attempted to fail unknown job ${jobId}`);
513
- return;
514
- }
515
- const result = JSON.parse(luaResult);
516
- if (result.status === "retrying") {
517
- this.log.debug(`Job ${jobId} failed, will retry in ${result.delay}ms`, {
518
- queue,
519
- attempt: job.state.attempts,
520
- error
521
- });
522
- await this.emit({
523
- type: "retrying",
524
- queue,
525
- jobId,
526
- timestamp: now,
527
- error,
528
- attempt: result.attempt,
529
- delay: result.delay
530
- });
531
- } else {
532
- this.log.debug(`Job ${jobId} permanently failed${result.removed ? " and removed" : ""}`, {
533
- queue,
534
- error
535
- });
536
- await this.emit({
537
- type: "failed",
538
- queue,
539
- jobId,
540
- timestamp: now,
541
- error,
542
- stackTrace,
543
- attempts: result.attempts
544
- });
545
- }
546
- } catch (luaError) {
547
- this.log.warn(`Lua failJob failed, using fallback`, luaError);
548
- await this.failJobFallback(queue, jobId, error, stackTrace);
549
- }
550
- }
551
- async failJobFallback(queue, jobId, error, stackTrace) {
552
- const redis = this.redisProvider.publisher;
553
- const now = Date.now();
554
- const jobData = await redis.HGETALL(this.key("job", queue, jobId));
555
- const job = this.deserializeJob(this.bufferRecordToString(jobData));
556
- if (!job) {
557
- this.log.warn(`Attempted to fail unknown job ${jobId}`);
558
- return;
559
- }
560
- await redis.SREM(this.key("active", queue), jobId);
561
- const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
562
- if (job.state.attempts < maxAttempts) {
563
- const backoffDelay = this.calculateBackoff(job);
564
- job.state.status = "delayed";
565
- job.state.availableAt = now + backoffDelay;
566
- job.state.error = error;
567
- job.state.stackTrace = stackTrace;
568
- job.state.lockedBy = void 0;
569
- job.state.lockedUntil = void 0;
570
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
571
- await redis.ZADD(this.key("delayed", queue), {
572
- score: job.state.availableAt,
573
- value: jobId
574
- });
575
- this.log.debug(`Job ${jobId} failed, will retry in ${backoffDelay}ms`, {
576
- queue,
577
- attempt: job.state.attempts,
578
- maxAttempts
579
- });
580
- await this.emit({
581
- type: "retrying",
582
- queue,
583
- jobId,
584
- timestamp: now,
585
- error,
586
- attempt: job.state.attempts + 1,
587
- delay: backoffDelay
588
- });
589
- } else {
590
- job.state.status = "failed";
591
- job.state.failedAt = now;
592
- job.state.error = error;
593
- job.state.stackTrace = stackTrace;
594
- job.state.lockedBy = void 0;
595
- job.state.lockedUntil = void 0;
596
- const removeOnFail = job.options.removeOnFail;
597
- if (removeOnFail === true) await redis.DEL(this.key("job", queue, jobId));
598
- else {
599
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
600
- await redis.LPUSH(this.key("failed", queue), jobId);
601
- if (typeof removeOnFail === "number" && removeOnFail >= 0) await this.cleanJobs(queue, "failed", { maxCount: removeOnFail });
602
- }
603
- this.log.debug(`Job ${jobId} permanently failed`, { queue });
604
- await this.emit({
605
- type: "failed",
606
- queue,
607
- jobId,
608
- timestamp: now,
609
- error,
610
- stackTrace,
611
- attempts: job.state.attempts
612
- });
613
- }
614
- }
615
- calculateBackoff(job) {
616
- const backoff = job.options.backoff;
617
- const attempt = job.state.attempts;
618
- if (!backoff) return DEFAULT_BACKOFF_DELAY;
619
- const baseDelay = backoff.delay ?? DEFAULT_BACKOFF_DELAY;
620
- const maxDelay = backoff.maxDelay ?? DEFAULT_BACKOFF_MAX_DELAY;
621
- if (backoff.type === "fixed") return baseDelay;
622
- const exponentialDelay = baseDelay * 2 ** (attempt - 1);
623
- return Math.min(exponentialDelay, maxDelay);
624
- }
625
- async renewJobLock(queue, jobId, workerId) {
626
- const redis = this.redisProvider.publisher;
627
- const jobData = await redis.HGETALL(this.key("job", queue, jobId));
628
- const job = this.deserializeJob(this.bufferRecordToString(jobData));
629
- if (!job || job.state.lockedBy !== workerId) return false;
630
- job.state.lockedUntil = Date.now() + (job.options.lockDuration ?? DEFAULT_LOCK_DURATION);
631
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
632
- return true;
633
- }
634
- async getJob(queue, jobId) {
635
- const jobData = await this.redisProvider.publisher.HGETALL(this.key("job", queue, jobId));
636
- return this.deserializeJob(this.bufferRecordToString(jobData));
637
- }
638
- async getJobs(queue, status, options) {
639
- const redis = this.redisProvider.publisher;
640
- const limit = options?.limit ?? 100;
641
- const offset = options?.offset ?? 0;
642
- let jobIds;
643
- switch (status) {
644
- case "waiting":
645
- jobIds = (await redis.ZRANGE(this.key("waiting", queue), offset, offset + limit - 1)).map((r) => r.toString());
646
- break;
647
- case "delayed":
648
- jobIds = (await redis.ZRANGE(this.key("delayed", queue), offset, offset + limit - 1)).map((r) => r.toString());
649
- break;
650
- case "active":
651
- jobIds = (await redis.SMEMBERS(this.key("active", queue))).map((r) => r.toString()).slice(offset, offset + limit);
652
- break;
653
- case "completed":
654
- jobIds = (await redis.LRANGE(this.key("completed", queue), offset, offset + limit - 1)).map((r) => r.toString());
655
- break;
656
- case "failed":
657
- jobIds = (await redis.LRANGE(this.key("failed", queue), offset, offset + limit - 1)).map((r) => r.toString());
658
- break;
659
- default: jobIds = [];
660
- }
661
- const jobs = [];
662
- for (const jobId of jobIds) {
663
- const job = await this.getJob(queue, jobId);
664
- if (job) jobs.push(job);
665
- }
666
- return jobs;
667
- }
668
- async getJobCounts(queue) {
669
- const redis = this.redisProvider.publisher;
670
- const [waiting, delayed, active, completed, failed] = await Promise.all([
671
- redis.ZCARD(this.key("waiting", queue)),
672
- redis.ZCARD(this.key("delayed", queue)),
673
- redis.SCARD(this.key("active", queue)),
674
- redis.LLEN(this.key("completed", queue)),
675
- redis.LLEN(this.key("failed", queue))
676
- ]);
677
- return {
678
- waiting,
679
- delayed,
680
- active,
681
- completed,
682
- failed
683
- };
684
- }
685
- async promoteDelayedJobs(queue) {
686
- const redis = this.redisProvider.publisher;
687
- const now = Date.now();
688
- const results = await redis.ZRANGEBYSCORE(this.key("delayed", queue), "-inf", now);
689
- let promoted = 0;
690
- for (const result of results) {
691
- const jobId = result.toString();
692
- if (await redis.ZREM(this.key("delayed", queue), jobId) === 0) continue;
693
- const job = await this.getJob(queue, jobId);
694
- if (!job) continue;
695
- job.state.status = "waiting";
696
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
697
- await redis.ZADD(this.key("waiting", queue), {
698
- score: job.options.priority ?? 0,
699
- value: jobId
700
- });
701
- await redis.LPUSH(this.notifyKey(queue), jobId);
702
- promoted++;
703
- this.log.debug(`Promoted delayed job ${jobId}`, { queue });
704
- await this.emit({
705
- type: "waiting",
706
- queue,
707
- jobId,
708
- timestamp: now,
709
- job
710
- });
711
- }
712
- return promoted;
713
- }
714
- async recoverStalledJobs(queue, stalledThresholdMs) {
715
- const redis = this.redisProvider.publisher;
716
- const now = Date.now();
717
- const activeJobIds = await redis.SMEMBERS(this.key("active", queue));
718
- const stalledJobIds = [];
719
- for (const result of activeJobIds) {
720
- const jobId = result.toString();
721
- const job = await this.getJob(queue, jobId);
722
- if (!job) continue;
723
- if (!((job.state.lockedUntil ?? 0) + stalledThresholdMs < now)) continue;
724
- stalledJobIds.push(jobId);
725
- const workerId = job.state.lockedBy;
726
- await redis.SREM(this.key("active", queue), jobId);
727
- const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
728
- const hasMoreAttempts = job.state.attempts < maxAttempts;
729
- await this.emit({
730
- type: "stalled",
731
- queue,
732
- jobId,
733
- timestamp: now,
734
- workerId,
735
- willRetry: hasMoreAttempts
736
- });
737
- if (hasMoreAttempts) {
738
- job.state.status = "waiting";
739
- job.state.lockedBy = void 0;
740
- job.state.lockedUntil = void 0;
741
- job.state.error = "Job stalled (worker timeout)";
742
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
743
- await redis.ZADD(this.key("waiting", queue), {
744
- score: job.options.priority ?? 0,
745
- value: jobId
746
- });
747
- await redis.LPUSH(this.notifyKey(queue), jobId);
748
- this.log.warn(`Recovered stalled job ${jobId}`, { queue });
749
- await this.emit({
750
- type: "waiting",
751
- queue,
752
- jobId,
753
- timestamp: now,
754
- job
755
- });
756
- } else {
757
- job.state.status = "failed";
758
- job.state.failedAt = now;
759
- job.state.lockedBy = void 0;
760
- job.state.lockedUntil = void 0;
761
- job.state.error = "Job stalled (worker timeout) - max attempts exceeded";
762
- const removeOnFail = job.options.removeOnFail;
763
- if (removeOnFail === true) await redis.DEL(this.key("job", queue, jobId));
764
- else {
765
- await redis.HSET(this.key("job", queue, jobId), { state: JSON.stringify(job.state) });
766
- await redis.LPUSH(this.key("failed", queue), jobId);
767
- if (typeof removeOnFail === "number" && removeOnFail >= 0) await this.cleanJobs(queue, "failed", { maxCount: removeOnFail });
768
- }
769
- this.log.warn(`Stalled job ${jobId} permanently failed`, { queue });
770
- await this.emit({
771
- type: "failed",
772
- queue,
773
- jobId,
774
- timestamp: now,
775
- error: job.state.error,
776
- attempts: job.state.attempts
777
- });
778
- }
779
- }
780
- return stalledJobIds;
781
- }
782
- async cleanJobs(queue, status, options) {
783
- const redis = this.redisProvider.publisher;
784
- const listKey = this.key(status, queue);
785
- const maxAge = options?.maxAge;
786
- const maxCount = options?.maxCount;
787
- let removed = 0;
788
- if (maxAge !== void 0) {
789
- const cutoff = Date.now() - maxAge;
790
- const jobIds = await redis.LRANGE(listKey, 0, -1);
791
- for (const result of jobIds) {
792
- const jobId = result.toString();
793
- const job = await this.getJob(queue, jobId);
794
- if (!job) continue;
795
- const timestamp = status === "completed" ? job.state.completedAt : job.state.failedAt;
796
- if (timestamp && timestamp < cutoff) {
797
- await redis.LREM(listKey, 1, jobId);
798
- await redis.DEL(this.key("job", queue, jobId));
799
- removed++;
800
- }
801
- }
802
- }
803
- if (maxCount !== void 0) {
804
- if (await redis.LLEN(listKey) > maxCount) {
805
- const toRemove = await redis.LRANGE(listKey, maxCount, -1);
806
- for (const result of toRemove) {
807
- const jobId = result.toString();
808
- await redis.DEL(this.key("job", queue, jobId));
809
- removed++;
810
- }
811
- await redis.LTRIM(listKey, 0, maxCount - 1);
812
- }
813
- }
814
- return removed;
815
- }
816
- async removeJob(queue, jobId) {
817
- const redis = this.redisProvider.publisher;
818
- const job = await this.getJob(queue, jobId);
819
- if (!job) return;
820
- const previousStatus = job.state.status;
821
- switch (job.state.status) {
822
- case "waiting":
823
- await redis.ZREM(this.key("waiting", queue), jobId);
824
- break;
825
- case "delayed":
826
- await redis.ZREM(this.key("delayed", queue), jobId);
827
- break;
828
- case "active":
829
- await redis.SREM(this.key("active", queue), jobId);
830
- break;
831
- case "completed":
832
- await redis.LREM(this.key("completed", queue), 1, jobId);
833
- break;
834
- case "failed":
835
- await redis.LREM(this.key("failed", queue), 1, jobId);
836
- break;
837
- }
838
- await redis.DEL(this.key("job", queue, jobId));
839
- await this.emit({
840
- type: "removed",
841
- queue,
842
- jobId,
843
- timestamp: Date.now(),
844
- previousStatus
845
- });
846
- }
847
- cancelWaiters() {
848
- this.shouldStop = true;
849
- }
850
- };
851
-
852
- //#endregion
853
- //#region ../../src/queue-redis/index.ts
854
- /**
855
- * Plugin for Alepha Queue that provides Redis queue capabilities.
856
- *
857
- * @see {@link RedisQueueProvider}
858
- * @module alepha.queue.redis
859
- */
860
- const AlephaQueueRedis = $module({
861
- name: "alepha.queue.redis",
862
- services: [RedisQueueProvider],
863
- register: (alepha) => alepha.with({
864
- optional: true,
865
- provide: QueueProvider,
866
- use: RedisQueueProvider
867
- }).with(AlephaQueue)
868
- });
869
-
870
- //#endregion
871
- export { AlephaQueueRedis, RedisQueueProvider };
872
- //# sourceMappingURL=index.js.map