@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.
- package/LICENSE +661 -0
- package/dist/bench/end-to-end-flow.bench.d.ts +2 -0
- package/dist/bench/end-to-end-flow.bench.d.ts.map +1 -0
- package/dist/bench/end-to-end-flow.bench.js +256 -0
- package/dist/bench/end-to-end-flow.bench.js.map +1 -0
- package/dist/bench/event-bus.bench.d.ts +2 -0
- package/dist/bench/event-bus.bench.d.ts.map +1 -0
- package/dist/bench/event-bus.bench.js +238 -0
- package/dist/bench/event-bus.bench.js.map +1 -0
- package/dist/bench/queue-only.bench.d.ts +2 -0
- package/dist/bench/queue-only.bench.d.ts.map +1 -0
- package/dist/bench/queue-only.bench.js +40 -0
- package/dist/bench/queue-only.bench.js.map +1 -0
- package/dist/bench/reactor-throughput.bench.d.ts +2 -0
- package/dist/bench/reactor-throughput.bench.d.ts.map +1 -0
- package/dist/bench/reactor-throughput.bench.js +137 -0
- package/dist/bench/reactor-throughput.bench.js.map +1 -0
- package/dist/src/events/event-bus.d.ts +8 -0
- package/dist/src/events/event-bus.d.ts.map +1 -0
- package/dist/src/events/event-bus.js +53 -0
- package/dist/src/events/event-bus.js.map +1 -0
- package/dist/src/events/interfaces.d.ts +27 -0
- package/dist/src/events/interfaces.d.ts.map +1 -0
- package/dist/src/events/interfaces.js +2 -0
- package/dist/src/events/interfaces.js.map +1 -0
- package/dist/src/events/types.d.ts +24 -0
- package/dist/src/events/types.d.ts.map +1 -0
- package/dist/src/events/types.js +20 -0
- package/dist/src/events/types.js.map +1 -0
- package/dist/src/executor/interfaces.d.ts +72 -0
- package/dist/src/executor/interfaces.d.ts.map +1 -0
- package/dist/src/executor/interfaces.js +2 -0
- package/dist/src/executor/interfaces.js.map +1 -0
- package/dist/src/executor/job-executor.d.ts +62 -0
- package/dist/src/executor/job-executor.d.ts.map +1 -0
- package/dist/src/executor/job-executor.js +325 -0
- package/dist/src/executor/job-executor.js.map +1 -0
- package/dist/src/executor/types.d.ts +67 -0
- package/dist/src/executor/types.d.ts.map +1 -0
- package/dist/src/executor/types.js +11 -0
- package/dist/src/executor/types.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/queue/interfaces.d.ts +62 -0
- package/dist/src/queue/interfaces.d.ts.map +1 -0
- package/dist/src/queue/interfaces.js +2 -0
- package/dist/src/queue/interfaces.js.map +1 -0
- package/dist/src/queue/queue.d.ts +30 -0
- package/dist/src/queue/queue.d.ts.map +1 -0
- package/dist/src/queue/queue.js +136 -0
- package/dist/src/queue/queue.js.map +1 -0
- package/dist/src/queue/types.d.ts +38 -0
- package/dist/src/queue/types.d.ts.map +1 -0
- package/dist/src/queue/types.js +7 -0
- package/dist/src/queue/types.js.map +1 -0
- package/dist/src/shared/types.d.ts +23 -0
- package/dist/src/shared/types.d.ts.map +1 -0
- package/dist/src/shared/types.js +2 -0
- package/dist/src/shared/types.js.map +1 -0
- package/dist/test/event-bus.test.d.ts +2 -0
- package/dist/test/event-bus.test.d.ts.map +1 -0
- package/dist/test/event-bus.test.js +532 -0
- package/dist/test/event-bus.test.js.map +1 -0
- package/dist/test/job-executor.test.d.ts +2 -0
- package/dist/test/job-executor.test.d.ts.map +1 -0
- package/dist/test/job-executor.test.js +581 -0
- package/dist/test/job-executor.test.js.map +1 -0
- package/dist/test/queue.test.d.ts +2 -0
- package/dist/test/queue.test.d.ts.map +1 -0
- package/dist/test/queue.test.js +396 -0
- package/dist/test/queue.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|