flashq 0.2.1 → 0.3.1

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 (119) hide show
  1. package/dist/client/connection.d.ts +27 -69
  2. package/dist/client/connection.d.ts.map +1 -1
  3. package/dist/client/connection.js +291 -272
  4. package/dist/client/connection.js.map +1 -1
  5. package/dist/client/http/request.d.ts +24 -0
  6. package/dist/client/http/request.d.ts.map +1 -0
  7. package/dist/client/http/request.js +289 -0
  8. package/dist/client/http/request.js.map +1 -0
  9. package/dist/client/http/response.d.ts +9 -0
  10. package/dist/client/http/response.d.ts.map +1 -0
  11. package/dist/client/http/response.js +80 -0
  12. package/dist/client/http/response.js.map +1 -0
  13. package/dist/client/index.d.ts +68 -562
  14. package/dist/client/index.d.ts.map +1 -1
  15. package/dist/client/index.js +186 -638
  16. package/dist/client/index.js.map +1 -1
  17. package/dist/client/{advanced.d.ts → methods/advanced.d.ts} +1 -1
  18. package/dist/client/methods/advanced.d.ts.map +1 -0
  19. package/dist/client/methods/advanced.js.map +1 -0
  20. package/dist/client/{core.d.ts → methods/core.d.ts} +25 -2
  21. package/dist/client/methods/core.d.ts.map +1 -0
  22. package/dist/client/{core.js → methods/core.js} +106 -1
  23. package/dist/client/methods/core.js.map +1 -0
  24. package/dist/client/{cron.d.ts → methods/cron.d.ts} +1 -1
  25. package/dist/client/methods/cron.d.ts.map +1 -0
  26. package/dist/client/methods/cron.js.map +1 -0
  27. package/dist/client/{dlq.d.ts → methods/dlq.d.ts} +1 -1
  28. package/dist/client/methods/dlq.d.ts.map +1 -0
  29. package/dist/client/methods/dlq.js.map +1 -0
  30. package/dist/client/{flows.d.ts → methods/flows.d.ts} +1 -1
  31. package/dist/client/methods/flows.d.ts.map +1 -0
  32. package/dist/client/methods/flows.js.map +1 -0
  33. package/dist/client/{jobs.d.ts → methods/jobs.d.ts} +2 -16
  34. package/dist/client/methods/jobs.d.ts.map +1 -0
  35. package/dist/client/{jobs.js → methods/jobs.js} +1 -15
  36. package/dist/client/methods/jobs.js.map +1 -0
  37. package/dist/client/{metrics.d.ts → methods/metrics.d.ts} +1 -1
  38. package/dist/client/methods/metrics.d.ts.map +1 -0
  39. package/dist/client/methods/metrics.js.map +1 -0
  40. package/dist/client/{queue.d.ts → methods/queue.d.ts} +1 -1
  41. package/dist/client/methods/queue.d.ts.map +1 -0
  42. package/dist/client/methods/queue.js.map +1 -0
  43. package/dist/client/types.d.ts +10 -3
  44. package/dist/client/types.d.ts.map +1 -1
  45. package/dist/errors.d.ts +105 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +223 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/events/index.d.ts +24 -0
  50. package/dist/events/index.d.ts.map +1 -0
  51. package/dist/events/index.js +53 -0
  52. package/dist/events/index.js.map +1 -0
  53. package/dist/events/subscriber.d.ts +30 -0
  54. package/dist/events/subscriber.d.ts.map +1 -0
  55. package/dist/{events.js → events/subscriber.js} +51 -148
  56. package/dist/events/subscriber.js.map +1 -0
  57. package/dist/events/types.d.ts +38 -0
  58. package/dist/events/types.d.ts.map +1 -0
  59. package/dist/events/types.js +6 -0
  60. package/dist/events/types.js.map +1 -0
  61. package/dist/hooks.d.ts +166 -0
  62. package/dist/hooks.d.ts.map +1 -0
  63. package/dist/hooks.js +73 -0
  64. package/dist/hooks.js.map +1 -0
  65. package/dist/index.d.ts +9 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +36 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/queue.d.ts.map +1 -1
  70. package/dist/queue.js +9 -5
  71. package/dist/queue.js.map +1 -1
  72. package/dist/types.d.ts +53 -2
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/utils/logger.d.ts +53 -0
  75. package/dist/utils/logger.d.ts.map +1 -0
  76. package/dist/utils/logger.js +150 -0
  77. package/dist/utils/logger.js.map +1 -0
  78. package/dist/utils/retry.d.ts +70 -0
  79. package/dist/utils/retry.d.ts.map +1 -0
  80. package/dist/utils/retry.js +149 -0
  81. package/dist/utils/retry.js.map +1 -0
  82. package/dist/worker.d.ts +26 -5
  83. package/dist/worker.d.ts.map +1 -1
  84. package/dist/worker.js +157 -86
  85. package/dist/worker.js.map +1 -1
  86. package/package.json +11 -1
  87. package/dist/client/advanced.d.ts.map +0 -1
  88. package/dist/client/advanced.js.map +0 -1
  89. package/dist/client/core.d.ts.map +0 -1
  90. package/dist/client/core.js.map +0 -1
  91. package/dist/client/cron.d.ts.map +0 -1
  92. package/dist/client/cron.js.map +0 -1
  93. package/dist/client/dlq.d.ts.map +0 -1
  94. package/dist/client/dlq.js.map +0 -1
  95. package/dist/client/flows.d.ts.map +0 -1
  96. package/dist/client/flows.js.map +0 -1
  97. package/dist/client/jobs.d.ts.map +0 -1
  98. package/dist/client/jobs.js.map +0 -1
  99. package/dist/client/kv.d.ts +0 -63
  100. package/dist/client/kv.d.ts.map +0 -1
  101. package/dist/client/kv.js +0 -131
  102. package/dist/client/kv.js.map +0 -1
  103. package/dist/client/metrics.d.ts.map +0 -1
  104. package/dist/client/metrics.js.map +0 -1
  105. package/dist/client/pubsub.d.ts +0 -42
  106. package/dist/client/pubsub.d.ts.map +0 -1
  107. package/dist/client/pubsub.js +0 -92
  108. package/dist/client/pubsub.js.map +0 -1
  109. package/dist/client/queue.d.ts.map +0 -1
  110. package/dist/client/queue.js.map +0 -1
  111. package/dist/events.d.ts +0 -184
  112. package/dist/events.d.ts.map +0 -1
  113. package/dist/events.js.map +0 -1
  114. /package/dist/client/{advanced.js → methods/advanced.js} +0 -0
  115. /package/dist/client/{cron.js → methods/cron.js} +0 -0
  116. /package/dist/client/{dlq.js → methods/dlq.js} +0 -0
  117. /package/dist/client/{flows.js → methods/flows.js} +0 -0
  118. /package/dist/client/{metrics.js → methods/metrics.js} +0 -0
  119. /package/dist/client/{queue.js → methods/queue.js} +0 -0
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RetryPresets = void 0;
4
+ exports.isRetryable = isRetryable;
5
+ exports.calculateDelay = calculateDelay;
6
+ exports.withRetry = withRetry;
7
+ exports.retryable = retryable;
8
+ /**
9
+ * Retry utility for automatic retries on transient failures
10
+ */
11
+ const errors_1 = require("../errors");
12
+ const DEFAULT_OPTIONS = {
13
+ maxRetries: 3,
14
+ initialDelay: 100,
15
+ maxDelay: 5000,
16
+ backoffMultiplier: 2,
17
+ jitter: true,
18
+ };
19
+ /** Check if an error is retryable */
20
+ function isRetryable(error) {
21
+ // FlashQ errors have retryable flag
22
+ if (error instanceof errors_1.FlashQError) {
23
+ return error.retryable;
24
+ }
25
+ // Network errors are generally retryable
26
+ const message = error.message.toLowerCase();
27
+ const retryablePatterns = [
28
+ 'timeout',
29
+ 'econnrefused',
30
+ 'econnreset',
31
+ 'epipe',
32
+ 'enetunreach',
33
+ 'ehostunreach',
34
+ 'socket hang up',
35
+ 'network',
36
+ 'connection',
37
+ 'aborted',
38
+ ];
39
+ return retryablePatterns.some((pattern) => message.includes(pattern));
40
+ }
41
+ /** Calculate delay for next retry with exponential backoff */
42
+ function calculateDelay(attempt, options) {
43
+ const delay = Math.min(options.initialDelay * Math.pow(options.backoffMultiplier, attempt - 1), options.maxDelay);
44
+ if (options.jitter) {
45
+ // Add ±25% jitter
46
+ const jitterRange = delay * 0.25;
47
+ return delay + (Math.random() * jitterRange * 2 - jitterRange);
48
+ }
49
+ return delay;
50
+ }
51
+ /** Sleep for a given number of milliseconds */
52
+ function sleep(ms) {
53
+ return new Promise((resolve) => setTimeout(resolve, ms));
54
+ }
55
+ /**
56
+ * Execute a function with automatic retries on failure.
57
+ *
58
+ * @param fn - Function to execute
59
+ * @param options - Retry options
60
+ * @returns Result of the function
61
+ * @throws Last error after all retries exhausted
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const result = await withRetry(
66
+ * () => client.push('queue', data),
67
+ * { maxRetries: 3, onRetry: (err, attempt) => console.log(`Retry ${attempt}`) }
68
+ * );
69
+ * ```
70
+ */
71
+ async function withRetry(fn, options = {}) {
72
+ const opts = { ...DEFAULT_OPTIONS, ...options };
73
+ let lastError = null;
74
+ for (let attempt = 1; attempt <= opts.maxRetries + 1; attempt++) {
75
+ try {
76
+ return await fn();
77
+ }
78
+ catch (error) {
79
+ lastError = error instanceof Error ? error : new Error(String(error));
80
+ // Check if we should retry
81
+ const shouldRetry = attempt <= opts.maxRetries &&
82
+ (opts.shouldRetry ? opts.shouldRetry(lastError, attempt) : isRetryable(lastError));
83
+ // Check retryOn filter
84
+ if (shouldRetry && opts.retryOn && lastError instanceof errors_1.FlashQError) {
85
+ if (!opts.retryOn.includes(lastError.code)) {
86
+ throw lastError;
87
+ }
88
+ }
89
+ if (!shouldRetry) {
90
+ throw lastError;
91
+ }
92
+ // Calculate delay and wait
93
+ const delay = calculateDelay(attempt, opts);
94
+ // Notify callback
95
+ if (opts.onRetry) {
96
+ opts.onRetry(lastError, attempt, delay);
97
+ }
98
+ await sleep(delay);
99
+ }
100
+ }
101
+ throw lastError;
102
+ }
103
+ /**
104
+ * Create a retryable version of a function.
105
+ *
106
+ * @param fn - Function to wrap
107
+ * @param options - Retry options
108
+ * @returns Wrapped function with retry logic
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const retryablePush = retryable(
113
+ * (queue: string, data: any) => client.push(queue, data),
114
+ * { maxRetries: 3 }
115
+ * );
116
+ * await retryablePush('emails', { to: 'user@example.com' });
117
+ * ```
118
+ */
119
+ function retryable(fn, options = {}) {
120
+ return (...args) => withRetry(() => fn(...args), options);
121
+ }
122
+ /**
123
+ * Retry configuration presets
124
+ */
125
+ exports.RetryPresets = {
126
+ /** Quick retries for interactive operations */
127
+ fast: {
128
+ maxRetries: 2,
129
+ initialDelay: 50,
130
+ maxDelay: 500,
131
+ },
132
+ /** Standard retries for most operations */
133
+ standard: {
134
+ maxRetries: 3,
135
+ initialDelay: 100,
136
+ maxDelay: 5000,
137
+ },
138
+ /** Aggressive retries for critical operations */
139
+ aggressive: {
140
+ maxRetries: 5,
141
+ initialDelay: 200,
142
+ maxDelay: 30000,
143
+ },
144
+ /** No retries */
145
+ none: {
146
+ maxRetries: 0,
147
+ },
148
+ };
149
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
package/dist/worker.d.ts CHANGED
@@ -1,8 +1,15 @@
1
1
  import { EventEmitter } from 'events';
2
2
  import type { JobProcessor, WorkerOptions, ClientOptions } from './types';
3
- export interface BullMQWorkerOptions extends WorkerOptions, ClientOptions {
3
+ import { type WorkerHooks } from './hooks';
4
+ export interface BullMQWorkerOptions extends Omit<ClientOptions, 'hooks'>, WorkerOptions {
4
5
  /** Auto-start worker (BullMQ-compatible, default: true) */
5
6
  autorun?: boolean;
7
+ /** Enable debug logging (default: false) */
8
+ debug?: boolean;
9
+ /** Graceful shutdown timeout in ms (default: 30000). Use 0 for infinite wait. */
10
+ closeTimeout?: number;
11
+ /** Worker hooks for observability */
12
+ workerHooks?: WorkerHooks;
6
13
  }
7
14
  type WorkerState = 'idle' | 'starting' | 'running' | 'stopping' | 'stopped';
8
15
  /**
@@ -37,9 +44,11 @@ export declare class Worker<T = unknown, R = unknown> extends EventEmitter {
37
44
  private processing;
38
45
  private jobsProcessed;
39
46
  private workers;
40
- private heartbeatTimer?;
41
47
  private startPromise;
42
48
  private stopPromise;
49
+ private abortController;
50
+ private workerHooks?;
51
+ private log;
43
52
  constructor(queues: string | string[], processor: JobProcessor<T, R>, options?: BullMQWorkerOptions);
44
53
  /**
45
54
  * Start processing jobs
@@ -48,13 +57,21 @@ export declare class Worker<T = unknown, R = unknown> extends EventEmitter {
48
57
  private doStart;
49
58
  /**
50
59
  * Close the worker (BullMQ-compatible alias for stop)
60
+ * @param force If true, don't wait for jobs to complete (default: false)
51
61
  */
52
- close(): Promise<void>;
62
+ close(force?: boolean): Promise<void>;
53
63
  /**
54
64
  * Stop processing jobs (graceful shutdown)
65
+ * @param force If true, don't wait for jobs to complete (default: false)
55
66
  */
56
- stop(): Promise<void>;
67
+ stop(force?: boolean): Promise<void>;
57
68
  private doStop;
69
+ /**
70
+ * Wait for all currently processing jobs to complete
71
+ * @param timeout Max wait time in ms (default: uses closeTimeout option)
72
+ * @returns true if all jobs completed, false if timeout
73
+ */
74
+ waitForJobs(timeout?: number): Promise<boolean>;
58
75
  /**
59
76
  * Check if worker is running
60
77
  */
@@ -75,12 +92,16 @@ export declare class Worker<T = unknown, R = unknown> extends EventEmitter {
75
92
  * Batch worker loop - pulls and processes jobs in batches for maximum throughput
76
93
  */
77
94
  private batchWorkerLoop;
95
+ /**
96
+ * Process a batch of jobs - always completes even during shutdown
97
+ */
98
+ private processJobBatch;
78
99
  private processJob;
79
- private startHeartbeat;
80
100
  private sleep;
81
101
  /**
82
102
  * Update progress for the current job
83
103
  * (Use this within your processor function)
104
+ * @throws Error if worker is not running
84
105
  */
85
106
  updateProgress(jobId: number, progress: number, message?: string): Promise<void>;
86
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAEV,YAAY,EACZ,aAAa,EACb,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,mBAAoB,SAAQ,aAAa,EAAE,aAAa;IACvE,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,YAAY;IAChE,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,WAAW,CAA8B;gBAG/C,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,EACzB,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAC7B,OAAO,GAAE,mBAAwB;IA4BnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAyBd,OAAO;IAoBrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YA2Bb,MAAM;IAoBpB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;YACW,eAAe;YAuFf,UAAU;IAIxB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvF;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAO,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa;IACtF,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,YAAY;IAChE,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAIb;IACF,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC,OAAO,CAAC,GAAG;gBAYT,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,EACzB,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAC7B,OAAO,GAAE,mBAAwB;IA+BnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAyBd,OAAO;IAoBrB;;;OAGG;IACG,KAAK,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC;;;OAGG;IACG,IAAI,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YA2B1B,MAAM;IAmDpB;;;;OAIG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBrD;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;YACW,eAAe;IAuC7B;;OAEG;YACW,eAAe;YAwEf,UAAU;IAIxB,OAAO,CAAC,KAAK;IAIb;;;;OAIG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvF;AAED,eAAe,MAAM,CAAC"}
package/dist/worker.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Worker = void 0;
4
4
  const events_1 = require("events");
5
5
  const client_1 = require("./client");
6
+ const hooks_1 = require("./hooks");
6
7
  /**
7
8
  * FlashQ Worker (BullMQ-compatible)
8
9
  *
@@ -35,9 +36,22 @@ class Worker extends events_1.EventEmitter {
35
36
  processing = 0;
36
37
  jobsProcessed = 0;
37
38
  workers = [];
38
- heartbeatTimer;
39
39
  startPromise = null;
40
40
  stopPromise = null;
41
+ abortController = null;
42
+ workerHooks;
43
+ log(message, data) {
44
+ if (!this.options.debug)
45
+ return;
46
+ const timestamp = new Date().toISOString();
47
+ const prefix = `[flashQ Worker ${this.options.id} ${timestamp}]`;
48
+ if (data !== undefined) {
49
+ console.log(`${prefix} ${message}`, data);
50
+ }
51
+ else {
52
+ console.log(`${prefix} ${message}`);
53
+ }
54
+ }
41
55
  constructor(queues, processor, options = {}) {
42
56
  super();
43
57
  this.queues = Array.isArray(queues) ? queues : [queues];
@@ -46,10 +60,12 @@ class Worker extends events_1.EventEmitter {
46
60
  id: options.id ?? `worker-${Date.now()}-${Math.random().toString(36).slice(2)}`,
47
61
  concurrency: options.concurrency ?? 10,
48
62
  batchSize: options.batchSize ?? 100,
49
- heartbeatInterval: options.heartbeatInterval ?? 1000,
50
63
  autoAck: options.autoAck ?? true,
51
- autorun: options.autorun ?? true, // BullMQ-compatible: auto-start
64
+ autorun: options.autorun ?? true,
65
+ debug: options.debug ?? false,
66
+ closeTimeout: options.closeTimeout ?? 30000,
52
67
  };
68
+ this.workerHooks = options.workerHooks;
53
69
  this.clientOptions = {
54
70
  host: options.host,
55
71
  port: options.port,
@@ -87,16 +103,17 @@ class Worker extends events_1.EventEmitter {
87
103
  }
88
104
  }
89
105
  async doStart() {
106
+ this.log('Starting worker', { queues: this.queues, concurrency: this.options.concurrency });
90
107
  // Create a separate client for each worker (TCP pull is blocking)
91
108
  for (let i = 0; i < this.options.concurrency; i++) {
92
- const client = new client_1.FlashQ(this.clientOptions);
109
+ const client = new client_1.FlashQ({ ...this.clientOptions, debug: this.options.debug });
93
110
  await client.connect();
94
111
  this.clients.push(client);
112
+ this.log(`Client ${i} connected`);
95
113
  }
96
114
  this.state = 'running';
97
115
  this.emit('ready');
98
- // Start heartbeat
99
- this.startHeartbeat();
116
+ this.log('Worker ready');
100
117
  // Start worker loops (each with its own client)
101
118
  for (let i = 0; i < this.options.concurrency; i++) {
102
119
  this.workers.push(this.batchWorkerLoop(i, this.clients[i]));
@@ -104,14 +121,16 @@ class Worker extends events_1.EventEmitter {
104
121
  }
105
122
  /**
106
123
  * Close the worker (BullMQ-compatible alias for stop)
124
+ * @param force If true, don't wait for jobs to complete (default: false)
107
125
  */
108
- async close() {
109
- return this.stop();
126
+ async close(force = false) {
127
+ return this.stop(force);
110
128
  }
111
129
  /**
112
130
  * Stop processing jobs (graceful shutdown)
131
+ * @param force If true, don't wait for jobs to complete (default: false)
113
132
  */
114
- async stop() {
133
+ async stop(force = false) {
115
134
  // Wait for starting to complete first
116
135
  if (this.state === 'starting' && this.startPromise) {
117
136
  await this.startPromise;
@@ -126,7 +145,7 @@ class Worker extends events_1.EventEmitter {
126
145
  }
127
146
  this.state = 'stopping';
128
147
  this.emit('stopping');
129
- this.stopPromise = this.doStop();
148
+ this.stopPromise = this.doStop(force);
130
149
  try {
131
150
  await this.stopPromise;
132
151
  }
@@ -134,21 +153,66 @@ class Worker extends events_1.EventEmitter {
134
153
  this.stopPromise = null;
135
154
  }
136
155
  }
137
- async doStop() {
138
- // Stop heartbeat
139
- if (this.heartbeatTimer) {
140
- clearInterval(this.heartbeatTimer);
141
- this.heartbeatTimer = undefined;
156
+ async doStop(force) {
157
+ this.log('Stopping worker', { processing: this.processing, force });
158
+ if (force) {
159
+ // Force close - abort immediately
160
+ this.abortController?.abort();
161
+ this.workers = [];
162
+ }
163
+ else {
164
+ // Graceful shutdown - wait for jobs with timeout
165
+ const timeout = this.options.closeTimeout;
166
+ if (timeout > 0) {
167
+ const timeoutPromise = new Promise((resolve) => setTimeout(() => resolve('timeout'), timeout));
168
+ const result = await Promise.race([
169
+ Promise.all(this.workers).then(() => 'done'),
170
+ timeoutPromise,
171
+ ]);
172
+ if (result === 'timeout') {
173
+ this.log('Graceful shutdown timeout reached', { timeout, processing: this.processing });
174
+ this.emit('error', new Error(`Shutdown timeout after ${timeout}ms with ${this.processing} jobs still processing`));
175
+ }
176
+ }
177
+ else {
178
+ // Wait indefinitely
179
+ await Promise.all(this.workers);
180
+ }
142
181
  }
143
- // Wait for current jobs to finish
144
- await Promise.all(this.workers);
145
182
  this.workers = [];
183
+ this.log('All worker loops stopped');
146
184
  // Close all clients
147
185
  const clientsToClose = [...this.clients];
148
186
  this.clients = [];
149
187
  await Promise.all(clientsToClose.map((c) => c.close()));
188
+ this.log('All clients closed');
150
189
  this.state = 'stopped';
151
190
  this.emit('stopped');
191
+ this.emit('drained');
192
+ this.log('Worker stopped', { totalProcessed: this.jobsProcessed });
193
+ }
194
+ /**
195
+ * Wait for all currently processing jobs to complete
196
+ * @param timeout Max wait time in ms (default: uses closeTimeout option)
197
+ * @returns true if all jobs completed, false if timeout
198
+ */
199
+ async waitForJobs(timeout) {
200
+ if (this.processing === 0)
201
+ return true;
202
+ const waitTimeout = timeout ?? this.options.closeTimeout;
203
+ return new Promise((resolve) => {
204
+ const checkInterval = setInterval(() => {
205
+ if (this.processing === 0) {
206
+ clearInterval(checkInterval);
207
+ clearTimeout(timer);
208
+ resolve(true);
209
+ }
210
+ }, 50);
211
+ const timer = setTimeout(() => {
212
+ clearInterval(checkInterval);
213
+ resolve(false);
214
+ }, waitTimeout);
215
+ });
152
216
  }
153
217
  /**
154
218
  * Check if worker is running
@@ -181,6 +245,7 @@ class Worker extends events_1.EventEmitter {
181
245
  const batchSize = this.options.batchSize;
182
246
  while (this.state === 'running') {
183
247
  for (const queue of this.queues) {
248
+ // Check before pulling - don't start new work if stopping
184
249
  if (this.state !== 'running')
185
250
  break;
186
251
  try {
@@ -190,51 +255,9 @@ class Worker extends events_1.EventEmitter {
190
255
  if (!jobs || jobs.length === 0) {
191
256
  continue;
192
257
  }
193
- this.processing += jobs.length;
194
- // Track successful and failed jobs
195
- const successJobs = [];
196
- const failedJobs = [];
197
- // Process all jobs in parallel
198
- await Promise.all(jobs.map(async (job) => {
199
- this.emit('active', job, workerId);
200
- try {
201
- const result = await this.processJob(job);
202
- successJobs.push({ job, result });
203
- }
204
- catch (error) {
205
- const errorMessage = error instanceof Error ? error.message : String(error);
206
- failedJobs.push({ job, error: errorMessage });
207
- }
208
- }));
209
- // Ack successful jobs with results - THEN emit completed
210
- if (this.options.autoAck && successJobs.length > 0) {
211
- // Use individual ack() to preserve results for finished() promise
212
- await Promise.all(successJobs.map(async ({ job, result }) => {
213
- await client.ack(job.id, result);
214
- this.jobsProcessed++;
215
- this.emit('completed', job, result, workerId);
216
- }));
217
- }
218
- else if (!this.options.autoAck && successJobs.length > 0) {
219
- // If autoAck is disabled, emit completed after processing
220
- for (const { job, result } of successJobs) {
221
- this.jobsProcessed++;
222
- this.emit('completed', job, result, workerId);
223
- }
224
- }
225
- // Fail individual jobs that errored - THEN emit failed
226
- if (this.options.autoAck && failedJobs.length > 0) {
227
- await Promise.all(failedJobs.map(async ({ job, error }) => {
228
- await client.fail(job.id, error);
229
- this.emit('failed', job, new Error(error), workerId);
230
- }));
231
- }
232
- else if (!this.options.autoAck && failedJobs.length > 0) {
233
- for (const { job, error } of failedJobs) {
234
- this.emit('failed', job, new Error(error), workerId);
235
- }
236
- }
237
- this.processing -= jobs.length;
258
+ // IMPORTANT: Always process pulled jobs even if state changed during pullBatch
259
+ // This ensures graceful shutdown completes in-flight work
260
+ await this.processJobBatch(workerId, client, jobs);
238
261
  }
239
262
  catch (error) {
240
263
  // Timeout is expected when no jobs available - not an error
@@ -251,32 +274,70 @@ class Worker extends events_1.EventEmitter {
251
274
  }
252
275
  }
253
276
  }
277
+ this.log(`Worker loop ${workerId} exited`, { state: this.state });
254
278
  }
255
- async processJob(job) {
256
- return this.processor(job);
257
- }
258
- startHeartbeat() {
259
- const sendHeartbeat = async () => {
260
- if (this.state !== 'running')
261
- return;
279
+ /**
280
+ * Process a batch of jobs - always completes even during shutdown
281
+ */
282
+ async processJobBatch(workerId, client, jobs) {
283
+ this.processing += jobs.length;
284
+ // Track successful and failed jobs
285
+ const successJobs = [];
286
+ const failedJobs = [];
287
+ // Process all jobs in parallel
288
+ await Promise.all(jobs.map(async (job) => {
289
+ this.emit('active', job, workerId);
290
+ // Create hook context for this job
291
+ const hookCtx = (0, hooks_1.createHookContext)({
292
+ job,
293
+ workerId,
294
+ });
295
+ await (0, hooks_1.callHook)(this.workerHooks?.onProcess, hookCtx);
262
296
  try {
263
- const url = `http://${this.clientOptions.host ?? 'localhost'}:${this.clientOptions.httpPort ?? 6790}/workers/${this.options.id}/heartbeat`;
264
- await fetch(url, {
265
- method: 'POST',
266
- headers: { 'Content-Type': 'application/json' },
267
- body: JSON.stringify({
268
- queues: this.queues,
269
- concurrency: this.options.concurrency,
270
- jobs_processed: this.jobsProcessed,
271
- }),
272
- });
297
+ const result = await this.processJob(job);
298
+ hookCtx.result = result;
299
+ await (0, hooks_1.callHook)(this.workerHooks?.onProcessComplete, hookCtx);
300
+ successJobs.push({ job, result });
273
301
  }
274
- catch {
275
- // Ignore heartbeat errors (HTTP may not be available)
302
+ catch (error) {
303
+ const err = error instanceof Error ? error : new Error(String(error));
304
+ hookCtx.error = err;
305
+ await (0, hooks_1.callErrorHook)(this.workerHooks?.onProcessError, hookCtx, err);
306
+ failedJobs.push({ job, error: err.message });
276
307
  }
277
- };
278
- this.heartbeatTimer = setInterval(sendHeartbeat, this.options.heartbeatInterval);
279
- sendHeartbeat();
308
+ }));
309
+ // Ack successful jobs with results - THEN emit completed
310
+ if (this.options.autoAck && successJobs.length > 0) {
311
+ // Use individual ack() to preserve results for finished() promise
312
+ await Promise.all(successJobs.map(async ({ job, result }) => {
313
+ await client.ack(job.id, result);
314
+ this.jobsProcessed++;
315
+ this.emit('completed', job, result, workerId);
316
+ }));
317
+ }
318
+ else if (!this.options.autoAck && successJobs.length > 0) {
319
+ // If autoAck is disabled, emit completed after processing
320
+ for (const { job, result } of successJobs) {
321
+ this.jobsProcessed++;
322
+ this.emit('completed', job, result, workerId);
323
+ }
324
+ }
325
+ // Fail individual jobs that errored - THEN emit failed
326
+ if (this.options.autoAck && failedJobs.length > 0) {
327
+ await Promise.all(failedJobs.map(async ({ job, error }) => {
328
+ await client.fail(job.id, error);
329
+ this.emit('failed', job, new Error(error), workerId);
330
+ }));
331
+ }
332
+ else if (!this.options.autoAck && failedJobs.length > 0) {
333
+ for (const { job, error } of failedJobs) {
334
+ this.emit('failed', job, new Error(error), workerId);
335
+ }
336
+ }
337
+ this.processing -= jobs.length;
338
+ }
339
+ async processJob(job) {
340
+ return this.processor(job);
280
341
  }
281
342
  sleep(ms) {
282
343
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -284,11 +345,21 @@ class Worker extends events_1.EventEmitter {
284
345
  /**
285
346
  * Update progress for the current job
286
347
  * (Use this within your processor function)
348
+ * @throws Error if worker is not running
287
349
  */
288
350
  async updateProgress(jobId, progress, message) {
289
- if (this.clients.length > 0) {
290
- await this.clients[0].progress(jobId, progress, message);
351
+ if (this.state !== 'running') {
352
+ const error = new Error(`Cannot update progress: worker is ${this.state}`);
353
+ this.log('updateProgress failed', { jobId, state: this.state });
354
+ throw error;
355
+ }
356
+ if (this.clients.length === 0) {
357
+ const error = new Error('Cannot update progress: no active clients');
358
+ this.log('updateProgress failed', { jobId, reason: 'no clients' });
359
+ throw error;
291
360
  }
361
+ await this.clients[0].progress(jobId, progress, message);
362
+ this.log('Progress updated', { jobId, progress, message });
292
363
  }
293
364
  }
294
365
  exports.Worker = Worker;
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flashq",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Official TypeScript SDK for flashQ - High-Performance Job Queue (BullMQ-compatible API)",
5
5
  "author": "Egeo Minotti",
6
6
  "license": "MIT",
@@ -32,6 +32,10 @@
32
32
  "build": "tsc",
33
33
  "typecheck": "tsc --noEmit",
34
34
  "test": "bun test",
35
+ "lint": "eslint src tests",
36
+ "lint:fix": "eslint src tests --fix",
37
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
38
+ "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
35
39
  "clean": "rm -rf dist",
36
40
  "prepublishOnly": "npm run clean && npm run build"
37
41
  },
@@ -60,6 +64,12 @@
60
64
  "@msgpack/msgpack": "^3.0.0"
61
65
  },
62
66
  "devDependencies": {
67
+ "@eslint/js": "^9.39.2",
68
+ "@typescript-eslint/eslint-plugin": "^8.53.1",
69
+ "@typescript-eslint/parser": "^8.53.1",
70
+ "eslint": "^9.39.2",
71
+ "eslint-config-prettier": "^10.1.8",
72
+ "prettier": "^3.8.1",
63
73
  "typescript": "^5.0.0"
64
74
  },
65
75
  "peerDependencies": {