@powerhousedao/reactor 2.5.0-dev.33

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 (75) hide show
  1. package/LICENSE +661 -0
  2. package/dist/bench/end-to-end-flow.bench.d.ts +2 -0
  3. package/dist/bench/end-to-end-flow.bench.d.ts.map +1 -0
  4. package/dist/bench/end-to-end-flow.bench.js +256 -0
  5. package/dist/bench/end-to-end-flow.bench.js.map +1 -0
  6. package/dist/bench/event-bus.bench.d.ts +2 -0
  7. package/dist/bench/event-bus.bench.d.ts.map +1 -0
  8. package/dist/bench/event-bus.bench.js +238 -0
  9. package/dist/bench/event-bus.bench.js.map +1 -0
  10. package/dist/bench/queue-only.bench.d.ts +2 -0
  11. package/dist/bench/queue-only.bench.d.ts.map +1 -0
  12. package/dist/bench/queue-only.bench.js +40 -0
  13. package/dist/bench/queue-only.bench.js.map +1 -0
  14. package/dist/bench/reactor-throughput.bench.d.ts +2 -0
  15. package/dist/bench/reactor-throughput.bench.d.ts.map +1 -0
  16. package/dist/bench/reactor-throughput.bench.js +137 -0
  17. package/dist/bench/reactor-throughput.bench.js.map +1 -0
  18. package/dist/src/events/event-bus.d.ts +8 -0
  19. package/dist/src/events/event-bus.d.ts.map +1 -0
  20. package/dist/src/events/event-bus.js +53 -0
  21. package/dist/src/events/event-bus.js.map +1 -0
  22. package/dist/src/events/interfaces.d.ts +27 -0
  23. package/dist/src/events/interfaces.d.ts.map +1 -0
  24. package/dist/src/events/interfaces.js +2 -0
  25. package/dist/src/events/interfaces.js.map +1 -0
  26. package/dist/src/events/types.d.ts +24 -0
  27. package/dist/src/events/types.d.ts.map +1 -0
  28. package/dist/src/events/types.js +20 -0
  29. package/dist/src/events/types.js.map +1 -0
  30. package/dist/src/executor/interfaces.d.ts +72 -0
  31. package/dist/src/executor/interfaces.d.ts.map +1 -0
  32. package/dist/src/executor/interfaces.js +2 -0
  33. package/dist/src/executor/interfaces.js.map +1 -0
  34. package/dist/src/executor/job-executor.d.ts +62 -0
  35. package/dist/src/executor/job-executor.d.ts.map +1 -0
  36. package/dist/src/executor/job-executor.js +325 -0
  37. package/dist/src/executor/job-executor.js.map +1 -0
  38. package/dist/src/executor/types.d.ts +67 -0
  39. package/dist/src/executor/types.d.ts.map +1 -0
  40. package/dist/src/executor/types.js +11 -0
  41. package/dist/src/executor/types.js.map +1 -0
  42. package/dist/src/index.d.ts +9 -0
  43. package/dist/src/index.d.ts.map +1 -0
  44. package/dist/src/index.js +8 -0
  45. package/dist/src/index.js.map +1 -0
  46. package/dist/src/queue/interfaces.d.ts +62 -0
  47. package/dist/src/queue/interfaces.d.ts.map +1 -0
  48. package/dist/src/queue/interfaces.js +2 -0
  49. package/dist/src/queue/interfaces.js.map +1 -0
  50. package/dist/src/queue/queue.d.ts +30 -0
  51. package/dist/src/queue/queue.d.ts.map +1 -0
  52. package/dist/src/queue/queue.js +136 -0
  53. package/dist/src/queue/queue.js.map +1 -0
  54. package/dist/src/queue/types.d.ts +38 -0
  55. package/dist/src/queue/types.d.ts.map +1 -0
  56. package/dist/src/queue/types.js +7 -0
  57. package/dist/src/queue/types.js.map +1 -0
  58. package/dist/src/shared/types.d.ts +23 -0
  59. package/dist/src/shared/types.d.ts.map +1 -0
  60. package/dist/src/shared/types.js +2 -0
  61. package/dist/src/shared/types.js.map +1 -0
  62. package/dist/test/event-bus.test.d.ts +2 -0
  63. package/dist/test/event-bus.test.d.ts.map +1 -0
  64. package/dist/test/event-bus.test.js +532 -0
  65. package/dist/test/event-bus.test.js.map +1 -0
  66. package/dist/test/job-executor.test.d.ts +2 -0
  67. package/dist/test/job-executor.test.d.ts.map +1 -0
  68. package/dist/test/job-executor.test.js +581 -0
  69. package/dist/test/job-executor.test.js.map +1 -0
  70. package/dist/test/queue.test.d.ts +2 -0
  71. package/dist/test/queue.test.d.ts.map +1 -0
  72. package/dist/test/queue.test.js +396 -0
  73. package/dist/test/queue.test.js.map +1 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -0
  75. package/package.json +40 -0
@@ -0,0 +1,325 @@
1
+ import { QueueEventTypes, } from "../queue/types.js";
2
+ import { JobExecutorEventTypes, } from "./types.js";
3
+ /**
4
+ * Default configuration for the job executor
5
+ */
6
+ const DEFAULT_CONFIG = {
7
+ maxConcurrency: 5,
8
+ jobTimeout: 30000, // 30 seconds
9
+ retryBaseDelay: 1000, // 1 second
10
+ retryMaxDelay: 30000, // 30 seconds
11
+ };
12
+ /**
13
+ * In-memory implementation of the IJobExecutor interface.
14
+ * Listens for job available events and executes jobs with concurrency control and retry logic.
15
+ */
16
+ export class InMemoryJobExecutor {
17
+ eventBus;
18
+ queue;
19
+ isRunning = false;
20
+ isPaused = false;
21
+ config = DEFAULT_CONFIG;
22
+ activeJobs = new Set();
23
+ jobAvailableUnsubscribe;
24
+ startedAt;
25
+ // Statistics
26
+ totalJobsProcessed = 0;
27
+ totalJobsSucceeded = 0;
28
+ totalJobsFailed = 0;
29
+ lastJobCompletedAt;
30
+ executionTimes = [];
31
+ // Job execution tracking
32
+ jobPromises = new Map();
33
+ abortControllers = new Map();
34
+ constructor(eventBus, queue) {
35
+ this.eventBus = eventBus;
36
+ this.queue = queue;
37
+ }
38
+ async start(config) {
39
+ if (this.isRunning) {
40
+ throw new Error("Job executor is already running");
41
+ }
42
+ this.config = { ...DEFAULT_CONFIG, ...config };
43
+ this.isRunning = true;
44
+ this.isPaused = false;
45
+ this.startedAt = new Date();
46
+ // Subscribe to job available events
47
+ this.jobAvailableUnsubscribe = this.eventBus.subscribe(QueueEventTypes.JOB_AVAILABLE, this.handleJobAvailable.bind(this));
48
+ // Emit executor started event
49
+ const startedEvent = {
50
+ config: this.config,
51
+ startedAt: this.startedAt.toISOString(),
52
+ };
53
+ await this.eventBus.emit(JobExecutorEventTypes.EXECUTOR_STARTED, startedEvent);
54
+ // Check for existing jobs in the queue
55
+ await this.processAvailableJobs();
56
+ }
57
+ async stop(graceful = true) {
58
+ if (!this.isRunning) {
59
+ return;
60
+ }
61
+ this.isRunning = false;
62
+ // Unsubscribe from job available events
63
+ if (this.jobAvailableUnsubscribe) {
64
+ this.jobAvailableUnsubscribe();
65
+ this.jobAvailableUnsubscribe = undefined;
66
+ }
67
+ if (graceful) {
68
+ // Wait for all active jobs to complete
69
+ await Promise.allSettled(Array.from(this.jobPromises.values()));
70
+ }
71
+ else {
72
+ // Abort all active jobs
73
+ for (const controller of this.abortControllers.values()) {
74
+ controller.abort();
75
+ }
76
+ }
77
+ // Clean up
78
+ this.activeJobs.clear();
79
+ this.jobPromises.clear();
80
+ this.abortControllers.clear();
81
+ // Emit executor stopped event
82
+ const stoppedEvent = {
83
+ stoppedAt: new Date().toISOString(),
84
+ graceful,
85
+ };
86
+ await this.eventBus.emit(JobExecutorEventTypes.EXECUTOR_STOPPED, stoppedEvent);
87
+ }
88
+ async executeJob(job) {
89
+ return this.executeJobInternal(job);
90
+ }
91
+ async getStatus() {
92
+ const uptime = this.startedAt
93
+ ? Date.now() - this.startedAt.getTime()
94
+ : undefined;
95
+ return {
96
+ isRunning: this.isRunning,
97
+ activeJobs: this.activeJobs.size,
98
+ totalJobsProcessed: this.totalJobsProcessed,
99
+ totalJobsSucceeded: this.totalJobsSucceeded,
100
+ totalJobsFailed: this.totalJobsFailed,
101
+ lastJobCompletedAt: this.lastJobCompletedAt,
102
+ uptime,
103
+ };
104
+ }
105
+ async getStats() {
106
+ const averageExecutionTime = this.executionTimes.length > 0
107
+ ? this.executionTimes.reduce((sum, time) => sum + time, 0) /
108
+ this.executionTimes.length
109
+ : 0;
110
+ const successRate = this.totalJobsProcessed > 0
111
+ ? this.totalJobsSucceeded / this.totalJobsProcessed
112
+ : 0;
113
+ const uptime = this.startedAt
114
+ ? (Date.now() - this.startedAt.getTime()) / 1000
115
+ : 0;
116
+ const jobsPerSecond = uptime > 0 ? this.totalJobsProcessed / uptime : 0;
117
+ const queueBacklog = await this.queue.totalSize();
118
+ return {
119
+ averageExecutionTime,
120
+ successRate,
121
+ jobsPerSecond,
122
+ queueBacklog,
123
+ };
124
+ }
125
+ async pause() {
126
+ this.isPaused = true;
127
+ }
128
+ async resume() {
129
+ this.isPaused = false;
130
+ // Process any available jobs
131
+ await this.processAvailableJobs();
132
+ }
133
+ on(event, handler) {
134
+ const eventType = this.getEventType(event);
135
+ return this.eventBus.subscribe(eventType, (_, data) => handler(data));
136
+ }
137
+ getEventType(event) {
138
+ switch (event) {
139
+ case "jobStarted":
140
+ return JobExecutorEventTypes.JOB_STARTED;
141
+ case "jobCompleted":
142
+ return JobExecutorEventTypes.JOB_COMPLETED;
143
+ case "jobFailed":
144
+ return JobExecutorEventTypes.JOB_FAILED;
145
+ case "executorStarted":
146
+ return JobExecutorEventTypes.EXECUTOR_STARTED;
147
+ case "executorStopped":
148
+ return JobExecutorEventTypes.EXECUTOR_STOPPED;
149
+ default:
150
+ throw new Error(`Unknown event type: ${event}`);
151
+ }
152
+ }
153
+ async handleJobAvailable(_, event) {
154
+ if (!this.isRunning || this.isPaused) {
155
+ return;
156
+ }
157
+ await this.processAvailableJobs();
158
+ }
159
+ async processAvailableJobs() {
160
+ if (!this.isRunning || this.isPaused) {
161
+ return;
162
+ }
163
+ // Check if we have capacity for more jobs
164
+ while (this.activeJobs.size < this.config.maxConcurrency) {
165
+ const job = await this.queue.dequeueNext();
166
+ if (!job) {
167
+ break; // No more jobs available
168
+ }
169
+ // Start executing the job (don't await - run concurrently)
170
+ const jobPromise = this.executeJobWithRetry(job);
171
+ this.jobPromises.set(job.id, jobPromise);
172
+ // Handle job completion asynchronously
173
+ jobPromise.finally(() => {
174
+ this.jobPromises.delete(job.id);
175
+ // Try to process more jobs when this one completes
176
+ this.processAvailableJobs().catch(console.error);
177
+ });
178
+ }
179
+ }
180
+ async executeJobWithRetry(job) {
181
+ let lastResult;
182
+ do {
183
+ lastResult = await this.executeJobInternal(job);
184
+ if (lastResult.success) {
185
+ return lastResult;
186
+ }
187
+ // Check if we should retry before incrementing
188
+ if (!this.shouldRetryJob(job)) {
189
+ return lastResult;
190
+ }
191
+ // Increment retry count after deciding to retry
192
+ job.retryCount = (job.retryCount || 0) + 1;
193
+ // Wait before retrying
194
+ const delay = this.calculateRetryDelay(job.retryCount);
195
+ await this.sleep(delay);
196
+ } while (true); // We'll break out when shouldRetryJob returns false
197
+ }
198
+ async executeJobInternal(job) {
199
+ const startTime = Date.now();
200
+ const abortController = new AbortController();
201
+ try {
202
+ // Track the job
203
+ this.activeJobs.add(job.id);
204
+ this.abortControllers.set(job.id, abortController);
205
+ // Emit job started event
206
+ const startedEvent = {
207
+ job,
208
+ startedAt: new Date().toISOString(),
209
+ };
210
+ await this.eventBus.emit(JobExecutorEventTypes.JOB_STARTED, startedEvent);
211
+ // Execute the job with timeout
212
+ const result = await this.executeJobWithTimeout(job, abortController.signal);
213
+ const endTime = Date.now();
214
+ const duration = endTime - startTime;
215
+ // Update statistics
216
+ this.totalJobsProcessed++;
217
+ this.totalJobsSucceeded++;
218
+ this.lastJobCompletedAt = new Date().toISOString();
219
+ this.executionTimes.push(duration);
220
+ // Keep only last 1000 execution times for average calculation
221
+ if (this.executionTimes.length > 1000) {
222
+ this.executionTimes = this.executionTimes.slice(-1000);
223
+ }
224
+ const jobResult = {
225
+ job,
226
+ success: true,
227
+ completedAt: this.lastJobCompletedAt,
228
+ duration,
229
+ metadata: result.metadata,
230
+ };
231
+ // Emit job completed event
232
+ const completedEvent = {
233
+ job,
234
+ result: jobResult,
235
+ };
236
+ await this.eventBus.emit(JobExecutorEventTypes.JOB_COMPLETED, completedEvent);
237
+ return jobResult;
238
+ }
239
+ catch (error) {
240
+ const endTime = Date.now();
241
+ const duration = endTime - startTime;
242
+ const errorMessage = error instanceof Error ? error.message : String(error);
243
+ // Update statistics
244
+ this.totalJobsProcessed++;
245
+ this.totalJobsFailed++;
246
+ const jobResult = {
247
+ job,
248
+ success: false,
249
+ error: errorMessage,
250
+ completedAt: new Date().toISOString(),
251
+ duration,
252
+ };
253
+ // Emit job failed event
254
+ const failedEvent = {
255
+ job,
256
+ error: errorMessage,
257
+ willRetry: this.shouldRetryJob(job),
258
+ retryCount: job.retryCount || 0,
259
+ };
260
+ await this.eventBus.emit(JobExecutorEventTypes.JOB_FAILED, failedEvent);
261
+ return jobResult;
262
+ }
263
+ finally {
264
+ // Clean up
265
+ this.activeJobs.delete(job.id);
266
+ this.abortControllers.delete(job.id);
267
+ }
268
+ }
269
+ async executeJobWithTimeout(job, signal) {
270
+ // Create a timeout promise
271
+ const timeoutPromise = new Promise((_, reject) => {
272
+ const timeout = setTimeout(() => {
273
+ reject(new Error(`Job ${job.id} timed out after ${this.config.jobTimeout}ms`));
274
+ }, this.config.jobTimeout);
275
+ // Clear timeout if aborted
276
+ signal.addEventListener("abort", () => {
277
+ clearTimeout(timeout);
278
+ reject(new Error(`Job ${job.id} was aborted`));
279
+ });
280
+ });
281
+ // Create the actual job execution promise
282
+ const jobPromise = this.performJobExecution(job, signal);
283
+ // Race between job execution and timeout
284
+ return Promise.race([jobPromise, timeoutPromise]);
285
+ }
286
+ async performJobExecution(job, signal) {
287
+ // This is where the actual job execution logic would go
288
+ // For now, we'll simulate job execution
289
+ // Check if aborted
290
+ if (signal.aborted) {
291
+ throw new Error("Job was aborted");
292
+ }
293
+ // Simulate some work
294
+ await this.sleep(Math.random() * 100 + 50); // 50-150ms (reduced for faster tests)
295
+ // Check if aborted again
296
+ if (signal.aborted) {
297
+ throw new Error("Job was aborted");
298
+ }
299
+ // Always succeed unless explicitly mocked in tests
300
+ return {
301
+ metadata: {
302
+ operationType: job.operation.type,
303
+ documentId: job.documentId,
304
+ executedAt: new Date().toISOString(),
305
+ },
306
+ };
307
+ }
308
+ shouldRetryJob(job) {
309
+ const retryCount = job.retryCount || 0;
310
+ const maxRetries = job.maxRetries || 3;
311
+ return retryCount < maxRetries;
312
+ }
313
+ calculateRetryDelay(retryCount) {
314
+ // Exponential backoff with jitter
315
+ const exponentialDelay = this.config.retryBaseDelay * Math.pow(2, retryCount - 1);
316
+ const jitter = Math.random() * 0.1 * exponentialDelay; // 10% jitter
317
+ const delay = Math.min(exponentialDelay + jitter, this.config.retryMaxDelay);
318
+ return Math.floor(delay);
319
+ }
320
+ sleep(ms) {
321
+ return new Promise((resolve) => setTimeout(resolve, ms));
322
+ }
323
+ }
324
+ export { JobExecutorEventTypes } from "./types.js";
325
+ //# sourceMappingURL=job-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-executor.js","sourceRoot":"","sources":["../../../src/executor/job-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { Job } from "../queue/types.js";
2
+ /**
3
+ * Represents the result of a job execution
4
+ */
5
+ export type JobResult = {
6
+ /** The job that was executed */
7
+ job: Job;
8
+ /** Whether the job executed successfully */
9
+ success: boolean;
10
+ /** Error message if the job failed */
11
+ error?: string;
12
+ /** Timestamp when the job execution completed */
13
+ completedAt: string;
14
+ /** Duration of job execution in milliseconds */
15
+ duration: number;
16
+ /** Any additional metadata from the execution */
17
+ metadata?: Record<string, any>;
18
+ };
19
+ /**
20
+ * Configuration options for the job executor
21
+ */
22
+ export type JobExecutorConfig = {
23
+ /** Maximum number of concurrent jobs to execute */
24
+ maxConcurrency?: number;
25
+ /** Maximum time in milliseconds a job can run before being considered timed out */
26
+ jobTimeout?: number;
27
+ /** Base delay in milliseconds for exponential backoff retries */
28
+ retryBaseDelay?: number;
29
+ /** Maximum delay in milliseconds for exponential backoff retries */
30
+ retryMaxDelay?: number;
31
+ };
32
+ /**
33
+ * Event types for the job executor
34
+ */
35
+ export declare const JobExecutorEventTypes: {
36
+ readonly JOB_STARTED: 20000;
37
+ readonly JOB_COMPLETED: 20001;
38
+ readonly JOB_FAILED: 20002;
39
+ readonly EXECUTOR_STARTED: 20003;
40
+ readonly EXECUTOR_STOPPED: 20004;
41
+ };
42
+ /**
43
+ * Event data for job execution events
44
+ */
45
+ export type JobStartedEvent = {
46
+ job: Job;
47
+ startedAt: string;
48
+ };
49
+ export type JobCompletedEvent = {
50
+ job: Job;
51
+ result: JobResult;
52
+ };
53
+ export type JobFailedEvent = {
54
+ job: Job;
55
+ error: string;
56
+ willRetry: boolean;
57
+ retryCount: number;
58
+ };
59
+ export type ExecutorStartedEvent = {
60
+ config: JobExecutorConfig;
61
+ startedAt: string;
62
+ };
63
+ export type ExecutorStoppedEvent = {
64
+ stoppedAt: string;
65
+ graceful: boolean;
66
+ };
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/executor/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAC;IAET,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IAEjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IAEpB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IAEjB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Event types for the job executor
3
+ */
4
+ export const JobExecutorEventTypes = {
5
+ JOB_STARTED: 20000,
6
+ JOB_COMPLETED: 20001,
7
+ JOB_FAILED: 20002,
8
+ EXECUTOR_STARTED: 20003,
9
+ EXECUTOR_STOPPED: 20004,
10
+ };
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/executor/types.ts"],"names":[],"mappings":"AA0CA;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,KAAK;IACvB,gBAAgB,EAAE,KAAK;CACf,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { EventBus } from "./events/event-bus.js";
2
+ export { type IEventBus } from "./events/interfaces.js";
3
+ export { EventBusAggregateError, type Unsubscribe } from "./events/types.js";
4
+ export { type IQueue } from "./queue/interfaces.js";
5
+ export { InMemoryQueue } from "./queue/queue.js";
6
+ export { QueueEventTypes, type Job, type JobAvailableEvent, } from "./queue/types.js";
7
+ export { InMemoryJobExecutor, JobExecutorEventTypes, type ExecutorStartedEvent, type ExecutorStoppedEvent, type IJobExecutor, type JobCompletedEvent, type JobExecutorConfig, type JobFailedEvent, type JobResult, type JobStartedEvent, } from "./executor/job-executor.js";
8
+ export { type Operation } from "./shared/types.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,eAAe,EACf,KAAK,GAAG,EACR,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Event Bus
2
+ export { EventBus } from "./events/event-bus.js";
3
+ export { EventBusAggregateError } from "./events/types.js";
4
+ export { InMemoryQueue } from "./queue/queue.js";
5
+ export { QueueEventTypes, } from "./queue/types.js";
6
+ // Job Executor
7
+ export { InMemoryJobExecutor, JobExecutorEventTypes, } from "./executor/job-executor.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAoB,MAAM,mBAAmB,CAAC;AAI7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,eAAe,GAGhB,MAAM,kBAAkB,CAAC;AAE1B,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAStB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { Job } from "./types.js";
2
+ /**
3
+ * Interface for a job queue that manages write operations.
4
+ * Internally organizes jobs by documentId, scope, and branch to ensure proper ordering.
5
+ * Emits events to the event bus when new jobs are available for consumption.
6
+ */
7
+ export interface IQueue {
8
+ /**
9
+ * Add a new job to the queue.
10
+ * Jobs are automatically organized by documentId, scope, and branch internally.
11
+ * Emits a 'jobAvailable' event to the event bus when the job is queued.
12
+ * @param job - The job to add to the queue
13
+ * @returns Promise that resolves when the job is queued
14
+ */
15
+ enqueue(job: Job): Promise<void>;
16
+ /**
17
+ * Get the next job to execute for a specific document/scope/branch combination.
18
+ * @param documentId - The document ID to get jobs for
19
+ * @param scope - The scope to get jobs for
20
+ * @param branch - The branch to get jobs for
21
+ * @returns Promise that resolves to the next job or null if no jobs available
22
+ */
23
+ dequeue(documentId: string, scope: string, branch: string): Promise<Job | null>;
24
+ /**
25
+ * Get the next available job from any queue.
26
+ * @returns Promise that resolves to the next job or null if no jobs available
27
+ */
28
+ dequeueNext(): Promise<Job | null>;
29
+ /**
30
+ * Get the current size of the queue for a specific document/scope/branch.
31
+ * @param documentId - The document ID
32
+ * @param scope - The scope
33
+ * @param branch - The branch
34
+ * @returns Promise that resolves to the number of jobs in the queue
35
+ */
36
+ size(documentId: string, scope: string, branch: string): Promise<number>;
37
+ /**
38
+ * Get the total size of all queues.
39
+ * @returns Promise that resolves to the total number of jobs across all queues
40
+ */
41
+ totalSize(): Promise<number>;
42
+ /**
43
+ * Remove a specific job from the queue.
44
+ * @param jobId - The ID of the job to remove
45
+ * @returns Promise that resolves to true if job was removed, false if not found
46
+ */
47
+ remove(jobId: string): Promise<boolean>;
48
+ /**
49
+ * Clear all jobs for a specific document/scope/branch combination.
50
+ * @param documentId - The document ID
51
+ * @param scope - The scope
52
+ * @param branch - The branch
53
+ * @returns Promise that resolves when the queue is cleared
54
+ */
55
+ clear(documentId: string, scope: string, branch: string): Promise<void>;
56
+ /**
57
+ * Clear all jobs from all queues.
58
+ * @returns Promise that resolves when all queues are cleared
59
+ */
60
+ clearAll(): Promise<void>;
61
+ }
62
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/queue/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;;OAMG;IACH,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAEnC;;;;;;OAMG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzE;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7B;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/queue/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { IEventBus } from "../events/interfaces.js";
2
+ import { IQueue } from "./interfaces.js";
3
+ import { Job } from "./types.js";
4
+ /**
5
+ * In-memory implementation of the IQueue interface.
6
+ * Organizes jobs by documentId, scope, and branch to ensure proper ordering.
7
+ */
8
+ export declare class InMemoryQueue implements IQueue {
9
+ private eventBus;
10
+ private queues;
11
+ private jobIndex;
12
+ constructor(eventBus: IEventBus);
13
+ /**
14
+ * Creates a unique key for a document/scope/branch combination
15
+ */
16
+ private createQueueKey;
17
+ /**
18
+ * Gets or creates a queue for the given key
19
+ */
20
+ private getQueue;
21
+ enqueue(job: Job): Promise<void>;
22
+ dequeue(documentId: string, scope: string, branch: string): Promise<Job | null>;
23
+ dequeueNext(): Promise<Job | null>;
24
+ size(documentId: string, scope: string, branch: string): Promise<number>;
25
+ totalSize(): Promise<number>;
26
+ remove(jobId: string): Promise<boolean>;
27
+ clear(documentId: string, scope: string, branch: string): Promise<void>;
28
+ clearAll(): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/queue/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAsC,MAAM,YAAY,CAAC;AAErE;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IAI9B,OAAO,CAAC,QAAQ;IAH5B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAA6B;gBAEzB,QAAQ,EAAE,SAAS;IAEvC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,QAAQ;IASV,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBhC,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAsBhB,WAAW,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAqBlC,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAMZ,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCvC,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAeV,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAOhC"}