retryify_queue.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. "use strict";
  2. /* IMPORT */
  3. Object.defineProperty(exports, "__esModule", { value: true });
  4. const consts_1 = require("../consts");
  5. /* RETRYIFY QUEUE */
  6. const RetryfyQueue = {
  7. interval: 25,
  8. intervalId: undefined,
  9. limit: consts_1.LIMIT_FILES_DESCRIPTORS,
  10. queueActive: new Set(),
  11. queueWaiting: new Set(),
  12. init: () => {
  13. if (RetryfyQueue.intervalId)
  14. return;
  15. RetryfyQueue.intervalId = setInterval(RetryfyQueue.tick, RetryfyQueue.interval);
  16. },
  17. reset: () => {
  18. if (!RetryfyQueue.intervalId)
  19. return;
  20. clearInterval(RetryfyQueue.intervalId);
  21. delete RetryfyQueue.intervalId;
  22. },
  23. add: (fn) => {
  24. RetryfyQueue.queueWaiting.add(fn);
  25. if (RetryfyQueue.queueActive.size < (RetryfyQueue.limit / 2)) { // Active queue not under preassure, executing immediately
  26. RetryfyQueue.tick();
  27. }
  28. else {
  29. RetryfyQueue.init();
  30. }
  31. },
  32. remove: (fn) => {
  33. RetryfyQueue.queueWaiting.delete(fn);
  34. RetryfyQueue.queueActive.delete(fn);
  35. },
  36. schedule: () => {
  37. return new Promise(resolve => {
  38. const cleanup = () => RetryfyQueue.remove(resolver);
  39. const resolver = () => resolve(cleanup);
  40. RetryfyQueue.add(resolver);
  41. });
  42. },
  43. tick: () => {
  44. if (RetryfyQueue.queueActive.size >= RetryfyQueue.limit)
  45. return;
  46. if (!RetryfyQueue.queueWaiting.size)
  47. return RetryfyQueue.reset();
  48. for (const fn of RetryfyQueue.queueWaiting) {
  49. if (RetryfyQueue.queueActive.size >= RetryfyQueue.limit)
  50. break;
  51. RetryfyQueue.queueWaiting.delete(fn);
  52. RetryfyQueue.queueActive.add(fn);
  53. fn();
  54. }
  55. }
  56. };
  57. /* EXPORT */
  58. exports.default = RetryfyQueue;