@archlast/server 0.1.7 → 0.1.9

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 (372) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +14 -10
  3. package/dist/admin/auth.d.ts +24 -5
  4. package/dist/admin/auth.js +49 -25
  5. package/dist/admin/schema.d.ts +122 -32
  6. package/dist/admin/schema.js +131 -95
  7. package/dist/admin/seed.d.ts +1 -1
  8. package/dist/admin/seed.js +79 -47
  9. package/dist/auth/api-key-resolver.d.ts +1 -1
  10. package/dist/auth/api-key-resolver.js +7 -3
  11. package/dist/auth/archlast-auth-adapter.d.ts +2 -5
  12. package/dist/auth/archlast-auth-adapter.js +1 -1
  13. package/dist/auth/better-auth-adapter.d.ts.map +1 -1
  14. package/dist/auth/better-auth-adapter.js +41 -26
  15. package/dist/auth/better-auth-adapter.js.map +1 -1
  16. package/dist/auth/better-auth-admin.d.ts.map +1 -1
  17. package/dist/auth/better-auth-admin.js +1 -1
  18. package/dist/auth/better-auth-admin.js.map +1 -1
  19. package/dist/auth/better-auth-api-key-resolver.js +1 -1
  20. package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
  21. package/dist/auth/better-auth-instance.d.ts +247 -303
  22. package/dist/auth/better-auth-instance.d.ts.map +1 -1
  23. package/dist/auth/better-auth-instance.js +11 -0
  24. package/dist/auth/better-auth-instance.js.map +1 -1
  25. package/dist/auth/better-auth-seed.d.ts +5 -2
  26. package/dist/auth/better-auth-seed.js +31 -22
  27. package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
  28. package/dist/auth/better-auth-session-adapter.js +14 -10
  29. package/dist/auth/better-auth-session-adapter.js.map +1 -1
  30. package/dist/auth/errors.d.ts.map +1 -1
  31. package/dist/auth/errors.js +11 -11
  32. package/dist/auth/errors.js.map +1 -1
  33. package/dist/auth/oauth-proxy.d.ts +5 -2
  34. package/dist/auth/oauth-proxy.js +23 -27
  35. package/dist/auth/resolver.d.ts.map +1 -1
  36. package/dist/auth/resolver.js.map +1 -1
  37. package/dist/auth/role-helpers.d.ts +1 -1
  38. package/dist/auth/role-helpers.d.ts.map +1 -1
  39. package/dist/auth/role-helpers.js.map +1 -1
  40. package/dist/auth/session-manager.d.ts +2 -5
  41. package/dist/auth/session-manager.js +16 -6
  42. package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
  43. package/dist/auth/system/better-auth-schema.js +6 -23
  44. package/dist/auth/system/better-auth-schema.js.map +1 -1
  45. package/dist/cache/circuit-breaker.d.ts +81 -0
  46. package/dist/cache/circuit-breaker.d.ts.map +1 -0
  47. package/dist/cache/circuit-breaker.js +170 -0
  48. package/dist/cache/circuit-breaker.js.map +1 -0
  49. package/dist/cache/client.d.ts +6 -3
  50. package/dist/cache/client.d.ts.map +1 -1
  51. package/dist/cache/client.js +12 -53
  52. package/dist/cache/client.js.map +1 -1
  53. package/dist/cache/index.d.ts +2 -0
  54. package/dist/cache/index.d.ts.map +1 -1
  55. package/dist/cache/index.js +5 -1
  56. package/dist/cache/index.js.map +1 -1
  57. package/dist/cache/invalidation-queue.d.ts +63 -0
  58. package/dist/cache/invalidation-queue.d.ts.map +1 -0
  59. package/dist/cache/invalidation-queue.js +196 -0
  60. package/dist/cache/invalidation-queue.js.map +1 -0
  61. package/dist/cache/layers.d.ts +14 -4
  62. package/dist/cache/layers.d.ts.map +1 -1
  63. package/dist/cache/layers.js +66 -72
  64. package/dist/cache/layers.js.map +1 -1
  65. package/dist/cache/manager.d.ts.map +1 -1
  66. package/dist/cache/manager.js +6 -41
  67. package/dist/cache/manager.js.map +1 -1
  68. package/dist/cache/protocol.d.ts +4 -39
  69. package/dist/cache/protocol.d.ts.map +1 -1
  70. package/dist/cache/protocol.js.map +1 -1
  71. package/dist/cache/redis-adapter.d.ts +103 -0
  72. package/dist/cache/redis-adapter.d.ts.map +1 -0
  73. package/dist/cache/redis-adapter.js +424 -0
  74. package/dist/cache/redis-adapter.js.map +1 -0
  75. package/dist/cache/run-sidecar.js +10 -1
  76. package/dist/cache/run-sidecar.js.map +1 -1
  77. package/dist/cache/sidecar-server.d.ts +51 -1
  78. package/dist/cache/sidecar-server.d.ts.map +1 -1
  79. package/dist/cache/sidecar-server.js +368 -22
  80. package/dist/cache/sidecar-server.js.map +1 -1
  81. package/dist/cache/store.d.ts +43 -0
  82. package/dist/cache/store.d.ts.map +1 -1
  83. package/dist/cache/store.js +69 -76
  84. package/dist/cache/store.js.map +1 -1
  85. package/dist/cache/strategies.d.ts +2 -9
  86. package/dist/cache/strategies.d.ts.map +1 -1
  87. package/dist/cache/types.d.ts +130 -0
  88. package/dist/cache/types.d.ts.map +1 -0
  89. package/dist/cache/types.js +60 -0
  90. package/dist/cache/types.js.map +1 -0
  91. package/dist/config/bullmq.d.ts +16 -0
  92. package/dist/config/bullmq.d.ts.map +1 -0
  93. package/dist/config/bullmq.js +103 -0
  94. package/dist/config/bullmq.js.map +1 -0
  95. package/dist/config/index.d.ts +1 -0
  96. package/dist/config/index.d.ts.map +1 -1
  97. package/dist/config/index.js +1 -0
  98. package/dist/config/index.js.map +1 -1
  99. package/dist/config/schema.d.ts +80 -6
  100. package/dist/config/schema.d.ts.map +1 -1
  101. package/dist/config/schema.js +71 -6
  102. package/dist/config/schema.js.map +1 -1
  103. package/dist/config/service.d.ts +54 -4
  104. package/dist/config/service.d.ts.map +1 -1
  105. package/dist/config/service.js +56 -2
  106. package/dist/config/service.js.map +1 -1
  107. package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
  108. package/dist/controllers/admin/admin-tokens.controller.js +117 -98
  109. package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
  110. package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
  111. package/dist/controllers/admin/api-keys.controller.js.map +1 -1
  112. package/dist/controllers/admin/app-users.controller.d.ts +274 -243
  113. package/dist/controllers/admin/app-users.controller.js +301 -257
  114. package/dist/controllers/admin/auth.controller.d.ts +260 -236
  115. package/dist/controllers/admin/auth.controller.js +197 -174
  116. package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
  117. package/dist/controllers/admin/backup.controller.js.map +1 -1
  118. package/dist/controllers/admin/settings.controller.d.ts +1 -1
  119. package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
  120. package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
  121. package/dist/controllers/admin/storage-stats.controller.js +33 -0
  122. package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
  123. package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
  124. package/dist/controllers/admin/tenants.controller.js.map +1 -1
  125. package/dist/controllers/admin/users.controller.d.ts +1 -1
  126. package/dist/controllers/admin/users.controller.d.ts.map +1 -1
  127. package/dist/controllers/admin/users.controller.js.map +1 -1
  128. package/dist/controllers/auth.controller.d.ts +289 -271
  129. package/dist/controllers/auth.controller.js +275 -226
  130. package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
  131. package/dist/controllers/crud-generator.controller.js +4 -2
  132. package/dist/controllers/crud-generator.controller.js.map +1 -1
  133. package/dist/controllers/index.d.ts +1 -1
  134. package/dist/controllers/index.d.ts.map +1 -1
  135. package/dist/controllers/index.js.map +1 -1
  136. package/dist/controllers/introspection.controller.d.ts +666 -0
  137. package/dist/controllers/introspection.controller.d.ts.map +1 -1
  138. package/dist/controllers/introspection.controller.js +628 -0
  139. package/dist/controllers/introspection.controller.js.map +1 -1
  140. package/dist/controllers/invite.controller.d.ts +190 -170
  141. package/dist/controllers/invite.controller.js +183 -164
  142. package/dist/controllers/mfa.controller.d.ts +205 -183
  143. package/dist/controllers/mfa.controller.js +131 -111
  144. package/dist/controllers/otp.controller.d.ts +194 -171
  145. package/dist/controllers/otp.controller.js +192 -175
  146. package/dist/controllers/storage.controller.d.ts.map +1 -1
  147. package/dist/controllers/storage.controller.js.map +1 -1
  148. package/dist/controllers/system.controller.d.ts +21 -3
  149. package/dist/controllers/system.controller.d.ts.map +1 -1
  150. package/dist/controllers/system.controller.js +32 -2
  151. package/dist/controllers/system.controller.js.map +1 -1
  152. package/dist/controllers/tenant.controller.d.ts +258 -227
  153. package/dist/controllers/tenant.controller.js +224 -200
  154. package/dist/db/cachedclient.d.ts +6 -11
  155. package/dist/db/cachedclient.d.ts.map +1 -1
  156. package/dist/db/cachedclient.js +79 -43
  157. package/dist/db/cachedclient.js.map +1 -1
  158. package/dist/db/distributed-client.d.ts +79 -24
  159. package/dist/db/distributed-client.js +23 -24
  160. package/dist/db/factory.d.ts +3 -8
  161. package/dist/db/factory.d.ts.map +1 -1
  162. package/dist/db/factory.js +3 -22
  163. package/dist/db/factory.js.map +1 -1
  164. package/dist/db/socket-client.d.ts +7 -0
  165. package/dist/db/socket-client.d.ts.map +1 -1
  166. package/dist/db/socket-client.js +140 -11
  167. package/dist/db/socket-client.js.map +1 -1
  168. package/dist/deployment/handler.d.ts +10 -2
  169. package/dist/deployment/handler.d.ts.map +1 -1
  170. package/dist/deployment/handler.js +103 -21
  171. package/dist/deployment/handler.js.map +1 -1
  172. package/dist/deployment/persistence.d.ts.map +1 -1
  173. package/dist/deployment/persistence.js +6 -1
  174. package/dist/deployment/persistence.js.map +1 -1
  175. package/dist/docker/compose.d.ts.map +1 -1
  176. package/dist/docker/compose.js +76 -0
  177. package/dist/docker/compose.js.map +1 -1
  178. package/dist/engine/runner.d.ts.map +1 -1
  179. package/dist/engine/runner.js +0 -43
  180. package/dist/engine/runner.js.map +1 -1
  181. package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
  182. package/dist/functions/built-in/auth-apikey.js.map +1 -1
  183. package/dist/functions/built-in/system-cache.d.ts.map +1 -1
  184. package/dist/functions/built-in/system-cache.js +6 -31
  185. package/dist/functions/built-in/system-cache.js.map +1 -1
  186. package/dist/functions/built-in/system-data.d.ts.map +1 -1
  187. package/dist/functions/built-in/system-data.js +4 -2
  188. package/dist/functions/built-in/system-data.js.map +1 -1
  189. package/dist/functions/definition.d.ts.map +1 -1
  190. package/dist/functions/definition.js +6 -2
  191. package/dist/functions/definition.js.map +1 -1
  192. package/dist/http/router.d.ts +1 -0
  193. package/dist/http/router.d.ts.map +1 -1
  194. package/dist/http/router.js +14 -3
  195. package/dist/http/router.js.map +1 -1
  196. package/dist/http/routes/metrics.d.ts +42 -0
  197. package/dist/http/routes/metrics.d.ts.map +1 -0
  198. package/dist/http/routes/metrics.js +29 -0
  199. package/dist/http/routes/metrics.js.map +1 -0
  200. package/dist/http/server.d.ts +1 -0
  201. package/dist/http/server.d.ts.map +1 -1
  202. package/dist/http/server.js +63 -22
  203. package/dist/http/server.js.map +1 -1
  204. package/dist/ipc/socket-bridge.d.ts +1 -0
  205. package/dist/ipc/socket-bridge.d.ts.map +1 -1
  206. package/dist/ipc/socket-bridge.js +5 -1
  207. package/dist/ipc/socket-bridge.js.map +1 -1
  208. package/dist/jobs/bullmq-adapter.d.ts +154 -0
  209. package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
  210. package/dist/jobs/bullmq-adapter.js +688 -0
  211. package/dist/jobs/bullmq-adapter.js.map +1 -0
  212. package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
  213. package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
  214. package/dist/jobs/bullmq-circuit-breaker.js +323 -0
  215. package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
  216. package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
  217. package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
  218. package/dist/jobs/bullmq-dlq-manager.js +325 -0
  219. package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
  220. package/dist/jobs/bullmq-metrics.d.ts +104 -0
  221. package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
  222. package/dist/jobs/bullmq-metrics.js +323 -0
  223. package/dist/jobs/bullmq-metrics.js.map +1 -0
  224. package/dist/jobs/bullmq-priority-service.d.ts +173 -0
  225. package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
  226. package/dist/jobs/bullmq-priority-service.js +390 -0
  227. package/dist/jobs/bullmq-priority-service.js.map +1 -0
  228. package/dist/jobs/bullmq-scheduler.d.ts +111 -0
  229. package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
  230. package/dist/jobs/bullmq-scheduler.js +300 -0
  231. package/dist/jobs/bullmq-scheduler.js.map +1 -0
  232. package/dist/jobs/bullmq-worker.d.ts +155 -0
  233. package/dist/jobs/bullmq-worker.d.ts.map +1 -0
  234. package/dist/jobs/bullmq-worker.js +651 -0
  235. package/dist/jobs/bullmq-worker.js.map +1 -0
  236. package/dist/jobs/circuit-breaker.d.ts +120 -0
  237. package/dist/jobs/circuit-breaker.d.ts.map +1 -0
  238. package/dist/jobs/circuit-breaker.js +262 -0
  239. package/dist/jobs/circuit-breaker.js.map +1 -0
  240. package/dist/jobs/index.d.ts +1 -1
  241. package/dist/jobs/index.d.ts.map +1 -1
  242. package/dist/jobs/index.js.map +1 -1
  243. package/dist/jobs/queue.d.ts +120 -1
  244. package/dist/jobs/queue.d.ts.map +1 -1
  245. package/dist/jobs/queue.js +487 -9
  246. package/dist/jobs/queue.js.map +1 -1
  247. package/dist/jobs/redis-connection.d.ts +50 -0
  248. package/dist/jobs/redis-connection.d.ts.map +1 -0
  249. package/dist/jobs/redis-connection.js +123 -0
  250. package/dist/jobs/redis-connection.js.map +1 -0
  251. package/dist/jobs/run-scheduler.js +163 -10
  252. package/dist/jobs/run-scheduler.js.map +1 -1
  253. package/dist/jobs/run-worker.js +101 -9
  254. package/dist/jobs/run-worker.js.map +1 -1
  255. package/dist/jobs/worker-thread.d.ts +6 -0
  256. package/dist/jobs/worker-thread.d.ts.map +1 -1
  257. package/dist/jobs/worker-thread.js +37 -8
  258. package/dist/jobs/worker-thread.js.map +1 -1
  259. package/dist/jobs/worker.d.ts +33 -0
  260. package/dist/jobs/worker.d.ts.map +1 -1
  261. package/dist/jobs/worker.js +358 -115
  262. package/dist/jobs/worker.js.map +1 -1
  263. package/dist/linq/async-enumerable.d.ts.map +1 -1
  264. package/dist/linq/async-enumerable.js.map +1 -1
  265. package/dist/linq/enumerable.d.ts.map +1 -1
  266. package/dist/linq/enumerable.js +10 -10
  267. package/dist/linq/enumerable.js.map +1 -1
  268. package/dist/metrics/collector.d.ts +26 -0
  269. package/dist/metrics/collector.d.ts.map +1 -0
  270. package/dist/metrics/collector.js +103 -0
  271. package/dist/metrics/collector.js.map +1 -0
  272. package/dist/polling/updates.controller.d.ts +57 -0
  273. package/dist/polling/updates.controller.d.ts.map +1 -0
  274. package/dist/polling/updates.controller.js +70 -0
  275. package/dist/polling/updates.controller.js.map +1 -0
  276. package/dist/repository/db-set.d.ts.map +1 -1
  277. package/dist/repository/db-set.js +12 -8
  278. package/dist/repository/db-set.js.map +1 -1
  279. package/dist/repository/ef-core.d.ts.map +1 -1
  280. package/dist/repository/ef-core.js +6 -6
  281. package/dist/repository/ef-core.js.map +1 -1
  282. package/dist/repository/factory.d.ts +1 -1
  283. package/dist/repository/factory.d.ts.map +1 -1
  284. package/dist/repository/factory.js.map +1 -1
  285. package/dist/repository/interfaces.d.ts.map +1 -1
  286. package/dist/repository/interfaces.js.map +1 -1
  287. package/dist/repository/queryable.d.ts.map +1 -1
  288. package/dist/repository/queryable.js.map +1 -1
  289. package/dist/rpc/adapter.d.ts.map +1 -1
  290. package/dist/rpc/adapter.js.map +1 -1
  291. package/dist/rpc/router.d.ts +2 -2
  292. package/dist/rpc/router.d.ts.map +1 -1
  293. package/dist/rpc/router.js +1 -1
  294. package/dist/rpc/router.js.map +1 -1
  295. package/dist/schema/input-types.d.ts +1 -1
  296. package/dist/schema/input-types.d.ts.map +1 -1
  297. package/dist/schema/input-types.js +4 -3
  298. package/dist/schema/input-types.js.map +1 -1
  299. package/dist/schema/modifiers.d.ts +2 -1
  300. package/dist/schema/modifiers.d.ts.map +1 -1
  301. package/dist/schema/modifiers.js +41 -5
  302. package/dist/schema/modifiers.js.map +1 -1
  303. package/dist/schema/relationship-types.d.ts +7 -2
  304. package/dist/schema/relationship-types.js +1 -1
  305. package/dist/schema/type-helpers.d.ts +35 -0
  306. package/dist/schema/type-helpers.d.ts.map +1 -1
  307. package/dist/schema/type-helpers.js +32 -21
  308. package/dist/schema/type-helpers.js.map +1 -1
  309. package/dist/schema/types.d.ts.map +1 -1
  310. package/dist/schema/validators.d.ts +1 -1
  311. package/dist/schema/validators.d.ts.map +1 -1
  312. package/dist/schema/validators.js +27 -16
  313. package/dist/schema/validators.js.map +1 -1
  314. package/dist/services/admin/app-users.service.d.ts +1 -1
  315. package/dist/services/admin/app-users.service.js +31 -38
  316. package/dist/services/admin/auth.service.d.ts +1 -1
  317. package/dist/services/admin/auth.service.js +11 -5
  318. package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
  319. package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
  320. package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
  321. package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
  322. package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
  323. package/dist/services/admin/backup/StorageStreamer.js +16 -55
  324. package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
  325. package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
  326. package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
  327. package/dist/services/admin/backup/ZipComposer.js +23 -0
  328. package/dist/services/admin/backup/ZipComposer.js.map +1 -1
  329. package/dist/services/admin/backup.service.d.ts.map +1 -1
  330. package/dist/services/admin/backup.service.js.map +1 -1
  331. package/dist/services/admin/data.service.d.ts.map +1 -1
  332. package/dist/services/admin/data.service.js +287 -286
  333. package/dist/services/admin/data.service.js.map +1 -1
  334. package/dist/services/admin/tenants.service.d.ts.map +1 -1
  335. package/dist/services/admin/tenants.service.js.map +1 -1
  336. package/dist/services/auth.service.d.ts +2 -3
  337. package/dist/services/auth.service.js +16 -16
  338. package/dist/services/introspection.service.d.ts.map +1 -1
  339. package/dist/services/introspection.service.js +6 -3
  340. package/dist/services/introspection.service.js.map +1 -1
  341. package/dist/services/invite.service.d.ts +1 -1
  342. package/dist/services/invite.service.js +17 -15
  343. package/dist/services/storage.service.d.ts.map +1 -1
  344. package/dist/services/storage.service.js +35 -4
  345. package/dist/services/storage.service.js.map +1 -1
  346. package/dist/services/system.service.d.ts +4 -0
  347. package/dist/services/system.service.d.ts.map +1 -1
  348. package/dist/services/system.service.js +43 -1
  349. package/dist/services/system.service.js.map +1 -1
  350. package/dist/services/tenant.service.d.ts +1 -1
  351. package/dist/services/tenant.service.js +43 -31
  352. package/dist/sse/subscriptions.controller.d.ts +57 -0
  353. package/dist/sse/subscriptions.controller.d.ts.map +1 -0
  354. package/dist/sse/subscriptions.controller.js +127 -0
  355. package/dist/sse/subscriptions.controller.js.map +1 -0
  356. package/dist/startup/bootstrap.d.ts +13 -2
  357. package/dist/startup/bootstrap.d.ts.map +1 -1
  358. package/dist/startup/bootstrap.js +85 -13
  359. package/dist/startup/bootstrap.js.map +1 -1
  360. package/dist/storage/s3-backend.d.ts.map +1 -1
  361. package/dist/storage/s3-backend.js +3 -3
  362. package/dist/storage/s3-backend.js.map +1 -1
  363. package/dist/websocket/server.d.ts.map +1 -1
  364. package/dist/websocket/server.js +14 -3
  365. package/dist/websocket/server.js.map +1 -1
  366. package/docker/README.md +299 -1
  367. package/package.json +5 -1
  368. package/templates/.env.example +76 -16
  369. package/templates/archlast.config.js +15 -1
  370. package/templates/docker-compose.dev.yml +8 -8
  371. package/templates/docker-compose.prod.yml +29 -12
  372. package/templates/docker-compose.yml +112 -28
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Circuit Breaker Pattern Implementation
3
+ *
4
+ * Prevents cascading failures by temporarily blocking execution
5
+ * of job types that are experiencing repeated failures.
6
+ *
7
+ * States:
8
+ * - CLOSED: Normal operation, requests pass through
9
+ * - OPEN: Blocking requests after threshold failures
10
+ * - HALF_OPEN: Testing if service has recovered
11
+ */
12
+ import type { Registry } from "prom-client";
13
+ export interface CircuitBreakerConfig {
14
+ /**
15
+ * Number of consecutive failures before tripping to OPEN state
16
+ * Default: 5
17
+ */
18
+ failureThreshold: number;
19
+ /**
20
+ * Number of consecutive successes needed to reset to CLOSED
21
+ * Default: 2
22
+ */
23
+ successThreshold: number;
24
+ /**
25
+ * Time in ms before attempting reset from OPEN to HALF_OPEN
26
+ * Default: 30000 (30 seconds)
27
+ */
28
+ resetTimeoutMs: number;
29
+ /**
30
+ * Maximum concurrent calls allowed in HALF_OPEN state
31
+ * Default: 3
32
+ */
33
+ halfOpenMaxCalls: number;
34
+ }
35
+ export type CircuitState = "closed" | "open" | "half_open";
36
+ export interface CircuitBreakerState {
37
+ state: CircuitState;
38
+ failureCount: number;
39
+ successCount: number;
40
+ lastFailureTime: number;
41
+ lastStateChange: number;
42
+ halfOpenCalls: number;
43
+ }
44
+ export interface CircuitBreakerMetrics {
45
+ circuitBreakerState: any;
46
+ circuitBreakerOpened: any;
47
+ }
48
+ /**
49
+ * Error thrown when circuit breaker is OPEN
50
+ */
51
+ export declare class CircuitBreakerOpenError extends Error {
52
+ constructor(jobName: string);
53
+ }
54
+ /**
55
+ * Circuit Breaker implementation for job execution protection
56
+ */
57
+ export declare class CircuitBreaker {
58
+ private readonly config;
59
+ private readonly breakers;
60
+ private metrics?;
61
+ constructor(config: CircuitBreakerConfig, metricsRegistry?: Registry);
62
+ /**
63
+ * Execute a job with circuit breaker protection
64
+ *
65
+ * @param jobName - Name of the job type
66
+ * @param fn - Async function to execute
67
+ * @returns Result of the function
68
+ * @throws {CircuitBreakerOpenError} If circuit is open
69
+ * @throws {Error} If the function itself fails
70
+ */
71
+ execute<T>(jobName: string, fn: () => Promise<T>): Promise<T>;
72
+ /**
73
+ * Get or create a circuit breaker for a job type
74
+ */
75
+ private getOrCreateBreaker;
76
+ /**
77
+ * Check if enough time has passed to attempt reset
78
+ */
79
+ private shouldAttemptReset;
80
+ /**
81
+ * Transition breaker to half_open state
82
+ */
83
+ private transitionToHalfOpen;
84
+ /**
85
+ * Handle successful execution
86
+ */
87
+ private onSuccess;
88
+ /**
89
+ * Transition breaker to closed state
90
+ */
91
+ private transitionToClosed;
92
+ /**
93
+ * Handle failed execution
94
+ */
95
+ private onFailure;
96
+ /**
97
+ * Transition breaker to open state
98
+ */
99
+ private transitionToOpen;
100
+ /**
101
+ * Get current state of circuit breaker for a job type
102
+ */
103
+ getState(jobName: string): CircuitBreakerState | null;
104
+ /**
105
+ * Manually reset circuit breaker for a job type
106
+ */
107
+ reset(jobName: string): void;
108
+ /**
109
+ * Get all circuit breaker states
110
+ */
111
+ getAllStates(): Map<string, CircuitBreakerState>;
112
+ /**
113
+ * Get statistics about all circuit breakers
114
+ */
115
+ getStats(): {
116
+ total: number;
117
+ byState: Record<CircuitState, number>;
118
+ };
119
+ }
120
+ //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/jobs/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IAClC,mBAAmB,EAAE,GAAG,CAAC;IACzB,oBAAoB,EAAE,GAAG,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI9B;AAED;;GAEG;AACH,qBAAa,cAAc;IAKnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+C;IACxE,OAAO,CAAC,OAAO,CAAC,CAAwB;gBAGnB,MAAM,EAAE,oBAAoB,EAC7C,eAAe,CAAC,EAAE,QAAQ;IA0B9B;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA8BnE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,OAAO,CAAC,SAAS;IAiBjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIrD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO5B;;OAEG;IACH,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAQhD;;OAEG;IACH,QAAQ,IAAI;QACR,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;KACzC;CAgBJ"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ /**
3
+ * Circuit Breaker Pattern Implementation
4
+ *
5
+ * Prevents cascading failures by temporarily blocking execution
6
+ * of job types that are experiencing repeated failures.
7
+ *
8
+ * States:
9
+ * - CLOSED: Normal operation, requests pass through
10
+ * - OPEN: Blocking requests after threshold failures
11
+ * - HALF_OPEN: Testing if service has recovered
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.CircuitBreaker = exports.CircuitBreakerOpenError = void 0;
15
+ const logger_js_1 = require("../logging/logger.js");
16
+ /**
17
+ * Error thrown when circuit breaker is OPEN
18
+ */
19
+ class CircuitBreakerOpenError extends Error {
20
+ constructor(jobName) {
21
+ super(`Circuit breaker is OPEN for job type: ${jobName}`);
22
+ this.name = "CircuitBreakerOpenError";
23
+ }
24
+ }
25
+ exports.CircuitBreakerOpenError = CircuitBreakerOpenError;
26
+ /**
27
+ * Circuit Breaker implementation for job execution protection
28
+ */
29
+ class CircuitBreaker {
30
+ config;
31
+ breakers = new Map();
32
+ metrics;
33
+ constructor(config, metricsRegistry) {
34
+ this.config = config;
35
+ // Initialize metrics if registry provided
36
+ if (metricsRegistry) {
37
+ // Dynamic import to avoid issues if prom-client not available
38
+ import("prom-client").then(({ Gauge, Counter }) => {
39
+ this.metrics = {
40
+ circuitBreakerState: new Gauge({
41
+ name: "archlast_circuit_breaker_state",
42
+ help: "Circuit breaker state (0=closed, 1=half_open, 2=open)",
43
+ labelNames: ["job_name", "state"],
44
+ registers: [metricsRegistry],
45
+ }),
46
+ circuitBreakerOpened: new Counter({
47
+ name: "archlast_circuit_breaker_opened_total",
48
+ help: "Total number of times circuit breaker opened",
49
+ labelNames: ["job_name"],
50
+ registers: [metricsRegistry],
51
+ }),
52
+ };
53
+ }).catch(() => {
54
+ // Silently fail if metrics not available
55
+ });
56
+ }
57
+ }
58
+ /**
59
+ * Execute a job with circuit breaker protection
60
+ *
61
+ * @param jobName - Name of the job type
62
+ * @param fn - Async function to execute
63
+ * @returns Result of the function
64
+ * @throws {CircuitBreakerOpenError} If circuit is open
65
+ * @throws {Error} If the function itself fails
66
+ */
67
+ async execute(jobName, fn) {
68
+ const breaker = this.getOrCreateBreaker(jobName);
69
+ // Check if circuit is open
70
+ if (breaker.state === "open") {
71
+ if (this.shouldAttemptReset(breaker)) {
72
+ this.transitionToHalfOpen(breaker, jobName);
73
+ }
74
+ else {
75
+ throw new CircuitBreakerOpenError(jobName);
76
+ }
77
+ }
78
+ // Check half-open call limit
79
+ if (breaker.state === "half_open") {
80
+ if (breaker.halfOpenCalls >= this.config.halfOpenMaxCalls) {
81
+ throw new CircuitBreakerOpenError(jobName);
82
+ }
83
+ breaker.halfOpenCalls++;
84
+ }
85
+ try {
86
+ const result = await fn();
87
+ this.onSuccess(jobName);
88
+ return result;
89
+ }
90
+ catch (error) {
91
+ this.onFailure(jobName);
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * Get or create a circuit breaker for a job type
97
+ */
98
+ getOrCreateBreaker(jobName) {
99
+ if (!this.breakers.has(jobName)) {
100
+ const initialState = {
101
+ state: "closed",
102
+ failureCount: 0,
103
+ successCount: 0,
104
+ lastFailureTime: 0,
105
+ lastStateChange: Date.now(),
106
+ halfOpenCalls: 0,
107
+ };
108
+ this.breakers.set(jobName, initialState);
109
+ // Initialize state metric
110
+ if (this.metrics) {
111
+ this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "closed" }, 1);
112
+ }
113
+ }
114
+ return this.breakers.get(jobName);
115
+ }
116
+ /**
117
+ * Check if enough time has passed to attempt reset
118
+ */
119
+ shouldAttemptReset(breaker) {
120
+ const timeSinceFailure = Date.now() - breaker.lastFailureTime;
121
+ return timeSinceFailure >= this.config.resetTimeoutMs;
122
+ }
123
+ /**
124
+ * Transition breaker to half_open state
125
+ */
126
+ transitionToHalfOpen(breaker, jobName) {
127
+ breaker.state = "half_open";
128
+ breaker.successCount = 0;
129
+ breaker.halfOpenCalls = 0;
130
+ breaker.lastStateChange = Date.now();
131
+ logger_js_1.logger.log({
132
+ timestamp: Date.now(),
133
+ level: "warn",
134
+ kind: "system",
135
+ message: `[CircuitBreaker] Transitioned to HALF_OPEN for job: ${jobName}`,
136
+ });
137
+ // Emit metric
138
+ if (this.metrics) {
139
+ this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "half_open" }, 1);
140
+ }
141
+ }
142
+ /**
143
+ * Handle successful execution
144
+ */
145
+ onSuccess(jobName) {
146
+ const breaker = this.breakers.get(jobName);
147
+ if (!breaker)
148
+ return;
149
+ if (breaker.state === "half_open") {
150
+ breaker.successCount++;
151
+ if (breaker.successCount >= this.config.successThreshold) {
152
+ // Reset to closed
153
+ this.transitionToClosed(breaker, jobName);
154
+ }
155
+ }
156
+ else if (breaker.state === "closed") {
157
+ // Reset failure count on success in closed state
158
+ breaker.failureCount = 0;
159
+ }
160
+ }
161
+ /**
162
+ * Transition breaker to closed state
163
+ */
164
+ transitionToClosed(breaker, jobName) {
165
+ breaker.state = "closed";
166
+ breaker.failureCount = 0;
167
+ breaker.successCount = 0;
168
+ breaker.halfOpenCalls = 0;
169
+ breaker.lastStateChange = Date.now();
170
+ logger_js_1.logger.log({
171
+ timestamp: Date.now(),
172
+ level: "info",
173
+ kind: "system",
174
+ message: `[CircuitBreaker] Reset to CLOSED for job: ${jobName}`,
175
+ });
176
+ // Emit metric
177
+ if (this.metrics) {
178
+ this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "closed" }, 1);
179
+ }
180
+ }
181
+ /**
182
+ * Handle failed execution
183
+ */
184
+ onFailure(jobName) {
185
+ const breaker = this.breakers.get(jobName);
186
+ if (!breaker)
187
+ return;
188
+ breaker.failureCount++;
189
+ breaker.lastFailureTime = Date.now();
190
+ // Check if should trip to open
191
+ if (breaker.state === "closed" &&
192
+ breaker.failureCount >= this.config.failureThreshold) {
193
+ this.transitionToOpen(breaker, jobName);
194
+ }
195
+ else if (breaker.state === "half_open") {
196
+ // Back to open on failure in half_open
197
+ this.transitionToOpen(breaker, jobName);
198
+ }
199
+ }
200
+ /**
201
+ * Transition breaker to open state
202
+ */
203
+ transitionToOpen(breaker, jobName) {
204
+ breaker.state = "open";
205
+ breaker.lastStateChange = Date.now();
206
+ logger_js_1.logger.log({
207
+ timestamp: Date.now(),
208
+ level: "error",
209
+ kind: "system",
210
+ message: `[CircuitBreaker] Tripped to OPEN for job: ${jobName} after ${breaker.failureCount} failures`,
211
+ });
212
+ // Emit metrics
213
+ if (this.metrics) {
214
+ this.metrics.circuitBreakerOpened?.inc({ job_name: jobName });
215
+ this.metrics.circuitBreakerState?.set({ job_name: jobName, state: "open" }, 1);
216
+ }
217
+ }
218
+ /**
219
+ * Get current state of circuit breaker for a job type
220
+ */
221
+ getState(jobName) {
222
+ return this.breakers.get(jobName) || null;
223
+ }
224
+ /**
225
+ * Manually reset circuit breaker for a job type
226
+ */
227
+ reset(jobName) {
228
+ const breaker = this.breakers.get(jobName);
229
+ if (breaker) {
230
+ this.transitionToClosed(breaker, jobName);
231
+ }
232
+ }
233
+ /**
234
+ * Get all circuit breaker states
235
+ */
236
+ getAllStates() {
237
+ const result = new Map();
238
+ this.breakers.forEach((value, key) => {
239
+ result.set(key, value);
240
+ });
241
+ return result;
242
+ }
243
+ /**
244
+ * Get statistics about all circuit breakers
245
+ */
246
+ getStats() {
247
+ const byState = {
248
+ closed: 0,
249
+ open: 0,
250
+ half_open: 0,
251
+ };
252
+ this.breakers.forEach((breaker) => {
253
+ byState[breaker.state]++;
254
+ });
255
+ return {
256
+ total: this.breakers.size,
257
+ byState,
258
+ };
259
+ }
260
+ }
261
+ exports.CircuitBreaker = CircuitBreaker;
262
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/jobs/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@ import { Scheduler, SchedulePreset, intervalToCron, type ScheduledJob } from "./
3
3
  /**
4
4
  * Public API for Archlast job system.
5
5
  */
6
- export { JobQueue, Scheduler, SchedulePreset, intervalToCron, ScheduledJob, };
6
+ export { JobQueue, Scheduler, SchedulePreset, intervalToCron, ScheduledJob };
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9F;;GAEG;AACH,OAAO,EACH,QAAQ,EACR,SAAS,EACT,cAAc,EACd,cAAc,EACd,YAAY,GACf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9F;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAOlC,yFAPK,mBAAQ,OAOL;AANZ,iDAA8F;AAO1F,0FAPK,wBAAS,OAOL;AACT,+FARgB,6BAAc,OAQhB;AACd,+FATgC,6BAAc,OAShC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAM7B,yFANA,mBAAQ,OAMA;AALjB,iDAA8F;AAK3E,0FALV,wBAAS,OAKU;AAAE,+FALV,6BAAc,OAKU;AAAE,+FALV,6BAAc,OAKU"}
@@ -1,6 +1,14 @@
1
1
  import type { IDatabaseClient } from "../db/interfaces.js";
2
2
  import type { CacheClient } from "../cache/client.js";
3
3
  export declare const JOBS_COLLECTION = "_jobs";
4
+ export declare const JOBS_DLQ_COLLECTION = "_jobs_dlq";
5
+ export interface JobDLQRecord<Payload = unknown> extends JobRecord<Payload> {
6
+ originalJobId: string;
7
+ deadLetteredAt: number;
8
+ errorCategory: "timeout" | "validation" | "dependency" | "system";
9
+ diagnostics: Record<string, unknown>;
10
+ reprocessCount: number;
11
+ }
4
12
  export type JobStatus = "pending" | "active" | "completed" | "failed";
5
13
  export interface JobRecord<Payload = unknown> {
6
14
  _id: string;
@@ -14,10 +22,16 @@ export interface JobRecord<Payload = unknown> {
14
22
  createdAt: number;
15
23
  updatedAt: number;
16
24
  lastError?: string | null;
25
+ priority?: number;
26
+ timeoutMs?: number;
27
+ dependsOn?: string[];
17
28
  }
18
29
  export interface EnqueueOptions {
19
30
  runAfterMs?: number;
20
31
  maxAttempts?: number;
32
+ priority?: number;
33
+ timeoutMs?: number;
34
+ dependsOn?: string[];
21
35
  }
22
36
  export interface JobQueueOptions {
23
37
  /**
@@ -47,16 +61,121 @@ export declare class JobQueue {
47
61
  constructor(options: JobQueueOptions);
48
62
  private emitRevalidation;
49
63
  enqueue<Payload = unknown>(name: string, payload: Payload, options?: EnqueueOptions): Promise<string>;
64
+ /**
65
+ * Calculate effective priority with aging to prevent starvation.
66
+ * Low-priority jobs gain priority over time (1 point every 15 minutes, max 5 points).
67
+ */
68
+ private calculateEffectivePriority;
69
+ /**
70
+ * Apply aging boost to old pending jobs to prevent starvation.
71
+ * This updates the priority field in the database for jobs that have been waiting too long.
72
+ */
73
+ private applyAgingToPendingJobs;
50
74
  /**
51
75
  * Claim the next available job for execution.
52
76
  * Returns null if none are ready.
53
77
  */
54
78
  claimNext<Payload = unknown>(): Promise<JobRecord<Payload> | null>;
55
- complete(id: string): Promise<void>;
79
+ complete(id: string, jobName?: string): Promise<void>;
56
80
  fail(job: JobRecord, error: unknown, backoffMs?: number): Promise<void>;
81
+ /**
82
+ * Categorize error for DLQ classification
83
+ */
84
+ private categorizeError;
85
+ /**
86
+ * Extract diagnostic information from error
87
+ */
88
+ private extractDiagnostics;
57
89
  getJob<Payload = unknown>(id: string): Promise<JobRecord<Payload> | null>;
58
90
  listJobs<Payload = unknown>(status?: JobStatus): Promise<JobRecord<Payload>[]>;
59
91
  dispose(): void;
60
92
  private mapDoc;
93
+ /**
94
+ * List DLQ jobs with optional filtering and pagination
95
+ */
96
+ getDLQJobs<Payload = unknown>(options?: {
97
+ limit?: number;
98
+ offset?: number;
99
+ errorCategory?: string;
100
+ jobName?: string;
101
+ }): Promise<JobDLQRecord<Payload>[]>;
102
+ /**
103
+ * Get specific DLQ job by ID
104
+ */
105
+ getDLQJob<Payload = unknown>(id: string): Promise<JobDLQRecord<Payload> | null>;
106
+ /**
107
+ * Get DLQ statistics
108
+ */
109
+ getDLQStats(): Promise<{
110
+ totalDLQJobs: number;
111
+ byStatus: Record<string, number>;
112
+ byErrorCategory: Record<string, number>;
113
+ byJobName: Record<string, number>;
114
+ oldestFailure: number | null;
115
+ recentFailures24h: number;
116
+ }>;
117
+ /**
118
+ * Reprocess a job from DLQ back to main queue
119
+ * @param dlqJobId - ID of DLQ job
120
+ * @param options - Reprocessing options
121
+ * @returns ID of new job in main queue
122
+ */
123
+ reprocessFromDLQ(dlqJobId: string, options?: {
124
+ newMaxAttempts?: number;
125
+ priority?: number;
126
+ }): Promise<string>;
127
+ /**
128
+ * Delete specific DLQ job
129
+ */
130
+ deleteFromDLQ(id: string): Promise<void>;
131
+ /**
132
+ * Purge DLQ jobs older than specified time
133
+ * @param olderThanMs - Age in milliseconds (default: 30 days)
134
+ * @returns Number of jobs purged
135
+ */
136
+ purgeDLQ(olderThanMs?: number): Promise<number>;
137
+ /**
138
+ * Get queue statistics
139
+ */
140
+ getQueueStats(): Promise<{
141
+ totalJobs: number;
142
+ pendingJobs: number;
143
+ activeJobs: number;
144
+ completedJobs: number;
145
+ failedJobs: number;
146
+ dlqJobs: number;
147
+ avgProcessingTime: number;
148
+ priorityDistribution: Record<string, number>;
149
+ }>;
150
+ /**
151
+ * Get queue depth by priority level
152
+ */
153
+ getQueueDepthByPriority(): Promise<Array<{
154
+ priority: number;
155
+ count: number;
156
+ label: string;
157
+ }>>;
158
+ /**
159
+ * Update job priority
160
+ */
161
+ updateJobPriority(jobId: string, priority: number): Promise<void>;
162
+ private getPriorityLabel;
163
+ /**
164
+ * Find jobs that are stuck in "active" status (worker terminated)
165
+ * Returns jobs that have been active longer than the specified timeout
166
+ */
167
+ findStuckJobs(timeoutMs?: number): Promise<JobRecord[]>;
168
+ /**
169
+ * Reset a stuck job from "active" to "pending" status
170
+ * Use this when a worker has terminated and left jobs in active state
171
+ */
172
+ resetStuckJob(jobId: string): Promise<void>;
173
+ /**
174
+ * Bulk reset multiple stuck jobs
175
+ */
176
+ resetStuckJobs(jobIds: string[]): Promise<{
177
+ reset: number;
178
+ failed: number;
179
+ }>;
61
180
  }
62
181
  //# sourceMappingURL=queue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,SAAS,CAAC,OAAO,GAAG,OAAO;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B;;OAEG;IACH,EAAE,EAAE,eAAe,CAAC;IACpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,qBAAa,QAAQ;IACjB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;gBAE/B,OAAO,EAAE,eAAe;IAOpC,OAAO,CAAC,gBAAgB;IAOlB,OAAO,CAAC,OAAO,GAAG,OAAO,EAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,MAAM,CAAC;IA+BlB;;;OAGG;IACG,SAAS,CAAC,OAAO,GAAG,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAgElE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDvE,MAAM,CAAC,OAAO,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAMzE,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAapF,OAAO;IAIP,OAAO,CAAC,MAAM;CAejB"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"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"}