@workglow/job-queue 0.1.2 → 0.2.0
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/dist/browser.js +88 -27
- package/dist/browser.js.map +8 -7
- package/dist/bun.js +88 -27
- package/dist/bun.js.map +8 -7
- package/dist/common.d.ts +1 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/job/JobError.d.ts +0 -4
- package/dist/job/JobError.d.ts.map +1 -1
- package/dist/job/JobErrorDiagnostics.d.ts +26 -0
- package/dist/job/JobErrorDiagnostics.d.ts.map +1 -0
- package/dist/job/JobQueueClient.d.ts.map +1 -1
- package/dist/job/JobQueueWorker.d.ts.map +1 -1
- package/dist/node.js +88 -27
- package/dist/node.js.map +8 -7
- package/package.json +10 -5
package/dist/bun.js
CHANGED
|
@@ -6,13 +6,8 @@ import { JobStatus } from "@workglow/storage";
|
|
|
6
6
|
import { BaseError } from "@workglow/util";
|
|
7
7
|
|
|
8
8
|
class JobError extends BaseError {
|
|
9
|
-
message;
|
|
10
9
|
static type = "JobError";
|
|
11
10
|
retryable = false;
|
|
12
|
-
constructor(message) {
|
|
13
|
-
super(message);
|
|
14
|
-
this.message = message;
|
|
15
|
-
}
|
|
16
11
|
}
|
|
17
12
|
|
|
18
13
|
class JobNotFoundError extends JobError {
|
|
@@ -34,16 +29,10 @@ class RetryableJobError extends JobError {
|
|
|
34
29
|
|
|
35
30
|
class PermanentJobError extends JobError {
|
|
36
31
|
static type = "PermanentJobError";
|
|
37
|
-
constructor(message) {
|
|
38
|
-
super(message);
|
|
39
|
-
}
|
|
40
32
|
}
|
|
41
33
|
|
|
42
34
|
class AbortSignalJobError extends PermanentJobError {
|
|
43
35
|
static type = "AbortSignalJobError";
|
|
44
|
-
constructor(message) {
|
|
45
|
-
super(message);
|
|
46
|
-
}
|
|
47
36
|
}
|
|
48
37
|
|
|
49
38
|
class JobDisabledError extends PermanentJobError {
|
|
@@ -135,6 +124,57 @@ class Job {
|
|
|
135
124
|
}
|
|
136
125
|
}
|
|
137
126
|
|
|
127
|
+
// src/job/JobErrorDiagnostics.ts
|
|
128
|
+
var JOB_ERROR_DIAGNOSTICS_MARKER = `
|
|
129
|
+
|
|
130
|
+
--- Error diagnostics ---
|
|
131
|
+
`;
|
|
132
|
+
var DEFAULT_MAX_DIAGNOSTICS_CHARS = 48000;
|
|
133
|
+
function formatErrorChainForDiagnostics(err, maxChars = DEFAULT_MAX_DIAGNOSTICS_CHARS) {
|
|
134
|
+
const lines = [];
|
|
135
|
+
let current = err;
|
|
136
|
+
for (let depth = 0;depth < 8 && current != null; depth++) {
|
|
137
|
+
if (current instanceof Error) {
|
|
138
|
+
lines.push(`${current.name}: ${current.message}`);
|
|
139
|
+
if (current.stack) {
|
|
140
|
+
lines.push(current.stack);
|
|
141
|
+
}
|
|
142
|
+
const next = current.cause;
|
|
143
|
+
if (next === undefined || next === null) {
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
lines.push("");
|
|
147
|
+
current = next;
|
|
148
|
+
} else {
|
|
149
|
+
lines.push(typeof current === "string" ? current : String(current));
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const text = lines.join(`
|
|
154
|
+
`);
|
|
155
|
+
if (text.length <= maxChars) {
|
|
156
|
+
return text;
|
|
157
|
+
}
|
|
158
|
+
return `${text.slice(0, maxChars)}
|
|
159
|
+
\u2026(truncated)`;
|
|
160
|
+
}
|
|
161
|
+
function withJobErrorDiagnostics(summaryLine, err) {
|
|
162
|
+
const diag = formatErrorChainForDiagnostics(err);
|
|
163
|
+
if (diag.length === 0) {
|
|
164
|
+
return summaryLine;
|
|
165
|
+
}
|
|
166
|
+
return `${summaryLine}${JOB_ERROR_DIAGNOSTICS_MARKER}${diag}`;
|
|
167
|
+
}
|
|
168
|
+
function applyPersistedDiagnosticsToStack(jobError, fullMessage) {
|
|
169
|
+
if (!fullMessage.includes(JOB_ERROR_DIAGNOSTICS_MARKER)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const firstLine = fullMessage.split(`
|
|
173
|
+
`)[0] ?? fullMessage;
|
|
174
|
+
jobError.stack = `${jobError.name}: ${firstLine}
|
|
175
|
+
${fullMessage}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
138
178
|
// src/job/JobQueueClient.ts
|
|
139
179
|
import { JobStatus as JobStatus2 } from "@workglow/storage";
|
|
140
180
|
import { EventEmitter } from "@workglow/util";
|
|
@@ -465,18 +505,28 @@ class JobQueueClient {
|
|
|
465
505
|
}
|
|
466
506
|
buildErrorFromCode(message, errorCode) {
|
|
467
507
|
if (errorCode === "PermanentJobError") {
|
|
468
|
-
|
|
508
|
+
const err2 = new PermanentJobError(message);
|
|
509
|
+
applyPersistedDiagnosticsToStack(err2, message);
|
|
510
|
+
return err2;
|
|
469
511
|
}
|
|
470
512
|
if (errorCode === "RetryableJobError") {
|
|
471
|
-
|
|
513
|
+
const err2 = new RetryableJobError(message);
|
|
514
|
+
applyPersistedDiagnosticsToStack(err2, message);
|
|
515
|
+
return err2;
|
|
472
516
|
}
|
|
473
517
|
if (errorCode === "AbortSignalJobError") {
|
|
474
|
-
|
|
518
|
+
const err2 = new AbortSignalJobError(message);
|
|
519
|
+
applyPersistedDiagnosticsToStack(err2, message);
|
|
520
|
+
return err2;
|
|
475
521
|
}
|
|
476
522
|
if (errorCode === "JobDisabledError") {
|
|
477
|
-
|
|
523
|
+
const err2 = new JobDisabledError(message);
|
|
524
|
+
applyPersistedDiagnosticsToStack(err2, message);
|
|
525
|
+
return err2;
|
|
478
526
|
}
|
|
479
|
-
|
|
527
|
+
const err = new JobError(message);
|
|
528
|
+
applyPersistedDiagnosticsToStack(err, message);
|
|
529
|
+
return err;
|
|
480
530
|
}
|
|
481
531
|
}
|
|
482
532
|
|
|
@@ -503,7 +553,14 @@ class NullLimiter {
|
|
|
503
553
|
|
|
504
554
|
// src/job/JobQueueWorker.ts
|
|
505
555
|
import { JobStatus as JobStatus3 } from "@workglow/storage";
|
|
506
|
-
import {
|
|
556
|
+
import {
|
|
557
|
+
EventEmitter as EventEmitter2,
|
|
558
|
+
getLogger,
|
|
559
|
+
getTelemetryProvider,
|
|
560
|
+
sleep,
|
|
561
|
+
SpanStatusCode,
|
|
562
|
+
uuid4
|
|
563
|
+
} from "@workglow/util";
|
|
507
564
|
class JobQueueWorker {
|
|
508
565
|
queueName;
|
|
509
566
|
workerId;
|
|
@@ -737,7 +794,7 @@ class JobQueueWorker {
|
|
|
737
794
|
await this.storage.complete(this.classToStorage(job));
|
|
738
795
|
this.events.emit("job_complete", job.id, output);
|
|
739
796
|
} catch (err) {
|
|
740
|
-
|
|
797
|
+
getLogger().error("completeJob errored:", { error: err });
|
|
741
798
|
} finally {
|
|
742
799
|
this.cleanupJob(job.id);
|
|
743
800
|
}
|
|
@@ -754,7 +811,7 @@ class JobQueueWorker {
|
|
|
754
811
|
await this.storage.complete(this.classToStorage(job));
|
|
755
812
|
this.events.emit("job_error", job.id, error.message, error.constructor.name);
|
|
756
813
|
} catch (err) {
|
|
757
|
-
|
|
814
|
+
getLogger().error("failJob errored:", { error: err });
|
|
758
815
|
} finally {
|
|
759
816
|
this.cleanupJob(job.id);
|
|
760
817
|
}
|
|
@@ -769,7 +826,7 @@ class JobQueueWorker {
|
|
|
769
826
|
await this.storage.complete(this.classToStorage(job));
|
|
770
827
|
this.events.emit("job_disabled", job.id);
|
|
771
828
|
} catch (err) {
|
|
772
|
-
|
|
829
|
+
getLogger().error("disableJob errored:", { error: err });
|
|
773
830
|
} finally {
|
|
774
831
|
this.cleanupJob(job.id);
|
|
775
832
|
}
|
|
@@ -786,7 +843,7 @@ class JobQueueWorker {
|
|
|
786
843
|
await this.storage.complete(this.classToStorage(job));
|
|
787
844
|
this.events.emit("job_retry", job.id, job.runAfter);
|
|
788
845
|
} catch (err) {
|
|
789
|
-
|
|
846
|
+
getLogger().error("rescheduleJob errored:", { error: err });
|
|
790
847
|
}
|
|
791
848
|
}
|
|
792
849
|
createAbortController(jobId) {
|
|
@@ -803,7 +860,7 @@ class JobQueueWorker {
|
|
|
803
860
|
async handleAbort(jobId) {
|
|
804
861
|
const job = await this.getJob(jobId);
|
|
805
862
|
if (!job) {
|
|
806
|
-
|
|
863
|
+
getLogger().error("handleAbort: job not found", { jobId });
|
|
807
864
|
return;
|
|
808
865
|
}
|
|
809
866
|
const error = new AbortSignalJobError("Job Aborted");
|
|
@@ -837,7 +894,7 @@ class JobQueueWorker {
|
|
|
837
894
|
return err;
|
|
838
895
|
}
|
|
839
896
|
if (err instanceof Error) {
|
|
840
|
-
return new PermanentJobError(err.message);
|
|
897
|
+
return new PermanentJobError(withJobErrorDiagnostics(err.message, err));
|
|
841
898
|
}
|
|
842
899
|
return new PermanentJobError(String(err));
|
|
843
900
|
}
|
|
@@ -1146,10 +1203,10 @@ class CompositeLimiter {
|
|
|
1146
1203
|
return true;
|
|
1147
1204
|
}
|
|
1148
1205
|
async recordJobStart() {
|
|
1149
|
-
this.limiters.
|
|
1206
|
+
await Promise.all(this.limiters.map((limiter) => limiter.recordJobStart()));
|
|
1150
1207
|
}
|
|
1151
1208
|
async recordJobCompletion() {
|
|
1152
|
-
this.limiters.
|
|
1209
|
+
await Promise.all(this.limiters.map((limiter) => limiter.recordJobCompletion()));
|
|
1153
1210
|
}
|
|
1154
1211
|
async getNextAvailableTime() {
|
|
1155
1212
|
let maxDate = new Date;
|
|
@@ -1167,7 +1224,7 @@ class CompositeLimiter {
|
|
|
1167
1224
|
}
|
|
1168
1225
|
}
|
|
1169
1226
|
async clear() {
|
|
1170
|
-
this.limiters.
|
|
1227
|
+
await Promise.all(this.limiters.map((limiter) => limiter.clear()));
|
|
1171
1228
|
}
|
|
1172
1229
|
}
|
|
1173
1230
|
|
|
@@ -1405,8 +1462,11 @@ class RateLimiter {
|
|
|
1405
1462
|
}
|
|
1406
1463
|
}
|
|
1407
1464
|
export {
|
|
1465
|
+
withJobErrorDiagnostics,
|
|
1408
1466
|
storageToClass,
|
|
1467
|
+
formatErrorChainForDiagnostics,
|
|
1409
1468
|
classToStorage,
|
|
1469
|
+
applyPersistedDiagnosticsToStack,
|
|
1410
1470
|
RetryableJobError,
|
|
1411
1471
|
RateLimiter,
|
|
1412
1472
|
PermanentJobError,
|
|
@@ -1421,6 +1481,7 @@ export {
|
|
|
1421
1481
|
JobDisabledError,
|
|
1422
1482
|
Job,
|
|
1423
1483
|
JOB_LIMITER,
|
|
1484
|
+
JOB_ERROR_DIAGNOSTICS_MARKER,
|
|
1424
1485
|
EvenlySpacedRateLimiter,
|
|
1425
1486
|
EVENLY_SPACED_JOB_RATE_LIMITER,
|
|
1426
1487
|
DelayLimiter,
|
|
@@ -1430,4 +1491,4 @@ export {
|
|
|
1430
1491
|
AbortSignalJobError
|
|
1431
1492
|
};
|
|
1432
1493
|
|
|
1433
|
-
//# debugId=
|
|
1494
|
+
//# debugId=9EA74A4E777F02B264756E2164756E21
|