@zdavison/matador 4.0.3 → 4.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/core/matador.d.ts.map +1 -1
- package/dist/core/matador.js +4 -1
- package/dist/index.cjs +156 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pipeline/pipeline.d.ts +30 -2
- package/dist/pipeline/pipeline.d.ts.map +1 -1
- package/dist/pipeline/pipeline.js +65 -9
- package/dist/retry/index.d.ts +1 -1
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/policy.d.ts +27 -0
- package/dist/retry/policy.d.ts.map +1 -1
- package/dist/retry/standard-policy.d.ts +33 -2
- package/dist/retry/standard-policy.d.ts.map +1 -1
- package/dist/retry/standard-policy.js +73 -9
- package/dist/topology/types.d.ts +14 -0
- package/dist/topology/types.d.ts.map +1 -1
- package/dist/transport/rabbitmq/rabbitmq-transport.d.ts.map +1 -1
- package/dist/transport/rabbitmq/rabbitmq-transport.js +3 -0
- package/package.json +1 -1
- package/dist/checkpoint/context.test.d.ts +0 -2
- package/dist/checkpoint/context.test.d.ts.map +0 -1
- package/dist/checkpoint/context.test.js +0 -428
- package/dist/checkpoint/stores/stores.test.d.ts +0 -2
- package/dist/checkpoint/stores/stores.test.d.ts.map +0 -1
- package/dist/checkpoint/stores/stores.test.js +0 -146
- package/dist/codec/rabbitmq-codec.test.d.ts +0 -2
- package/dist/codec/rabbitmq-codec.test.d.ts.map +0 -1
- package/dist/codec/rabbitmq-codec.test.js +0 -428
- package/dist/core/fanout.test.d.ts +0 -2
- package/dist/core/fanout.test.d.ts.map +0 -1
- package/dist/core/fanout.test.js +0 -1970
- package/dist/core/matador.test.d.ts +0 -2
- package/dist/core/matador.test.d.ts.map +0 -1
- package/dist/core/matador.test.js +0 -813
- package/dist/core/shutdown.test.d.ts +0 -2
- package/dist/core/shutdown.test.d.ts.map +0 -1
- package/dist/core/shutdown.test.js +0 -599
- package/dist/errors/retry-errors.test.d.ts +0 -2
- package/dist/errors/retry-errors.test.d.ts.map +0 -1
- package/dist/errors/retry-errors.test.js +0 -136
- package/dist/pipeline/pipeline.test.d.ts +0 -2
- package/dist/pipeline/pipeline.test.d.ts.map +0 -1
- package/dist/pipeline/pipeline.test.js +0 -1124
- package/dist/retry/standard-policy.test.d.ts +0 -2
- package/dist/retry/standard-policy.test.d.ts.map +0 -1
- package/dist/retry/standard-policy.test.js +0 -196
- package/dist/schema/registry.test.d.ts +0 -2
- package/dist/schema/registry.test.d.ts.map +0 -1
- package/dist/schema/registry.test.js +0 -278
- package/dist/schema/types.test.d.ts +0 -2
- package/dist/schema/types.test.d.ts.map +0 -1
- package/dist/schema/types.test.js +0 -246
- package/dist/topology/builder.test.d.ts +0 -2
- package/dist/topology/builder.test.d.ts.map +0 -1
- package/dist/topology/builder.test.js +0 -547
- package/dist/transport/local/local-transport.test.d.ts +0 -2
- package/dist/transport/local/local-transport.test.d.ts.map +0 -1
- package/dist/transport/local/local-transport.test.js +0 -232
- package/dist/transport/multi/multi-transport.test.d.ts +0 -2
- package/dist/transport/multi/multi-transport.test.d.ts.map +0 -1
- package/dist/transport/multi/multi-transport.test.js +0 -322
- package/dist/transport/rabbitmq/rabbitmq-transport-reconnection.test.d.ts +0 -2
- package/dist/transport/rabbitmq/rabbitmq-transport-reconnection.test.d.ts.map +0 -1
- package/dist/transport/rabbitmq/rabbitmq-transport-reconnection.test.js +0 -149
- package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts +0 -2
- package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts.map +0 -1
- package/dist/transport/rabbitmq/rabbitmq-transport.test.js +0 -230
- package/dist/types/event.test.d.ts +0 -2
- package/dist/types/event.test.d.ts.map +0 -1
- package/dist/types/event.test.js +0 -130
|
@@ -36,8 +36,10 @@ export interface ProcessResult {
|
|
|
36
36
|
* Handles the complete message lifecycle:
|
|
37
37
|
* 1. Decode envelope from raw bytes
|
|
38
38
|
* 2. Lookup subscriber from schema
|
|
39
|
-
* 3.
|
|
40
|
-
* 4.
|
|
39
|
+
* 3. Pre-execution poison check (retry policy, before running the callback)
|
|
40
|
+
* 4. Execute subscriber callback with hooks
|
|
41
|
+
* 5. Handle success
|
|
42
|
+
* 6. Handle failure with retry policy
|
|
41
43
|
*/
|
|
42
44
|
export declare class ProcessingPipeline {
|
|
43
45
|
private readonly transport;
|
|
@@ -52,6 +54,32 @@ export declare class ProcessingPipeline {
|
|
|
52
54
|
* Processes a raw message from the transport.
|
|
53
55
|
*/
|
|
54
56
|
process(rawMessage: Uint8Array, receipt: MessageReceipt): Promise<ProcessResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Runs the retry policy's pre-processing check.
|
|
59
|
+
*
|
|
60
|
+
* This returns a terminal `ProcessResult` if the message should be skipped (dead-lettered/discarded) without ever invoking the callback,
|
|
61
|
+
* or a success result if shouldProcess passes and we should continue processing the message.
|
|
62
|
+
* @param envelope - The message envelope
|
|
63
|
+
* @param subscriberDef - The subscriber definition
|
|
64
|
+
* @param isResumable - Whether the subscriber is resumable
|
|
65
|
+
* @param receipt - The message receipt
|
|
66
|
+
* @param startTime - The start time of the processing
|
|
67
|
+
* @returns A `ProcessResult` indicating if we should continue with processing the message, or fail it preemptively
|
|
68
|
+
*/
|
|
69
|
+
private handleShouldProcess;
|
|
70
|
+
/**
|
|
71
|
+
* Performs failure handling and cleanup based on retry decision (e.g. dead-letter).
|
|
72
|
+
*
|
|
73
|
+
* @param error - The error from the processing attempt
|
|
74
|
+
* @param decision - The decision from executing the appropriate retry policy check
|
|
75
|
+
* @param envelope - The message envelope
|
|
76
|
+
* @param subscriberDef - The subscriber definition
|
|
77
|
+
* @param isResumable - Whether the subscriber is resumable
|
|
78
|
+
* @param receipt - The message receipt
|
|
79
|
+
* @param durationMs - The duration of processing
|
|
80
|
+
* @returns A `ProcessResult` indicating failure
|
|
81
|
+
*/
|
|
82
|
+
private handleFailure;
|
|
55
83
|
private handleRetryDecision;
|
|
56
84
|
private sendToDeadLetter;
|
|
57
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAM/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAEV,UAAU,EACV,QAAQ,EAER,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAM/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAEV,UAAU,EACV,QAAQ,EAER,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,MAAM,EAAE,cAAc;IAUlC;;OAEG;IACG,OAAO,CACX,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;IAoNzB;;;;;;;;;;;OAWG;YACW,mBAAmB;IAqCjC;;;;;;;;;;;OAWG;YACW,aAAa;YA4Cb,mBAAmB;YAqCnB,gBAAgB;IAkB9B;;;OAGG;IACH,OAAO,CAAC,yBAAyB;CA+BlC"}
|
|
@@ -8,8 +8,10 @@ import { isResumableSubscriber } from '../types/index.js';
|
|
|
8
8
|
* Handles the complete message lifecycle:
|
|
9
9
|
* 1. Decode envelope from raw bytes
|
|
10
10
|
* 2. Lookup subscriber from schema
|
|
11
|
-
* 3.
|
|
12
|
-
* 4.
|
|
11
|
+
* 3. Pre-execution poison check (retry policy, before running the callback)
|
|
12
|
+
* 4. Execute subscriber callback with hooks
|
|
13
|
+
* 5. Handle success
|
|
14
|
+
* 6. Handle failure with retry policy
|
|
13
15
|
*/
|
|
14
16
|
export class ProcessingPipeline {
|
|
15
17
|
transport;
|
|
@@ -87,13 +89,22 @@ export class ProcessingPipeline {
|
|
|
87
89
|
durationMs: performance.now() - startTime,
|
|
88
90
|
};
|
|
89
91
|
}
|
|
90
|
-
|
|
92
|
+
const isResumable = isResumableSubscriber(subscriber);
|
|
93
|
+
// 3. Pre-execution poison check, based on delivery metadata alone.
|
|
94
|
+
//
|
|
95
|
+
// Catches a message that's already known-poisoned (e.g. delivery count at/above the threshold)
|
|
96
|
+
// before running the callback
|
|
97
|
+
const shouldProcessResult = await this.handleShouldProcess(envelope, subscriberDef, isResumable, receipt, startTime);
|
|
98
|
+
// If the message is poisoned, return the result immediately
|
|
99
|
+
if (!shouldProcessResult.success) {
|
|
100
|
+
return shouldProcessResult;
|
|
101
|
+
}
|
|
102
|
+
// 4. Execute subscriber callback with hooks
|
|
91
103
|
let result;
|
|
92
104
|
let error;
|
|
93
105
|
let context;
|
|
94
|
-
// For resumable subscribers, load existing checkpoint and create context
|
|
95
|
-
const isResumable = isResumableSubscriber(subscriber);
|
|
96
106
|
let existingCheckpoint;
|
|
107
|
+
// For resumable subscribers, load existing checkpoint and create context
|
|
97
108
|
if (isResumable) {
|
|
98
109
|
existingCheckpoint = await this.checkpointStore.get(envelope.id);
|
|
99
110
|
if (existingCheckpoint) {
|
|
@@ -145,7 +156,7 @@ export class ProcessingPipeline {
|
|
|
145
156
|
}
|
|
146
157
|
});
|
|
147
158
|
const durationMs = performance.now() - startTime;
|
|
148
|
-
//
|
|
159
|
+
// 5. Handle success
|
|
149
160
|
if (!error) {
|
|
150
161
|
// Clear checkpoint on success for resumable subscribers
|
|
151
162
|
if (context) {
|
|
@@ -171,19 +182,64 @@ export class ProcessingPipeline {
|
|
|
171
182
|
durationMs,
|
|
172
183
|
};
|
|
173
184
|
}
|
|
174
|
-
//
|
|
185
|
+
// 6. Handle failure - consult retry policy
|
|
175
186
|
const decision = this.retryPolicy.shouldRetry({
|
|
176
187
|
envelope,
|
|
177
188
|
error,
|
|
178
189
|
subscriber: subscriberDef,
|
|
179
190
|
receipt,
|
|
180
191
|
});
|
|
192
|
+
return await this.handleFailure(error, decision, envelope, subscriberDef, isResumable, receipt, durationMs);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Runs the retry policy's pre-processing check.
|
|
196
|
+
*
|
|
197
|
+
* This returns a terminal `ProcessResult` if the message should be skipped (dead-lettered/discarded) without ever invoking the callback,
|
|
198
|
+
* or a success result if shouldProcess passes and we should continue processing the message.
|
|
199
|
+
* @param envelope - The message envelope
|
|
200
|
+
* @param subscriberDef - The subscriber definition
|
|
201
|
+
* @param isResumable - Whether the subscriber is resumable
|
|
202
|
+
* @param receipt - The message receipt
|
|
203
|
+
* @param startTime - The start time of the processing
|
|
204
|
+
* @returns A `ProcessResult` indicating if we should continue with processing the message, or fail it preemptively
|
|
205
|
+
*/
|
|
206
|
+
async handleShouldProcess(envelope, subscriberDef, isResumable, receipt, startTime) {
|
|
207
|
+
const decision = this.retryPolicy.shouldProcess({
|
|
208
|
+
envelope,
|
|
209
|
+
subscriber: subscriberDef,
|
|
210
|
+
receipt,
|
|
211
|
+
});
|
|
212
|
+
// If shouldProcess passes, we can proceed with normal processing
|
|
213
|
+
if (decision.action === 'process') {
|
|
214
|
+
return {
|
|
215
|
+
success: true,
|
|
216
|
+
durationMs: 0,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Otherwise, the message needs to be handled accordingly (e.g. dead-lettered or discarded)
|
|
220
|
+
const durationMs = performance.now() - startTime;
|
|
221
|
+
const error = new Error(decision.reason);
|
|
222
|
+
return await this.handleFailure(error, decision, envelope, subscriberDef, isResumable, receipt, durationMs);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Performs failure handling and cleanup based on retry decision (e.g. dead-letter).
|
|
226
|
+
*
|
|
227
|
+
* @param error - The error from the processing attempt
|
|
228
|
+
* @param decision - The decision from executing the appropriate retry policy check
|
|
229
|
+
* @param envelope - The message envelope
|
|
230
|
+
* @param subscriberDef - The subscriber definition
|
|
231
|
+
* @param isResumable - Whether the subscriber is resumable
|
|
232
|
+
* @param receipt - The message receipt
|
|
233
|
+
* @param durationMs - The duration of processing
|
|
234
|
+
* @returns A `ProcessResult` indicating failure
|
|
235
|
+
*/
|
|
236
|
+
async handleFailure(error, decision, envelope, subscriberDef, isResumable, receipt, durationMs) {
|
|
181
237
|
// Update envelope with error info
|
|
182
238
|
envelope.docket.lastError = error.message;
|
|
183
239
|
envelope.docket.firstError ??= error.message;
|
|
184
240
|
// Clear checkpoint on dead-letter (terminal state)
|
|
185
|
-
if (decision.action === 'dead-letter' &&
|
|
186
|
-
await
|
|
241
|
+
if (decision.action === 'dead-letter' && isResumable) {
|
|
242
|
+
await this.checkpointStore.delete(envelope.id);
|
|
187
243
|
await this.hooks.onCheckpointCleared?.({
|
|
188
244
|
envelope,
|
|
189
245
|
subscriber: subscriberDef,
|
package/dist/retry/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { RetryContext, RetryDecision, RetryPolicy } from './policy.js';
|
|
1
|
+
export type { ProcessContext, ProcessDecision, RetryContext, RetryDecision, RetryPolicy, } from './policy.js';
|
|
2
2
|
export type { StandardRetryPolicyConfig } from './standard-policy.js';
|
|
3
3
|
export { defaultRetryConfig, StandardRetryPolicy } from './standard-policy.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retry/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retry/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/retry/policy.d.ts
CHANGED
|
@@ -27,10 +27,37 @@ export type RetryDecision = {
|
|
|
27
27
|
readonly action: 'discard';
|
|
28
28
|
readonly reason: string;
|
|
29
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Decision returned by pre-processing check
|
|
32
|
+
*/
|
|
33
|
+
export type ProcessDecision = {
|
|
34
|
+
action: 'process';
|
|
35
|
+
} | Extract<RetryDecision, {
|
|
36
|
+
action: 'dead-letter' | 'discard';
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Context provided to retry policy for a pre-processing check, i.e. before the
|
|
40
|
+
* subscriber callback has run and before any error exists.
|
|
41
|
+
*/
|
|
42
|
+
export interface ProcessContext {
|
|
43
|
+
/** The message envelope */
|
|
44
|
+
readonly envelope: Envelope;
|
|
45
|
+
/** The subscriber definition */
|
|
46
|
+
readonly subscriber: SubscriberDefinition;
|
|
47
|
+
/** Message receipt with delivery information */
|
|
48
|
+
readonly receipt: MessageReceipt;
|
|
49
|
+
}
|
|
30
50
|
/**
|
|
31
51
|
* Interface for retry policies.
|
|
32
52
|
*/
|
|
33
53
|
export interface RetryPolicy {
|
|
54
|
+
/**
|
|
55
|
+
* Check if the message should be dead-lettered or discarded before the subscriber callback is invoked.
|
|
56
|
+
*
|
|
57
|
+
* Return a 'process' decision to proceed with normal processing; otherwise return a decision to handle the
|
|
58
|
+
* message accordingly (e.g. dead-letter or discard).
|
|
59
|
+
*/
|
|
60
|
+
shouldProcess(context: ProcessContext): ProcessDecision;
|
|
34
61
|
/**
|
|
35
62
|
* Determines what to do with a failed message.
|
|
36
63
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/retry/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,gCAAgC;IAChC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAAC;IAElD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;CACzC"}
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/retry/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,gCAAgC;IAChC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB,OAAO,CAAC,aAAa,EAAE;IAAE,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,gCAAgC;IAChC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CAAC;IAExD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAAC;IAElD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;CACzC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RetryContext, RetryDecision, RetryPolicy } from './policy.js';
|
|
1
|
+
import type { ProcessContext, ProcessDecision, RetryContext, RetryDecision, RetryPolicy } from './policy.js';
|
|
2
2
|
/**
|
|
3
3
|
* Configuration for the standard retry policy.
|
|
4
4
|
*/
|
|
@@ -32,13 +32,44 @@ export declare const defaultRetryConfig: StandardRetryPolicyConfig;
|
|
|
32
32
|
* 3. DontRetry → dead-letter (explicit no-retry)
|
|
33
33
|
* 4. DoRetry → retry if under max attempts
|
|
34
34
|
* 5. Max attempts exceeded → dead-letter
|
|
35
|
-
* 6. Non-idempotent subscriber
|
|
35
|
+
* 6. Non-idempotent subscriber → dead-letter
|
|
36
36
|
* 7. Default → retry with exponential backoff
|
|
37
37
|
*/
|
|
38
38
|
export declare class StandardRetryPolicy implements RetryPolicy {
|
|
39
39
|
private readonly config;
|
|
40
40
|
constructor(config?: Partial<StandardRetryPolicyConfig>);
|
|
41
|
+
/**
|
|
42
|
+
* Check if the message should be dead-lettered before the subscriber callback is invoked.
|
|
43
|
+
* This is needed when a subscriber crashes and the `shouldRetry` policy is never executed.
|
|
44
|
+
*
|
|
45
|
+
* Uses the same delivery-count threshold as `shouldRetry` poison check, so an
|
|
46
|
+
* already-poisoned message is dead-lettered without ever running the callback again.
|
|
47
|
+
*
|
|
48
|
+
* Checks the subscriber idempotency setting to prevent processing when a previous attempt crashed.
|
|
49
|
+
*
|
|
50
|
+
* @param context - The shouldProcess context.
|
|
51
|
+
* @returns A 'process' decision if subscriber processing should be attempted; a dead-letter decision otherwise.
|
|
52
|
+
*/
|
|
53
|
+
shouldProcess(context: ProcessContext): ProcessDecision;
|
|
41
54
|
shouldRetry(context: RetryContext): RetryDecision;
|
|
42
55
|
getDelay(context: RetryContext): number;
|
|
56
|
+
/**
|
|
57
|
+
* Checks the native delivery count against the poison threshold
|
|
58
|
+
*
|
|
59
|
+
* @param envelope - The message envelope.
|
|
60
|
+
* @param receipt - The message receipt.
|
|
61
|
+
* @returns A MessageMaybePoisonedError if the message is poisoned; null otherwise
|
|
62
|
+
*/
|
|
63
|
+
private checkPoisoned;
|
|
64
|
+
/**
|
|
65
|
+
* Checks whether the subscriber allows retries based on its idempotency setting
|
|
66
|
+
*
|
|
67
|
+
* @param envelope - The message envelope.
|
|
68
|
+
* @param receipt - The message receipt.
|
|
69
|
+
* @param subscriber - The subscriber definition
|
|
70
|
+
* @param error - The processing error, if it exists
|
|
71
|
+
* @returns A IdempotentMessageCannotRetryError if the message is poisoned; null otherwise
|
|
72
|
+
*/
|
|
73
|
+
private checkIdempotency;
|
|
43
74
|
}
|
|
44
75
|
//# sourceMappingURL=standard-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-policy.d.ts","sourceRoot":"","sources":["../../src/retry/standard-policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"standard-policy.d.ts","sourceRoot":"","sources":["../../src/retry/standard-policy.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,iDAAiD;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,yCAAyC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,yBAMhC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;gBAEvC,MAAM,GAAE,OAAO,CAAC,yBAAyB,CAAM;IAI3D;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe;IAgCvD,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa;IAiFjD,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAOvC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAcrB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;CAkBzB"}
|
|
@@ -18,7 +18,7 @@ export const defaultRetryConfig = {
|
|
|
18
18
|
* 3. DontRetry → dead-letter (explicit no-retry)
|
|
19
19
|
* 4. DoRetry → retry if under max attempts
|
|
20
20
|
* 5. Max attempts exceeded → dead-letter
|
|
21
|
-
* 6. Non-idempotent subscriber
|
|
21
|
+
* 6. Non-idempotent subscriber → dead-letter
|
|
22
22
|
* 7. Default → retry with exponential backoff
|
|
23
23
|
*/
|
|
24
24
|
export class StandardRetryPolicy {
|
|
@@ -26,12 +26,48 @@ export class StandardRetryPolicy {
|
|
|
26
26
|
constructor(config = {}) {
|
|
27
27
|
this.config = { ...defaultRetryConfig, ...config };
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if the message should be dead-lettered before the subscriber callback is invoked.
|
|
31
|
+
* This is needed when a subscriber crashes and the `shouldRetry` policy is never executed.
|
|
32
|
+
*
|
|
33
|
+
* Uses the same delivery-count threshold as `shouldRetry` poison check, so an
|
|
34
|
+
* already-poisoned message is dead-lettered without ever running the callback again.
|
|
35
|
+
*
|
|
36
|
+
* Checks the subscriber idempotency setting to prevent processing when a previous attempt crashed.
|
|
37
|
+
*
|
|
38
|
+
* @param context - The shouldProcess context.
|
|
39
|
+
* @returns A 'process' decision if subscriber processing should be attempted; a dead-letter decision otherwise.
|
|
40
|
+
*/
|
|
41
|
+
shouldProcess(context) {
|
|
42
|
+
// Poison message detection - prevent crash loops
|
|
43
|
+
const poisonError = this.checkPoisoned(context.envelope, context.receipt);
|
|
44
|
+
// If the message is poisoned, dead-letter it
|
|
45
|
+
if (poisonError) {
|
|
46
|
+
return {
|
|
47
|
+
action: 'dead-letter',
|
|
48
|
+
queue: 'undeliverable',
|
|
49
|
+
reason: poisonError.message,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Non-idempotent subscriber on redelivery
|
|
53
|
+
const idempotencyError = this.checkIdempotency(context.envelope, context.receipt, context.subscriber);
|
|
54
|
+
if (idempotencyError) {
|
|
55
|
+
return {
|
|
56
|
+
action: 'dead-letter',
|
|
57
|
+
queue: 'undeliverable',
|
|
58
|
+
reason: idempotencyError.message,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Allow processing to continue
|
|
62
|
+
return { action: 'process' };
|
|
63
|
+
}
|
|
29
64
|
shouldRetry(context) {
|
|
30
65
|
const { envelope, error, subscriber, receipt } = context;
|
|
31
66
|
const errorMessage = error.message;
|
|
32
67
|
// 1. Poison message detection - prevent crash loops
|
|
33
|
-
|
|
34
|
-
|
|
68
|
+
const poisonError = this.checkPoisoned(envelope, receipt);
|
|
69
|
+
// If the message is poisoned, dead-letter it
|
|
70
|
+
if (poisonError) {
|
|
35
71
|
return {
|
|
36
72
|
action: 'dead-letter',
|
|
37
73
|
queue: 'undeliverable',
|
|
@@ -76,15 +112,13 @@ export class StandardRetryPolicy {
|
|
|
76
112
|
reason: `max attempts exceeded (${this.config.maxAttempts})`,
|
|
77
113
|
};
|
|
78
114
|
}
|
|
79
|
-
// 6. Non-idempotent subscriber
|
|
80
|
-
|
|
81
|
-
if (
|
|
82
|
-
(subscriber.idempotent === 'no' || subscriber.idempotent === 'unknown')) {
|
|
83
|
-
const idempotentError = new IdempotentMessageCannotRetryError(envelope.id, subscriber.name);
|
|
115
|
+
// 6. Non-idempotent subscriber
|
|
116
|
+
const idempotencyError = this.checkIdempotency(envelope, receipt, subscriber, error);
|
|
117
|
+
if (idempotencyError) {
|
|
84
118
|
return {
|
|
85
119
|
action: 'dead-letter',
|
|
86
120
|
queue: 'undeliverable',
|
|
87
|
-
reason:
|
|
121
|
+
reason: idempotencyError.message,
|
|
88
122
|
};
|
|
89
123
|
}
|
|
90
124
|
// 7. Default: retry with backoff
|
|
@@ -98,4 +132,34 @@ export class StandardRetryPolicy {
|
|
|
98
132
|
const delay = this.config.baseDelay * this.config.backoffMultiplier ** (attempt - 1);
|
|
99
133
|
return Math.min(delay, this.config.maxDelay);
|
|
100
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Checks the native delivery count against the poison threshold
|
|
137
|
+
*
|
|
138
|
+
* @param envelope - The message envelope.
|
|
139
|
+
* @param receipt - The message receipt.
|
|
140
|
+
* @returns A MessageMaybePoisonedError if the message is poisoned; null otherwise
|
|
141
|
+
*/
|
|
142
|
+
checkPoisoned(envelope, receipt) {
|
|
143
|
+
if (receipt.deliveryCount >= this.config.maxDeliveries) {
|
|
144
|
+
return new MessageMaybePoisonedError(envelope.id, receipt.deliveryCount, this.config.maxDeliveries);
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Checks whether the subscriber allows retries based on its idempotency setting
|
|
150
|
+
*
|
|
151
|
+
* @param envelope - The message envelope.
|
|
152
|
+
* @param receipt - The message receipt.
|
|
153
|
+
* @param subscriber - The subscriber definition
|
|
154
|
+
* @param error - The processing error, if it exists
|
|
155
|
+
* @returns A IdempotentMessageCannotRetryError if the message is poisoned; null otherwise
|
|
156
|
+
*/
|
|
157
|
+
checkIdempotency(envelope, receipt, subscriber, error) {
|
|
158
|
+
// 'no' and 'unknown' are treated the same (safer default)
|
|
159
|
+
if ((error || receipt.redelivered) &&
|
|
160
|
+
(subscriber.idempotent === 'no' || subscriber.idempotent === 'unknown')) {
|
|
161
|
+
return new IdempotentMessageCannotRetryError(envelope.id, subscriber.name);
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
101
165
|
}
|
package/dist/topology/types.d.ts
CHANGED
|
@@ -113,6 +113,20 @@ export interface QueueDefinition {
|
|
|
113
113
|
readonly consumerTimeout?: number | undefined;
|
|
114
114
|
/** Enable priority support if transport allows */
|
|
115
115
|
readonly priorities?: boolean | undefined;
|
|
116
|
+
/**
|
|
117
|
+
* Restricts the queue to one active consumer at a time.
|
|
118
|
+
*
|
|
119
|
+
* Only RabbitMQ supports this option, with the `x-single-active-consumer`
|
|
120
|
+
* argument. Other transports ignore the option. RabbitMQ also ignores the
|
|
121
|
+
* option when you set a custom `transport.rabbitmq.options` override on the
|
|
122
|
+
* queue.
|
|
123
|
+
*
|
|
124
|
+
* With `concurrency: 1`, RabbitMQ delivers the queue in order, one message
|
|
125
|
+
* at a time, to the active consumer.
|
|
126
|
+
*
|
|
127
|
+
* @default false
|
|
128
|
+
*/
|
|
129
|
+
readonly singleActiveConsumer?: boolean | undefined;
|
|
116
130
|
/**
|
|
117
131
|
* When true, the queue name is used exactly as provided without any
|
|
118
132
|
* modification. The namespace prefix will NOT be added, and no other
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/topology/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/topology/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/rabbitmq/rabbitmq-transport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rabbitmq-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/rabbitmq/rabbitmq-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -539,6 +539,9 @@ export class RabbitMQTransport {
|
|
|
539
539
|
if (queueDef.consumerTimeout) {
|
|
540
540
|
queueOptions.arguments['x-consumer-timeout'] = queueDef.consumerTimeout;
|
|
541
541
|
}
|
|
542
|
+
if (queueDef.singleActiveConsumer) {
|
|
543
|
+
queueOptions.arguments['x-single-active-consumer'] = true;
|
|
544
|
+
}
|
|
542
545
|
return queueOptions;
|
|
543
546
|
}
|
|
544
547
|
async assertWorkQueue(channel, topology, queueDef) {
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../src/checkpoint/context.test.ts"],"names":[],"mappings":""}
|