@zdavison/matador 4.0.2 → 4.0.3

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.
@@ -1,7 +1,7 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, mock } from 'bun:test';
2
2
  import { SomeSendError, TransportSendError } from '../errors/index.js';
3
3
  import { TopologyBuilder } from '../topology/builder.js';
4
- import { LocalTransport } from '../transport/local/local-transport.js';
4
+ import { LocalTransport, MultiTransport } from '../transport/index.js';
5
5
  import { MatadorEvent, createSubscriber } from '../types/index.js';
6
6
  import { Matador } from './matador.js';
7
7
  class UserCreatedEvent extends MatadorEvent {
@@ -22,6 +22,24 @@ class OrderPlacedEvent extends MatadorEvent {
22
22
  this.data = data;
23
23
  }
24
24
  }
25
+ class StepOneEvent extends MatadorEvent {
26
+ data;
27
+ static key = 'step.one';
28
+ static description = 'First step of a chain';
29
+ constructor(data) {
30
+ super();
31
+ this.data = data;
32
+ }
33
+ }
34
+ class StepTwoEvent extends MatadorEvent {
35
+ data;
36
+ static key = 'step.two';
37
+ static description = 'Follow-up step dispatched from within step one';
38
+ constructor(data) {
39
+ super();
40
+ this.data = data;
41
+ }
42
+ }
25
43
  describe('Matador', () => {
26
44
  let transport;
27
45
  let matador;
@@ -208,7 +226,12 @@ describe('Matador', () => {
208
226
  const schema = {
209
227
  [UserCreatedEvent.key]: [UserCreatedEvent, [subscriber]],
210
228
  };
211
- matador = new Matador({ transport, topology, schema });
229
+ matador = new Matador({
230
+ transport,
231
+ topology,
232
+ schema,
233
+ consumeFrom: ['events'],
234
+ });
212
235
  await matador.start();
213
236
  const event = new UserCreatedEvent({
214
237
  userId: '123',
@@ -231,7 +254,12 @@ describe('Matador', () => {
231
254
  const schema = {
232
255
  [UserCreatedEvent.key]: [UserCreatedEvent, [subscriber]],
233
256
  };
234
- matador = new Matador({ transport, topology, schema });
257
+ matador = new Matador({
258
+ transport,
259
+ topology,
260
+ schema,
261
+ consumeFrom: ['events'],
262
+ });
235
263
  await matador.start();
236
264
  // Use the shorthand: send(EventClass, data)
237
265
  const result = await matador.send(UserCreatedEvent, {
@@ -264,7 +292,12 @@ describe('Matador', () => {
264
292
  const schema = {
265
293
  [UserCreatedEvent.key]: [UserCreatedEvent, [sub1, sub2, sub3]],
266
294
  };
267
- matador = new Matador({ transport, topology, schema });
295
+ matador = new Matador({
296
+ transport,
297
+ topology,
298
+ schema,
299
+ consumeFrom: ['events'],
300
+ });
268
301
  await matador.start();
269
302
  const event = new UserCreatedEvent({
270
303
  userId: '123',
@@ -286,7 +319,12 @@ describe('Matador', () => {
286
319
  const schema = {
287
320
  [UserCreatedEvent.key]: [UserCreatedEvent, [subscriber]],
288
321
  };
289
- matador = new Matador({ transport, topology, schema });
322
+ matador = new Matador({
323
+ transport,
324
+ topology,
325
+ schema,
326
+ consumeFrom: ['events'],
327
+ });
290
328
  await matador.start();
291
329
  const event = new UserCreatedEvent({
292
330
  userId: '123',
@@ -481,8 +519,19 @@ describe('Matador', () => {
481
519
  const schema = {
482
520
  [UserCreatedEvent.key]: [UserCreatedEvent, [subscriber]],
483
521
  };
484
- matador = new Matador({ transport, topology, schema });
522
+ matador = new Matador({
523
+ transport,
524
+ topology,
525
+ schema,
526
+ consumeFrom: ['events'],
527
+ });
485
528
  await matador.start();
529
+ // stopReceiving() unsubscribes this instance's own handler. With a real
530
+ // broker, the queue would still exist independently (another replica,
531
+ // or this instance after restart, could pick the message up) — simulate
532
+ // that here with a subscription outside Matador's own lifecycle so
533
+ // LocalTransport still has somewhere to deliver to.
534
+ await transport.subscribe('matador.test.events', async () => { });
486
535
  await matador.stopReceiving();
487
536
  const event = new UserCreatedEvent({
488
537
  userId: '123',
@@ -574,4 +623,191 @@ describe('Matador', () => {
574
623
  expect(matador.isConnected()).toBe(true);
575
624
  });
576
625
  });
626
+ describe('self-dispatch during graceful shutdown (stopReceiving)', () => {
627
+ it('LOCAL transport only: a self-dispatched follow-up should still be delivered after stopReceiving()', async () => {
628
+ const topology = TopologyBuilder.create()
629
+ .withNamespace('test')
630
+ .addQueue('events')
631
+ .build();
632
+ const received = [];
633
+ let releaseGate;
634
+ const gate = new Promise((resolve) => {
635
+ releaseGate = resolve;
636
+ });
637
+ let markStarted;
638
+ const started = new Promise((resolve) => {
639
+ markStarted = resolve;
640
+ });
641
+ const stepOneSub = createSubscriber({
642
+ name: 'step-one-handler',
643
+ description: 'Handles step one',
644
+ callback: async (envelope, context) => {
645
+ markStarted?.();
646
+ await gate;
647
+ await context.matador.send(StepTwoEvent, { id: envelope.data.id });
648
+ },
649
+ });
650
+ const stepTwoSub = createSubscriber({
651
+ name: 'step-two-handler',
652
+ description: 'Handles step two',
653
+ callback: async (envelope) => {
654
+ received.push(envelope.data.id);
655
+ },
656
+ });
657
+ const schema = {
658
+ [StepOneEvent.key]: [StepOneEvent, [stepOneSub]],
659
+ [StepTwoEvent.key]: [StepTwoEvent, [stepTwoSub]],
660
+ };
661
+ matador = new Matador({
662
+ transport,
663
+ topology,
664
+ schema,
665
+ consumeFrom: ['events'],
666
+ });
667
+ await matador.start();
668
+ void matador.send(StepOneEvent, { id: 'abc' });
669
+ await started;
670
+ // Graceful shutdown begins while step-one is still in flight.
671
+ await matador.stopReceiving();
672
+ // The in-flight handler now self-dispatches its follow-up event.
673
+ releaseGate?.();
674
+ await new Promise((resolve) => setTimeout(resolve, 50));
675
+ // LocalTransport is process-local — no other consumer could ever pick
676
+ // this up, so it should still be delivered here.
677
+ expect(received).toEqual(['abc']);
678
+ });
679
+ it('MULTI transport (external primary + local fallback): a dispatched event that falls back to local should still be delivered after stopReceiving()', async () => {
680
+ const topology = TopologyBuilder.create()
681
+ .withNamespace('test')
682
+ .addQueue('events')
683
+ .build();
684
+ const received = [];
685
+ let releaseGate;
686
+ const gate = new Promise((resolve) => {
687
+ releaseGate = resolve;
688
+ });
689
+ let markStarted;
690
+ const started = new Promise((resolve) => {
691
+ markStarted = resolve;
692
+ });
693
+ // Always-failing "external" transport, forcing every send to fall
694
+ // back to the local transport below.
695
+ const externalMock = {
696
+ name: 'rabbitmq',
697
+ capabilities: {
698
+ deliveryModes: ['at-least-once'],
699
+ delayedMessages: false,
700
+ deadLetterRouting: 'native',
701
+ attemptTracking: true,
702
+ concurrencyModel: 'prefetch',
703
+ ordering: 'none',
704
+ priorities: false,
705
+ },
706
+ isConnected: () => true,
707
+ connect: mock(async () => { }),
708
+ disconnect: mock(async () => { }),
709
+ send: mock(async () => {
710
+ throw new Error('RabbitMQ down');
711
+ }),
712
+ subscribe: mock(async () => ({
713
+ unsubscribe: mock(async () => { }),
714
+ isActive: true,
715
+ })),
716
+ applyTopology: mock(async () => { }),
717
+ complete: mock(async () => { }),
718
+ };
719
+ const localTransport = new LocalTransport();
720
+ const multiTransport = new MultiTransport({
721
+ transports: [externalMock, localTransport],
722
+ });
723
+ const stepOneSub = createSubscriber({
724
+ name: 'step-one-handler',
725
+ description: 'Handles step one',
726
+ callback: async (envelope, context) => {
727
+ markStarted?.();
728
+ await gate;
729
+ await context.matador.send(StepTwoEvent, { id: envelope.data.id });
730
+ },
731
+ });
732
+ const stepTwoSub = createSubscriber({
733
+ name: 'step-two-handler',
734
+ description: 'Handles step two',
735
+ callback: async (envelope) => {
736
+ received.push(envelope.data.id);
737
+ },
738
+ });
739
+ const schema = {
740
+ [StepOneEvent.key]: [StepOneEvent, [stepOneSub]],
741
+ [StepTwoEvent.key]: [StepTwoEvent, [stepTwoSub]],
742
+ };
743
+ matador = new Matador({
744
+ transport: multiTransport,
745
+ topology,
746
+ schema,
747
+ consumeFrom: ['events'],
748
+ });
749
+ await matador.start();
750
+ void matador.send(StepOneEvent, { id: 'abc' });
751
+ await started;
752
+ await matador.stopReceiving();
753
+ releaseGate?.();
754
+ await new Promise((resolve) => setTimeout(resolve, 50));
755
+ // The follow-up falls back to the local transport. Local is
756
+ // process-local — no other consumer could ever pick it up — so it
757
+ // should still be delivered here, even though the external transport's
758
+ // own subscription was (correctly) cut off immediately.
759
+ expect(received).toEqual(['abc']);
760
+ });
761
+ it('RABBIT-like (external) transport only: send() after stopReceiving() should still succeed regardless of local subscription state', async () => {
762
+ const topology = TopologyBuilder.create()
763
+ .withNamespace('test')
764
+ .addQueue('events')
765
+ .build();
766
+ const subscriber = createSubscriber({
767
+ name: 'step-one-handler',
768
+ description: 'Handles step one',
769
+ callback: async () => { },
770
+ });
771
+ const schema = {
772
+ [StepOneEvent.key]: [StepOneEvent, [subscriber]],
773
+ };
774
+ const externalTransport = {
775
+ name: 'rabbitmq',
776
+ capabilities: {
777
+ deliveryModes: ['at-least-once'],
778
+ delayedMessages: false,
779
+ deadLetterRouting: 'native',
780
+ attemptTracking: true,
781
+ concurrencyModel: 'prefetch',
782
+ ordering: 'none',
783
+ priorities: false,
784
+ },
785
+ isConnected: () => true,
786
+ connect: mock(async () => { }),
787
+ disconnect: mock(async () => { }),
788
+ send: mock(async () => 'rabbitmq'),
789
+ subscribe: mock(async () => ({
790
+ unsubscribe: mock(async () => { }),
791
+ isActive: true,
792
+ })),
793
+ applyTopology: mock(async () => { }),
794
+ complete: mock(async () => { }),
795
+ };
796
+ matador = new Matador({
797
+ transport: externalTransport,
798
+ topology,
799
+ schema,
800
+ consumeFrom: ['events'],
801
+ });
802
+ await matador.start();
803
+ await matador.stopReceiving();
804
+ const result = await matador.send(StepOneEvent, { id: 'xyz' });
805
+ // A real broker doesn't need an active local consumer to accept a
806
+ // publish — another replica (or this instance, once it stops
807
+ // pretending to be shut down) could still consume it later. This case
808
+ // is not part of the bug — included as a contrast baseline.
809
+ expect(result.subscribersSent).toBe(1);
810
+ expect(result.errors).toHaveLength(0);
811
+ });
812
+ });
577
813
  });
@@ -1,6 +1,6 @@
1
1
  export type { HasDescription } from './has-description.js';
2
2
  export { hasDescription } from './has-description.js';
3
3
  export { assertEvent, DontRetry, DoRetry, EventAssertionError, isAssertionError, isDontRetry, isDoRetry, RetryControlError, } from './retry-errors.js';
4
- export { MatadorError, isMatadorError, NotStartedError, isNotStartedError, ShutdownInProgressError, TransportNotConnectedError, isTransportNotConnectedError, TransportClosedError, TransportSendError, SomeSendError, AllTransportsFailedError, DelayedMessagesNotSupportedError, EventNotRegisteredError, isEventNotRegisteredError, SubscriberNotRegisteredError, isSubscriberNotRegisteredError, NoSubscribersExistError, InvalidSchemaError, SubscriberIsStubError, LocalTransportCannotProcessStubError, QueueNotFoundError, UnknownQueueReferenceError, isUnknownQueueReferenceError, InvalidEventError, MessageMaybePoisonedError, isMessageMaybePoisonedError, IdempotentMessageCannotRetryError, isIdempotentMessageCannotRetryError, TimeoutError, } from './matador-errors.js';
4
+ export { MatadorError, isMatadorError, NotStartedError, isNotStartedError, ShutdownInProgressError, TransportNotConnectedError, isTransportNotConnectedError, TransportClosedError, TransportSendError, SomeSendError, AllTransportsFailedError, DelayedMessagesNotSupportedError, LocalTransportNoActiveSubscriberError, EventNotRegisteredError, isEventNotRegisteredError, SubscriberNotRegisteredError, isSubscriberNotRegisteredError, NoSubscribersExistError, InvalidSchemaError, SubscriberIsStubError, QueueNotFoundError, UnknownQueueReferenceError, isUnknownQueueReferenceError, InvalidEventError, MessageMaybePoisonedError, isMessageMaybePoisonedError, IdempotentMessageCannotRetryError, isIdempotentMessageCannotRetryError, TimeoutError, } from './matador-errors.js';
5
5
  export { CheckpointStoreError, DuplicateIoKeyError, isCheckpointStoreError, isDuplicateIoKeyError, } from './checkpoint-errors.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EACL,WAAW,EACX,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,YAAY,EACZ,cAAc,EAEd,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EAEvB,0BAA0B,EAC1B,4BAA4B,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,gCAAgC,EAEhC,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,oCAAoC,EAEpC,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,EAE5B,iBAAiB,EAEjB,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,mCAAmC,EAEnC,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EACL,WAAW,EACX,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,YAAY,EACZ,cAAc,EAEd,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EAEvB,0BAA0B,EAC1B,4BAA4B,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,gCAAgC,EAChC,qCAAqC,EAErC,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EAErB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,EAE5B,iBAAiB,EAEjB,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,mCAAmC,EAEnC,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -6,9 +6,9 @@ MatadorError, isMatadorError,
6
6
  // Lifecycle errors
7
7
  NotStartedError, isNotStartedError, ShutdownInProgressError,
8
8
  // Transport errors
9
- TransportNotConnectedError, isTransportNotConnectedError, TransportClosedError, TransportSendError, SomeSendError, AllTransportsFailedError, DelayedMessagesNotSupportedError,
9
+ TransportNotConnectedError, isTransportNotConnectedError, TransportClosedError, TransportSendError, SomeSendError, AllTransportsFailedError, DelayedMessagesNotSupportedError, LocalTransportNoActiveSubscriberError,
10
10
  // Schema & configuration errors
11
- EventNotRegisteredError, isEventNotRegisteredError, SubscriberNotRegisteredError, isSubscriberNotRegisteredError, NoSubscribersExistError, InvalidSchemaError, SubscriberIsStubError, LocalTransportCannotProcessStubError,
11
+ EventNotRegisteredError, isEventNotRegisteredError, SubscriberNotRegisteredError, isSubscriberNotRegisteredError, NoSubscribersExistError, InvalidSchemaError, SubscriberIsStubError,
12
12
  // Queue errors
13
13
  QueueNotFoundError, UnknownQueueReferenceError, isUnknownQueueReferenceError,
14
14
  // Event validation errors
@@ -98,6 +98,16 @@ export declare class DelayedMessagesNotSupportedError extends MatadorError {
98
98
  readonly description: string;
99
99
  constructor(transportName: string);
100
100
  }
101
+ /**
102
+ * Thrown when a LocalTransport is sent a message for a queue with no active
103
+ * subscriber in the current process (e.g. the subscriber is a SubscriberStub
104
+ * implemented in another service, or matador.start() hasn't subscribed yet).
105
+ */
106
+ export declare class LocalTransportNoActiveSubscriberError extends MatadorError {
107
+ readonly queue: string;
108
+ readonly description: string;
109
+ constructor(queue: string);
110
+ }
101
111
  /**
102
112
  * Thrown when an event is not registered in the schema.
103
113
  */
@@ -139,14 +149,6 @@ export declare class SubscriberIsStubError extends MatadorError {
139
149
  readonly description: string;
140
150
  constructor(subscriberName: string);
141
151
  }
142
- /**
143
- * Thrown when a LocalTransport tries to process a stub subscriber.
144
- */
145
- export declare class LocalTransportCannotProcessStubError extends MatadorError {
146
- readonly subscriberName: string;
147
- readonly description: string;
148
- constructor(subscriberName: string);
149
- }
150
152
  /**
151
153
  * Thrown when a subscriber's `targetQueue` or a `consumeFrom` entry references
152
154
  * a queue that was never declared in the topology.
@@ -1 +1 @@
1
- {"version":3,"file":"matador-errors.d.ts","sourceRoot":"","sources":["../../src/errors/matador-errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matador-errors.d.ts","sourceRoot":"","sources":["../../src/errors/matador-errors.ts"],"names":[],"mappings":"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"}
@@ -168,6 +168,24 @@ export class DelayedMessagesNotSupportedError extends MatadorError {
168
168
  this.transportName = transportName;
169
169
  }
170
170
  }
171
+ /**
172
+ * Thrown when a LocalTransport is sent a message for a queue with no active
173
+ * subscriber in the current process (e.g. the subscriber is a SubscriberStub
174
+ * implemented in another service, or matador.start() hasn't subscribed yet).
175
+ */
176
+ export class LocalTransportNoActiveSubscriberError extends MatadorError {
177
+ queue;
178
+ description = 'The LocalTransport has no active subscriber for this queue in the current process, ' +
179
+ 'so it cannot guarantee delivery. ' +
180
+ 'ACTION: If the subscriber is a SubscriberStub (implemented in another service), ' +
181
+ 'the local transport can never deliver it locally — a distributed transport like ' +
182
+ 'RabbitMQ is required. If the subscriber should run in this process, ensure ' +
183
+ 'matador.start() has subscribed to this queue before sending.';
184
+ constructor(queue) {
185
+ super(`LocalTransport has no active subscriber for queue "${queue}"; message cannot be delivered.`);
186
+ this.queue = queue;
187
+ }
188
+ }
171
189
  // ============================================================================
172
190
  // Schema & Configuration Errors
173
191
  // ============================================================================
@@ -248,20 +266,6 @@ export class SubscriberIsStubError extends MatadorError {
248
266
  this.subscriberName = subscriberName;
249
267
  }
250
268
  }
251
- /**
252
- * Thrown when a LocalTransport tries to process a stub subscriber.
253
- */
254
- export class LocalTransportCannotProcessStubError extends MatadorError {
255
- subscriberName;
256
- description = 'The LocalTransport cannot process events for SubscriberStubs. ' +
257
- 'ACTION: SubscriberStubs represent remote implementations that only RabbitMQ can route. ' +
258
- 'If using LocalTransport for testing, provide mock implementations instead of stubs. ' +
259
- 'For production fallback scenarios, be aware that stub-targeted events will be dropped.';
260
- constructor(subscriberName) {
261
- super(`LocalTransport cannot process stub subscriber "${subscriberName}". Stub subscribers require a distributed transport like RabbitMQ.`);
262
- this.subscriberName = subscriberName;
263
- }
264
- }
265
269
  // ============================================================================
266
270
  // Queue Errors
267
271
  // ============================================================================