@cloud-copilot/job 0.1.3 → 0.1.5

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.
@@ -0,0 +1,63 @@
1
+ import { Job, JobResult, Logger } from './job.js';
2
+ /**
3
+ * A worker pool that will run jobs concurrently using promises up to a specified limit.
4
+ * If no work is being done, it will wait for jobs to be added and run them up to the
5
+ * maximum concurrency.
6
+ *
7
+ * This is designed to create a central queue for jobs of many types to be processed
8
+ * in a streaming fashion, allowing for efficient resource usage and managed network requests.
9
+ *
10
+ */
11
+ export declare class ConcurrentWorkerPool<T = void, P = Record<string, unknown>> {
12
+ private concurrency;
13
+ private logger;
14
+ private jobCounter;
15
+ private resolveMap;
16
+ private queue;
17
+ private activeJobs;
18
+ private waitingResolvers;
19
+ private workers;
20
+ private isAcceptingWork;
21
+ private workAvailablePromise;
22
+ private resolveWorkAvailable;
23
+ /**
24
+ * Create a new runner with the specified concurrency.
25
+ *
26
+ * @param concurrency - The maximum number of jobs to run concurrently.
27
+ * @param logger - Logger instance for logging long-running jobs.
28
+ */
29
+ constructor(concurrency: number, logger: Logger);
30
+ private worker;
31
+ private waitForWorkAvailable;
32
+ private ensureWorkers;
33
+ private notifyWorkersOfNewWork;
34
+ private checkIfIdle;
35
+ /**
36
+ * Add a job to the queue
37
+ */
38
+ enqueue(job: Job<T, P>): Promise<JobResult<T, P>>;
39
+ /**
40
+ * Add multiple jobs to the queue
41
+ */
42
+ enqueueAll(jobs: Job<T, P>[]): Promise<JobResult<T, P>>[];
43
+ /**
44
+ * Returns a promise that resolves when all queued work is complete
45
+ */
46
+ waitForIdle(): Promise<void>;
47
+ /**
48
+ * Shutdown the queue - no new jobs will be accepted, but existing jobs will complete.
49
+ *
50
+ * Returns when a promise that resolves when all jobs have been processed and
51
+ * the onComplete callback has been called for each job.
52
+ */
53
+ finishAllWork(): Promise<void>;
54
+ /**
55
+ * Get the current queue length
56
+ */
57
+ get queueLength(): number;
58
+ /**
59
+ * Get the number of currently active jobs
60
+ */
61
+ get activeJobCount(): number;
62
+ }
63
+ //# sourceMappingURL=ConcurrentWorkerPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConcurrentWorkerPool.d.ts","sourceRoot":"","sources":["../../src/ConcurrentWorkerPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAc,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAM7D;;;;;;;;GAQG;AACH,qBAAa,oBAAoB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAkBnE,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IAlBhB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAAuD;IACzE,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,oBAAoB,CAA4B;IAExD;;;;;OAKG;gBAEO,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM;YAGV,MAAM;IAwCpB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAmBjD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IAIzD;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IASpC;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;CACF"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConcurrentWorkerPool = void 0;
4
+ /**
5
+ * A worker pool that will run jobs concurrently using promises up to a specified limit.
6
+ * If no work is being done, it will wait for jobs to be added and run them up to the
7
+ * maximum concurrency.
8
+ *
9
+ * This is designed to create a central queue for jobs of many types to be processed
10
+ * in a streaming fashion, allowing for efficient resource usage and managed network requests.
11
+ *
12
+ */
13
+ class ConcurrentWorkerPool {
14
+ concurrency;
15
+ logger;
16
+ jobCounter = 0;
17
+ resolveMap = {};
18
+ queue = [];
19
+ activeJobs = 0;
20
+ waitingResolvers = [];
21
+ workers = [];
22
+ isAcceptingWork = true;
23
+ workAvailablePromise = null;
24
+ resolveWorkAvailable = null;
25
+ /**
26
+ * Create a new runner with the specified concurrency.
27
+ *
28
+ * @param concurrency - The maximum number of jobs to run concurrently.
29
+ * @param logger - Logger instance for logging long-running jobs.
30
+ */
31
+ constructor(concurrency, logger) {
32
+ this.concurrency = concurrency;
33
+ this.logger = logger;
34
+ }
35
+ async worker(workerId) {
36
+ while (this.isAcceptingWork || this.queue.length > 0) {
37
+ const job = this.queue.shift();
38
+ if (!job) {
39
+ if (!this.isAcceptingWork) {
40
+ // No longer accepting work and no jobs left, exit immediately
41
+ return;
42
+ }
43
+ // No work available, wait for new work to be added
44
+ await this.waitForWorkAvailable();
45
+ continue;
46
+ }
47
+ this.activeJobs++;
48
+ const context = { workerId };
49
+ const startTime = Date.now();
50
+ const interval = setInterval(() => {
51
+ this.logger.warn(`Long-running job detected.`, { minutes: Math.floor((Date.now() - startTime) / 60000) }, { ...context, ...job.properties });
52
+ }, 60_000);
53
+ const resolve = this.resolveMap[job.concurrentJobId];
54
+ try {
55
+ const value = await job.execute({ ...context, properties: job.properties });
56
+ resolve({ status: 'fulfilled', value, properties: job.properties });
57
+ }
58
+ catch (reason) {
59
+ resolve({ status: 'rejected', reason, properties: job.properties });
60
+ }
61
+ finally {
62
+ clearInterval(interval);
63
+ this.activeJobs--;
64
+ this.checkIfIdle();
65
+ delete this.resolveMap[job.concurrentJobId];
66
+ }
67
+ }
68
+ }
69
+ waitForWorkAvailable() {
70
+ if (!this.workAvailablePromise) {
71
+ this.workAvailablePromise = new Promise((resolve) => {
72
+ this.resolveWorkAvailable = resolve;
73
+ });
74
+ }
75
+ return this.workAvailablePromise;
76
+ }
77
+ ensureWorkers() {
78
+ if (this.workers.length === 0 && this.isAcceptingWork) {
79
+ for (let i = 0; i < this.concurrency; i++) {
80
+ this.workers.push(this.worker(i + 1));
81
+ }
82
+ }
83
+ }
84
+ notifyWorkersOfNewWork() {
85
+ // Wake up waiting workers
86
+ if (this.resolveWorkAvailable) {
87
+ this.resolveWorkAvailable();
88
+ this.workAvailablePromise = null;
89
+ this.resolveWorkAvailable = null;
90
+ }
91
+ }
92
+ checkIfIdle() {
93
+ if (this.activeJobs === 0 && this.queue.length === 0) {
94
+ // Notify all waiting resolvers
95
+ this.waitingResolvers.forEach((resolve) => resolve());
96
+ this.waitingResolvers = [];
97
+ }
98
+ }
99
+ /**
100
+ * Add a job to the queue
101
+ */
102
+ enqueue(job) {
103
+ if (!this.isAcceptingWork) {
104
+ throw new Error('Cannot enqueue jobs after shutdown');
105
+ }
106
+ return new Promise((resolve) => {
107
+ const jobId = this.jobCounter++;
108
+ const jobWithId = {
109
+ ...job,
110
+ concurrentJobId: jobId
111
+ };
112
+ this.resolveMap[jobId] = resolve;
113
+ this.queue.push(jobWithId);
114
+ this.ensureWorkers();
115
+ this.notifyWorkersOfNewWork();
116
+ });
117
+ }
118
+ /**
119
+ * Add multiple jobs to the queue
120
+ */
121
+ enqueueAll(jobs) {
122
+ return jobs.map((job) => this.enqueue(job));
123
+ }
124
+ /**
125
+ * Returns a promise that resolves when all queued work is complete
126
+ */
127
+ waitForIdle() {
128
+ return new Promise((resolve) => {
129
+ if (this.activeJobs === 0 && this.queue.length === 0) {
130
+ resolve();
131
+ }
132
+ else {
133
+ this.waitingResolvers.push(resolve);
134
+ }
135
+ });
136
+ }
137
+ /**
138
+ * Shutdown the queue - no new jobs will be accepted, but existing jobs will complete.
139
+ *
140
+ * Returns when a promise that resolves when all jobs have been processed and
141
+ * the onComplete callback has been called for each job.
142
+ */
143
+ async finishAllWork() {
144
+ this.isAcceptingWork = false;
145
+ // Wake up any sleeping workers so they can process remaining jobs or exit
146
+ this.notifyWorkersOfNewWork();
147
+ // Check if we're already idle and notify any waiting resolvers
148
+ await Promise.all(this.workers);
149
+ this.workers = [];
150
+ }
151
+ /**
152
+ * Get the current queue length
153
+ */
154
+ get queueLength() {
155
+ return this.queue.length;
156
+ }
157
+ /**
158
+ * Get the number of currently active jobs
159
+ */
160
+ get activeJobCount() {
161
+ return this.activeJobs;
162
+ }
163
+ }
164
+ exports.ConcurrentWorkerPool = ConcurrentWorkerPool;
165
+ //# sourceMappingURL=ConcurrentWorkerPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConcurrentWorkerPool.js","sourceRoot":"","sources":["../../src/ConcurrentWorkerPool.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export { ConcurrentJobQueue } from './ConcurrentJobQueue.js';
2
+ export { ConcurrentWorkerPool } from './ConcurrentWorkerPool.js';
2
3
  export type { Job, JobContext, JobResult, Logger } from './job.js';
3
4
  export { runJobs } from './runJobs.js';
4
5
  export { StreamingJobQueue } from './StreamingJobQueue.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
package/dist/cjs/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.numberOfCpus = exports.StreamingJobQueue = exports.runJobs = exports.ConcurrentJobQueue = void 0;
3
+ exports.numberOfCpus = exports.StreamingJobQueue = exports.runJobs = exports.ConcurrentWorkerPool = exports.ConcurrentJobQueue = void 0;
4
4
  var ConcurrentJobQueue_js_1 = require("./ConcurrentJobQueue.js");
5
5
  Object.defineProperty(exports, "ConcurrentJobQueue", { enumerable: true, get: function () { return ConcurrentJobQueue_js_1.ConcurrentJobQueue; } });
6
+ var ConcurrentWorkerPool_js_1 = require("./ConcurrentWorkerPool.js");
7
+ Object.defineProperty(exports, "ConcurrentWorkerPool", { enumerable: true, get: function () { return ConcurrentWorkerPool_js_1.ConcurrentWorkerPool; } });
6
8
  var runJobs_js_1 = require("./runJobs.js");
7
9
  Object.defineProperty(exports, "runJobs", { enumerable: true, get: function () { return runJobs_js_1.runJobs; } });
8
10
  var StreamingJobQueue_js_1 = require("./StreamingJobQueue.js");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAAnD,2HAAA,kBAAkB,OAAA;AAE3B,2CAAsC;AAA7B,qGAAA,OAAO,OAAA;AAChB,+DAA0D;AAAjD,yHAAA,iBAAiB,OAAA;AAC1B,qCAAwC;AAA/B,uGAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAAnD,2HAAA,kBAAkB,OAAA;AAC3B,qEAAgE;AAAvD,+HAAA,oBAAoB,OAAA;AAE7B,2CAAsC;AAA7B,qGAAA,OAAO,OAAA;AAChB,+DAA0D;AAAjD,yHAAA,iBAAiB,OAAA;AAC1B,qCAAwC;AAA/B,uGAAA,YAAY,OAAA"}
@@ -0,0 +1,63 @@
1
+ import { Job, JobResult, Logger } from './job.js';
2
+ /**
3
+ * A worker pool that will run jobs concurrently using promises up to a specified limit.
4
+ * If no work is being done, it will wait for jobs to be added and run them up to the
5
+ * maximum concurrency.
6
+ *
7
+ * This is designed to create a central queue for jobs of many types to be processed
8
+ * in a streaming fashion, allowing for efficient resource usage and managed network requests.
9
+ *
10
+ */
11
+ export declare class ConcurrentWorkerPool<T = void, P = Record<string, unknown>> {
12
+ private concurrency;
13
+ private logger;
14
+ private jobCounter;
15
+ private resolveMap;
16
+ private queue;
17
+ private activeJobs;
18
+ private waitingResolvers;
19
+ private workers;
20
+ private isAcceptingWork;
21
+ private workAvailablePromise;
22
+ private resolveWorkAvailable;
23
+ /**
24
+ * Create a new runner with the specified concurrency.
25
+ *
26
+ * @param concurrency - The maximum number of jobs to run concurrently.
27
+ * @param logger - Logger instance for logging long-running jobs.
28
+ */
29
+ constructor(concurrency: number, logger: Logger);
30
+ private worker;
31
+ private waitForWorkAvailable;
32
+ private ensureWorkers;
33
+ private notifyWorkersOfNewWork;
34
+ private checkIfIdle;
35
+ /**
36
+ * Add a job to the queue
37
+ */
38
+ enqueue(job: Job<T, P>): Promise<JobResult<T, P>>;
39
+ /**
40
+ * Add multiple jobs to the queue
41
+ */
42
+ enqueueAll(jobs: Job<T, P>[]): Promise<JobResult<T, P>>[];
43
+ /**
44
+ * Returns a promise that resolves when all queued work is complete
45
+ */
46
+ waitForIdle(): Promise<void>;
47
+ /**
48
+ * Shutdown the queue - no new jobs will be accepted, but existing jobs will complete.
49
+ *
50
+ * Returns when a promise that resolves when all jobs have been processed and
51
+ * the onComplete callback has been called for each job.
52
+ */
53
+ finishAllWork(): Promise<void>;
54
+ /**
55
+ * Get the current queue length
56
+ */
57
+ get queueLength(): number;
58
+ /**
59
+ * Get the number of currently active jobs
60
+ */
61
+ get activeJobCount(): number;
62
+ }
63
+ //# sourceMappingURL=ConcurrentWorkerPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConcurrentWorkerPool.d.ts","sourceRoot":"","sources":["../../src/ConcurrentWorkerPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAc,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAM7D;;;;;;;;GAQG;AACH,qBAAa,oBAAoB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAkBnE,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IAlBhB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAAuD;IACzE,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,oBAAoB,CAA4B;IAExD;;;;;OAKG;gBAEO,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM;YAGV,MAAM;IAwCpB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAmBjD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IAIzD;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IASpC;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;CACF"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * A worker pool that will run jobs concurrently using promises up to a specified limit.
3
+ * If no work is being done, it will wait for jobs to be added and run them up to the
4
+ * maximum concurrency.
5
+ *
6
+ * This is designed to create a central queue for jobs of many types to be processed
7
+ * in a streaming fashion, allowing for efficient resource usage and managed network requests.
8
+ *
9
+ */
10
+ export class ConcurrentWorkerPool {
11
+ /**
12
+ * Create a new runner with the specified concurrency.
13
+ *
14
+ * @param concurrency - The maximum number of jobs to run concurrently.
15
+ * @param logger - Logger instance for logging long-running jobs.
16
+ */
17
+ constructor(concurrency, logger) {
18
+ this.concurrency = concurrency;
19
+ this.logger = logger;
20
+ this.jobCounter = 0;
21
+ this.resolveMap = {};
22
+ this.queue = [];
23
+ this.activeJobs = 0;
24
+ this.waitingResolvers = [];
25
+ this.workers = [];
26
+ this.isAcceptingWork = true;
27
+ this.workAvailablePromise = null;
28
+ this.resolveWorkAvailable = null;
29
+ }
30
+ async worker(workerId) {
31
+ while (this.isAcceptingWork || this.queue.length > 0) {
32
+ const job = this.queue.shift();
33
+ if (!job) {
34
+ if (!this.isAcceptingWork) {
35
+ // No longer accepting work and no jobs left, exit immediately
36
+ return;
37
+ }
38
+ // No work available, wait for new work to be added
39
+ await this.waitForWorkAvailable();
40
+ continue;
41
+ }
42
+ this.activeJobs++;
43
+ const context = { workerId };
44
+ const startTime = Date.now();
45
+ const interval = setInterval(() => {
46
+ this.logger.warn(`Long-running job detected.`, { minutes: Math.floor((Date.now() - startTime) / 60000) }, { ...context, ...job.properties });
47
+ }, 60000);
48
+ const resolve = this.resolveMap[job.concurrentJobId];
49
+ try {
50
+ const value = await job.execute({ ...context, properties: job.properties });
51
+ resolve({ status: 'fulfilled', value, properties: job.properties });
52
+ }
53
+ catch (reason) {
54
+ resolve({ status: 'rejected', reason, properties: job.properties });
55
+ }
56
+ finally {
57
+ clearInterval(interval);
58
+ this.activeJobs--;
59
+ this.checkIfIdle();
60
+ delete this.resolveMap[job.concurrentJobId];
61
+ }
62
+ }
63
+ }
64
+ waitForWorkAvailable() {
65
+ if (!this.workAvailablePromise) {
66
+ this.workAvailablePromise = new Promise((resolve) => {
67
+ this.resolveWorkAvailable = resolve;
68
+ });
69
+ }
70
+ return this.workAvailablePromise;
71
+ }
72
+ ensureWorkers() {
73
+ if (this.workers.length === 0 && this.isAcceptingWork) {
74
+ for (let i = 0; i < this.concurrency; i++) {
75
+ this.workers.push(this.worker(i + 1));
76
+ }
77
+ }
78
+ }
79
+ notifyWorkersOfNewWork() {
80
+ // Wake up waiting workers
81
+ if (this.resolveWorkAvailable) {
82
+ this.resolveWorkAvailable();
83
+ this.workAvailablePromise = null;
84
+ this.resolveWorkAvailable = null;
85
+ }
86
+ }
87
+ checkIfIdle() {
88
+ if (this.activeJobs === 0 && this.queue.length === 0) {
89
+ // Notify all waiting resolvers
90
+ this.waitingResolvers.forEach((resolve) => resolve());
91
+ this.waitingResolvers = [];
92
+ }
93
+ }
94
+ /**
95
+ * Add a job to the queue
96
+ */
97
+ enqueue(job) {
98
+ if (!this.isAcceptingWork) {
99
+ throw new Error('Cannot enqueue jobs after shutdown');
100
+ }
101
+ return new Promise((resolve) => {
102
+ const jobId = this.jobCounter++;
103
+ const jobWithId = {
104
+ ...job,
105
+ concurrentJobId: jobId
106
+ };
107
+ this.resolveMap[jobId] = resolve;
108
+ this.queue.push(jobWithId);
109
+ this.ensureWorkers();
110
+ this.notifyWorkersOfNewWork();
111
+ });
112
+ }
113
+ /**
114
+ * Add multiple jobs to the queue
115
+ */
116
+ enqueueAll(jobs) {
117
+ return jobs.map((job) => this.enqueue(job));
118
+ }
119
+ /**
120
+ * Returns a promise that resolves when all queued work is complete
121
+ */
122
+ waitForIdle() {
123
+ return new Promise((resolve) => {
124
+ if (this.activeJobs === 0 && this.queue.length === 0) {
125
+ resolve();
126
+ }
127
+ else {
128
+ this.waitingResolvers.push(resolve);
129
+ }
130
+ });
131
+ }
132
+ /**
133
+ * Shutdown the queue - no new jobs will be accepted, but existing jobs will complete.
134
+ *
135
+ * Returns when a promise that resolves when all jobs have been processed and
136
+ * the onComplete callback has been called for each job.
137
+ */
138
+ async finishAllWork() {
139
+ this.isAcceptingWork = false;
140
+ // Wake up any sleeping workers so they can process remaining jobs or exit
141
+ this.notifyWorkersOfNewWork();
142
+ // Check if we're already idle and notify any waiting resolvers
143
+ await Promise.all(this.workers);
144
+ this.workers = [];
145
+ }
146
+ /**
147
+ * Get the current queue length
148
+ */
149
+ get queueLength() {
150
+ return this.queue.length;
151
+ }
152
+ /**
153
+ * Get the number of currently active jobs
154
+ */
155
+ get activeJobCount() {
156
+ return this.activeJobs;
157
+ }
158
+ }
159
+ //# sourceMappingURL=ConcurrentWorkerPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConcurrentWorkerPool.js","sourceRoot":"","sources":["../../src/ConcurrentWorkerPool.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAW/B;;;;;OAKG;IACH,YACU,WAAmB,EACnB,MAAc;QADd,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAQ;QAlBhB,eAAU,GAAG,CAAC,CAAA;QACd,eAAU,GAAqD,EAAE,CAAA;QACjE,UAAK,GAAsB,EAAE,CAAA;QAC7B,eAAU,GAAG,CAAC,CAAA;QACd,qBAAgB,GAAmB,EAAE,CAAA;QACrC,YAAO,GAAoB,EAAE,CAAA;QAC7B,oBAAe,GAAG,IAAI,CAAA;QACtB,yBAAoB,GAAyB,IAAI,CAAA;QACjD,yBAAoB,GAAwB,IAAI,CAAA;IAWrD,CAAC;IAEI,KAAK,CAAC,MAAM,CAAC,QAAgB;QACnC,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC1B,8DAA8D;oBAC9D,OAAM;gBACR,CAAC;gBACD,mDAAmD;gBACnD,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBACjC,SAAQ;YACV,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,MAAM,OAAO,GAAe,EAAE,QAAQ,EAAE,CAAA;YAExC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,4BAA4B,EAC5B,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,EACzD,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,CAClC,CAAA;YACH,CAAC,EAAE,KAAM,CAAC,CAAA;YAEV,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;YACpD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;gBAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACrE,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACrE,CAAC;oBAAS,CAAC;gBACT,aAAa,CAAC,QAAQ,CAAC,CAAA;gBACvB,IAAI,CAAC,UAAU,EAAE,CAAA;gBACjB,IAAI,CAAC,WAAW,EAAE,CAAA;gBAClB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACxD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAA;YACrC,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,oBAAoB,CAAA;IAClC,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,0BAA0B;QAC1B,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAA;YAC3B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;YAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;QAClC,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,+BAA+B;YAC/B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YACrD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACvD,CAAC;QAED,OAAO,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;YAC/B,MAAM,SAAS,GAAoB;gBACjC,GAAG,GAAG;gBACN,eAAe,EAAE,KAAK;aACvB,CAAA;YACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,OAAO,CAAA;YAEhC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAiB;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,OAAO,EAAE,CAAA;YACX,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrC,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;QAC5B,0EAA0E;QAC1E,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC7B,+DAA+D;QAC/D,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;CACF"}
@@ -1,4 +1,5 @@
1
1
  export { ConcurrentJobQueue } from './ConcurrentJobQueue.js';
2
+ export { ConcurrentWorkerPool } from './ConcurrentWorkerPool.js';
2
3
  export type { Job, JobContext, JobResult, Logger } from './job.js';
3
4
  export { runJobs } from './runJobs.js';
4
5
  export { StreamingJobQueue } from './StreamingJobQueue.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
package/dist/esm/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { ConcurrentJobQueue } from './ConcurrentJobQueue.js';
2
+ export { ConcurrentWorkerPool } from './ConcurrentWorkerPool.js';
2
3
  export { runJobs } from './runJobs.js';
3
4
  export { StreamingJobQueue } from './StreamingJobQueue.js';
4
5
  export { numberOfCpus } from './util.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-copilot/job",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Async job runners with defined worker pools",
5
5
  "keywords": [
6
6
  "Typescript",