@zdavison/matador 2.0.7 → 2.0.9

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 (200) hide show
  1. package/package.json +3 -2
  2. package/src/hooks/safe-hooks.ts +0 -16
  3. package/src/hooks/types.ts +0 -7
  4. package/src/index.ts +1 -0
  5. package/src/types/event.ts +8 -14
  6. package/src/types/index.ts +3 -2
  7. package/dist/checkpoint/context.d.ts +0 -59
  8. package/dist/checkpoint/context.d.ts.map +0 -1
  9. package/dist/checkpoint/context.js +0 -140
  10. package/dist/checkpoint/context.test.d.ts +0 -2
  11. package/dist/checkpoint/context.test.d.ts.map +0 -1
  12. package/dist/checkpoint/context.test.js +0 -424
  13. package/dist/checkpoint/index.d.ts +0 -7
  14. package/dist/checkpoint/index.d.ts.map +0 -1
  15. package/dist/checkpoint/index.js +0 -6
  16. package/dist/checkpoint/stores/memory.d.ts +0 -29
  17. package/dist/checkpoint/stores/memory.d.ts.map +0 -1
  18. package/dist/checkpoint/stores/memory.js +0 -39
  19. package/dist/checkpoint/stores/noop.d.ts +0 -14
  20. package/dist/checkpoint/stores/noop.d.ts.map +0 -1
  21. package/dist/checkpoint/stores/noop.js +0 -18
  22. package/dist/checkpoint/stores/stores.test.d.ts +0 -2
  23. package/dist/checkpoint/stores/stores.test.d.ts.map +0 -1
  24. package/dist/checkpoint/stores/stores.test.js +0 -146
  25. package/dist/checkpoint/types.d.ts +0 -119
  26. package/dist/checkpoint/types.d.ts.map +0 -1
  27. package/dist/checkpoint/types.js +0 -1
  28. package/dist/codec/codec.d.ts +0 -29
  29. package/dist/codec/codec.d.ts.map +0 -1
  30. package/dist/codec/codec.js +0 -15
  31. package/dist/codec/header-aware-codec.d.ts +0 -36
  32. package/dist/codec/header-aware-codec.d.ts.map +0 -1
  33. package/dist/codec/header-aware-codec.js +0 -1
  34. package/dist/codec/index.d.ts +0 -6
  35. package/dist/codec/index.d.ts.map +0 -1
  36. package/dist/codec/index.js +0 -3
  37. package/dist/codec/json-codec.d.ts +0 -13
  38. package/dist/codec/json-codec.d.ts.map +0 -1
  39. package/dist/codec/json-codec.js +0 -64
  40. package/dist/codec/rabbitmq-codec.d.ts +0 -28
  41. package/dist/codec/rabbitmq-codec.d.ts.map +0 -1
  42. package/dist/codec/rabbitmq-codec.js +0 -242
  43. package/dist/codec/rabbitmq-codec.test.d.ts +0 -2
  44. package/dist/codec/rabbitmq-codec.test.d.ts.map +0 -1
  45. package/dist/codec/rabbitmq-codec.test.js +0 -433
  46. package/dist/core/fanout.d.ts +0 -59
  47. package/dist/core/fanout.d.ts.map +0 -1
  48. package/dist/core/fanout.js +0 -121
  49. package/dist/core/fanout.test.d.ts +0 -2
  50. package/dist/core/fanout.test.d.ts.map +0 -1
  51. package/dist/core/fanout.test.js +0 -1054
  52. package/dist/core/index.d.ts +0 -7
  53. package/dist/core/index.d.ts.map +0 -1
  54. package/dist/core/index.js +0 -3
  55. package/dist/core/matador.d.ts +0 -133
  56. package/dist/core/matador.d.ts.map +0 -1
  57. package/dist/core/matador.js +0 -228
  58. package/dist/core/matador.test.d.ts +0 -2
  59. package/dist/core/matador.test.d.ts.map +0 -1
  60. package/dist/core/matador.test.js +0 -446
  61. package/dist/core/shutdown.d.ts +0 -78
  62. package/dist/core/shutdown.d.ts.map +0 -1
  63. package/dist/core/shutdown.js +0 -111
  64. package/dist/core/shutdown.test.d.ts +0 -2
  65. package/dist/core/shutdown.test.d.ts.map +0 -1
  66. package/dist/core/shutdown.test.js +0 -524
  67. package/dist/errors/checkpoint-errors.d.ts +0 -30
  68. package/dist/errors/checkpoint-errors.d.ts.map +0 -1
  69. package/dist/errors/checkpoint-errors.js +0 -49
  70. package/dist/errors/has-description.d.ts +0 -18
  71. package/dist/errors/has-description.d.ts.map +0 -1
  72. package/dist/errors/has-description.js +0 -9
  73. package/dist/errors/index.d.ts +0 -6
  74. package/dist/errors/index.d.ts.map +0 -1
  75. package/dist/errors/index.js +0 -22
  76. package/dist/errors/matador-errors.d.ts +0 -183
  77. package/dist/errors/matador-errors.d.ts.map +0 -1
  78. package/dist/errors/matador-errors.js +0 -376
  79. package/dist/errors/retry-errors.d.ts +0 -102
  80. package/dist/errors/retry-errors.d.ts.map +0 -1
  81. package/dist/errors/retry-errors.js +0 -155
  82. package/dist/errors/retry-errors.test.d.ts +0 -2
  83. package/dist/errors/retry-errors.test.d.ts.map +0 -1
  84. package/dist/errors/retry-errors.test.js +0 -136
  85. package/dist/hooks/index.d.ts +0 -4
  86. package/dist/hooks/index.d.ts.map +0 -1
  87. package/dist/hooks/index.js +0 -2
  88. package/dist/hooks/safe-hooks.d.ts +0 -33
  89. package/dist/hooks/safe-hooks.d.ts.map +0 -1
  90. package/dist/hooks/safe-hooks.js +0 -132
  91. package/dist/hooks/types.d.ts +0 -176
  92. package/dist/hooks/types.d.ts.map +0 -1
  93. package/dist/hooks/types.js +0 -9
  94. package/dist/index.cjs +0 -3242
  95. package/dist/index.cjs.map +0 -1
  96. package/dist/index.d.cts +0 -23
  97. package/dist/index.d.ts +0 -23
  98. package/dist/index.d.ts.map +0 -1
  99. package/dist/index.js +0 -31
  100. package/dist/index.js.map +0 -1
  101. package/dist/pipeline/index.d.ts +0 -3
  102. package/dist/pipeline/index.d.ts.map +0 -1
  103. package/dist/pipeline/index.js +0 -1
  104. package/dist/pipeline/pipeline.d.ts +0 -63
  105. package/dist/pipeline/pipeline.d.ts.map +0 -1
  106. package/dist/pipeline/pipeline.js +0 -273
  107. package/dist/pipeline/pipeline.test.d.ts +0 -2
  108. package/dist/pipeline/pipeline.test.d.ts.map +0 -1
  109. package/dist/pipeline/pipeline.test.js +0 -1112
  110. package/dist/retry/index.d.ts +0 -4
  111. package/dist/retry/index.d.ts.map +0 -1
  112. package/dist/retry/index.js +0 -1
  113. package/dist/retry/policy.d.ts +0 -43
  114. package/dist/retry/policy.d.ts.map +0 -1
  115. package/dist/retry/policy.js +0 -1
  116. package/dist/retry/standard-policy.d.ts +0 -44
  117. package/dist/retry/standard-policy.d.ts.map +0 -1
  118. package/dist/retry/standard-policy.js +0 -102
  119. package/dist/retry/standard-policy.test.d.ts +0 -2
  120. package/dist/retry/standard-policy.test.d.ts.map +0 -1
  121. package/dist/retry/standard-policy.test.js +0 -196
  122. package/dist/schema/index.d.ts +0 -4
  123. package/dist/schema/index.d.ts.map +0 -1
  124. package/dist/schema/index.js +0 -2
  125. package/dist/schema/registry.d.ts +0 -63
  126. package/dist/schema/registry.d.ts.map +0 -1
  127. package/dist/schema/registry.js +0 -174
  128. package/dist/schema/registry.test.d.ts +0 -2
  129. package/dist/schema/registry.test.d.ts.map +0 -1
  130. package/dist/schema/registry.test.js +0 -278
  131. package/dist/schema/types.d.ts +0 -158
  132. package/dist/schema/types.d.ts.map +0 -1
  133. package/dist/schema/types.js +0 -74
  134. package/dist/schema/types.test.d.ts +0 -2
  135. package/dist/schema/types.test.d.ts.map +0 -1
  136. package/dist/schema/types.test.js +0 -242
  137. package/dist/topology/builder.d.ts +0 -80
  138. package/dist/topology/builder.d.ts.map +0 -1
  139. package/dist/topology/builder.js +0 -165
  140. package/dist/topology/builder.test.d.ts +0 -2
  141. package/dist/topology/builder.test.d.ts.map +0 -1
  142. package/dist/topology/builder.test.js +0 -360
  143. package/dist/topology/index.d.ts +0 -5
  144. package/dist/topology/index.d.ts.map +0 -1
  145. package/dist/topology/index.js +0 -2
  146. package/dist/topology/types.d.ts +0 -128
  147. package/dist/topology/types.d.ts.map +0 -1
  148. package/dist/topology/types.js +0 -28
  149. package/dist/transport/capabilities.d.ts +0 -66
  150. package/dist/transport/capabilities.d.ts.map +0 -1
  151. package/dist/transport/capabilities.js +0 -18
  152. package/dist/transport/connection-manager.d.ts +0 -95
  153. package/dist/transport/connection-manager.d.ts.map +0 -1
  154. package/dist/transport/connection-manager.js +0 -144
  155. package/dist/transport/index.d.ts +0 -11
  156. package/dist/transport/index.d.ts.map +0 -1
  157. package/dist/transport/index.js +0 -5
  158. package/dist/transport/local/local-transport.d.ts +0 -62
  159. package/dist/transport/local/local-transport.d.ts.map +0 -1
  160. package/dist/transport/local/local-transport.js +0 -241
  161. package/dist/transport/local/local-transport.test.d.ts +0 -2
  162. package/dist/transport/local/local-transport.test.d.ts.map +0 -1
  163. package/dist/transport/local/local-transport.test.js +0 -192
  164. package/dist/transport/multi/multi-transport.d.ts +0 -94
  165. package/dist/transport/multi/multi-transport.d.ts.map +0 -1
  166. package/dist/transport/multi/multi-transport.js +0 -184
  167. package/dist/transport/multi/multi-transport.test.d.ts +0 -2
  168. package/dist/transport/multi/multi-transport.test.d.ts.map +0 -1
  169. package/dist/transport/multi/multi-transport.test.js +0 -236
  170. package/dist/transport/rabbitmq/rabbitmq-transport.d.ts +0 -83
  171. package/dist/transport/rabbitmq/rabbitmq-transport.d.ts.map +0 -1
  172. package/dist/transport/rabbitmq/rabbitmq-transport.js +0 -541
  173. package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts +0 -2
  174. package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts.map +0 -1
  175. package/dist/transport/rabbitmq/rabbitmq-transport.test.js +0 -100
  176. package/dist/transport/transport.d.ts +0 -152
  177. package/dist/transport/transport.d.ts.map +0 -1
  178. package/dist/transport/transport.js +0 -1
  179. package/dist/types/common.d.ts +0 -41
  180. package/dist/types/common.d.ts.map +0 -1
  181. package/dist/types/common.js +0 -12
  182. package/dist/types/dispatcher.d.ts +0 -14
  183. package/dist/types/dispatcher.d.ts.map +0 -1
  184. package/dist/types/dispatcher.js +0 -1
  185. package/dist/types/envelope.d.ts +0 -131
  186. package/dist/types/envelope.d.ts.map +0 -1
  187. package/dist/types/envelope.js +0 -99
  188. package/dist/types/event.d.ts +0 -96
  189. package/dist/types/event.d.ts.map +0 -1
  190. package/dist/types/event.js +0 -26
  191. package/dist/types/event.test.d.ts +0 -2
  192. package/dist/types/event.test.d.ts.map +0 -1
  193. package/dist/types/event.test.js +0 -130
  194. package/dist/types/index.d.ts +0 -10
  195. package/dist/types/index.d.ts.map +0 -1
  196. package/dist/types/index.js +0 -4
  197. package/dist/types/subscriber.d.ts +0 -227
  198. package/dist/types/subscriber.d.ts.map +0 -1
  199. package/dist/types/subscriber.js +0 -97
  200. package/tsconfig.tsbuildinfo +0 -1
@@ -1,3 +0,0 @@
1
- export type { PipelineConfig, ProcessResult } from './pipeline.js';
2
- export { ProcessingPipeline } from './pipeline.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -1 +0,0 @@
1
- export { ProcessingPipeline } from './pipeline.js';
@@ -1,63 +0,0 @@
1
- import type { CheckpointStore } from '../checkpoint/index.js';
2
- import type { Codec } from '../codec/index.js';
3
- import type { SafeHooks } from '../hooks/index.js';
4
- import type { RetryDecision, RetryPolicy } from '../retry/index.js';
5
- import type { SchemaRegistry } from '../schema/index.js';
6
- import type { MessageReceipt, Transport } from '../transport/index.js';
7
- import type { Dispatcher, Envelope, SubscriberDefinition } from '../types/index.js';
8
- /**
9
- * Configuration for the processing pipeline.
10
- */
11
- export interface PipelineConfig {
12
- readonly transport: Transport;
13
- readonly schema: SchemaRegistry;
14
- readonly codec: Codec;
15
- readonly retryPolicy: RetryPolicy;
16
- readonly hooks: SafeHooks;
17
- /** Optional checkpoint store for resumable subscribers */
18
- readonly checkpointStore?: CheckpointStore | undefined;
19
- /** Dispatcher (matador) for sending events from subscriber callbacks */
20
- readonly dispatcher: Dispatcher;
21
- }
22
- /**
23
- * Result of pipeline processing.
24
- */
25
- export interface ProcessResult {
26
- readonly success: boolean;
27
- readonly envelope?: Envelope | undefined;
28
- readonly subscriber?: SubscriberDefinition | undefined;
29
- readonly error?: Error | undefined;
30
- readonly decision?: RetryDecision | undefined;
31
- readonly durationMs: number;
32
- }
33
- /**
34
- * Processing pipeline for incoming messages.
35
- *
36
- * Handles the complete message lifecycle:
37
- * 1. Decode envelope from raw bytes
38
- * 2. Lookup subscriber from schema
39
- * 3. Execute subscriber callback with hooks
40
- * 4. Handle success/failure with retry policy
41
- */
42
- export declare class ProcessingPipeline {
43
- private readonly transport;
44
- private readonly schema;
45
- private readonly codec;
46
- private readonly retryPolicy;
47
- private readonly hooks;
48
- private readonly checkpointStore;
49
- private readonly dispatcher;
50
- constructor(config: PipelineConfig);
51
- /**
52
- * Processes a raw message from the transport.
53
- */
54
- process(rawMessage: Uint8Array, receipt: MessageReceipt): Promise<ProcessResult>;
55
- private handleRetryDecision;
56
- private sendToDeadLetter;
57
- /**
58
- * Gets retry decision for unhandled messages (subscriber not found).
59
- * Uses same retry policy logic but sends to 'unhandled' DLQ after max attempts.
60
- */
61
- private getUnhandledRetryDecision;
62
- }
63
- //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +0,0 @@
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;;;;;;;;GAQG;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;YA4NX,mBAAmB;YAqCnB,gBAAgB;IAkB9B;;;OAGG;IACH,OAAO,CAAC,yBAAyB;CA+BlC"}
@@ -1,273 +0,0 @@
1
- import { NoOpCheckpointStore, ResumableContext } from '../checkpoint/index.js';
2
- import { CodecDecodeError } from '../codec/index.js';
3
- import { SubscriberIsStubError, SubscriberNotRegisteredError, } from '../errors/index.js';
4
- import { isResumableSubscriber } from '../types/index.js';
5
- /**
6
- * Processing pipeline for incoming messages.
7
- *
8
- * Handles the complete message lifecycle:
9
- * 1. Decode envelope from raw bytes
10
- * 2. Lookup subscriber from schema
11
- * 3. Execute subscriber callback with hooks
12
- * 4. Handle success/failure with retry policy
13
- */
14
- export class ProcessingPipeline {
15
- transport;
16
- schema;
17
- codec;
18
- retryPolicy;
19
- hooks;
20
- checkpointStore;
21
- dispatcher;
22
- constructor(config) {
23
- this.transport = config.transport;
24
- this.schema = config.schema;
25
- this.codec = config.codec;
26
- this.retryPolicy = config.retryPolicy;
27
- this.hooks = config.hooks;
28
- this.checkpointStore = config.checkpointStore ?? new NoOpCheckpointStore();
29
- this.dispatcher = config.dispatcher;
30
- }
31
- /**
32
- * Processes a raw message from the transport.
33
- */
34
- async process(rawMessage, receipt) {
35
- const startTime = performance.now();
36
- // 1. Decode envelope
37
- let envelope;
38
- try {
39
- envelope = this.codec.decode(rawMessage);
40
- }
41
- catch (error) {
42
- const decodeError = error instanceof CodecDecodeError
43
- ? error
44
- : new CodecDecodeError('Unknown decode error', error);
45
- await this.transport.complete(receipt);
46
- await this.hooks.onDecodeError({
47
- error: decodeError,
48
- rawMessage,
49
- sourceQueue: receipt.sourceQueue,
50
- transport: receipt.sourceTransport,
51
- });
52
- return {
53
- success: false,
54
- error: decodeError,
55
- durationMs: performance.now() - startTime,
56
- };
57
- }
58
- // 2. Lookup subscriber from schema
59
- const subscriberDef = this.schema.getSubscriberDefinition(envelope.docket.eventKey, envelope.docket.targetSubscriber);
60
- if (!subscriberDef) {
61
- const error = new SubscriberNotRegisteredError(envelope.docket.targetSubscriber, envelope.docket.eventKey);
62
- // Retry unhandled messages (likely deployment timing issue)
63
- const decision = this.getUnhandledRetryDecision(envelope, receipt, error);
64
- await this.handleRetryDecision(receipt, envelope, decision);
65
- return {
66
- success: false,
67
- envelope,
68
- error,
69
- decision,
70
- durationMs: performance.now() - startTime,
71
- };
72
- }
73
- // Get executable subscriber
74
- const subscriber = this.schema.getExecutableSubscriber(envelope.docket.eventKey, envelope.docket.targetSubscriber);
75
- if (!subscriber) {
76
- // Subscriber is a stub (remote implementation)
77
- const error = new SubscriberIsStubError(envelope.docket.targetSubscriber);
78
- // Retry stub messages (likely deployment timing issue)
79
- const decision = this.getUnhandledRetryDecision(envelope, receipt, error);
80
- await this.handleRetryDecision(receipt, envelope, decision);
81
- return {
82
- success: false,
83
- envelope,
84
- subscriber: subscriberDef,
85
- error,
86
- decision,
87
- durationMs: performance.now() - startTime,
88
- };
89
- }
90
- // 3. Execute subscriber callback with hooks
91
- let result;
92
- let error;
93
- let context;
94
- // For resumable subscribers, load existing checkpoint and create context
95
- const isResumable = isResumableSubscriber(subscriber);
96
- let existingCheckpoint;
97
- if (isResumable) {
98
- existingCheckpoint = await this.checkpointStore.get(envelope.id);
99
- if (existingCheckpoint) {
100
- await this.hooks.onCheckpointLoaded?.({
101
- envelope,
102
- subscriber: subscriberDef,
103
- checkpoint: existingCheckpoint,
104
- cachedSteps: Object.keys(existingCheckpoint.completedSteps).length,
105
- });
106
- }
107
- context = new ResumableContext({
108
- store: this.checkpointStore,
109
- envelope,
110
- subscriber: subscriberDef,
111
- existingCheckpoint,
112
- hooks: {
113
- onCheckpointHit: (ctx) => this.hooks.onCheckpointHit?.(ctx),
114
- onCheckpointMiss: (ctx) => this.hooks.onCheckpointMiss?.(ctx),
115
- },
116
- });
117
- }
118
- // Create base callback context with matador dispatcher
119
- const callbackContext = { matador: this.dispatcher };
120
- await this.hooks.onWorkerWrap(envelope, subscriberDef, async () => {
121
- await this.hooks.onWorkerBeforeProcess(envelope, subscriberDef);
122
- try {
123
- if (isResumable && context) {
124
- // Resumable subscriber: pass combined context (checkpoint + matador)
125
- // Cast needed because TypeScript can't narrow the union type based on isResumable
126
- const resumableCallback = subscriber.callback;
127
- // Create combined context by binding class methods and adding matador
128
- const fullContext = {
129
- io: context.io.bind(context),
130
- all: context.all.bind(context),
131
- attempt: context.attempt,
132
- isRetry: context.isRetry,
133
- matador: this.dispatcher,
134
- };
135
- result = await resumableCallback(envelope, fullContext);
136
- }
137
- else {
138
- // Standard subscriber: pass envelope and callback context
139
- const standardCallback = subscriber.callback;
140
- result = await standardCallback(envelope, callbackContext);
141
- }
142
- }
143
- catch (e) {
144
- error = e instanceof Error ? e : new Error(String(e));
145
- }
146
- });
147
- const durationMs = performance.now() - startTime;
148
- // 4. Handle success
149
- if (!error) {
150
- // Clear checkpoint on success for resumable subscribers
151
- if (context) {
152
- await context.clear();
153
- await this.hooks.onCheckpointCleared?.({
154
- envelope,
155
- subscriber: subscriberDef,
156
- reason: 'success',
157
- });
158
- }
159
- await this.transport.complete(receipt);
160
- await this.hooks.onWorkerSuccess({
161
- envelope,
162
- subscriber: subscriberDef,
163
- result,
164
- durationMs,
165
- transport: receipt.sourceTransport,
166
- });
167
- return {
168
- success: true,
169
- envelope,
170
- subscriber: subscriberDef,
171
- durationMs,
172
- };
173
- }
174
- // 5. Handle failure - consult retry policy
175
- const decision = this.retryPolicy.shouldRetry({
176
- envelope,
177
- error,
178
- subscriber: subscriberDef,
179
- receipt,
180
- });
181
- // Update envelope with error info
182
- envelope.docket.lastError = error.message;
183
- envelope.docket.firstError ??= error.message;
184
- // Clear checkpoint on dead-letter (terminal state)
185
- if (decision.action === 'dead-letter' && context) {
186
- await context.clear();
187
- await this.hooks.onCheckpointCleared?.({
188
- envelope,
189
- subscriber: subscriberDef,
190
- reason: 'dead-letter',
191
- });
192
- }
193
- await this.handleRetryDecision(receipt, envelope, decision);
194
- await this.hooks.onWorkerError({
195
- envelope,
196
- subscriber: subscriberDef,
197
- error,
198
- durationMs,
199
- decision,
200
- transport: receipt.sourceTransport,
201
- });
202
- return {
203
- success: false,
204
- envelope,
205
- subscriber: subscriberDef,
206
- error,
207
- decision,
208
- durationMs,
209
- };
210
- }
211
- async handleRetryDecision(receipt, envelope, decision) {
212
- switch (decision.action) {
213
- case 'retry': {
214
- // Increment attempts and schedule retry
215
- envelope.docket.attempts++;
216
- envelope.docket.scheduledFor = new Date(Date.now() + decision.delay).toISOString();
217
- await this.transport.send(receipt.sourceQueue, envelope, {
218
- delay: decision.delay,
219
- });
220
- await this.transport.complete(receipt);
221
- break;
222
- }
223
- case 'dead-letter': {
224
- await this.sendToDeadLetter(receipt, envelope, decision.queue, decision.reason);
225
- break;
226
- }
227
- case 'discard': {
228
- await this.transport.complete(receipt);
229
- break;
230
- }
231
- }
232
- }
233
- async sendToDeadLetter(receipt, envelope, dlqName, reason) {
234
- envelope.docket.originalQueue ??= receipt.sourceQueue;
235
- if (this.transport.sendToDeadLetter) {
236
- await this.transport.sendToDeadLetter(receipt, dlqName, envelope, reason);
237
- }
238
- else {
239
- // Manual: send to DLQ then complete original
240
- const fullDlqName = `${receipt.sourceQueue}.${dlqName}`;
241
- await this.transport.send(fullDlqName, envelope);
242
- await this.transport.complete(receipt);
243
- }
244
- }
245
- /**
246
- * Gets retry decision for unhandled messages (subscriber not found).
247
- * Uses same retry policy logic but sends to 'unhandled' DLQ after max attempts.
248
- */
249
- getUnhandledRetryDecision(envelope, receipt, error) {
250
- // Create a synthetic subscriber definition for retry policy
251
- const syntheticSubscriber = {
252
- name: envelope.docket.targetSubscriber,
253
- description: 'Synthetic subscriber for unhandled message retry',
254
- idempotent: 'yes', // Safe to retry unhandled messages
255
- importance: envelope.docket.importance ?? 'should-investigate',
256
- };
257
- const decision = this.retryPolicy.shouldRetry({
258
- envelope,
259
- error,
260
- subscriber: syntheticSubscriber,
261
- receipt,
262
- });
263
- // Override dead-letter queue to 'unhandled' instead of 'undeliverable'
264
- if (decision.action === 'dead-letter') {
265
- return {
266
- action: 'dead-letter',
267
- queue: 'unhandled',
268
- reason: decision.reason,
269
- };
270
- }
271
- return decision;
272
- }
273
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=pipeline.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline.test.ts"],"names":[],"mappings":""}