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,319 +0,0 @@
1
- import type {
2
- QueueAcquiredJob,
3
- QueueCleanOptions,
4
- QueueEvent,
5
- QueueEventHandler,
6
- QueueEventMap,
7
- QueueEventType,
8
- QueueGetJobsOptions,
9
- QueueJob,
10
- QueueJobCounts,
11
- QueueJobOptions,
12
- QueueJobStatus,
13
- } from "../interfaces/QueueJob.ts";
14
-
15
- /**
16
- * Queue provider interface supporting both simple message-based and advanced job-based operations.
17
- *
18
- * The simple API (push/pop/popBlocking) is for basic fire-and-forget messaging.
19
- * The job API provides crash recovery, retries, delayed jobs, priorities, and job history.
20
- */
21
- export abstract class QueueProvider {
22
- // ===========================================
23
- // Event System
24
- // ===========================================
25
-
26
- protected eventHandlers: Map<
27
- QueueEventType | "*",
28
- Set<QueueEventHandler<QueueEvent>>
29
- > = new Map();
30
-
31
- /**
32
- * Subscribe to queue events.
33
- *
34
- * @param event Event type to listen for, or "*" for all events.
35
- * @param handler Handler function to call when event occurs.
36
- * @returns Unsubscribe function.
37
- *
38
- * @example
39
- * ```ts
40
- * // Listen for completed events
41
- * const unsubscribe = provider.on("completed", (event) => {
42
- * console.log(`Job ${event.jobId} completed in ${event.duration}ms`);
43
- * });
44
- *
45
- * // Listen for all events
46
- * provider.on("*", (event) => {
47
- * console.log(`Event: ${event.type} for job ${event.jobId}`);
48
- * });
49
- *
50
- * // Unsubscribe later
51
- * unsubscribe();
52
- * ```
53
- */
54
- public on<T extends QueueEventType>(
55
- event: T,
56
- handler: QueueEventHandler<QueueEventMap[T]>,
57
- ): () => void;
58
- public on(event: "*", handler: QueueEventHandler<QueueEvent>): () => void;
59
- public on(
60
- event: QueueEventType | "*",
61
- handler: QueueEventHandler<QueueEvent>,
62
- ): () => void {
63
- if (!this.eventHandlers.has(event)) {
64
- this.eventHandlers.set(event, new Set());
65
- }
66
- this.eventHandlers.get(event)!.add(handler);
67
-
68
- return () => {
69
- this.eventHandlers.get(event)?.delete(handler);
70
- };
71
- }
72
-
73
- /**
74
- * Emit a queue event to all registered handlers.
75
- *
76
- * @param event The event to emit.
77
- */
78
- protected async emit(event: QueueEvent): Promise<void> {
79
- const handlers = [
80
- ...(this.eventHandlers.get(event.type) ?? []),
81
- ...(this.eventHandlers.get("*") ?? []),
82
- ];
83
-
84
- await Promise.all(handlers.map((handler) => handler(event)));
85
- }
86
- // ===========================================
87
- // Simple Message API (backward compatible)
88
- // ===========================================
89
-
90
- /**
91
- * Push a message to the queue.
92
- *
93
- * @param queue Name of the queue to push the message to.
94
- * @param message String message to be pushed to the queue.
95
- */
96
- public abstract push(queue: string, message: string): Promise<void>;
97
-
98
- /**
99
- * Pop a message from the queue.
100
- *
101
- * @param queue Name of the queue to pop the message from.
102
- * @returns The message popped or `undefined` if the queue is empty.
103
- */
104
- public abstract pop(queue: string): Promise<string | undefined>;
105
-
106
- /**
107
- * Pop a message from one of the specified queues, blocking until available or timeout.
108
- *
109
- * @param queues Array of queue names to listen on.
110
- * @param timeoutSeconds Maximum time to wait in seconds.
111
- * @returns Object with queue name and message, or `undefined` if timeout expired.
112
- */
113
- public abstract popBlocking(
114
- queues: string[],
115
- timeoutSeconds: number,
116
- ): Promise<{ queue: string; message: string } | undefined>;
117
-
118
- // ===========================================
119
- // Job-based API (advanced features)
120
- // ===========================================
121
-
122
- /**
123
- * Add a job to the queue.
124
- *
125
- * @param queue Queue name.
126
- * @param payload Job data to process.
127
- * @param options Job options (priority, delay, retries, etc.).
128
- * @returns The created job.
129
- */
130
- public abstract addJob<T>(
131
- queue: string,
132
- payload: T,
133
- options?: QueueJobOptions,
134
- ): Promise<QueueJob<T>>;
135
-
136
- /**
137
- * Acquire the next available job for processing.
138
- *
139
- * This atomically:
140
- * 1. Finds the highest priority job that is ready for processing
141
- * 2. Moves it to "active" status
142
- * 3. Sets a lock with the worker ID
143
- *
144
- * @param queues Queue names to check (in order of preference).
145
- * @param workerId Unique identifier for the worker acquiring the job.
146
- * @param timeoutSeconds Maximum time to wait for a job.
147
- * @returns The acquired job or undefined if timeout.
148
- */
149
- public abstract acquireJob(
150
- queues: string[],
151
- workerId: string,
152
- timeoutSeconds: number,
153
- ): Promise<QueueAcquiredJob | undefined>;
154
-
155
- /**
156
- * Mark a job as completed successfully.
157
- *
158
- * @param queue Queue name.
159
- * @param jobId Job ID.
160
- * @param result Optional result data from processing.
161
- */
162
- public abstract completeJob(
163
- queue: string,
164
- jobId: string,
165
- result?: unknown,
166
- ): Promise<void>;
167
-
168
- /**
169
- * Mark a job as failed.
170
- *
171
- * If the job has remaining retry attempts, it will be moved to "delayed" status
172
- * (for backoff) or "waiting" status. Otherwise, it will be moved to "failed" status.
173
- *
174
- * @param queue Queue name.
175
- * @param jobId Job ID.
176
- * @param error Error message.
177
- * @param stackTrace Optional stack trace.
178
- */
179
- public abstract failJob(
180
- queue: string,
181
- jobId: string,
182
- error: string,
183
- stackTrace?: string,
184
- ): Promise<void>;
185
-
186
- /**
187
- * Extend the lock on an active job.
188
- *
189
- * Workers should call this periodically while processing long-running jobs
190
- * to prevent them from being considered stalled.
191
- *
192
- * @param queue Queue name.
193
- * @param jobId Job ID.
194
- * @param workerId Worker ID (must match the lock holder).
195
- * @returns True if lock was extended, false if job is not locked by this worker.
196
- */
197
- public abstract renewJobLock(
198
- queue: string,
199
- jobId: string,
200
- workerId: string,
201
- ): Promise<boolean>;
202
-
203
- /**
204
- * Get a job by ID.
205
- *
206
- * @param queue Queue name.
207
- * @param jobId Job ID.
208
- * @returns The job or undefined if not found.
209
- */
210
- public abstract getJob(
211
- queue: string,
212
- jobId: string,
213
- ): Promise<QueueJob | undefined>;
214
-
215
- /**
216
- * Get jobs by status.
217
- *
218
- * @param queue Queue name.
219
- * @param status Job status to filter by.
220
- * @param options Pagination options.
221
- * @returns Array of jobs.
222
- */
223
- public abstract getJobs(
224
- queue: string,
225
- status: QueueJobStatus,
226
- options?: QueueGetJobsOptions,
227
- ): Promise<QueueJob[]>;
228
-
229
- /**
230
- * Get job counts by status.
231
- *
232
- * @param queue Queue name.
233
- * @returns Object with counts for each status.
234
- */
235
- public abstract getJobCounts(queue: string): Promise<QueueJobCounts>;
236
-
237
- /**
238
- * Promote delayed jobs that are ready for processing.
239
- *
240
- * Moves jobs from "delayed" to "waiting" status when their availableAt time has passed.
241
- *
242
- * @param queue Queue name.
243
- * @returns Number of jobs promoted.
244
- */
245
- public abstract promoteDelayedJobs(queue: string): Promise<number>;
246
-
247
- /**
248
- * Recover stalled jobs.
249
- *
250
- * Finds jobs in "active" status whose locks have expired and either:
251
- * - Moves them back to "waiting" for retry (if attempts remaining)
252
- * - Moves them to "failed" (if no attempts remaining)
253
- *
254
- * @param queue Queue name.
255
- * @param stalledThresholdMs Jobs with expired locks older than this are considered stalled.
256
- * @returns Array of recovered job IDs.
257
- */
258
- public abstract recoverStalledJobs(
259
- queue: string,
260
- stalledThresholdMs: number,
261
- ): Promise<string[]>;
262
-
263
- /**
264
- * Remove old completed or failed jobs.
265
- *
266
- * @param queue Queue name.
267
- * @param status Status to clean ("completed" or "failed").
268
- * @param options Cleaning options (maxAge, maxCount).
269
- * @returns Number of jobs removed.
270
- */
271
- public abstract cleanJobs(
272
- queue: string,
273
- status: "completed" | "failed",
274
- options?: QueueCleanOptions,
275
- ): Promise<number>;
276
-
277
- /**
278
- * Remove a specific job.
279
- *
280
- * @param queue Queue name.
281
- * @param jobId Job ID.
282
- */
283
- public abstract removeJob(queue: string, jobId: string): Promise<void>;
284
-
285
- /**
286
- * Cancel all pending waiters.
287
- *
288
- * This is called during shutdown to immediately release all blocking
289
- * acquireJob calls, preventing shutdown delays.
290
- */
291
- public abstract cancelWaiters(): void;
292
- }
293
-
294
- // Re-export types for convenience
295
- export type {
296
- QueueAcquiredJob,
297
- QueueAddJobOptions,
298
- QueueCleanOptions,
299
- QueueEvent,
300
- QueueEventActive,
301
- QueueEventBase,
302
- QueueEventCompleted,
303
- QueueEventFailed,
304
- QueueEventHandler,
305
- QueueEventMap,
306
- QueueEventProgress,
307
- QueueEventRemoved,
308
- QueueEventRetrying,
309
- QueueEventStalled,
310
- QueueEventType,
311
- QueueEventWaiting,
312
- QueueGetJobsOptions,
313
- QueueJob,
314
- QueueJobBackoff,
315
- QueueJobCounts,
316
- QueueJobOptions,
317
- QueueJobState,
318
- QueueJobStatus,
319
- } from "../interfaces/QueueJob.ts";
@@ -1,344 +0,0 @@
1
- import {
2
- $env,
3
- $hook,
4
- $inject,
5
- Alepha,
6
- type Static,
7
- type TSchema,
8
- t,
9
- } from "alepha";
10
- import { DateTimeProvider } from "alepha/datetime";
11
- import { $logger } from "alepha/logger";
12
- import type { QueueAcquiredJob } from "../interfaces/QueueJob.ts";
13
- import { $consumer } from "../primitives/$consumer.ts";
14
- import {
15
- $queue,
16
- type QueueMessage,
17
- type QueuePrimitive,
18
- } from "../primitives/$queue.ts";
19
- import { QueueProvider } from "./QueueProvider.ts";
20
-
21
- const envSchema = t.object({
22
- /**
23
- * The timeout in seconds for blocking job acquisition.
24
- * Workers will check for shutdown after each timeout period.
25
- */
26
- QUEUE_WORKER_BLOCKING_TIMEOUT: t.integer({
27
- default: 5,
28
- }),
29
- /**
30
- * The number of workers to run concurrently. Defaults to 1.
31
- * Useful only if you are doing a lot of I/O.
32
- */
33
- QUEUE_WORKER_CONCURRENCY: t.integer({
34
- default: 1,
35
- }),
36
- /**
37
- * Interval in milliseconds for renewing job locks during processing.
38
- * Should be less than the job's lock duration.
39
- */
40
- QUEUE_WORKER_LOCK_RENEWAL_INTERVAL: t.integer({
41
- default: 10000, // 10 seconds
42
- }),
43
- /**
44
- * Interval in milliseconds for the scheduler to check delayed jobs and stalled jobs.
45
- */
46
- QUEUE_SCHEDULER_INTERVAL: t.integer({
47
- default: 5000, // 5 seconds
48
- }),
49
- /**
50
- * Threshold in milliseconds after lock expiration to consider a job stalled.
51
- */
52
- QUEUE_STALLED_THRESHOLD: t.integer({
53
- default: 5000, // 5 seconds grace period after lock expires
54
- }),
55
- });
56
-
57
- declare module "alepha" {
58
- interface Env extends Partial<Static<typeof envSchema>> {}
59
- }
60
-
61
- export class WorkerProvider {
62
- protected readonly log = $logger();
63
- protected readonly env = $env(envSchema);
64
- protected readonly alepha = $inject(Alepha);
65
- protected readonly queueProvider = $inject(QueueProvider);
66
- protected readonly dateTime = $inject(DateTimeProvider);
67
-
68
- protected workerPromises: Array<Promise<void>> = [];
69
- protected workersRunning = 0;
70
- protected shouldStop = false;
71
- protected consumers: Array<Consumer> = [];
72
- protected consumersByProvider: Map<QueueProvider, Consumer[]> = new Map();
73
- protected schedulerPromise: Promise<void> | undefined;
74
- protected schedulerRunning = false;
75
- protected abortController: AbortController | undefined;
76
- protected workerId: string = `worker_${process.pid}_${Date.now()}`;
77
-
78
- public get isRunning(): boolean {
79
- return this.workersRunning > 0;
80
- }
81
-
82
- protected readonly start = $hook({
83
- on: "start",
84
- priority: "last",
85
- handler: () => {
86
- for (const queue of this.alepha.primitives($queue)) {
87
- const handler = queue.options.handler;
88
- if (handler) {
89
- this.consumers.push({
90
- handler,
91
- queue,
92
- });
93
- }
94
- }
95
-
96
- for (const consumer of this.alepha.primitives($consumer)) {
97
- this.consumers.push(consumer.options);
98
- }
99
-
100
- // Group consumers by their provider for efficient blocking
101
- for (const consumer of this.consumers) {
102
- const provider = consumer.queue.provider;
103
- const list = this.consumersByProvider.get(provider) ?? [];
104
- list.push(consumer);
105
- this.consumersByProvider.set(provider, list);
106
- }
107
-
108
- if (this.consumers.length > 0) {
109
- this.startWorkers();
110
- this.startScheduler();
111
- this.log.debug(
112
- `Watching for ${this.consumers.length} queue${this.consumers.length > 1 ? "s" : ""} with ${this.env.QUEUE_WORKER_CONCURRENCY} worker${
113
- this.env.QUEUE_WORKER_CONCURRENCY > 1 ? "s" : ""
114
- }.`,
115
- );
116
- }
117
- },
118
- });
119
-
120
- // -------------------------------------------------------------------------------------------------------------------
121
-
122
- // Engine part - this is the part that will run the workers and process the jobs
123
-
124
- /**
125
- * Start the workers.
126
- * Each worker acquires jobs and processes them with proper lifecycle management.
127
- */
128
- protected startWorkers(): void {
129
- const workerToStart =
130
- this.env.QUEUE_WORKER_CONCURRENCY - this.workersRunning;
131
-
132
- for (let i = 0; i < workerToStart; i++) {
133
- this.workersRunning += 1;
134
- const workerIndex = i;
135
- const localWorkerId = `${this.workerId}_${workerIndex}`;
136
- this.log.debug(`Starting worker n-${workerIndex}`);
137
-
138
- const workerLoop = async () => {
139
- while (!this.shouldStop) {
140
- this.log.trace(`Worker n-${workerIndex} is waiting for jobs`);
141
- const acquired = await this.acquireNextJob(localWorkerId);
142
- if (acquired) {
143
- await this.processJob(acquired, localWorkerId);
144
- }
145
- // If no job (timeout), loop continues and checks shouldStop
146
- }
147
- this.log.info(`Worker n-${workerIndex} has stopped`);
148
- };
149
-
150
- this.workerPromises.push(
151
- workerLoop().catch((e) => {
152
- this.log.error(`Worker n-${workerIndex} has crashed`, e);
153
- this.workersRunning -= 1;
154
- }),
155
- );
156
- }
157
- }
158
-
159
- /**
160
- * Start the scheduler for delayed job promotion and stalled job recovery.
161
- */
162
- protected startScheduler(): void {
163
- if (this.schedulerRunning) return;
164
- this.schedulerRunning = true;
165
- this.abortController = new AbortController();
166
- this.log.debug("Starting scheduler");
167
-
168
- const schedulerLoop = async () => {
169
- while (!this.shouldStop) {
170
- try {
171
- await this.runSchedulerCycle();
172
- } catch (e) {
173
- this.log.error("Scheduler cycle failed", e);
174
- }
175
-
176
- // Wait for next interval (interruptible via AbortController)
177
- await this.dateTime.wait(this.env.QUEUE_SCHEDULER_INTERVAL, {
178
- signal: this.abortController?.signal,
179
- });
180
- }
181
- this.log.debug("Scheduler stopped");
182
- };
183
-
184
- this.schedulerPromise = schedulerLoop();
185
- }
186
-
187
- /**
188
- * Run one cycle of the scheduler.
189
- * Promotes delayed jobs and recovers stalled jobs.
190
- */
191
- protected async runSchedulerCycle(): Promise<void> {
192
- for (const [provider, consumers] of this.consumersByProvider) {
193
- const queues = new Set(consumers.map((c) => c.queue.name));
194
-
195
- for (const queue of queues) {
196
- // Promote delayed jobs
197
- const promoted = await provider.promoteDelayedJobs(queue);
198
- if (promoted > 0) {
199
- this.log.debug(`Promoted ${promoted} delayed jobs in queue ${queue}`);
200
- }
201
-
202
- // Recover stalled jobs
203
- const recovered = await provider.recoverStalledJobs(
204
- queue,
205
- this.env.QUEUE_STALLED_THRESHOLD,
206
- );
207
- if (recovered.length > 0) {
208
- this.log.warn(
209
- `Recovered ${recovered.length} stalled jobs in queue ${queue}`,
210
- );
211
- }
212
- }
213
- }
214
- }
215
-
216
- protected readonly stop = $hook({
217
- on: "stop",
218
- handler: async () => {
219
- if (this.consumers.length > 0) {
220
- await this.stopWorkers();
221
- }
222
- },
223
- });
224
-
225
- /**
226
- * Acquire the next available job from any provider.
227
- */
228
- protected async acquireNextJob(
229
- localWorkerId: string,
230
- ): Promise<AcquiredJobWithConsumer | undefined> {
231
- for (const [provider, consumers] of this.consumersByProvider) {
232
- const queueNames = consumers.map((c) => c.queue.name);
233
- const acquired = await provider.acquireJob(
234
- queueNames,
235
- localWorkerId,
236
- this.env.QUEUE_WORKER_BLOCKING_TIMEOUT,
237
- );
238
-
239
- if (acquired) {
240
- const consumer = consumers.find((c) => c.queue.name === acquired.queue);
241
- if (consumer) {
242
- return { acquired, consumer, provider };
243
- }
244
- }
245
- }
246
-
247
- return undefined;
248
- }
249
-
250
- /**
251
- * Process a job with proper lifecycle management.
252
- * - Starts a lock renewal interval
253
- * - Calls the handler
254
- * - Marks job as completed or failed
255
- */
256
- protected async processJob(
257
- { acquired, consumer, provider }: AcquiredJobWithConsumer,
258
- localWorkerId: string,
259
- ): Promise<void> {
260
- const { queue, job } = acquired;
261
-
262
- // Start lock renewal heartbeat
263
- const lockRenewalInterval = this.dateTime.createInterval(
264
- async () => {
265
- try {
266
- const renewed = await provider.renewJobLock(
267
- queue,
268
- job.id,
269
- localWorkerId,
270
- );
271
- if (!renewed) {
272
- this.log.warn(
273
- `Failed to renew lock for job ${job.id}, lock may have been stolen`,
274
- );
275
- }
276
- } catch (e) {
277
- this.log.error(`Error renewing lock for job ${job.id}`, e);
278
- }
279
- },
280
- this.env.QUEUE_WORKER_LOCK_RENEWAL_INTERVAL,
281
- true, // start immediately
282
- );
283
-
284
- try {
285
- // Decode payload and run handler
286
- const payload = this.alepha.codec.decode(
287
- consumer.queue.options.schema,
288
- job.payload,
289
- );
290
-
291
- await this.alepha.context.run(() => consumer.handler({ payload }));
292
-
293
- // Mark as completed
294
- await provider.completeJob(queue, job.id);
295
- this.log.debug(`Job ${job.id} completed successfully`, { queue });
296
- } catch (e) {
297
- // Mark as failed (provider handles retry logic)
298
- const error = e instanceof Error ? e.message : String(e);
299
- const stackTrace = e instanceof Error ? e.stack : undefined;
300
- await provider.failJob(queue, job.id, error, stackTrace);
301
- this.log.error(`Job ${job.id} failed`, e);
302
- } finally {
303
- this.dateTime.clearInterval(lockRenewalInterval);
304
- }
305
- }
306
-
307
- /**
308
- * Stop the workers and scheduler.
309
- */
310
- protected async stopWorkers(): Promise<void> {
311
- this.shouldStop = true;
312
- this.workersRunning = 0;
313
- this.schedulerRunning = false;
314
-
315
- // Abort the scheduler's wait immediately
316
- this.abortController?.abort();
317
-
318
- // Cancel all pending acquireJob waiters to unblock workers immediately
319
- for (const provider of this.consumersByProvider.keys()) {
320
- provider.cancelWaiters();
321
- }
322
-
323
- this.log.trace("Stopping workers...");
324
- this.log.trace("Waiting for workers to finish...");
325
-
326
- const promises: Promise<void>[] = [...this.workerPromises];
327
- if (this.schedulerPromise) {
328
- promises.push(this.schedulerPromise);
329
- }
330
-
331
- await Promise.all(promises);
332
- }
333
- }
334
-
335
- export interface Consumer<T extends TSchema = TSchema> {
336
- queue: QueuePrimitive<T>;
337
- handler: (message: QueueMessage<T>) => Promise<void>;
338
- }
339
-
340
- export interface AcquiredJobWithConsumer {
341
- acquired: QueueAcquiredJob;
342
- consumer: Consumer;
343
- provider: QueueProvider;
344
- }