bullmq 1.57.3 → 1.59.1

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 (384) hide show
  1. package/dist/bullmq.d.ts +1839 -0
  2. package/dist/{classes → cjs/classes}/backoffs.d.ts +0 -0
  3. package/dist/{classes → cjs/classes}/backoffs.js +0 -0
  4. package/dist/cjs/classes/backoffs.js.map +1 -0
  5. package/dist/{classes → cjs/classes}/child-pool.d.ts +0 -0
  6. package/dist/{classes → cjs/classes}/child-pool.js +1 -1
  7. package/dist/cjs/classes/child-pool.js.map +1 -0
  8. package/dist/{classes → cjs/classes}/child-processor.d.ts +0 -0
  9. package/dist/{classes → cjs/classes}/child-processor.js +0 -0
  10. package/dist/cjs/classes/child-processor.js.map +1 -0
  11. package/dist/{classes → cjs/classes}/compat.d.ts +0 -0
  12. package/dist/{classes → cjs/classes}/compat.js +0 -0
  13. package/dist/cjs/classes/compat.js.map +1 -0
  14. package/dist/{classes → cjs/classes}/flow-producer.d.ts +0 -0
  15. package/dist/{classes → cjs/classes}/flow-producer.js +0 -0
  16. package/dist/cjs/classes/flow-producer.js.map +1 -0
  17. package/dist/{classes → cjs/classes}/index.d.ts +0 -0
  18. package/dist/{classes → cjs/classes}/index.js +0 -0
  19. package/dist/cjs/classes/index.js.map +1 -0
  20. package/dist/{classes → cjs/classes}/job.d.ts +0 -0
  21. package/dist/{classes → cjs/classes}/job.js +0 -0
  22. package/dist/cjs/classes/job.js.map +1 -0
  23. package/dist/{classes → cjs/classes}/master.d.ts +0 -0
  24. package/dist/{classes → cjs/classes}/master.js +0 -0
  25. package/dist/cjs/classes/master.js.map +1 -0
  26. package/dist/{classes → cjs/classes}/process-utils.d.ts +0 -0
  27. package/dist/{classes → cjs/classes}/process-utils.js +0 -0
  28. package/dist/cjs/classes/process-utils.js.map +1 -0
  29. package/dist/{classes → cjs/classes}/queue-base.d.ts +0 -0
  30. package/dist/{classes → cjs/classes}/queue-base.js +0 -0
  31. package/dist/cjs/classes/queue-base.js.map +1 -0
  32. package/dist/{classes → cjs/classes}/queue-events.d.ts +0 -0
  33. package/dist/{classes → cjs/classes}/queue-events.js +0 -0
  34. package/dist/cjs/classes/queue-events.js.map +1 -0
  35. package/dist/{classes → cjs/classes}/queue-getters.d.ts +0 -0
  36. package/dist/{classes → cjs/classes}/queue-getters.js +0 -0
  37. package/dist/cjs/classes/queue-getters.js.map +1 -0
  38. package/dist/{classes → cjs/classes}/queue-keys.d.ts +0 -0
  39. package/dist/{classes → cjs/classes}/queue-keys.js +0 -0
  40. package/dist/cjs/classes/queue-keys.js.map +1 -0
  41. package/dist/{classes → cjs/classes}/queue-scheduler.d.ts +0 -0
  42. package/dist/{classes → cjs/classes}/queue-scheduler.js +0 -0
  43. package/dist/cjs/classes/queue-scheduler.js.map +1 -0
  44. package/dist/{classes → cjs/classes}/queue.d.ts +2 -2
  45. package/dist/{classes → cjs/classes}/queue.js +0 -0
  46. package/dist/cjs/classes/queue.js.map +1 -0
  47. package/dist/{classes → cjs/classes}/redis-connection.d.ts +0 -0
  48. package/dist/{classes → cjs/classes}/redis-connection.js +7 -5
  49. package/dist/cjs/classes/redis-connection.js.map +1 -0
  50. package/dist/{classes → cjs/classes}/repeat.d.ts +2 -2
  51. package/dist/{classes → cjs/classes}/repeat.js +3 -6
  52. package/dist/cjs/classes/repeat.js.map +1 -0
  53. package/dist/{classes → cjs/classes}/sandbox.d.ts +0 -0
  54. package/dist/{classes → cjs/classes}/sandbox.js +0 -0
  55. package/dist/cjs/classes/sandbox.js.map +1 -0
  56. package/dist/{classes → cjs/classes}/scripts.d.ts +2 -0
  57. package/dist/{classes → cjs/classes}/scripts.js +18 -0
  58. package/dist/cjs/classes/scripts.js.map +1 -0
  59. package/dist/{classes → cjs/classes}/timer-manager.d.ts +0 -0
  60. package/dist/{classes → cjs/classes}/timer-manager.js +0 -0
  61. package/dist/cjs/classes/timer-manager.js.map +1 -0
  62. package/dist/{classes → cjs/classes}/worker.d.ts +33 -18
  63. package/dist/{classes → cjs/classes}/worker.js +27 -5
  64. package/dist/cjs/classes/worker.js.map +1 -0
  65. package/dist/{commands → cjs/commands}/addJob-9.lua +0 -0
  66. package/dist/{commands → cjs/commands}/changeDelay-4.lua +0 -0
  67. package/dist/{commands → cjs/commands}/cleanJobsInSet-2.lua +0 -0
  68. package/dist/{commands → cjs/commands}/drain-4.lua +0 -0
  69. package/dist/{commands → cjs/commands}/extendLock-2.lua +0 -0
  70. package/dist/{commands → cjs/commands}/getState-7.lua +0 -0
  71. package/dist/{commands → cjs/commands}/getStateV2-7.lua +0 -0
  72. package/dist/{commands → cjs/commands}/includes/destructureJobKey.lua +0 -0
  73. package/dist/{commands → cjs/commands}/includes/updateParentDepsIfNeeded.lua +0 -0
  74. package/dist/{commands → cjs/commands}/index.d.ts +0 -0
  75. package/dist/{commands → cjs/commands}/index.js +0 -0
  76. package/dist/cjs/commands/index.js.map +1 -0
  77. package/dist/{commands → cjs/commands}/isFinished-3.lua +0 -0
  78. package/dist/{commands → cjs/commands}/isJobInList-1.lua +0 -0
  79. package/dist/{commands → cjs/commands}/moveStalledJobsToWait-8.lua +0 -0
  80. package/dist/{commands → cjs/commands}/moveToActive-8.lua +0 -0
  81. package/dist/{commands → cjs/commands}/moveToDelayed-5.lua +0 -0
  82. package/dist/{commands → cjs/commands}/moveToFinished-8.lua +0 -0
  83. package/dist/{commands → cjs/commands}/moveToWaitingChildren-4.lua +0 -0
  84. package/dist/{commands → cjs/commands}/obliterate-2.lua +0 -0
  85. package/dist/{commands → cjs/commands}/pause-4.lua +0 -0
  86. package/dist/{commands → cjs/commands}/promote-5.lua +0 -0
  87. package/dist/{commands → cjs/commands}/releaseLock-1.lua +0 -0
  88. package/dist/{commands → cjs/commands}/removeJob-1.lua +0 -0
  89. package/dist/{commands → cjs/commands}/removeRepeatable-2.lua +0 -0
  90. package/dist/{commands → cjs/commands}/reprocessJob-4.lua +0 -0
  91. package/dist/{commands → cjs/commands}/retryJob-4.lua +0 -0
  92. package/dist/{commands → cjs/commands}/script-loader.d.ts +0 -0
  93. package/dist/{commands → cjs/commands}/script-loader.js +0 -0
  94. package/dist/cjs/commands/script-loader.js.map +1 -0
  95. package/dist/{commands → cjs/commands}/takeLock-1.lua +0 -0
  96. package/dist/{commands → cjs/commands}/updateDelaySet-7.lua +0 -0
  97. package/dist/{commands → cjs/commands}/updateProgress-2.lua +0 -0
  98. package/dist/{enums → cjs/enums}/error-codes.enum.d.ts +0 -0
  99. package/dist/{enums → cjs/enums}/error-codes.enum.js +0 -0
  100. package/dist/cjs/enums/error-codes.enum.js.map +1 -0
  101. package/dist/{enums → cjs/enums}/index.d.ts +0 -0
  102. package/dist/{enums → cjs/enums}/index.js +0 -0
  103. package/dist/{enums → cjs/enums}/index.js.map +1 -1
  104. package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  105. package/dist/{index.js → cjs/index.js} +0 -0
  106. package/dist/cjs/index.js.map +1 -0
  107. package/dist/{interfaces → cjs/interfaces}/advanced-options.d.ts +0 -0
  108. package/dist/{interfaces → cjs/interfaces}/advanced-options.js +0 -0
  109. package/dist/cjs/interfaces/advanced-options.js.map +1 -0
  110. package/dist/{interfaces → cjs/interfaces}/backoff-options.d.ts +0 -0
  111. package/dist/{interfaces → cjs/interfaces}/backoff-options.js +0 -0
  112. package/dist/cjs/interfaces/backoff-options.js.map +1 -0
  113. package/dist/{interfaces → cjs/interfaces}/child-command.d.ts +0 -0
  114. package/dist/{interfaces → cjs/interfaces}/child-command.js +0 -0
  115. package/dist/cjs/interfaces/child-command.js.map +1 -0
  116. package/dist/{interfaces → cjs/interfaces}/child-message.d.ts +0 -0
  117. package/dist/{interfaces → cjs/interfaces}/child-message.js +0 -0
  118. package/dist/cjs/interfaces/child-message.js.map +1 -0
  119. package/dist/{interfaces → cjs/interfaces}/connection.d.ts +0 -0
  120. package/dist/{interfaces → cjs/interfaces}/connection.js +0 -0
  121. package/dist/cjs/interfaces/connection.js.map +1 -0
  122. package/dist/{interfaces → cjs/interfaces}/flow-job.d.ts +0 -0
  123. package/dist/{interfaces → cjs/interfaces}/flow-job.js +0 -0
  124. package/dist/{interfaces → cjs/interfaces}/flow-job.js.map +1 -1
  125. package/dist/{interfaces → cjs/interfaces}/index.d.ts +0 -0
  126. package/dist/{interfaces → cjs/interfaces}/index.js +0 -0
  127. package/dist/cjs/interfaces/index.js.map +1 -0
  128. package/dist/{interfaces → cjs/interfaces}/jobs-options.d.ts +0 -0
  129. package/dist/{interfaces → cjs/interfaces}/jobs-options.js +0 -0
  130. package/dist/cjs/interfaces/jobs-options.js.map +1 -0
  131. package/dist/{interfaces → cjs/interfaces}/parent-command.d.ts +0 -0
  132. package/dist/{interfaces → cjs/interfaces}/parent-command.js +0 -0
  133. package/dist/cjs/interfaces/parent-command.js.map +1 -0
  134. package/dist/{interfaces → cjs/interfaces}/parent-message.d.ts +0 -0
  135. package/dist/{interfaces → cjs/interfaces}/parent-message.js +0 -0
  136. package/dist/cjs/interfaces/parent-message.js.map +1 -0
  137. package/dist/{interfaces → cjs/interfaces}/parent.d.ts +0 -0
  138. package/dist/{interfaces → cjs/interfaces}/parent.js +0 -0
  139. package/dist/{interfaces → cjs/interfaces}/parent.js.map +1 -1
  140. package/dist/{interfaces → cjs/interfaces}/queue-options.d.ts +0 -0
  141. package/dist/{interfaces → cjs/interfaces}/queue-options.js +0 -0
  142. package/dist/cjs/interfaces/queue-options.js.map +1 -0
  143. package/dist/{interfaces → cjs/interfaces}/queue-scheduler-options.d.ts +0 -0
  144. package/dist/{interfaces → cjs/interfaces}/queue-scheduler-options.js +0 -0
  145. package/dist/cjs/interfaces/queue-scheduler-options.js.map +1 -0
  146. package/dist/{interfaces → cjs/interfaces}/rate-limiter-options.d.ts +0 -0
  147. package/dist/{interfaces → cjs/interfaces}/rate-limiter-options.js +0 -0
  148. package/dist/cjs/interfaces/rate-limiter-options.js.map +1 -0
  149. package/dist/cjs/interfaces/redis-options.d.ts +5 -0
  150. package/dist/{interfaces → cjs/interfaces}/redis-options.js +0 -0
  151. package/dist/cjs/interfaces/redis-options.js.map +1 -0
  152. package/dist/{interfaces → cjs/interfaces}/redis-streams.d.ts +0 -0
  153. package/dist/{interfaces → cjs/interfaces}/redis-streams.js +0 -0
  154. package/dist/cjs/interfaces/redis-streams.js.map +1 -0
  155. package/dist/{interfaces → cjs/interfaces}/repeat-options.d.ts +0 -0
  156. package/dist/{interfaces → cjs/interfaces}/repeat-options.js +0 -0
  157. package/dist/cjs/interfaces/repeat-options.js.map +1 -0
  158. package/dist/{interfaces → cjs/interfaces}/sandboxed-job-processor.d.ts +0 -0
  159. package/dist/{interfaces → cjs/interfaces}/sandboxed-job-processor.js +0 -0
  160. package/dist/cjs/interfaces/sandboxed-job-processor.js.map +1 -0
  161. package/dist/{interfaces → cjs/interfaces}/sandboxed-job.d.ts +0 -0
  162. package/dist/{interfaces → cjs/interfaces}/sandboxed-job.js +0 -0
  163. package/dist/cjs/interfaces/sandboxed-job.js.map +1 -0
  164. package/dist/{interfaces → cjs/interfaces}/worker-options.d.ts +0 -0
  165. package/dist/{interfaces → cjs/interfaces}/worker-options.js +0 -0
  166. package/dist/cjs/interfaces/worker-options.js.map +1 -0
  167. package/dist/{utils.d.ts → cjs/utils.d.ts} +0 -0
  168. package/dist/{utils.js → cjs/utils.js} +0 -0
  169. package/dist/cjs/utils.js.map +1 -0
  170. package/dist/esm/classes/backoffs.d.ts +15 -0
  171. package/dist/esm/classes/backoffs.js +44 -0
  172. package/dist/esm/classes/backoffs.js.map +1 -0
  173. package/dist/esm/classes/child-pool.d.ts +22 -0
  174. package/dist/esm/classes/child-pool.js +125 -0
  175. package/dist/esm/classes/child-pool.js.map +1 -0
  176. package/dist/esm/classes/child-processor.d.ts +24 -0
  177. package/dist/esm/classes/child-processor.js +165 -0
  178. package/dist/esm/classes/child-processor.js.map +1 -0
  179. package/dist/esm/classes/compat.d.ts +316 -0
  180. package/dist/esm/classes/compat.js +674 -0
  181. package/dist/esm/classes/compat.js.map +1 -0
  182. package/dist/esm/classes/flow-producer.d.ts +148 -0
  183. package/dist/esm/classes/flow-producer.js +228 -0
  184. package/dist/esm/classes/flow-producer.js.map +1 -0
  185. package/dist/esm/classes/index.d.ts +14 -0
  186. package/dist/esm/classes/index.js +15 -0
  187. package/dist/esm/classes/index.js.map +1 -0
  188. package/dist/esm/classes/job.d.ts +338 -0
  189. package/dist/esm/classes/job.js +623 -0
  190. package/dist/esm/classes/job.js.map +1 -0
  191. package/dist/esm/classes/master.d.ts +1 -0
  192. package/dist/esm/classes/master.js +35 -0
  193. package/dist/esm/classes/master.js.map +1 -0
  194. package/dist/esm/classes/process-utils.d.ts +7 -0
  195. package/dist/esm/classes/process-utils.js +31 -0
  196. package/dist/esm/classes/process-utils.js.map +1 -0
  197. package/dist/esm/classes/queue-base.d.ts +22 -0
  198. package/dist/esm/classes/queue-base.js +62 -0
  199. package/dist/esm/classes/queue-base.js.map +1 -0
  200. package/dist/esm/classes/queue-events.d.ts +153 -0
  201. package/dist/esm/classes/queue-events.js +108 -0
  202. package/dist/esm/classes/queue-events.js.map +1 -0
  203. package/dist/esm/classes/queue-getters.d.ts +54 -0
  204. package/dist/esm/classes/queue-getters.js +207 -0
  205. package/dist/esm/classes/queue-getters.js.map +1 -0
  206. package/dist/esm/classes/queue-keys.d.ts +10 -0
  207. package/dist/esm/classes/queue-keys.js +40 -0
  208. package/dist/esm/classes/queue-keys.js.map +1 -0
  209. package/dist/esm/classes/queue-scheduler.d.ts +35 -0
  210. package/dist/esm/classes/queue-scheduler.js +156 -0
  211. package/dist/esm/classes/queue-scheduler.js.map +1 -0
  212. package/dist/esm/classes/queue.d.ts +143 -0
  213. package/dist/esm/classes/queue.js +195 -0
  214. package/dist/esm/classes/queue.js.map +1 -0
  215. package/dist/esm/classes/redis-connection.d.ts +28 -0
  216. package/dist/esm/classes/redis-connection.js +164 -0
  217. package/dist/esm/classes/redis-connection.js.map +1 -0
  218. package/dist/esm/classes/repeat.d.ts +20 -0
  219. package/dist/esm/classes/repeat.js +140 -0
  220. package/dist/esm/classes/repeat.js.map +1 -0
  221. package/dist/esm/classes/sandbox.d.ts +4 -0
  222. package/dist/esm/classes/sandbox.js +56 -0
  223. package/dist/esm/classes/sandbox.js.map +1 -0
  224. package/dist/esm/classes/scripts.d.ts +82 -0
  225. package/dist/esm/classes/scripts.js +510 -0
  226. package/dist/esm/classes/scripts.js.map +1 -0
  227. package/dist/esm/classes/timer-manager.d.ts +17 -0
  228. package/dist/esm/classes/timer-manager.js +47 -0
  229. package/dist/esm/classes/timer-manager.js.map +1 -0
  230. package/dist/esm/classes/worker.d.ts +168 -0
  231. package/dist/esm/classes/worker.js +469 -0
  232. package/dist/esm/classes/worker.js.map +1 -0
  233. package/dist/esm/commands/addJob-9.lua +179 -0
  234. package/dist/esm/commands/changeDelay-4.lua +41 -0
  235. package/dist/esm/commands/cleanJobsInSet-2.lua +65 -0
  236. package/dist/esm/commands/drain-4.lua +36 -0
  237. package/dist/esm/commands/extendLock-2.lua +23 -0
  238. package/dist/esm/commands/getState-7.lua +63 -0
  239. package/dist/esm/commands/getStateV2-7.lua +51 -0
  240. package/dist/esm/commands/includes/destructureJobKey.lua +12 -0
  241. package/dist/esm/commands/includes/updateParentDepsIfNeeded.lua +19 -0
  242. package/dist/esm/commands/index.d.ts +4 -0
  243. package/dist/esm/commands/index.js +5 -0
  244. package/dist/esm/commands/index.js.map +1 -0
  245. package/dist/esm/commands/isFinished-3.lua +48 -0
  246. package/dist/esm/commands/isJobInList-1.lua +20 -0
  247. package/dist/esm/commands/moveStalledJobsToWait-8.lua +112 -0
  248. package/dist/esm/commands/moveToActive-8.lua +100 -0
  249. package/dist/esm/commands/moveToDelayed-5.lua +45 -0
  250. package/dist/esm/commands/moveToFinished-8.lua +159 -0
  251. package/dist/esm/commands/moveToWaitingChildren-4.lua +60 -0
  252. package/dist/esm/commands/obliterate-2.lua +129 -0
  253. package/dist/esm/commands/pause-4.lua +27 -0
  254. package/dist/esm/commands/promote-5.lua +54 -0
  255. package/dist/esm/commands/releaseLock-1.lua +19 -0
  256. package/dist/esm/commands/removeJob-1.lua +115 -0
  257. package/dist/esm/commands/removeRepeatable-2.lua +23 -0
  258. package/dist/esm/commands/reprocessJob-4.lua +32 -0
  259. package/dist/esm/commands/retryJob-4.lua +34 -0
  260. package/dist/esm/commands/script-loader.d.ts +120 -0
  261. package/dist/esm/commands/script-loader.js +395 -0
  262. package/dist/esm/commands/script-loader.js.map +1 -0
  263. package/dist/esm/commands/takeLock-1.lua +17 -0
  264. package/dist/esm/commands/updateDelaySet-7.lua +73 -0
  265. package/dist/esm/commands/updateProgress-2.lua +15 -0
  266. package/dist/esm/enums/error-codes.enum.d.ts +7 -0
  267. package/dist/esm/enums/error-codes.enum.js +9 -0
  268. package/dist/esm/enums/error-codes.enum.js.map +1 -0
  269. package/dist/esm/enums/index.d.ts +1 -0
  270. package/dist/esm/enums/index.js +2 -0
  271. package/dist/esm/enums/index.js.map +1 -0
  272. package/dist/esm/index.d.ts +5 -0
  273. package/dist/esm/index.js +6 -0
  274. package/dist/esm/index.js.map +1 -0
  275. package/dist/esm/interfaces/advanced-options.d.ts +6 -0
  276. package/dist/esm/interfaces/advanced-options.js +2 -0
  277. package/dist/esm/interfaces/advanced-options.js.map +1 -0
  278. package/dist/esm/interfaces/backoff-options.d.ts +15 -0
  279. package/dist/esm/interfaces/backoff-options.js +2 -0
  280. package/dist/esm/interfaces/backoff-options.js.map +1 -0
  281. package/dist/esm/interfaces/child-command.d.ts +5 -0
  282. package/dist/esm/interfaces/child-command.js +7 -0
  283. package/dist/esm/interfaces/child-command.js.map +1 -0
  284. package/dist/esm/interfaces/child-message.d.ts +6 -0
  285. package/dist/esm/interfaces/child-message.js +2 -0
  286. package/dist/esm/interfaces/child-message.js.map +1 -0
  287. package/dist/esm/interfaces/connection.d.ts +8 -0
  288. package/dist/esm/interfaces/connection.js +2 -0
  289. package/dist/esm/interfaces/connection.js.map +1 -0
  290. package/dist/esm/interfaces/flow-job.d.ts +14 -0
  291. package/dist/esm/interfaces/flow-job.js +2 -0
  292. package/dist/esm/interfaces/flow-job.js.map +1 -0
  293. package/dist/esm/interfaces/index.d.ts +19 -0
  294. package/dist/esm/interfaces/index.js +20 -0
  295. package/dist/esm/interfaces/index.js.map +1 -0
  296. package/dist/esm/interfaces/jobs-options.d.ts +91 -0
  297. package/dist/esm/interfaces/jobs-options.js +2 -0
  298. package/dist/esm/interfaces/jobs-options.js.map +1 -0
  299. package/dist/esm/interfaces/parent-command.d.ts +9 -0
  300. package/dist/esm/interfaces/parent-command.js +11 -0
  301. package/dist/esm/interfaces/parent-command.js.map +1 -0
  302. package/dist/esm/interfaces/parent-message.d.ts +8 -0
  303. package/dist/esm/interfaces/parent-message.js +2 -0
  304. package/dist/esm/interfaces/parent-message.js.map +1 -0
  305. package/dist/esm/interfaces/parent.d.ts +11 -0
  306. package/dist/esm/interfaces/parent.js +2 -0
  307. package/dist/esm/interfaces/parent.js.map +1 -0
  308. package/dist/esm/interfaces/queue-options.d.ts +72 -0
  309. package/dist/esm/interfaces/queue-options.js +6 -0
  310. package/dist/esm/interfaces/queue-options.js.map +1 -0
  311. package/dist/esm/interfaces/queue-scheduler-options.d.ts +23 -0
  312. package/dist/esm/interfaces/queue-scheduler-options.js +2 -0
  313. package/dist/esm/interfaces/queue-scheduler-options.js.map +1 -0
  314. package/dist/esm/interfaces/rate-limiter-options.d.ts +30 -0
  315. package/dist/esm/interfaces/rate-limiter-options.js +2 -0
  316. package/dist/esm/interfaces/rate-limiter-options.js.map +1 -0
  317. package/dist/esm/interfaces/redis-options.d.ts +5 -0
  318. package/dist/esm/interfaces/redis-options.js +2 -0
  319. package/dist/esm/interfaces/redis-options.js.map +1 -0
  320. package/dist/esm/interfaces/redis-streams.d.ts +4 -0
  321. package/dist/esm/interfaces/redis-streams.js +2 -0
  322. package/dist/esm/interfaces/redis-streams.js.map +1 -0
  323. package/dist/esm/interfaces/repeat-options.d.ts +44 -0
  324. package/dist/esm/interfaces/repeat-options.js +2 -0
  325. package/dist/esm/interfaces/repeat-options.js.map +1 -0
  326. package/dist/esm/interfaces/sandboxed-job-processor.d.ts +5 -0
  327. package/dist/esm/interfaces/sandboxed-job-processor.js +2 -0
  328. package/dist/esm/interfaces/sandboxed-job-processor.js.map +1 -0
  329. package/dist/esm/interfaces/sandboxed-job.d.ts +13 -0
  330. package/dist/esm/interfaces/sandboxed-job.js +2 -0
  331. package/dist/esm/interfaces/sandboxed-job.js.map +1 -0
  332. package/dist/esm/interfaces/worker-options.d.ts +32 -0
  333. package/dist/esm/interfaces/worker-options.js +2 -0
  334. package/dist/esm/interfaces/worker-options.js.map +1 -0
  335. package/dist/esm/tsdoc-metadata.json +11 -0
  336. package/dist/esm/utils.d.ts +29 -0
  337. package/dist/esm/utils.js +124 -0
  338. package/dist/esm/utils.js.map +1 -0
  339. package/package.json +14 -12
  340. package/dist/classes/backoffs.js.map +0 -1
  341. package/dist/classes/child-pool.js.map +0 -1
  342. package/dist/classes/child-processor.js.map +0 -1
  343. package/dist/classes/compat.js.map +0 -1
  344. package/dist/classes/flow-producer.js.map +0 -1
  345. package/dist/classes/index.js.map +0 -1
  346. package/dist/classes/job.js.map +0 -1
  347. package/dist/classes/master.js.map +0 -1
  348. package/dist/classes/process-utils.js.map +0 -1
  349. package/dist/classes/queue-base.js.map +0 -1
  350. package/dist/classes/queue-events.js.map +0 -1
  351. package/dist/classes/queue-getters.js.map +0 -1
  352. package/dist/classes/queue-keys.js.map +0 -1
  353. package/dist/classes/queue-scheduler.js.map +0 -1
  354. package/dist/classes/queue.js.map +0 -1
  355. package/dist/classes/redis-connection.js.map +0 -1
  356. package/dist/classes/repeat.js.map +0 -1
  357. package/dist/classes/sandbox.js.map +0 -1
  358. package/dist/classes/scripts.js.map +0 -1
  359. package/dist/classes/timer-manager.js.map +0 -1
  360. package/dist/classes/worker.js.map +0 -1
  361. package/dist/commands/index.js.map +0 -1
  362. package/dist/commands/script-loader.js.map +0 -1
  363. package/dist/enums/error-codes.enum.js.map +0 -1
  364. package/dist/index.js.map +0 -1
  365. package/dist/interfaces/advanced-options.js.map +0 -1
  366. package/dist/interfaces/backoff-options.js.map +0 -1
  367. package/dist/interfaces/child-command.js.map +0 -1
  368. package/dist/interfaces/child-message.js.map +0 -1
  369. package/dist/interfaces/connection.js.map +0 -1
  370. package/dist/interfaces/index.js.map +0 -1
  371. package/dist/interfaces/jobs-options.js.map +0 -1
  372. package/dist/interfaces/parent-command.js.map +0 -1
  373. package/dist/interfaces/parent-message.js.map +0 -1
  374. package/dist/interfaces/queue-options.js.map +0 -1
  375. package/dist/interfaces/queue-scheduler-options.js.map +0 -1
  376. package/dist/interfaces/rate-limiter-options.js.map +0 -1
  377. package/dist/interfaces/redis-options.d.ts +0 -5
  378. package/dist/interfaces/redis-options.js.map +0 -1
  379. package/dist/interfaces/redis-streams.js.map +0 -1
  380. package/dist/interfaces/repeat-options.js.map +0 -1
  381. package/dist/interfaces/sandboxed-job-processor.js.map +0 -1
  382. package/dist/interfaces/sandboxed-job.js.map +0 -1
  383. package/dist/interfaces/worker-options.js.map +0 -1
  384. package/dist/utils.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ import { v4 } from 'uuid';
2
+ /**
3
+ * Keeps track on timers created with setTimeout to help clearTimeout
4
+ * for all timers when no more delayed actions needed
5
+ */
6
+ export class TimerManager {
7
+ constructor() {
8
+ this.timers = new Map();
9
+ }
10
+ /**
11
+ * Creates a new timer and returns its ID.
12
+ *
13
+ * @param name Readable name for the timer
14
+ * @param delay Delay in milliseconds
15
+ * @param fn callback function that is executed after the timer expires
16
+ */
17
+ setTimer(name, delay, fn) {
18
+ const id = v4();
19
+ const timer = setTimeout(timeoutId => {
20
+ this.clearTimer(timeoutId);
21
+ try {
22
+ fn();
23
+ }
24
+ catch (err) {
25
+ console.error(err);
26
+ }
27
+ }, delay, id);
28
+ this.timers.set(id, {
29
+ name,
30
+ timer,
31
+ });
32
+ return id;
33
+ }
34
+ clearTimer(id) {
35
+ const timer = this.timers.get(id);
36
+ if (timer) {
37
+ clearTimeout(timer.timer);
38
+ this.timers.delete(id);
39
+ }
40
+ }
41
+ clearAllTimers() {
42
+ for (const id of this.timers.keys()) {
43
+ this.clearTimer(id);
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=timer-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer-manager.js","sourceRoot":"","sources":["../../../src/classes/timer-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAE1B;;;GAGG;AACH,MAAM,OAAO,YAAY;IAAzB;QACmB,WAAM,GAAG,IAAI,GAAG,EAM9B,CAAC;IA6CN,CAAC;IA3CC;;;;;;OAMG;IACI,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,EAAY;QACvD,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,UAAU,CACtB,SAAS,CAAC,EAAE;YACV,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI;gBACF,EAAE,EAAE,CAAC;aACN;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpB;QACH,CAAC,EACD,KAAK,EACL,EAAE,CACH,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;YAClB,IAAI;YACJ,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,UAAU,CAAC,EAAU;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE;YACT,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACxB;IACH,CAAC;IAEM,cAAc;QACnB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YACnC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;SACrB;IACH,CAAC;CACF"}
@@ -0,0 +1,168 @@
1
+ import { Processor, WorkerOptions, GetNextJobOptions, RedisClient } from '../interfaces';
2
+ import { QueueBase } from './queue-base';
3
+ import { Repeat } from './repeat';
4
+ import { Job, JobJsonRaw } from './job';
5
+ import { RedisConnection } from './redis-connection';
6
+ import { TimerManager } from './timer-manager';
7
+ export interface WorkerListener {
8
+ /**
9
+ * Listen to 'active' event.
10
+ *
11
+ * This event is triggered when a job enters the 'active' state.
12
+ */
13
+ active: (job: Job, prev: string) => void;
14
+ /**
15
+ * Listen to 'closing' event.
16
+ *
17
+ * This event is triggered when the worker is closed.
18
+ */
19
+ closed: () => void;
20
+ /**
21
+ * Listen to 'closing' event.
22
+ *
23
+ * This event is triggered when the worker is closing.
24
+ */
25
+ closing: (msg: string) => void;
26
+ /**
27
+ * Listen to 'completed' event.
28
+ *
29
+ * This event is triggered when a job has successfully completed.
30
+ */
31
+ completed: (job: Job, result: any, prev: string) => void;
32
+ /**
33
+ * Listen to 'drained' event.
34
+ *
35
+ * This event is triggered when the queue has drained the waiting list.
36
+ * Note that there could still be delayed jobs waiting their timers to expire
37
+ * and this event will still be triggered as long as the waiting list has emptied.
38
+ */
39
+ drained: () => void;
40
+ /**
41
+ * Listen to 'error' event.
42
+ *
43
+ * This event is triggered when an error is throw.
44
+ */
45
+ error: (failedReason: Error) => void;
46
+ /**
47
+ * Listen to 'failed' event.
48
+ *
49
+ * This event is triggered when a job has thrown an exception.
50
+ */
51
+ failed: (job: Job, error: Error, prev: string) => void;
52
+ /**
53
+ * Listen to 'paused' event.
54
+ *
55
+ * This event is triggered when the queue is paused.
56
+ */
57
+ paused: () => void;
58
+ /**
59
+ * Listen to 'progress' event.
60
+ *
61
+ * This event is triggered when a job updates it progress, i.e. the
62
+ * Job##updateProgress() method is called. This is useful to notify
63
+ * progress or any other data from within a processor to the rest of the
64
+ * world.
65
+ */
66
+ progress: (job: Job, progress: number | object) => void;
67
+ /**
68
+ * Listen to 'resumed' event.
69
+ *
70
+ * This event is triggered when the queue is resumed.
71
+ */
72
+ resumed: () => void;
73
+ }
74
+ /**
75
+ *
76
+ * This class represents a worker that is able to process jobs from the queue.
77
+ * As soon as the class is instantiated it will start processing jobs.
78
+ *
79
+ */
80
+ export declare class Worker<DataType = any, ResultType = any, NameType extends string = string> extends QueueBase {
81
+ opts: WorkerOptions;
82
+ private drained;
83
+ private waiting;
84
+ private running;
85
+ private blockTimeout;
86
+ protected processFn: Processor<DataType, ResultType, NameType>;
87
+ private resumeWorker;
88
+ protected paused: Promise<void>;
89
+ private _repeat;
90
+ private childPool;
91
+ protected timerManager: TimerManager;
92
+ private blockingConnection;
93
+ private processing;
94
+ constructor(name: string, processor?: string | Processor<DataType, ResultType, NameType>, opts?: WorkerOptions, Connection?: typeof RedisConnection);
95
+ emit<U extends keyof WorkerListener>(event: U, ...args: Parameters<WorkerListener[U]>): boolean;
96
+ off<U extends keyof WorkerListener>(eventName: U, listener: WorkerListener[U]): this;
97
+ on<U extends keyof WorkerListener>(event: U, listener: WorkerListener[U]): this;
98
+ once<U extends keyof WorkerListener>(event: U, listener: WorkerListener[U]): this;
99
+ protected callProcessJob(job: Job<DataType, ResultType, NameType>, token: string): Promise<ResultType>;
100
+ protected createJob(data: JobJsonRaw, jobId: string): Job<any, any, string>;
101
+ /**
102
+ *
103
+ * Waits until the worker is ready to start processing jobs.
104
+ * In general only useful when writing tests.
105
+ *
106
+ */
107
+ waitUntilReady(): Promise<RedisClient>;
108
+ get repeat(): Promise<Repeat>;
109
+ run(): Promise<any[]>;
110
+ /**
111
+ * Returns a promise that resolves to the next job in queue.
112
+ * @param token - worker token to be assigned to retrieved job
113
+ * @returns a Job or undefined if no job was available in the queue.
114
+ */
115
+ getNextJob(token: string, { block }?: GetNextJobOptions): Promise<Job<any, any, string>>;
116
+ protected moveToActive(token: string, jobId?: string): Promise<Job<any, any, string>>;
117
+ private waitForJob;
118
+ /**
119
+ *
120
+ * This function is exposed only for testing purposes.
121
+ */
122
+ delay(): Promise<void>;
123
+ protected nextJobFromJobData(jobData?: JobJsonRaw | number, jobId?: string): Promise<Job<any, any, string>>;
124
+ processJob(job: Job<DataType, ResultType, NameType>, token: string): Promise<void | Job<any, any, string>>;
125
+ /**
126
+ *
127
+ * Pauses the processing of this queue only for this worker.
128
+ */
129
+ pause(doNotWaitActive?: boolean): Promise<void>;
130
+ /**
131
+ *
132
+ * Resumes processing of this worker (if paused).
133
+ */
134
+ resume(): void;
135
+ /**
136
+ *
137
+ * Checks if worker is paused.
138
+ *
139
+ * @returns true if worker is paused, false otherwise.
140
+ */
141
+ isPaused(): boolean;
142
+ /**
143
+ *
144
+ * Checks if worker is currently running.
145
+ *
146
+ * @returns true if worker is running, false otherwise.
147
+ */
148
+ isRunning(): boolean;
149
+ /**
150
+ *
151
+ * Closes the worker and related redis connections.
152
+ *
153
+ * This method waits for current jobs to finalize before returning.
154
+ *
155
+ * @param force - Use force boolean parameter if you do not want to wait for
156
+ * current jobs to be processed.
157
+ *
158
+ * @returns Promise that resolves when the worker has been closed.
159
+ */
160
+ close(force?: boolean): Promise<void>;
161
+ /**
162
+ * Returns a promise that resolves when active jobs are cleared
163
+ *
164
+ * @returns
165
+ */
166
+ private whenCurrentJobsFinished;
167
+ private retryIfFailed;
168
+ }
@@ -0,0 +1,469 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { v4 } from 'uuid';
4
+ import { clientCommandMessageReg, delay, DELAY_TIME_1, isNotConnectionError, isRedisInstance, } from '../utils';
5
+ import { QueueBase } from './queue-base';
6
+ import { Repeat } from './repeat';
7
+ import { ChildPool } from './child-pool';
8
+ import { Job } from './job';
9
+ import { RedisConnection } from './redis-connection';
10
+ import sandbox from './sandbox';
11
+ import { Scripts } from './scripts';
12
+ import { TimerManager } from './timer-manager';
13
+ /**
14
+ *
15
+ * This class represents a worker that is able to process jobs from the queue.
16
+ * As soon as the class is instantiated it will start processing jobs.
17
+ *
18
+ */
19
+ export class Worker extends QueueBase {
20
+ constructor(name, processor, opts = {}, Connection) {
21
+ super(name, Object.assign(Object.assign({}, opts), { sharedConnection: isRedisInstance(opts.connection) }), Connection);
22
+ this.waiting = false;
23
+ this.running = false;
24
+ this.blockTimeout = 0;
25
+ this.opts = Object.assign({ drainDelay: 5, concurrency: 1, lockDuration: 30000, runRetryDelay: 15000, autorun: true }, this.opts);
26
+ this.opts.lockRenewTime =
27
+ this.opts.lockRenewTime || this.opts.lockDuration / 2;
28
+ this.blockingConnection = new RedisConnection(isRedisInstance(opts.connection)
29
+ ? opts.connection.duplicate()
30
+ : opts.connection);
31
+ this.blockingConnection.on('error', error => this.emit('error', error));
32
+ if (processor) {
33
+ if (typeof processor === 'function') {
34
+ this.processFn = processor;
35
+ }
36
+ else {
37
+ // SANDBOXED
38
+ const supportedFileTypes = ['.js', '.ts', '.flow'];
39
+ const processorFile = processor +
40
+ (supportedFileTypes.includes(path.extname(processor)) ? '' : '.js');
41
+ if (!fs.existsSync(processorFile)) {
42
+ throw new Error(`File ${processorFile} does not exist`);
43
+ }
44
+ let masterFile = path.join(__dirname, './master.js');
45
+ try {
46
+ fs.statSync(masterFile); // would throw if file not exists
47
+ }
48
+ catch (_) {
49
+ masterFile = path.join(process.cwd(), 'dist/cjs/classes/master.js');
50
+ fs.statSync(masterFile);
51
+ }
52
+ this.childPool = new ChildPool(masterFile);
53
+ this.processFn = sandbox(processor, this.childPool).bind(this);
54
+ }
55
+ this.timerManager = new TimerManager();
56
+ if (this.opts.autorun) {
57
+ this.run().catch(error => this.emit('error', error));
58
+ }
59
+ }
60
+ this.on('error', err => console.error(err));
61
+ }
62
+ emit(event, ...args) {
63
+ return super.emit(event, ...args);
64
+ }
65
+ off(eventName, listener) {
66
+ super.off(eventName, listener);
67
+ return this;
68
+ }
69
+ on(event, listener) {
70
+ super.on(event, listener);
71
+ return this;
72
+ }
73
+ once(event, listener) {
74
+ super.once(event, listener);
75
+ return this;
76
+ }
77
+ callProcessJob(job, token) {
78
+ return this.processFn(job, token);
79
+ }
80
+ createJob(data, jobId) {
81
+ return Job.fromJSON(this, data, jobId);
82
+ }
83
+ /**
84
+ *
85
+ * Waits until the worker is ready to start processing jobs.
86
+ * In general only useful when writing tests.
87
+ *
88
+ */
89
+ async waitUntilReady() {
90
+ await super.waitUntilReady();
91
+ return this.blockingConnection.client;
92
+ }
93
+ get repeat() {
94
+ return new Promise(async (resolve) => {
95
+ if (!this._repeat) {
96
+ const connection = await this.client;
97
+ this._repeat = new Repeat(this.name, Object.assign(Object.assign({}, this.opts), { connection }));
98
+ this._repeat.on('error', e => this.emit.bind(this, e));
99
+ }
100
+ resolve(this._repeat);
101
+ });
102
+ }
103
+ async run() {
104
+ if (this.processFn) {
105
+ if (!this.running) {
106
+ try {
107
+ this.running = true;
108
+ const client = await this.client;
109
+ if (this.closing) {
110
+ return;
111
+ }
112
+ // IDEA, How to store metadata associated to a worker.
113
+ // create a key from the worker ID associated to the given name.
114
+ // We keep a hash table bull:myqueue:workers where
115
+ // every worker is a hash key workername:workerId with json holding
116
+ // metadata of the worker. The worker key gets expired every 30 seconds or so, we renew the worker metadata.
117
+ //
118
+ try {
119
+ await client.client('setname', this.clientName());
120
+ }
121
+ catch (err) {
122
+ if (!clientCommandMessageReg.test(err.message)) {
123
+ throw err;
124
+ }
125
+ }
126
+ const opts = this.opts;
127
+ const processing = (this.processing = new Map());
128
+ const tokens = Array.from({ length: opts.concurrency }, () => v4());
129
+ while (!this.closing) {
130
+ if (processing.size < opts.concurrency) {
131
+ const token = tokens.pop();
132
+ processing.set(this.retryIfFailed(() => this.getNextJob(token), this.opts.runRetryDelay), token);
133
+ }
134
+ /*
135
+ * Get the first promise that completes
136
+ */
137
+ const promises = [...processing.keys()];
138
+ const completedIdx = await Promise.race(promises.map((p, idx) => p.then(() => idx)));
139
+ const completed = promises[completedIdx];
140
+ const token = processing.get(completed);
141
+ processing.delete(completed);
142
+ const job = await completed;
143
+ if (job) {
144
+ // reuse same token if next job is available to process
145
+ processing.set(this.retryIfFailed(() => this.processJob(job, token), this.opts.runRetryDelay), token);
146
+ }
147
+ else {
148
+ tokens.push(token);
149
+ }
150
+ }
151
+ this.running = false;
152
+ return Promise.all([...processing.keys()]);
153
+ }
154
+ catch (error) {
155
+ this.running = false;
156
+ throw error;
157
+ }
158
+ }
159
+ else {
160
+ throw new Error('Worker is already running.');
161
+ }
162
+ }
163
+ else {
164
+ throw new Error('No process function is defined.');
165
+ }
166
+ }
167
+ /**
168
+ * Returns a promise that resolves to the next job in queue.
169
+ * @param token - worker token to be assigned to retrieved job
170
+ * @returns a Job or undefined if no job was available in the queue.
171
+ */
172
+ async getNextJob(token, { block = true } = {}) {
173
+ if (this.paused) {
174
+ if (block) {
175
+ await this.paused;
176
+ }
177
+ else {
178
+ return;
179
+ }
180
+ }
181
+ if (this.closing) {
182
+ return;
183
+ }
184
+ if (this.drained && block) {
185
+ try {
186
+ const jobId = await this.waitForJob();
187
+ return this.moveToActive(token, jobId);
188
+ }
189
+ catch (err) {
190
+ // Swallow error if locally paused or closing since we did force a disconnection
191
+ if (!((this.paused || this.closing) &&
192
+ err.message === 'Connection is closed.')) {
193
+ throw err;
194
+ }
195
+ }
196
+ }
197
+ else {
198
+ return this.moveToActive(token);
199
+ }
200
+ }
201
+ async moveToActive(token, jobId) {
202
+ try {
203
+ const [jobData, id] = await Scripts.moveToActive(this, token, jobId);
204
+ return await this.nextJobFromJobData(jobData, id);
205
+ }
206
+ catch (error) {
207
+ if (isNotConnectionError(error)) {
208
+ this.emit('error', error);
209
+ }
210
+ }
211
+ }
212
+ async waitForJob() {
213
+ const client = await this.blockingConnection.client;
214
+ if (this.paused) {
215
+ return;
216
+ }
217
+ let jobId;
218
+ const opts = this.opts;
219
+ try {
220
+ this.waiting = true;
221
+ const blockTimeout = Math.max(this.blockTimeout ? this.blockTimeout / 1000 : opts.drainDelay, 0.01);
222
+ jobId = await client.brpoplpush(this.keys.wait, this.keys.active, blockTimeout);
223
+ }
224
+ catch (error) {
225
+ if (isNotConnectionError(error)) {
226
+ this.emit('error', error);
227
+ }
228
+ await this.delay();
229
+ }
230
+ finally {
231
+ this.waiting = false;
232
+ }
233
+ return jobId;
234
+ }
235
+ /**
236
+ *
237
+ * This function is exposed only for testing purposes.
238
+ */
239
+ async delay() {
240
+ await delay(DELAY_TIME_1);
241
+ }
242
+ async nextJobFromJobData(jobData, jobId) {
243
+ var _a, _b;
244
+ // NOTE: This is not really optimal in all cases since a new job would could arrive at the wait
245
+ // list and this worker will not start processing it directly.
246
+ // Best would be to emit drain and block for rateKeyExpirationTime
247
+ if (typeof jobData === 'number') {
248
+ if (!this.drained) {
249
+ this.emit('drained');
250
+ this.drained = true;
251
+ }
252
+ // workerDelay left for backwards compatibility although not recommended to use.
253
+ if ((_b = (_a = this.opts) === null || _a === void 0 ? void 0 : _a.limiter) === null || _b === void 0 ? void 0 : _b.workerDelay) {
254
+ const rateKeyExpirationTime = jobData;
255
+ await delay(rateKeyExpirationTime);
256
+ }
257
+ else {
258
+ this.blockTimeout = jobData;
259
+ }
260
+ }
261
+ else if (jobData) {
262
+ this.drained = false;
263
+ const job = this.createJob(jobData, jobId);
264
+ if (job.opts.repeat) {
265
+ const repeat = await this.repeat;
266
+ await repeat.addNextRepeatableJob(job.name, job.data, job.opts);
267
+ }
268
+ return job;
269
+ }
270
+ else if (!this.drained) {
271
+ this.blockTimeout = 0;
272
+ this.emit('drained');
273
+ this.drained = true;
274
+ }
275
+ }
276
+ async processJob(job, token) {
277
+ if (!job || this.closing || this.paused) {
278
+ return;
279
+ }
280
+ // code from Bull3..
281
+ //
282
+ // There are two cases to take into consideration regarding locks.
283
+ // 1) The lock renewer fails to renew a lock, this should make this job
284
+ // unable to complete, since some other worker is also working on it.
285
+ // 2) The lock renewer is called more seldom than the check for stalled
286
+ // jobs, so we can assume the job has been stalled and is already being processed
287
+ // by another worker. See https://github.com/OptimalBits/bull/issues/308
288
+ //
289
+ // TODO: Have only 1 timer that extends all the locks instead of one timer
290
+ // per concurrency setting.
291
+ let lockRenewId;
292
+ let timerStopped = false;
293
+ const lockExtender = () => {
294
+ lockRenewId = this.timerManager.setTimer('lockExtender', this.opts.lockRenewTime, async () => {
295
+ try {
296
+ const result = await job.extendLock(token, this.opts.lockDuration);
297
+ if (result && !timerStopped) {
298
+ lockExtender();
299
+ }
300
+ // FIXME if result = 0 (missing lock), reject processFn promise to take next job?
301
+ }
302
+ catch (error) {
303
+ console.error('Error extending lock ', error);
304
+ // Somehow tell the worker this job should stop processing...
305
+ }
306
+ });
307
+ };
308
+ const stopTimer = () => {
309
+ timerStopped = true;
310
+ this.timerManager.clearTimer(lockRenewId);
311
+ };
312
+ // end copy-paste from Bull3
313
+ const handleCompleted = async (result) => {
314
+ const completed = await job.moveToCompleted(result, token, !(this.closing || this.paused));
315
+ this.emit('completed', job, result, 'active');
316
+ const [jobData, jobId] = completed || [];
317
+ return this.nextJobFromJobData(jobData, jobId);
318
+ };
319
+ const handleFailed = async (err) => {
320
+ try {
321
+ await job.moveToFailed(err, token);
322
+ this.emit('failed', job, err, 'active');
323
+ }
324
+ catch (err) {
325
+ this.emit('error', err);
326
+ // It probably means that the job has lost the lock before completion
327
+ // The QueueScheduler will (or already has) moved the job back
328
+ // to the waiting list (as stalled)
329
+ }
330
+ };
331
+ this.emit('active', job, 'waiting');
332
+ lockExtender();
333
+ try {
334
+ const result = await this.callProcessJob(job, token);
335
+ return await handleCompleted(result);
336
+ }
337
+ catch (err) {
338
+ return handleFailed(err);
339
+ }
340
+ finally {
341
+ stopTimer();
342
+ }
343
+ }
344
+ /**
345
+ *
346
+ * Pauses the processing of this queue only for this worker.
347
+ */
348
+ async pause(doNotWaitActive) {
349
+ if (!this.paused) {
350
+ this.paused = new Promise(resolve => {
351
+ this.resumeWorker = function () {
352
+ resolve();
353
+ this.paused = null; // Allow pause to be checked externally for paused state.
354
+ this.resumeWorker = null;
355
+ };
356
+ });
357
+ await (!doNotWaitActive && this.whenCurrentJobsFinished());
358
+ this.emit('paused');
359
+ }
360
+ }
361
+ /**
362
+ *
363
+ * Resumes processing of this worker (if paused).
364
+ */
365
+ resume() {
366
+ if (this.resumeWorker) {
367
+ this.resumeWorker();
368
+ this.emit('resumed');
369
+ }
370
+ }
371
+ /**
372
+ *
373
+ * Checks if worker is paused.
374
+ *
375
+ * @returns true if worker is paused, false otherwise.
376
+ */
377
+ isPaused() {
378
+ return !!this.paused;
379
+ }
380
+ /**
381
+ *
382
+ * Checks if worker is currently running.
383
+ *
384
+ * @returns true if worker is running, false otherwise.
385
+ */
386
+ isRunning() {
387
+ return this.running;
388
+ }
389
+ /**
390
+ *
391
+ * Closes the worker and related redis connections.
392
+ *
393
+ * This method waits for current jobs to finalize before returning.
394
+ *
395
+ * @param force - Use force boolean parameter if you do not want to wait for
396
+ * current jobs to be processed.
397
+ *
398
+ * @returns Promise that resolves when the worker has been closed.
399
+ */
400
+ close(force = false) {
401
+ if (this.closing) {
402
+ return this.closing;
403
+ }
404
+ this.closing = (async () => {
405
+ this.emit('closing', 'closing queue');
406
+ const client = await this.blockingConnection.client;
407
+ this.resume();
408
+ await Promise.resolve()
409
+ .finally(() => {
410
+ return force || this.whenCurrentJobsFinished(false);
411
+ })
412
+ .finally(() => {
413
+ var _a;
414
+ const closePoolPromise = (_a = this.childPool) === null || _a === void 0 ? void 0 : _a.clean();
415
+ if (force) {
416
+ // since we're not waiting for the job to end attach
417
+ // an error handler to avoid crashing the whole process
418
+ closePoolPromise === null || closePoolPromise === void 0 ? void 0 : closePoolPromise.catch(err => {
419
+ console.error(err);
420
+ });
421
+ return;
422
+ }
423
+ return closePoolPromise;
424
+ })
425
+ .finally(() => client.disconnect())
426
+ .finally(() => this.timerManager && this.timerManager.clearAllTimers())
427
+ .finally(() => this.connection.close())
428
+ .finally(() => this.emit('closed'));
429
+ })();
430
+ return this.closing;
431
+ }
432
+ /**
433
+ * Returns a promise that resolves when active jobs are cleared
434
+ *
435
+ * @returns
436
+ */
437
+ async whenCurrentJobsFinished(reconnect = true) {
438
+ //
439
+ // Force reconnection of blocking connection to abort blocking redis call immediately.
440
+ //
441
+ if (this.waiting) {
442
+ await this.blockingConnection.disconnect();
443
+ }
444
+ else {
445
+ reconnect = false;
446
+ }
447
+ if (this.processing) {
448
+ await Promise.all(this.processing.keys());
449
+ }
450
+ reconnect && (await this.blockingConnection.reconnect());
451
+ }
452
+ async retryIfFailed(fn, delayInMs) {
453
+ const retry = 1;
454
+ do {
455
+ try {
456
+ return await fn();
457
+ }
458
+ catch (err) {
459
+ if (delayInMs) {
460
+ await delay(delayInMs);
461
+ }
462
+ else {
463
+ return;
464
+ }
465
+ }
466
+ } while (retry);
467
+ }
468
+ }
469
+ //# sourceMappingURL=worker.js.map