alepha 0.13.7 → 0.14.0

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