@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.
- package/dist/core/fanout.d.ts +51 -0
- package/dist/core/fanout.d.ts.map +1 -1
- package/dist/core/fanout.js +141 -28
- package/dist/core/fanout.test.js +533 -7
- package/dist/core/matador.d.ts +33 -0
- package/dist/core/matador.d.ts.map +1 -1
- package/dist/core/matador.js +5 -1
- package/dist/core/matador.test.js +242 -6
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/errors/matador-errors.d.ts +10 -8
- package/dist/errors/matador-errors.d.ts.map +1 -1
- package/dist/errors/matador-errors.js +18 -14
- package/dist/index.cjs +215 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/transport/local/local-transport.d.ts +6 -0
- package/dist/transport/local/local-transport.d.ts.map +1 -1
- package/dist/transport/local/local-transport.js +35 -18
- package/dist/transport/local/local-transport.test.js +40 -4
- package/dist/transport/multi/multi-transport.d.ts.map +1 -1
- package/dist/transport/multi/multi-transport.js +3 -0
- package/dist/transport/multi/multi-transport.test.js +82 -0
- package/dist/transport/rabbitmq/rabbitmq-transport.d.ts.map +1 -1
- package/dist/transport/rabbitmq/rabbitmq-transport.js +31 -27
- package/dist/transport/transport.d.ts +6 -0
- package/dist/transport/transport.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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/
|
|
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({
|
|
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({
|
|
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({
|
|
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({
|
|
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({
|
|
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
|
});
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -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,
|
|
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,
|
|
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"}
|
package/dist/errors/index.js
CHANGED
|
@@ -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,
|
|
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
|
// ============================================================================
|