@sidequest/engine 1.0.0-next.10

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 (81) hide show
  1. package/dist/engine.cjs +189 -0
  2. package/dist/engine.cjs.map +1 -0
  3. package/dist/engine.d.ts +122 -0
  4. package/dist/engine.js +187 -0
  5. package/dist/engine.js.map +1 -0
  6. package/dist/execution/dispatcher.cjs +90 -0
  7. package/dist/execution/dispatcher.cjs.map +1 -0
  8. package/dist/execution/dispatcher.d.ts +44 -0
  9. package/dist/execution/dispatcher.js +88 -0
  10. package/dist/execution/dispatcher.js.map +1 -0
  11. package/dist/execution/executor-manager.cjs +151 -0
  12. package/dist/execution/executor-manager.cjs.map +1 -0
  13. package/dist/execution/executor-manager.d.ts +51 -0
  14. package/dist/execution/executor-manager.js +149 -0
  15. package/dist/execution/executor-manager.js.map +1 -0
  16. package/dist/execution/queue-manager.cjs +43 -0
  17. package/dist/execution/queue-manager.cjs.map +1 -0
  18. package/dist/execution/queue-manager.d.ts +23 -0
  19. package/dist/execution/queue-manager.js +41 -0
  20. package/dist/execution/queue-manager.js.map +1 -0
  21. package/dist/index.cjs +38 -0
  22. package/dist/index.cjs.map +1 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.js +17 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/job/constants.cjs +30 -0
  27. package/dist/job/constants.cjs.map +1 -0
  28. package/dist/job/constants.d.ts +20 -0
  29. package/dist/job/constants.js +28 -0
  30. package/dist/job/constants.js.map +1 -0
  31. package/dist/job/job-builder.cjs +153 -0
  32. package/dist/job/job-builder.cjs.map +1 -0
  33. package/dist/job/job-builder.d.ts +115 -0
  34. package/dist/job/job-builder.js +151 -0
  35. package/dist/job/job-builder.js.map +1 -0
  36. package/dist/job/job-transitioner.cjs +36 -0
  37. package/dist/job/job-transitioner.cjs.map +1 -0
  38. package/dist/job/job-transitioner.d.ts +21 -0
  39. package/dist/job/job-transitioner.js +34 -0
  40. package/dist/job/job-transitioner.js.map +1 -0
  41. package/dist/job/job.cjs +250 -0
  42. package/dist/job/job.cjs.map +1 -0
  43. package/dist/job/job.d.ts +178 -0
  44. package/dist/job/job.js +248 -0
  45. package/dist/job/job.js.map +1 -0
  46. package/dist/queue/grant-queue-config.cjs +49 -0
  47. package/dist/queue/grant-queue-config.cjs.map +1 -0
  48. package/dist/queue/grant-queue-config.d.ts +32 -0
  49. package/dist/queue/grant-queue-config.js +46 -0
  50. package/dist/queue/grant-queue-config.js.map +1 -0
  51. package/dist/routines/cleanup-finished-job.cjs +17 -0
  52. package/dist/routines/cleanup-finished-job.cjs.map +1 -0
  53. package/dist/routines/cleanup-finished-job.d.ts +10 -0
  54. package/dist/routines/cleanup-finished-job.js +15 -0
  55. package/dist/routines/cleanup-finished-job.js.map +1 -0
  56. package/dist/routines/release-stale-jobs.cjs +28 -0
  57. package/dist/routines/release-stale-jobs.cjs.map +1 -0
  58. package/dist/routines/release-stale-jobs.d.ts +12 -0
  59. package/dist/routines/release-stale-jobs.js +26 -0
  60. package/dist/routines/release-stale-jobs.js.map +1 -0
  61. package/dist/shared-runner/runner-pool.cjs +46 -0
  62. package/dist/shared-runner/runner-pool.cjs.map +1 -0
  63. package/dist/shared-runner/runner-pool.d.ts +28 -0
  64. package/dist/shared-runner/runner-pool.js +44 -0
  65. package/dist/shared-runner/runner-pool.js.map +1 -0
  66. package/dist/shared-runner/runner.cjs +39 -0
  67. package/dist/shared-runner/runner.cjs.map +1 -0
  68. package/dist/shared-runner/runner.d.ts +10 -0
  69. package/dist/shared-runner/runner.js +35 -0
  70. package/dist/shared-runner/runner.js.map +1 -0
  71. package/dist/utils/shutdown.cjs +53 -0
  72. package/dist/utils/shutdown.cjs.map +1 -0
  73. package/dist/utils/shutdown.d.ts +9 -0
  74. package/dist/utils/shutdown.js +50 -0
  75. package/dist/utils/shutdown.js.map +1 -0
  76. package/dist/workers/main.cjs +153 -0
  77. package/dist/workers/main.cjs.map +1 -0
  78. package/dist/workers/main.d.ts +39 -0
  79. package/dist/workers/main.js +151 -0
  80. package/dist/workers/main.js.map +1 -0
  81. package/package.json +30 -0
@@ -0,0 +1,88 @@
1
+ import { logger } from '@sidequest/core';
2
+
3
+ const sleepDelay = 100;
4
+ /**
5
+ * Dispatcher for managing job execution and queue polling.
6
+ */
7
+ class Dispatcher {
8
+ backend;
9
+ queueManager;
10
+ executorManager;
11
+ /** Indicates if the dispatcher is currently running */
12
+ isRunning = false;
13
+ /**
14
+ * Creates a new Dispatcher.
15
+ * @param backend The backend instance.
16
+ * @param queueManager The queue manager instance.
17
+ * @param executorManager The executor manager instance.
18
+ */
19
+ constructor(backend, queueManager, executorManager) {
20
+ this.backend = backend;
21
+ this.queueManager = queueManager;
22
+ this.executorManager = executorManager;
23
+ }
24
+ /**
25
+ * Main loop for polling queues and dispatching jobs.
26
+ * @private
27
+ */
28
+ async listen() {
29
+ while (this.isRunning) {
30
+ const queues = await this.queueManager.getActiveQueuesWithRunnableJobs();
31
+ let shouldSleep = true;
32
+ for (const queue of queues) {
33
+ const availableSlots = this.executorManager.availableSlotsByQueue(queue);
34
+ if (availableSlots <= 0) {
35
+ logger("Dispatcher").debug(`Queue ${queue.name} limit reached!`);
36
+ await this.sleep(sleepDelay);
37
+ continue;
38
+ }
39
+ const globalSlots = this.executorManager.availableSlotsGlobal();
40
+ if (globalSlots <= 0) {
41
+ logger("Dispatcher").debug(`Global concurrency limit reached!`);
42
+ await this.sleep(sleepDelay);
43
+ continue;
44
+ }
45
+ const jobs = await this.backend.claimPendingJob(queue.name, availableSlots);
46
+ if (jobs.length > 0) {
47
+ // if a job was found on any queue do not sleep
48
+ shouldSleep = false;
49
+ }
50
+ for (const job of jobs) {
51
+ // does not await for job execution.
52
+ void this.executorManager.execute(queue, job);
53
+ }
54
+ }
55
+ if (shouldSleep) {
56
+ await this.sleep(sleepDelay);
57
+ }
58
+ }
59
+ }
60
+ /**
61
+ * Sleeps for the given delay in milliseconds.
62
+ * @param delay The delay in milliseconds.
63
+ * @returns A promise that resolves after the delay.
64
+ * @private
65
+ */
66
+ sleep(delay) {
67
+ return new Promise((r) => setTimeout(r, delay));
68
+ }
69
+ /**
70
+ * Starts the dispatcher loop.
71
+ */
72
+ start() {
73
+ logger("Dispatcher").debug(`Starting dispatcher...`);
74
+ this.isRunning = true;
75
+ void this.listen();
76
+ }
77
+ /**
78
+ * Stops the dispatcher and waits for all active jobs to finish.
79
+ * @returns A promise that resolves when all jobs are finished.
80
+ */
81
+ async stop() {
82
+ this.isRunning = false;
83
+ await this.executorManager.destroy();
84
+ }
85
+ }
86
+
87
+ export { Dispatcher };
88
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sources":["../../src/execution/dispatcher.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,MAAM,UAAU,GAAG,GAAG;AAEtB;;AAEG;MACU,UAAU,CAAA;AAWX,IAAA,OAAA;AACA,IAAA,YAAA;AACA,IAAA,eAAA;;IAXF,SAAS,GAAG,KAAK;AAEzB;;;;;AAKG;AACH,IAAA,WAAA,CACU,OAAgB,EAChB,YAA0B,EAC1B,eAAgC,EAAA;QAFhC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,eAAe,GAAf,eAAe;IACtB;AAEH;;;AAGG;AACK,IAAA,MAAM,MAAM,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,+BAA+B,EAAE;YAExE,IAAI,WAAW,GAAG,IAAI;AAEtB,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACxE,gBAAA,IAAI,cAAc,IAAI,CAAC,EAAE;AACvB,oBAAA,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,KAAK,CAAC,IAAI,CAAA,eAAA,CAAiB,CAAC;AAChE,oBAAA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC5B;gBACF;gBAEA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE;AAC/D,gBAAA,IAAI,WAAW,IAAI,CAAC,EAAE;oBACpB,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAA,iCAAA,CAAmC,CAAC;AAC/D,oBAAA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC5B;gBACF;AAEA,gBAAA,MAAM,IAAI,GAAc,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC;AAEtF,gBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAEnB,WAAW,GAAG,KAAK;gBACrB;AAEA,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;;oBAEtB,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC/C;YACF;YAEA,IAAI,WAAW,EAAE;AACf,gBAAA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC9B;QACF;IACF;AAEA;;;;;AAKG;AACK,IAAA,KAAK,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjD;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAA,sBAAA,CAAwB,CAAC;AACpD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,KAAK,IAAI,CAAC,MAAM,EAAE;IACpB;AAEA;;;AAGG;AACH,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;IACtC;AACD;;;;"}
@@ -0,0 +1,151 @@
1
+ 'use strict';
2
+
3
+ var core = require('@sidequest/core');
4
+ var EventEmitter = require('events');
5
+ var jobTransitioner = require('../job/job-transitioner.cjs');
6
+ var runnerPool = require('../shared-runner/runner-pool.cjs');
7
+
8
+ /**
9
+ * Manages job execution and worker concurrency for Sidequest.
10
+ */
11
+ class ExecutorManager {
12
+ backend;
13
+ maxConcurrentJobs;
14
+ minThreads;
15
+ maxThreads;
16
+ activeByQueue;
17
+ activeJobs;
18
+ runnerPool;
19
+ /**
20
+ * Creates a new ExecutorManager.
21
+ * @param backend The backend instance.
22
+ * @param maxConcurrentJobs The maximum number of concurrent jobs across all queues.
23
+ * @param minThreads Minimum number of worker threads to use.
24
+ * @param maxThreads Maximum number of worker threads to use.
25
+ */
26
+ constructor(backend, maxConcurrentJobs, minThreads, maxThreads) {
27
+ this.backend = backend;
28
+ this.maxConcurrentJobs = maxConcurrentJobs;
29
+ this.minThreads = minThreads;
30
+ this.maxThreads = maxThreads;
31
+ this.activeByQueue = {};
32
+ this.activeJobs = new Set();
33
+ this.runnerPool = new runnerPool.RunnerPool(this.minThreads, this.maxThreads);
34
+ }
35
+ /**
36
+ * Gets the number of available slots for a given queue.
37
+ * @param queueConfig The queue configuration.
38
+ * @returns The number of available slots.
39
+ */
40
+ availableSlotsByQueue(queueConfig) {
41
+ if (!this.activeByQueue[queueConfig.name]) {
42
+ this.activeByQueue[queueConfig.name] = new Set();
43
+ }
44
+ const activeJobs = this.activeByQueue[queueConfig.name];
45
+ const limit = queueConfig.concurrency ?? 10;
46
+ const availableSlots = limit - activeJobs.size;
47
+ if (availableSlots < 0) {
48
+ return 0;
49
+ }
50
+ return availableSlots;
51
+ }
52
+ /**
53
+ * Gets the number of available slots globally.
54
+ * @returns The number of available slots.
55
+ */
56
+ availableSlotsGlobal() {
57
+ const limit = this.maxConcurrentJobs;
58
+ const availableSlots = limit - this.activeJobs.size;
59
+ if (availableSlots < 0) {
60
+ return 0;
61
+ }
62
+ return availableSlots;
63
+ }
64
+ /**
65
+ * Gets the total number of active workers.
66
+ * @returns The number of active jobs.
67
+ */
68
+ totalActiveWorkers() {
69
+ return this.activeJobs.size;
70
+ }
71
+ /**
72
+ * Executes a job in the given queue.
73
+ * @param queueConfig The queue configuration.
74
+ * @param job The job data to execute.
75
+ */
76
+ async execute(queueConfig, job) {
77
+ core.logger("Executor Manager").debug(`Submitting job ${job.id} for execution in queue ${queueConfig.name}`);
78
+ if (!this.activeByQueue[queueConfig.name]) {
79
+ this.activeByQueue[queueConfig.name] = new Set();
80
+ }
81
+ if (this.availableSlotsByQueue(queueConfig) <= 0 || this.availableSlotsGlobal() <= 0) {
82
+ core.logger("Executor Manager").debug(`No available slots for job ${job.id} in queue ${queueConfig.name}`);
83
+ await jobTransitioner.JobTransitioner.apply(this.backend, job, new core.SnoozeTransition(0));
84
+ return;
85
+ }
86
+ this.activeByQueue[queueConfig.name].add(job.id);
87
+ this.activeJobs.add(job.id);
88
+ job = await jobTransitioner.JobTransitioner.apply(this.backend, job, new core.RunTransition());
89
+ const signal = new EventEmitter();
90
+ let isRunning = true;
91
+ const jobChecker = async () => {
92
+ while (isRunning) {
93
+ const watchedJob = await this.backend.getJob(job.id);
94
+ if (watchedJob?.state === "canceled") {
95
+ core.logger("Executor Manager").debug(`Emitting abort signal for job ${job.id}`);
96
+ signal.emit("abort");
97
+ isRunning = false;
98
+ return;
99
+ }
100
+ await new Promise((r) => setTimeout(r, 1000));
101
+ }
102
+ };
103
+ void jobChecker();
104
+ try {
105
+ core.logger("Executor Manager").debug(`Running job ${job.id} in queue ${queueConfig.name}`);
106
+ const result = await this.runnerPool.run(job, signal);
107
+ isRunning = false;
108
+ core.logger("Executor Manager").debug(`Job ${job.id} completed with result: ${JSON.stringify(result)}`);
109
+ const transition = core.JobTransitionFactory.create(result);
110
+ await jobTransitioner.JobTransitioner.apply(this.backend, job, transition);
111
+ }
112
+ catch (error) {
113
+ isRunning = false;
114
+ const err = error;
115
+ if (err.message === "The task has been aborted") {
116
+ core.logger("Executor Manager").debug(`Job ${job.id} was canceled`);
117
+ }
118
+ else {
119
+ core.logger("Executor Manager").error(`Error executing job ${job.id}: ${err.message}`);
120
+ throw error;
121
+ }
122
+ }
123
+ finally {
124
+ isRunning = false;
125
+ this.activeByQueue[queueConfig.name].delete(job.id);
126
+ this.activeJobs.delete(job.id);
127
+ }
128
+ }
129
+ /**
130
+ * Destroys the runner pool and releases resources.
131
+ */
132
+ async destroy() {
133
+ await new Promise((resolve) => {
134
+ const checkJobs = async () => {
135
+ if (this.totalActiveWorkers() === 0) {
136
+ core.logger("ExecutorManager").info("All active jobs finished. Destroying runner pool.");
137
+ await this.runnerPool.destroy();
138
+ resolve();
139
+ }
140
+ else {
141
+ core.logger("ExecutorManager").info(`Waiting for ${this.totalActiveWorkers()} active jobs to finish...`);
142
+ setTimeout(() => void checkJobs(), 1000);
143
+ }
144
+ };
145
+ void checkJobs();
146
+ });
147
+ }
148
+ }
149
+
150
+ exports.ExecutorManager = ExecutorManager;
151
+ //# sourceMappingURL=executor-manager.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-manager.cjs","sources":["../../src/execution/executor-manager.ts"],"sourcesContent":[null],"names":["RunnerPool","logger","JobTransitioner","SnoozeTransition","RunTransition","JobTransitionFactory"],"mappings":";;;;;;;AAMA;;AAEG;MACU,eAAe,CAAA;AAahB,IAAA,OAAA;AACA,IAAA,iBAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AAfF,IAAA,aAAa;AACb,IAAA,UAAU;AACV,IAAA,UAAU;AAElB;;;;;;AAMG;AACH,IAAA,WAAA,CACU,OAAgB,EAChB,iBAAyB,EACzB,UAAkB,EAClB,UAAkB,EAAA;QAHlB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QACjB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,UAAU,GAAV,UAAU;AAElB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAIA,qBAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;IACpE;AAEA;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,WAAwB,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;QAClD;QACA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC;AACvD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,IAAI,EAAE;AAE3C,QAAA,MAAM,cAAc,GAAG,KAAK,GAAG,UAAU,CAAC,IAAI;AAC9C,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,OAAO,cAAc;IACvB;AAEA;;;AAGG;IACH,oBAAoB,GAAA;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB;QACpC,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;AACnD,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,OAAO,cAAc;IACvB;AAEA;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI;IAC7B;AAEA;;;;AAIG;AACH,IAAA,MAAM,OAAO,CAAC,WAAwB,EAAE,GAAY,EAAA;AAClD,QAAAC,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,eAAA,EAAkB,GAAG,CAAC,EAAE,2BAA2B,WAAW,CAAC,IAAI,CAAA,CAAE,CAAC;QACvG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;QAClD;AAEA,QAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE;AACpF,YAAAA,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,GAAG,CAAC,EAAE,aAAa,WAAW,CAAC,IAAI,CAAA,CAAE,CAAC;AACrG,YAAA,MAAMC,+BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAIC,qBAAgB,CAAC,CAAC,CAAC,CAAC;YACvE;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAE3B,QAAA,GAAG,GAAG,MAAMD,+BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAIE,kBAAa,EAAE,CAAC;AAEzE,QAAA,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE;QAEjC,IAAI,SAAS,GAAG,IAAI;AAEpB,QAAA,MAAM,UAAU,GAAG,YAAW;YAC5B,OAAO,SAAS,EAAE;AAChB,gBAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACpD,gBAAA,IAAI,UAAU,EAAE,KAAK,KAAK,UAAU,EAAE;AACpC,oBAAAH,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,GAAG,CAAC,EAAE,CAAA,CAAE,CAAC;AAC3E,oBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;oBACpB,SAAS,GAAG,KAAK;oBACjB;gBACF;AACA,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/C;AACF,QAAA,CAAC;QACD,KAAK,UAAU,EAAE;AAEjB,QAAA,IAAI;AACF,YAAAA,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,YAAA,EAAe,GAAG,CAAC,EAAE,aAAa,WAAW,CAAC,IAAI,CAAA,CAAE,CAAC;AACtF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;YACrD,SAAS,GAAG,KAAK;AACjB,YAAAA,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAA,wBAAA,EAA2B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA,CAAE,CAAC;YAClG,MAAM,UAAU,GAAGI,yBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC;AACtD,YAAA,MAAMH,+BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC;QAC5D;QAAE,OAAO,KAAc,EAAE;YACvB,SAAS,GAAG,KAAK;YACjB,MAAM,GAAG,GAAG,KAAc;AAC1B,YAAA,IAAI,GAAG,CAAC,OAAO,KAAK,2BAA2B,EAAE;AAC/C,gBAAAD,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,GAAG,CAAC,EAAE,CAAA,aAAA,CAAe,CAAC;YAChE;iBAAO;AACL,gBAAAA,WAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AACjF,gBAAA,MAAM,KAAK;YACb;QACF;gBAAU;YACR,SAAS,GAAG,KAAK;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AAClC,YAAA,MAAM,SAAS,GAAG,YAAW;AAC3B,gBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,EAAE;oBACnCA,WAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,mDAAmD,CAAC;AACnF,oBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AAC/B,oBAAA,OAAO,EAAE;gBACX;qBAAO;AACL,oBAAAA,WAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAA,YAAA,EAAe,IAAI,CAAC,kBAAkB,EAAE,CAAA,yBAAA,CAA2B,CAAC;oBACnG,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,EAAE,IAAI,CAAC;gBAC1C;AACF,YAAA,CAAC;YAED,KAAK,SAAS,EAAE;AAClB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
@@ -0,0 +1,51 @@
1
+ import { Backend } from '@sidequest/backend';
2
+ import { QueueConfig, JobData } from '@sidequest/core';
3
+
4
+ /**
5
+ * Manages job execution and worker concurrency for Sidequest.
6
+ */
7
+ declare class ExecutorManager {
8
+ private backend;
9
+ private maxConcurrentJobs;
10
+ private minThreads;
11
+ private maxThreads;
12
+ private activeByQueue;
13
+ private activeJobs;
14
+ private runnerPool;
15
+ /**
16
+ * Creates a new ExecutorManager.
17
+ * @param backend The backend instance.
18
+ * @param maxConcurrentJobs The maximum number of concurrent jobs across all queues.
19
+ * @param minThreads Minimum number of worker threads to use.
20
+ * @param maxThreads Maximum number of worker threads to use.
21
+ */
22
+ constructor(backend: Backend, maxConcurrentJobs: number, minThreads: number, maxThreads: number);
23
+ /**
24
+ * Gets the number of available slots for a given queue.
25
+ * @param queueConfig The queue configuration.
26
+ * @returns The number of available slots.
27
+ */
28
+ availableSlotsByQueue(queueConfig: QueueConfig): number;
29
+ /**
30
+ * Gets the number of available slots globally.
31
+ * @returns The number of available slots.
32
+ */
33
+ availableSlotsGlobal(): number;
34
+ /**
35
+ * Gets the total number of active workers.
36
+ * @returns The number of active jobs.
37
+ */
38
+ totalActiveWorkers(): number;
39
+ /**
40
+ * Executes a job in the given queue.
41
+ * @param queueConfig The queue configuration.
42
+ * @param job The job data to execute.
43
+ */
44
+ execute(queueConfig: QueueConfig, job: JobData): Promise<void>;
45
+ /**
46
+ * Destroys the runner pool and releases resources.
47
+ */
48
+ destroy(): Promise<void>;
49
+ }
50
+
51
+ export { ExecutorManager };
@@ -0,0 +1,149 @@
1
+ import { logger, SnoozeTransition, RunTransition, JobTransitionFactory } from '@sidequest/core';
2
+ import EventEmitter from 'events';
3
+ import { JobTransitioner } from '../job/job-transitioner.js';
4
+ import { RunnerPool } from '../shared-runner/runner-pool.js';
5
+
6
+ /**
7
+ * Manages job execution and worker concurrency for Sidequest.
8
+ */
9
+ class ExecutorManager {
10
+ backend;
11
+ maxConcurrentJobs;
12
+ minThreads;
13
+ maxThreads;
14
+ activeByQueue;
15
+ activeJobs;
16
+ runnerPool;
17
+ /**
18
+ * Creates a new ExecutorManager.
19
+ * @param backend The backend instance.
20
+ * @param maxConcurrentJobs The maximum number of concurrent jobs across all queues.
21
+ * @param minThreads Minimum number of worker threads to use.
22
+ * @param maxThreads Maximum number of worker threads to use.
23
+ */
24
+ constructor(backend, maxConcurrentJobs, minThreads, maxThreads) {
25
+ this.backend = backend;
26
+ this.maxConcurrentJobs = maxConcurrentJobs;
27
+ this.minThreads = minThreads;
28
+ this.maxThreads = maxThreads;
29
+ this.activeByQueue = {};
30
+ this.activeJobs = new Set();
31
+ this.runnerPool = new RunnerPool(this.minThreads, this.maxThreads);
32
+ }
33
+ /**
34
+ * Gets the number of available slots for a given queue.
35
+ * @param queueConfig The queue configuration.
36
+ * @returns The number of available slots.
37
+ */
38
+ availableSlotsByQueue(queueConfig) {
39
+ if (!this.activeByQueue[queueConfig.name]) {
40
+ this.activeByQueue[queueConfig.name] = new Set();
41
+ }
42
+ const activeJobs = this.activeByQueue[queueConfig.name];
43
+ const limit = queueConfig.concurrency ?? 10;
44
+ const availableSlots = limit - activeJobs.size;
45
+ if (availableSlots < 0) {
46
+ return 0;
47
+ }
48
+ return availableSlots;
49
+ }
50
+ /**
51
+ * Gets the number of available slots globally.
52
+ * @returns The number of available slots.
53
+ */
54
+ availableSlotsGlobal() {
55
+ const limit = this.maxConcurrentJobs;
56
+ const availableSlots = limit - this.activeJobs.size;
57
+ if (availableSlots < 0) {
58
+ return 0;
59
+ }
60
+ return availableSlots;
61
+ }
62
+ /**
63
+ * Gets the total number of active workers.
64
+ * @returns The number of active jobs.
65
+ */
66
+ totalActiveWorkers() {
67
+ return this.activeJobs.size;
68
+ }
69
+ /**
70
+ * Executes a job in the given queue.
71
+ * @param queueConfig The queue configuration.
72
+ * @param job The job data to execute.
73
+ */
74
+ async execute(queueConfig, job) {
75
+ logger("Executor Manager").debug(`Submitting job ${job.id} for execution in queue ${queueConfig.name}`);
76
+ if (!this.activeByQueue[queueConfig.name]) {
77
+ this.activeByQueue[queueConfig.name] = new Set();
78
+ }
79
+ if (this.availableSlotsByQueue(queueConfig) <= 0 || this.availableSlotsGlobal() <= 0) {
80
+ logger("Executor Manager").debug(`No available slots for job ${job.id} in queue ${queueConfig.name}`);
81
+ await JobTransitioner.apply(this.backend, job, new SnoozeTransition(0));
82
+ return;
83
+ }
84
+ this.activeByQueue[queueConfig.name].add(job.id);
85
+ this.activeJobs.add(job.id);
86
+ job = await JobTransitioner.apply(this.backend, job, new RunTransition());
87
+ const signal = new EventEmitter();
88
+ let isRunning = true;
89
+ const jobChecker = async () => {
90
+ while (isRunning) {
91
+ const watchedJob = await this.backend.getJob(job.id);
92
+ if (watchedJob?.state === "canceled") {
93
+ logger("Executor Manager").debug(`Emitting abort signal for job ${job.id}`);
94
+ signal.emit("abort");
95
+ isRunning = false;
96
+ return;
97
+ }
98
+ await new Promise((r) => setTimeout(r, 1000));
99
+ }
100
+ };
101
+ void jobChecker();
102
+ try {
103
+ logger("Executor Manager").debug(`Running job ${job.id} in queue ${queueConfig.name}`);
104
+ const result = await this.runnerPool.run(job, signal);
105
+ isRunning = false;
106
+ logger("Executor Manager").debug(`Job ${job.id} completed with result: ${JSON.stringify(result)}`);
107
+ const transition = JobTransitionFactory.create(result);
108
+ await JobTransitioner.apply(this.backend, job, transition);
109
+ }
110
+ catch (error) {
111
+ isRunning = false;
112
+ const err = error;
113
+ if (err.message === "The task has been aborted") {
114
+ logger("Executor Manager").debug(`Job ${job.id} was canceled`);
115
+ }
116
+ else {
117
+ logger("Executor Manager").error(`Error executing job ${job.id}: ${err.message}`);
118
+ throw error;
119
+ }
120
+ }
121
+ finally {
122
+ isRunning = false;
123
+ this.activeByQueue[queueConfig.name].delete(job.id);
124
+ this.activeJobs.delete(job.id);
125
+ }
126
+ }
127
+ /**
128
+ * Destroys the runner pool and releases resources.
129
+ */
130
+ async destroy() {
131
+ await new Promise((resolve) => {
132
+ const checkJobs = async () => {
133
+ if (this.totalActiveWorkers() === 0) {
134
+ logger("ExecutorManager").info("All active jobs finished. Destroying runner pool.");
135
+ await this.runnerPool.destroy();
136
+ resolve();
137
+ }
138
+ else {
139
+ logger("ExecutorManager").info(`Waiting for ${this.totalActiveWorkers()} active jobs to finish...`);
140
+ setTimeout(() => void checkJobs(), 1000);
141
+ }
142
+ };
143
+ void checkJobs();
144
+ });
145
+ }
146
+ }
147
+
148
+ export { ExecutorManager };
149
+ //# sourceMappingURL=executor-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-manager.js","sources":["../../src/execution/executor-manager.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAMA;;AAEG;MACU,eAAe,CAAA;AAahB,IAAA,OAAA;AACA,IAAA,iBAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AAfF,IAAA,aAAa;AACb,IAAA,UAAU;AACV,IAAA,UAAU;AAElB;;;;;;AAMG;AACH,IAAA,WAAA,CACU,OAAgB,EAChB,iBAAyB,EACzB,UAAkB,EAClB,UAAkB,EAAA;QAHlB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QACjB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,UAAU,GAAV,UAAU;AAElB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;IACpE;AAEA;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,WAAwB,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;QAClD;QACA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC;AACvD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,IAAI,EAAE;AAE3C,QAAA,MAAM,cAAc,GAAG,KAAK,GAAG,UAAU,CAAC,IAAI;AAC9C,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,OAAO,cAAc;IACvB;AAEA;;;AAGG;IACH,oBAAoB,GAAA;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB;QACpC,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;AACnD,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,OAAO,cAAc;IACvB;AAEA;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI;IAC7B;AAEA;;;;AAIG;AACH,IAAA,MAAM,OAAO,CAAC,WAAwB,EAAE,GAAY,EAAA;AAClD,QAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,eAAA,EAAkB,GAAG,CAAC,EAAE,2BAA2B,WAAW,CAAC,IAAI,CAAA,CAAE,CAAC;QACvG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;QAClD;AAEA,QAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE;AACpF,YAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,GAAG,CAAC,EAAE,aAAa,WAAW,CAAC,IAAI,CAAA,CAAE,CAAC;AACrG,YAAA,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACvE;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAE3B,QAAA,GAAG,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;AAEzE,QAAA,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE;QAEjC,IAAI,SAAS,GAAG,IAAI;AAEpB,QAAA,MAAM,UAAU,GAAG,YAAW;YAC5B,OAAO,SAAS,EAAE;AAChB,gBAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACpD,gBAAA,IAAI,UAAU,EAAE,KAAK,KAAK,UAAU,EAAE;AACpC,oBAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,GAAG,CAAC,EAAE,CAAA,CAAE,CAAC;AAC3E,oBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;oBACpB,SAAS,GAAG,KAAK;oBACjB;gBACF;AACA,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/C;AACF,QAAA,CAAC;QACD,KAAK,UAAU,EAAE;AAEjB,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,YAAA,EAAe,GAAG,CAAC,EAAE,aAAa,WAAW,CAAC,IAAI,CAAA,CAAE,CAAC;AACtF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;YACrD,SAAS,GAAG,KAAK;AACjB,YAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAA,wBAAA,EAA2B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA,CAAE,CAAC;YAClG,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC;AACtD,YAAA,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC;QAC5D;QAAE,OAAO,KAAc,EAAE;YACvB,SAAS,GAAG,KAAK;YACjB,MAAM,GAAG,GAAG,KAAc;AAC1B,YAAA,IAAI,GAAG,CAAC,OAAO,KAAK,2BAA2B,EAAE;AAC/C,gBAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,GAAG,CAAC,EAAE,CAAA,aAAA,CAAe,CAAC;YAChE;iBAAO;AACL,gBAAA,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AACjF,gBAAA,MAAM,KAAK;YACb;QACF;gBAAU;YACR,SAAS,GAAG,KAAK;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AAClC,YAAA,MAAM,SAAS,GAAG,YAAW;AAC3B,gBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,EAAE;oBACnC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,mDAAmD,CAAC;AACnF,oBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AAC/B,oBAAA,OAAO,EAAE;gBACX;qBAAO;AACL,oBAAA,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAA,YAAA,EAAe,IAAI,CAAC,kBAAkB,EAAE,CAAA,yBAAA,CAA2B,CAAC;oBACnG,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,EAAE,IAAI,CAAC;gBAC1C;AACF,YAAA,CAAC;YAED,KAAK,SAAS,EAAE;AAClB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ var grantQueueConfig = require('../queue/grant-queue-config.cjs');
4
+
5
+ /**
6
+ * Manages queue configurations and retrieves active queues with runnable jobs.
7
+ */
8
+ class QueueManager {
9
+ backend;
10
+ queues;
11
+ /**
12
+ * Creates a new QueueManager.
13
+ * @param backend The backend instance.
14
+ * @param queues The queue configurations to manage.
15
+ */
16
+ constructor(backend, queues) {
17
+ this.backend = backend;
18
+ this.queues = queues;
19
+ }
20
+ /**
21
+ * Gets all active queues that have runnable jobs, sorted by priority.
22
+ * @returns A promise resolving to an array of active queue configs.
23
+ */
24
+ async getActiveQueuesWithRunnableJobs() {
25
+ const queueNames = await this.backend.getQueuesFromJobs();
26
+ const queues = [];
27
+ for (const queue of queueNames) {
28
+ const fromConfig = this.queues.find((q) => q.name === queue);
29
+ const queueConfig = await grantQueueConfig.grantQueueConfig(this.backend, { ...fromConfig, name: queue });
30
+ if (queueConfig) {
31
+ queues.push(queueConfig);
32
+ }
33
+ }
34
+ return queues
35
+ .filter((queue) => queue.state === "active")
36
+ .sort((a, b) => {
37
+ return (b.priority ?? 0) - (a.priority ?? 0);
38
+ });
39
+ }
40
+ }
41
+
42
+ exports.QueueManager = QueueManager;
43
+ //# sourceMappingURL=queue-manager.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-manager.cjs","sources":["../../src/execution/queue-manager.ts"],"sourcesContent":[null],"names":["grantQueueConfig"],"mappings":";;;;AAIA;;AAEG;MACU,YAAY,CAAA;AAOb,IAAA,OAAA;AACA,IAAA,MAAA;AAPV;;;;AAIG;IACH,WAAA,CACU,OAAgB,EAChB,MAAsB,EAAA;QADtB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;AAEH;;;AAGG;AACH,IAAA,MAAM,+BAA+B,GAAA;QACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;QAEzD,MAAM,MAAM,GAAkB,EAAE;AAChC,QAAA,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;AAC9B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;AAC5D,YAAA,MAAM,WAAW,GAAG,MAAMA,iCAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACxF,IAAI,WAAW,EAAE;AACf,gBAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1B;QACF;AAEA,QAAA,OAAO;aACJ,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,QAAQ;AAC1C,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACb,YAAA,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC9C,QAAA,CAAC,CAAC;IACN;AACD;;;;"}
@@ -0,0 +1,23 @@
1
+ import { Backend, NewQueueData } from '@sidequest/backend';
2
+ import { QueueConfig } from '@sidequest/core';
3
+
4
+ /**
5
+ * Manages queue configurations and retrieves active queues with runnable jobs.
6
+ */
7
+ declare class QueueManager {
8
+ private backend;
9
+ private queues;
10
+ /**
11
+ * Creates a new QueueManager.
12
+ * @param backend The backend instance.
13
+ * @param queues The queue configurations to manage.
14
+ */
15
+ constructor(backend: Backend, queues: NewQueueData[]);
16
+ /**
17
+ * Gets all active queues that have runnable jobs, sorted by priority.
18
+ * @returns A promise resolving to an array of active queue configs.
19
+ */
20
+ getActiveQueuesWithRunnableJobs(): Promise<QueueConfig[]>;
21
+ }
22
+
23
+ export { QueueManager };
@@ -0,0 +1,41 @@
1
+ import { grantQueueConfig } from '../queue/grant-queue-config.js';
2
+
3
+ /**
4
+ * Manages queue configurations and retrieves active queues with runnable jobs.
5
+ */
6
+ class QueueManager {
7
+ backend;
8
+ queues;
9
+ /**
10
+ * Creates a new QueueManager.
11
+ * @param backend The backend instance.
12
+ * @param queues The queue configurations to manage.
13
+ */
14
+ constructor(backend, queues) {
15
+ this.backend = backend;
16
+ this.queues = queues;
17
+ }
18
+ /**
19
+ * Gets all active queues that have runnable jobs, sorted by priority.
20
+ * @returns A promise resolving to an array of active queue configs.
21
+ */
22
+ async getActiveQueuesWithRunnableJobs() {
23
+ const queueNames = await this.backend.getQueuesFromJobs();
24
+ const queues = [];
25
+ for (const queue of queueNames) {
26
+ const fromConfig = this.queues.find((q) => q.name === queue);
27
+ const queueConfig = await grantQueueConfig(this.backend, { ...fromConfig, name: queue });
28
+ if (queueConfig) {
29
+ queues.push(queueConfig);
30
+ }
31
+ }
32
+ return queues
33
+ .filter((queue) => queue.state === "active")
34
+ .sort((a, b) => {
35
+ return (b.priority ?? 0) - (a.priority ?? 0);
36
+ });
37
+ }
38
+ }
39
+
40
+ export { QueueManager };
41
+ //# sourceMappingURL=queue-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-manager.js","sources":["../../src/execution/queue-manager.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;AAEG;MACU,YAAY,CAAA;AAOb,IAAA,OAAA;AACA,IAAA,MAAA;AAPV;;;;AAIG;IACH,WAAA,CACU,OAAgB,EAChB,MAAsB,EAAA;QADtB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;AAEH;;;AAGG;AACH,IAAA,MAAM,+BAA+B,GAAA;QACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;QAEzD,MAAM,MAAM,GAAkB,EAAE;AAChC,QAAA,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;AAC9B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;AAC5D,YAAA,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACxF,IAAI,WAAW,EAAE;AACf,gBAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1B;QACF;AAEA,QAAA,OAAO;aACJ,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,QAAQ;AAC1C,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACb,YAAA,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC9C,QAAA,CAAC,CAAC;IACN;AACD;;;;"}
package/dist/index.cjs ADDED
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ var engine = require('./engine.cjs');
4
+ var dispatcher = require('./execution/dispatcher.cjs');
5
+ var executorManager = require('./execution/executor-manager.cjs');
6
+ var queueManager = require('./execution/queue-manager.cjs');
7
+ var constants = require('./job/constants.cjs');
8
+ var job = require('./job/job.cjs');
9
+ var jobBuilder = require('./job/job-builder.cjs');
10
+ var jobTransitioner = require('./job/job-transitioner.cjs');
11
+ var grantQueueConfig = require('./queue/grant-queue-config.cjs');
12
+ var cleanupFinishedJob = require('./routines/cleanup-finished-job.cjs');
13
+ var releaseStaleJobs = require('./routines/release-stale-jobs.cjs');
14
+ var runner = require('./shared-runner/runner.cjs');
15
+ var runnerPool = require('./shared-runner/runner-pool.cjs');
16
+ var shutdown = require('./utils/shutdown.cjs');
17
+ var main = require('./workers/main.cjs');
18
+
19
+
20
+
21
+ exports.Engine = engine.Engine;
22
+ exports.Dispatcher = dispatcher.Dispatcher;
23
+ exports.ExecutorManager = executorManager.ExecutorManager;
24
+ exports.QueueManager = queueManager.QueueManager;
25
+ exports.JOB_BUILDER_FALLBACK = constants.JOB_BUILDER_FALLBACK;
26
+ exports.Job = job.Job;
27
+ exports.JobBuilder = jobBuilder.JobBuilder;
28
+ exports.JobTransitioner = jobTransitioner.JobTransitioner;
29
+ exports.differentQueueConfig = grantQueueConfig.differentQueueConfig;
30
+ exports.grantQueueConfig = grantQueueConfig.grantQueueConfig;
31
+ exports.cleanupFinishedJobs = cleanupFinishedJob.cleanupFinishedJobs;
32
+ exports.releaseStaleJobs = releaseStaleJobs.releaseStaleJobs;
33
+ exports.run = runner;
34
+ exports.RunnerPool = runnerPool.RunnerPool;
35
+ exports.clearGracefulShutdown = shutdown.clearGracefulShutdown;
36
+ exports.gracefulShutdown = shutdown.gracefulShutdown;
37
+ exports.MainWorker = main.MainWorker;
38
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,16 @@
1
+ export { Engine, EngineConfig, NonNullableEngineConfig } from './engine.js';
2
+ export { Dispatcher } from './execution/dispatcher.js';
3
+ export { ExecutorManager } from './execution/executor-manager.js';
4
+ export { QueueManager } from './execution/queue-manager.js';
5
+ export { JOB_BUILDER_FALLBACK } from './job/constants.js';
6
+ export { Job, JobClassType } from './job/job.js';
7
+ export { JobBuilder, JobBuilderDefaults, UniquenessInput } from './job/job-builder.js';
8
+ export { JobTransitioner } from './job/job-transitioner.js';
9
+ export { QueueDefaults, differentQueueConfig, grantQueueConfig } from './queue/grant-queue-config.js';
10
+ export { cleanupFinishedJobs } from './routines/cleanup-finished-job.js';
11
+ export { releaseStaleJobs } from './routines/release-stale-jobs.js';
12
+ import * as runner from './shared-runner/runner.js';
13
+ export { runner as run };
14
+ export { RunnerPool } from './shared-runner/runner-pool.js';
15
+ export { clearGracefulShutdown, gracefulShutdown } from './utils/shutdown.js';
16
+ export { MainWorker } from './workers/main.js';
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export { Engine } from './engine.js';
2
+ export { Dispatcher } from './execution/dispatcher.js';
3
+ export { ExecutorManager } from './execution/executor-manager.js';
4
+ export { QueueManager } from './execution/queue-manager.js';
5
+ export { JOB_BUILDER_FALLBACK } from './job/constants.js';
6
+ export { Job } from './job/job.js';
7
+ export { JobBuilder } from './job/job-builder.js';
8
+ export { JobTransitioner } from './job/job-transitioner.js';
9
+ export { differentQueueConfig, grantQueueConfig } from './queue/grant-queue-config.js';
10
+ export { cleanupFinishedJobs } from './routines/cleanup-finished-job.js';
11
+ export { releaseStaleJobs } from './routines/release-stale-jobs.js';
12
+ import * as runner from './shared-runner/runner.js';
13
+ export { runner as run };
14
+ export { RunnerPool } from './shared-runner/runner-pool.js';
15
+ export { clearGracefulShutdown, gracefulShutdown } from './utils/shutdown.js';
16
+ export { MainWorker } from './workers/main.js';
17
+ //# sourceMappingURL=index.js.map