@workglow/job-queue 0.1.1 → 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/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
- return new PermanentJobError(message);
508
+ const err2 = new PermanentJobError(message);
509
+ applyPersistedDiagnosticsToStack(err2, message);
510
+ return err2;
469
511
  }
470
512
  if (errorCode === "RetryableJobError") {
471
- return new RetryableJobError(message);
513
+ const err2 = new RetryableJobError(message);
514
+ applyPersistedDiagnosticsToStack(err2, message);
515
+ return err2;
472
516
  }
473
517
  if (errorCode === "AbortSignalJobError") {
474
- return new AbortSignalJobError(message);
518
+ const err2 = new AbortSignalJobError(message);
519
+ applyPersistedDiagnosticsToStack(err2, message);
520
+ return err2;
475
521
  }
476
522
  if (errorCode === "JobDisabledError") {
477
- return new JobDisabledError(message);
523
+ const err2 = new JobDisabledError(message);
524
+ applyPersistedDiagnosticsToStack(err2, message);
525
+ return err2;
478
526
  }
479
- return new JobError(message);
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 { EventEmitter as EventEmitter2, getTelemetryProvider, sleep, SpanStatusCode, uuid4 } from "@workglow/util";
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
- console.error("completeJob errored:", err);
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
- console.error("failJob errored:", err);
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
- console.error("disableJob errored:", err);
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
- console.error("rescheduleJob errored:", err);
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
- console.error("handleAbort: job not found", jobId);
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.forEach((limiter) => limiter.recordJobStart());
1206
+ await Promise.all(this.limiters.map((limiter) => limiter.recordJobStart()));
1150
1207
  }
1151
1208
  async recordJobCompletion() {
1152
- this.limiters.forEach((limiter) => limiter.recordJobCompletion());
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.forEach((limiter) => limiter.clear());
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=9CBA07AF2D8BC8F364756E2164756E21
1494
+ //# debugId=9EA74A4E777F02B264756E2164756E21