@boopkit/cap-background-jobs 0.2.2 → 0.2.4

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.
@@ -0,0 +1,3 @@
1
+ /** @boopkit/cap-background-jobs — package exports. */
2
+ export { default as MessageQueueService } from './message-queue.service';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /** @boopkit/cap-background-jobs — package exports. */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MessageQueueService = void 0;
8
+ var message_queue_service_1 = require("./message-queue.service");
9
+ Object.defineProperty(exports, "MessageQueueService", { enumerable: true, get: function () { return __importDefault(message_queue_service_1).default; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,sDAAsD;;;;;;AAEtD,iEAAyE;AAAhE,6IAAA,OAAO,OAAuB"}
@@ -0,0 +1,47 @@
1
+ /** @boopkit/cap-background-jobs — RabbitMQ message queue service. */
2
+ declare const MessageQueueService: {
3
+ name: string;
4
+ init: typeof init;
5
+ publish: typeof publish;
6
+ listen: typeof listen;
7
+ close: typeof close;
8
+ };
9
+ export default MessageQueueService;
10
+ /**
11
+ * Validate that CLOUDAMQP_URL is set. Does NOT open a connection —
12
+ * publish connection is lazy (first publish call), listener connections
13
+ * are created at listen() time.
14
+ */
15
+ declare function init(): void;
16
+ /**
17
+ * Publish a message to the given queue.
18
+ * Lazy-initializes a persistent connection on first call, reuses it
19
+ * across subsequent calls. Returns true on success, false on failure.
20
+ */
21
+ declare function publish(queue: string, payload: unknown): Promise<boolean>;
22
+ /** Options for listen(). */
23
+ interface ListenOpts {
24
+ /** When true, handler receives guarded ack/nack functions instead of returning boolean. */
25
+ manualAck?: boolean;
26
+ /** Channel prefetch count — limits concurrent message delivery for backpressure. */
27
+ prefetch?: number;
28
+ }
29
+ /**
30
+ * Listen on a queue with auto-ACK or manual-ACK semantics.
31
+ *
32
+ * Asserts full queue topology on registration:
33
+ * - Main queue: `{prefix}/{name}`
34
+ * - Retry queue: `{prefix}/{name}.retry` (TTL redelivery to main)
35
+ * - DLQ: `{prefix}/{name}.failed` (dead-letter exchange)
36
+ *
37
+ * **Auto-ACK (default):** Handler returns true → ACK, false → retry with backoff,
38
+ * throws → NACK to DLQ after max retries.
39
+ *
40
+ * **Manual-ACK (opts.manualAck = true):** Handler receives guarded ack()/nack()
41
+ * functions. First call wins — subsequent calls are no-ops. If handler resolves
42
+ * or throws without settling → retry/DLQ after max retries.
43
+ */
44
+ declare function listen(queue: string, handler: (...args: any[]) => Promise<any>, opts?: ListenOpts): Promise<void>;
45
+ /** Close all tracked connections (publish + listeners). */
46
+ declare function close(): Promise<void>;
47
+ //# sourceMappingURL=message-queue.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-queue.service.d.ts","sourceRoot":"","sources":["../src/message-queue.service.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAmBrE,QAAA,MAAM,mBAAmB;;;;;;CAMxB,CAAC;AAEF,eAAe,mBAAmB,CAAC;AAEnC;;;;GAIG;AACH,iBAAS,IAAI,IAAI,IAAI,CAQpB;AAED;;;;GAIG;AACH,iBAAe,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBxE;AAED,4BAA4B;AAC5B,UAAU,UAAU;IAClB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AAEH,iBAAe,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EhH;AAED,2DAA2D;AAC3D,iBAAe,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBpC"}
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ /** @boopkit/cap-background-jobs — RabbitMQ message queue service. */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const amqplib_1 = __importDefault(require("amqplib"));
8
+ const BACKOFF_BASE_MS = 4000;
9
+ const BACKOFF_MAX_MS = 60000;
10
+ /** Read env lazily — package imports run before dotenv/app boot. */
11
+ function getQueuePrefix() { return process.env.QUEUE_PREFIX ?? ''; }
12
+ function getMaxRetries() { return parseInt(process.env.MAX_MESSAGE_RETRIES ?? '5', 10); }
13
+ /** All open connections tracked for shutdown cleanup. */
14
+ const connections = [];
15
+ /** Lazy-initialized publish connection and channel. */
16
+ let publishConnection = null;
17
+ let publishChannel = null;
18
+ const MessageQueueService = {
19
+ name: 'message-queue',
20
+ init,
21
+ publish,
22
+ listen,
23
+ close,
24
+ };
25
+ exports.default = MessageQueueService;
26
+ /**
27
+ * Validate that CLOUDAMQP_URL is set. Does NOT open a connection —
28
+ * publish connection is lazy (first publish call), listener connections
29
+ * are created at listen() time.
30
+ */
31
+ function init() {
32
+ if (!process.env.CLOUDAMQP_URL) {
33
+ throw new Error('E: CLOUDAMQP_URL is not set. ' +
34
+ 'R: The message queue service requires a CloudAMQP connection URL. ' +
35
+ 'R: Set CLOUDAMQP_URL in your environment (e.g. .env file).');
36
+ }
37
+ }
38
+ /**
39
+ * Publish a message to the given queue.
40
+ * Lazy-initializes a persistent connection on first call, reuses it
41
+ * across subsequent calls. Returns true on success, false on failure.
42
+ */
43
+ async function publish(queue, payload) {
44
+ const queueName = prefixedName(queue);
45
+ try {
46
+ const channel = await getPublishChannel();
47
+ await channel.assertQueue(queueName, { durable: true });
48
+ const body = Buffer.from(JSON.stringify(payload));
49
+ const ok = channel.sendToQueue(queueName, body, {
50
+ persistent: true,
51
+ messageId: crypto.randomUUID(),
52
+ });
53
+ if (!ok) {
54
+ // Channel buffer full — wait for drain
55
+ await new Promise((resolve) => channel.once('drain', resolve));
56
+ }
57
+ return true;
58
+ }
59
+ catch (err) {
60
+ console.error(`[message-queue] publish error on "${queue}":`, err);
61
+ resetPublishConnection();
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Listen on a queue with auto-ACK or manual-ACK semantics.
67
+ *
68
+ * Asserts full queue topology on registration:
69
+ * - Main queue: `{prefix}/{name}`
70
+ * - Retry queue: `{prefix}/{name}.retry` (TTL redelivery to main)
71
+ * - DLQ: `{prefix}/{name}.failed` (dead-letter exchange)
72
+ *
73
+ * **Auto-ACK (default):** Handler returns true → ACK, false → retry with backoff,
74
+ * throws → NACK to DLQ after max retries.
75
+ *
76
+ * **Manual-ACK (opts.manualAck = true):** Handler receives guarded ack()/nack()
77
+ * functions. First call wins — subsequent calls are no-ops. If handler resolves
78
+ * or throws without settling → retry/DLQ after max retries.
79
+ */
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ async function listen(queue, handler, opts) {
82
+ const connection = await amqplib_1.default.connect(process.env.CLOUDAMQP_URL);
83
+ connections.push(connection);
84
+ const channel = await connection.createChannel();
85
+ const { mainQueue, retryQueue, failedQueue } = await assertTopology(channel, queue);
86
+ if (opts?.prefetch != null) {
87
+ await channel.prefetch(opts.prefetch);
88
+ }
89
+ await channel.consume(mainQueue, async (raw) => {
90
+ if (!raw)
91
+ return;
92
+ const retryCount = getRetryCount(raw);
93
+ let parsed;
94
+ try {
95
+ parsed = JSON.parse(raw.content.toString());
96
+ }
97
+ catch {
98
+ // Poison message — ACK to prevent infinite redelivery
99
+ console.error(`[message-queue] unparseable message on "${queue}", sending to DLQ`);
100
+ channel.nack(raw, false, false);
101
+ return;
102
+ }
103
+ if (opts?.manualAck) {
104
+ // Manual-ACK: handler receives guarded ack/nack
105
+ let settled = false;
106
+ const guardedAck = () => {
107
+ if (settled) {
108
+ console.warn(`[message-queue] duplicate ack on "${queue}" — ignored`);
109
+ return;
110
+ }
111
+ settled = true;
112
+ channel.ack(raw);
113
+ };
114
+ const guardedNack = async () => {
115
+ if (settled) {
116
+ console.warn(`[message-queue] duplicate nack on "${queue}" — ignored`);
117
+ return;
118
+ }
119
+ settled = true;
120
+ await retryOrDLQ(channel, raw, retryCount, retryQueue, failedQueue);
121
+ };
122
+ try {
123
+ await handler(parsed, guardedAck, guardedNack);
124
+ if (!settled) {
125
+ console.warn(`[message-queue] handler resolved without settling on "${queue}" — treating as failure`);
126
+ await retryOrDLQ(channel, raw, retryCount, retryQueue, failedQueue);
127
+ }
128
+ }
129
+ catch (err) {
130
+ console.error(`[message-queue] handler threw on "${queue}":`, err);
131
+ if (!settled) {
132
+ await retryOrDLQ(channel, raw, retryCount, retryQueue, failedQueue);
133
+ }
134
+ }
135
+ }
136
+ else {
137
+ // Auto-ACK: handler returns boolean
138
+ try {
139
+ const ok = await handler(parsed);
140
+ if (ok) {
141
+ channel.ack(raw);
142
+ }
143
+ else {
144
+ await retryOrDLQ(channel, raw, retryCount, retryQueue, failedQueue);
145
+ }
146
+ }
147
+ catch (err) {
148
+ console.error(`[message-queue] handler threw on "${queue}":`, err);
149
+ await retryOrDLQ(channel, raw, retryCount, retryQueue, failedQueue);
150
+ }
151
+ }
152
+ }, { noAck: false });
153
+ }
154
+ /** Close all tracked connections (publish + listeners). */
155
+ async function close() {
156
+ // Close the publish connection explicitly (resetPublishConnection is fire-and-forget)
157
+ if (publishConnection) {
158
+ const conn = publishConnection;
159
+ publishConnection = null;
160
+ publishChannel = null;
161
+ const idx = connections.indexOf(conn);
162
+ if (idx !== -1)
163
+ connections.splice(idx, 1);
164
+ try {
165
+ await conn.close();
166
+ }
167
+ catch {
168
+ // Already closed — ignore
169
+ }
170
+ }
171
+ const closing = connections.map(async (conn) => {
172
+ try {
173
+ await conn.close();
174
+ }
175
+ catch {
176
+ // Already closed — ignore
177
+ }
178
+ });
179
+ await Promise.all(closing);
180
+ connections.length = 0;
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // Internal helpers
184
+ // ---------------------------------------------------------------------------
185
+ function prefixedName(name) {
186
+ const prefix = getQueuePrefix();
187
+ return prefix ? `${prefix}/${name}` : name;
188
+ }
189
+ /** Lazy-create or return the existing publish channel. */
190
+ async function getPublishChannel() {
191
+ if (publishChannel)
192
+ return publishChannel;
193
+ const conn = await amqplib_1.default.connect(process.env.CLOUDAMQP_URL);
194
+ connections.push(conn);
195
+ publishConnection = conn;
196
+ conn.on('error', () => resetPublishConnection());
197
+ conn.on('close', () => resetPublishConnection());
198
+ publishChannel = await conn.createChannel();
199
+ return publishChannel;
200
+ }
201
+ /** Clear cached publish connection so the next call reconnects. */
202
+ function resetPublishConnection() {
203
+ if (publishConnection) {
204
+ publishConnection.close().catch(() => { });
205
+ const idx = connections.indexOf(publishConnection);
206
+ if (idx !== -1)
207
+ connections.splice(idx, 1);
208
+ }
209
+ publishConnection = null;
210
+ publishChannel = null;
211
+ }
212
+ /**
213
+ * Assert main + retry + DLQ queues for a given queue name.
214
+ *
215
+ * Topology:
216
+ * main ──(dead-letter)──▸ {name}.failed (via exchange)
217
+ * retry ──(TTL expiry)──▸ main (via dead-letter back to main exchange)
218
+ */
219
+ async function assertTopology(channel, queue) {
220
+ const mainQueue = prefixedName(queue);
221
+ const retryQueue = `${mainQueue}.retry`;
222
+ const failedQueue = `${mainQueue}.failed`;
223
+ const mainExchange = `${mainQueue}.exchange`;
224
+ const retryExchange = `${retryQueue}.exchange`;
225
+ const failedExchange = `${failedQueue}.exchange`;
226
+ // Exchanges
227
+ await channel.assertExchange(mainExchange, 'direct', { durable: true });
228
+ await channel.assertExchange(retryExchange, 'direct', { durable: true });
229
+ await channel.assertExchange(failedExchange, 'direct', { durable: true });
230
+ // Main queue — dead-letters to failed exchange.
231
+ // Note: the DLX here is primarily exercised for poison messages (unparseable
232
+ // JSON) which are nacked without requeue. Normal failures go through
233
+ // retryOrDLQ() which manually publishes to the retry/failed queue and acks.
234
+ await channel.assertQueue(mainQueue, {
235
+ durable: true,
236
+ deadLetterExchange: failedExchange,
237
+ });
238
+ await channel.bindQueue(mainQueue, mainExchange, '');
239
+ // Retry queue — messages TTL then dead-letter back to main exchange
240
+ await channel.assertQueue(retryQueue, {
241
+ durable: true,
242
+ deadLetterExchange: mainExchange,
243
+ });
244
+ await channel.bindQueue(retryQueue, retryExchange, '');
245
+ // Failed (DLQ) — terminal resting place
246
+ await channel.assertQueue(failedQueue, { durable: true });
247
+ await channel.bindQueue(failedQueue, failedExchange, '');
248
+ return { mainQueue, retryQueue, failedQueue };
249
+ }
250
+ function getRetryCount(msg) {
251
+ const headers = msg.properties.headers ?? {};
252
+ return typeof headers['x-retry-count'] === 'number' ? headers['x-retry-count'] : 0;
253
+ }
254
+ function computeBackoff(retryCount) {
255
+ return Math.min(BACKOFF_BASE_MS * Math.pow(2, retryCount), BACKOFF_MAX_MS);
256
+ }
257
+ /**
258
+ * Retry a message (publish to retry queue with incremented count and TTL)
259
+ * or send to DLQ if max retries exceeded.
260
+ */
261
+ async function retryOrDLQ(channel, raw, retryCount, retryQueue, failedQueue) {
262
+ const maxRetries = getMaxRetries();
263
+ if (retryCount >= maxRetries) {
264
+ console.error(`[message-queue] max retries (${maxRetries}) exceeded, moving to DLQ: ${failedQueue}`);
265
+ channel.publish('', failedQueue, raw.content, {
266
+ persistent: true,
267
+ headers: { ...raw.properties.headers, 'x-retry-count': retryCount },
268
+ });
269
+ channel.ack(raw);
270
+ return;
271
+ }
272
+ const ttl = computeBackoff(retryCount);
273
+ channel.publish('', retryQueue, raw.content, {
274
+ persistent: true,
275
+ expiration: String(ttl),
276
+ headers: {
277
+ ...raw.properties.headers,
278
+ 'x-retry-count': retryCount + 1,
279
+ },
280
+ });
281
+ channel.ack(raw);
282
+ }
283
+ //# sourceMappingURL=message-queue.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-queue.service.js","sourceRoot":"","sources":["../src/message-queue.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boopkit/cap-background-jobs",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Background job processing with RabbitMQ for boopkit-scaffolded projects",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",