@zdavison/matador 3.0.0 → 3.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/checkpoint/context.d.ts +1 -1
- package/dist/checkpoint/context.d.ts.map +1 -1
- package/dist/checkpoint/types.d.ts +1 -1
- package/dist/checkpoint/types.d.ts.map +1 -1
- package/dist/codec/json-codec.js +8 -8
- package/dist/codec/rabbitmq-codec.js +4 -4
- package/dist/core/fanout.test.js +22 -22
- package/dist/core/matador.d.ts.map +1 -1
- package/dist/core/matador.js +5 -7
- package/dist/errors/checkpoint-errors.d.ts.map +1 -1
- package/dist/errors/checkpoint-errors.js +1 -2
- package/dist/errors/matador-errors.d.ts.map +1 -1
- package/dist/errors/matador-errors.js +13 -23
- package/dist/errors/retry-errors.test.js +1 -1
- package/dist/index.cjs +61 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/retry/standard-policy.d.ts.map +1 -1
- package/dist/retry/standard-policy.js +1 -2
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/transport/connection-manager.js +1 -1
- package/dist/transport/rabbitmq/rabbitmq-transport.d.ts.map +1 -1
- package/dist/transport/rabbitmq/rabbitmq-transport.js +7 -2
- package/dist/types/subscriber.d.ts +2 -2
- package/dist/types/subscriber.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -39,7 +39,7 @@ export declare class ResumableContext implements SubscriberContext {
|
|
|
39
39
|
string,
|
|
40
40
|
() => Promise<JsonSerializable> | JsonSerializable
|
|
41
41
|
][]>(ops: T): Promise<{
|
|
42
|
-
[K in keyof T]: T[K] extends [string, () => Promise<infer R>
|
|
42
|
+
[K in keyof T]: T[K] extends [string, () => Promise<infer R>] ? R : T[K] extends [string, () => infer R] ? R : never;
|
|
43
43
|
}>;
|
|
44
44
|
/**
|
|
45
45
|
* Clears the checkpoint from storage.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/checkpoint/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,gBAAgB,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CACpD;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAE9C,MAAM,EAAE,sBAAsB;IAa1C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,EAAE,CAAC,CAAC,SAAS,gBAAgB,EACjC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC;IA0CP,GAAG,CACP,CAAC,SAAS,SAAS;QACjB,MAAM;QACN,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;KACnD,EAAE,EAEH,GAAG,EAAE,CAAC,GACL,OAAO,CAAC;SACR,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/checkpoint/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,gBAAgB,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CACpD;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAE9C,MAAM,EAAE,sBAAsB;IAa1C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,EAAE,CAAC,CAAC,SAAS,gBAAgB,EACjC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC;IA0CP,GAAG,CACP,CAAC,SAAS,SAAS;QACjB,MAAM;QACN,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;KACnD,EAAE,EAEH,GAAG,EAAE,CAAC,GACL,OAAO,CAAC;SACR,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GACzD,CAAC,GACD,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,GAClC,CAAC,GACD,KAAK;KACZ,CAAC;IAsEF;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;OAGG;IACH,aAAa,IAAI,UAAU;IAI3B;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;CACF"}
|
|
@@ -76,7 +76,7 @@ export interface SubscriberContext {
|
|
|
76
76
|
string,
|
|
77
77
|
() => Promise<JsonSerializable> | JsonSerializable
|
|
78
78
|
][]>(ops: T): Promise<{
|
|
79
|
-
[K in keyof T]: T[K] extends [string, () => Promise<infer R>
|
|
79
|
+
[K in keyof T]: T[K] extends [string, () => Promise<infer R>] ? R : T[K] extends [string, () => infer R] ? R : never;
|
|
80
80
|
}>;
|
|
81
81
|
/** Current attempt number (1-based) */
|
|
82
82
|
readonly attempt: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/checkpoint/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,gBAAgB,EAAE,GAClB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,CAAC;AAExC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,4CAA4C;IAC5C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,+CAA+C;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3D;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAEzD;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;OAGG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;OAWG;IACH,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAC3B,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAAC;IAEd;;;;;;OAMG;IACH,GAAG,CACD,CAAC,SAAS,SAAS;QACjB,MAAM;QACN,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;KACnD,EAAE,EAEH,GAAG,EAAE,CAAC,GACL,OAAO,CAAC;SACR,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/checkpoint/types.ts"],"names":[],"mappings":"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"}
|
package/dist/codec/json-codec.js
CHANGED
|
@@ -38,26 +38,26 @@ export class JsonCodec {
|
|
|
38
38
|
}
|
|
39
39
|
const envelope = value;
|
|
40
40
|
// Required top-level fields
|
|
41
|
-
if (typeof envelope
|
|
41
|
+
if (typeof envelope.id !== 'string')
|
|
42
42
|
return false;
|
|
43
43
|
if (!('data' in envelope))
|
|
44
44
|
return false;
|
|
45
|
-
if (typeof envelope
|
|
45
|
+
if (typeof envelope.docket !== 'object' || envelope.docket === null)
|
|
46
46
|
return false;
|
|
47
47
|
// Validate docket (routing, processing state, observability)
|
|
48
|
-
const docket = envelope
|
|
48
|
+
const docket = envelope.docket;
|
|
49
49
|
// Routing
|
|
50
|
-
if (typeof docket
|
|
50
|
+
if (typeof docket.eventKey !== 'string')
|
|
51
51
|
return false;
|
|
52
|
-
if (typeof docket
|
|
52
|
+
if (typeof docket.targetSubscriber !== 'string')
|
|
53
53
|
return false;
|
|
54
54
|
// Processing state
|
|
55
|
-
if (typeof docket
|
|
55
|
+
if (typeof docket.attempts !== 'number')
|
|
56
56
|
return false;
|
|
57
|
-
if (typeof docket
|
|
57
|
+
if (typeof docket.createdAt !== 'string')
|
|
58
58
|
return false;
|
|
59
59
|
// Observability
|
|
60
|
-
if (typeof docket
|
|
60
|
+
if (typeof docket.importance !== 'string')
|
|
61
61
|
return false;
|
|
62
62
|
return true;
|
|
63
63
|
}
|
|
@@ -105,8 +105,8 @@ export class RabbitMQCodec {
|
|
|
105
105
|
if (typeof value !== 'object' || value === null)
|
|
106
106
|
return false;
|
|
107
107
|
const obj = value;
|
|
108
|
-
return (typeof obj
|
|
109
|
-
typeof obj
|
|
108
|
+
return (typeof obj.key === 'string' &&
|
|
109
|
+
typeof obj.targetSubscriber === 'string' &&
|
|
110
110
|
'data' in obj &&
|
|
111
111
|
!('payload' in obj));
|
|
112
112
|
}
|
|
@@ -114,7 +114,7 @@ export class RabbitMQCodec {
|
|
|
114
114
|
if (typeof value !== 'object' || value === null)
|
|
115
115
|
return false;
|
|
116
116
|
const obj = value;
|
|
117
|
-
return (typeof obj
|
|
117
|
+
return (typeof obj.id === 'string' && 'data' in obj && !('key' in obj) // Distinguish from v1 which also has 'data'
|
|
118
118
|
);
|
|
119
119
|
}
|
|
120
120
|
decodeV2(body, headers) {
|
|
@@ -164,7 +164,7 @@ export class RabbitMQCodec {
|
|
|
164
164
|
Object.assign(mergedMetadata, body.metadata);
|
|
165
165
|
}
|
|
166
166
|
if (user_id !== undefined && user_id !== null) {
|
|
167
|
-
mergedMetadata
|
|
167
|
+
mergedMetadata.user_id = user_id;
|
|
168
168
|
}
|
|
169
169
|
Object.assign(mergedMetadata, otherUniversal);
|
|
170
170
|
// Try to get attempts from header (v1 also uses x-matador-attempts)
|
package/dist/core/fanout.test.js
CHANGED
|
@@ -227,8 +227,8 @@ describe('FanoutEngine', () => {
|
|
|
227
227
|
});
|
|
228
228
|
await fanout.send(UserCreatedEvent, event);
|
|
229
229
|
const calls = transport.send.mock.calls;
|
|
230
|
-
const envelope1 = calls[0][1];
|
|
231
|
-
const envelope2 = calls[1][1];
|
|
230
|
+
const envelope1 = calls[0]?.[1];
|
|
231
|
+
const envelope2 = calls[1]?.[1];
|
|
232
232
|
expect(envelope1.id).not.toBe(envelope2.id);
|
|
233
233
|
expect(envelope1.docket.targetSubscriber).toBe('subscriber-1');
|
|
234
234
|
expect(envelope2.docket.targetSubscriber).toBe('subscriber-2');
|
|
@@ -254,8 +254,8 @@ describe('FanoutEngine', () => {
|
|
|
254
254
|
});
|
|
255
255
|
await fanout.send(UserCreatedEvent, event);
|
|
256
256
|
const calls = transport.send.mock.calls;
|
|
257
|
-
expect(calls[0][0]).toBe('test.queue-1');
|
|
258
|
-
expect(calls[1][0]).toBe('test.queue-2');
|
|
257
|
+
expect(calls[0]?.[0]).toBe('test.queue-1');
|
|
258
|
+
expect(calls[1]?.[0]).toBe('test.queue-2');
|
|
259
259
|
});
|
|
260
260
|
it('should send to no subscribers when event is not registered', async () => {
|
|
261
261
|
const event = new OrderPlacedEvent({
|
|
@@ -280,7 +280,7 @@ describe('FanoutEngine', () => {
|
|
|
280
280
|
const event = new UserCreatedEventWithMetadata({ userId: '123', email: 'test@example.com' }, { source: 'api', version: 1 });
|
|
281
281
|
await fanout.send(UserCreatedEventWithMetadata, event);
|
|
282
282
|
const envelope = transport.send.mock
|
|
283
|
-
.calls[0][1];
|
|
283
|
+
.calls[0]?.[1];
|
|
284
284
|
expect(envelope.docket.metadata).toEqual({ source: 'api', version: 1 });
|
|
285
285
|
});
|
|
286
286
|
it('should include options metadata in envelope', async () => {
|
|
@@ -299,7 +299,7 @@ describe('FanoutEngine', () => {
|
|
|
299
299
|
};
|
|
300
300
|
await fanout.send(UserCreatedEvent, event, options);
|
|
301
301
|
const envelope = transport.send.mock
|
|
302
|
-
.calls[0][1];
|
|
302
|
+
.calls[0]?.[1];
|
|
303
303
|
expect(envelope.docket.metadata).toEqual({ requestId: 'req-123' });
|
|
304
304
|
});
|
|
305
305
|
it('should merge event and options metadata with options taking precedence', async () => {
|
|
@@ -315,7 +315,7 @@ describe('FanoutEngine', () => {
|
|
|
315
315
|
};
|
|
316
316
|
await fanout.send(UserCreatedEventWithMetadata, event, options);
|
|
317
317
|
const envelope = transport.send.mock
|
|
318
|
-
.calls[0][1];
|
|
318
|
+
.calls[0]?.[1];
|
|
319
319
|
expect(envelope.docket.metadata).toEqual({
|
|
320
320
|
source: 'api',
|
|
321
321
|
version: 2,
|
|
@@ -349,7 +349,7 @@ describe('FanoutEngine', () => {
|
|
|
349
349
|
});
|
|
350
350
|
await fanoutWithHooks.send(UserCreatedEvent, event);
|
|
351
351
|
const envelope = transport.send.mock
|
|
352
|
-
.calls[0][1];
|
|
352
|
+
.calls[0]?.[1];
|
|
353
353
|
expect(envelope.docket.metadata).toEqual({
|
|
354
354
|
environment: 'test',
|
|
355
355
|
hostname: 'test-host',
|
|
@@ -368,7 +368,7 @@ describe('FanoutEngine', () => {
|
|
|
368
368
|
});
|
|
369
369
|
await fanout.send(UserCreatedEvent, event);
|
|
370
370
|
const envelope = transport.send.mock
|
|
371
|
-
.calls[0][1];
|
|
371
|
+
.calls[0]?.[1];
|
|
372
372
|
expect(envelope.docket.metadata).toEqual({});
|
|
373
373
|
});
|
|
374
374
|
});
|
|
@@ -531,9 +531,9 @@ describe('FanoutEngine', () => {
|
|
|
531
531
|
expect(result.subscribersSent).toBe(0);
|
|
532
532
|
expect(result.subscribersSkipped).toBe(0);
|
|
533
533
|
expect(result.errors).toHaveLength(1);
|
|
534
|
-
expect(result.errors[0]
|
|
535
|
-
expect(result.errors[0]
|
|
536
|
-
expect(result.errors[0]
|
|
534
|
+
expect(result.errors[0]?.subscriberName).toBe('handle-user');
|
|
535
|
+
expect(result.errors[0]?.queue).toBe('test.events');
|
|
536
|
+
expect(result.errors[0]?.error).toBeInstanceOf(TransportSendError);
|
|
537
537
|
});
|
|
538
538
|
it('should continue sending to other subscribers after one fails', async () => {
|
|
539
539
|
const failingTransport = {
|
|
@@ -573,7 +573,7 @@ describe('FanoutEngine', () => {
|
|
|
573
573
|
expect(result.subscribersSent).toBe(1);
|
|
574
574
|
expect(result.subscribersSkipped).toBe(0);
|
|
575
575
|
expect(result.errors).toHaveLength(1);
|
|
576
|
-
expect(result.errors[0]
|
|
576
|
+
expect(result.errors[0]?.subscriberName).toBe('subscriber-1');
|
|
577
577
|
});
|
|
578
578
|
it('should wrap non-Error throws as Error in TransportSendError', async () => {
|
|
579
579
|
const failingTransport = {
|
|
@@ -601,8 +601,8 @@ describe('FanoutEngine', () => {
|
|
|
601
601
|
});
|
|
602
602
|
const result = await fanoutWithFailingTransport.send(UserCreatedEvent, event);
|
|
603
603
|
expect(result.errors).toHaveLength(1);
|
|
604
|
-
expect(result.errors[0]
|
|
605
|
-
expect(result.errors[0]
|
|
604
|
+
expect(result.errors[0]?.error).toBeInstanceOf(TransportSendError);
|
|
605
|
+
expect(result.errors[0]?.error.message).toContain('test.events');
|
|
606
606
|
});
|
|
607
607
|
});
|
|
608
608
|
describe('eventsBeingEnqueuedCount tracking', () => {
|
|
@@ -741,7 +741,7 @@ describe('FanoutEngine', () => {
|
|
|
741
741
|
};
|
|
742
742
|
await fanout.send(UserCreatedEvent, event, options);
|
|
743
743
|
const envelope = transport.send.mock
|
|
744
|
-
.calls[0][1];
|
|
744
|
+
.calls[0]?.[1];
|
|
745
745
|
expect(envelope.docket.correlationId).toBe('corr-123');
|
|
746
746
|
});
|
|
747
747
|
it('should propagate same correlation ID to all subscribers', async () => {
|
|
@@ -765,8 +765,8 @@ describe('FanoutEngine', () => {
|
|
|
765
765
|
};
|
|
766
766
|
await fanout.send(UserCreatedEvent, event, options);
|
|
767
767
|
const calls = transport.send.mock.calls;
|
|
768
|
-
const envelope1 = calls[0][1];
|
|
769
|
-
const envelope2 = calls[1][1];
|
|
768
|
+
const envelope1 = calls[0]?.[1];
|
|
769
|
+
const envelope2 = calls[1]?.[1];
|
|
770
770
|
expect(envelope1.docket.correlationId).toBe('corr-456');
|
|
771
771
|
expect(envelope2.docket.correlationId).toBe('corr-456');
|
|
772
772
|
});
|
|
@@ -783,7 +783,7 @@ describe('FanoutEngine', () => {
|
|
|
783
783
|
});
|
|
784
784
|
await fanout.send(UserCreatedEvent, event);
|
|
785
785
|
const envelope = transport.send.mock
|
|
786
|
-
.calls[0][1];
|
|
786
|
+
.calls[0]?.[1];
|
|
787
787
|
expect(envelope.docket.correlationId).toBeUndefined();
|
|
788
788
|
});
|
|
789
789
|
});
|
|
@@ -992,7 +992,7 @@ describe('FanoutEngine', () => {
|
|
|
992
992
|
};
|
|
993
993
|
await fanout.send(UserCreatedEvent, event, options);
|
|
994
994
|
const envelope = transport.send.mock
|
|
995
|
-
.calls[0][1];
|
|
995
|
+
.calls[0]?.[1];
|
|
996
996
|
expect(envelope.docket.scheduledFor).toBeDefined();
|
|
997
997
|
if (envelope.docket.scheduledFor) {
|
|
998
998
|
const scheduledTime = new Date(envelope.docket.scheduledFor).getTime();
|
|
@@ -1031,7 +1031,7 @@ describe('FanoutEngine', () => {
|
|
|
1031
1031
|
});
|
|
1032
1032
|
await fanout.send(UserCreatedEvent, event);
|
|
1033
1033
|
const envelope = transport.send.mock
|
|
1034
|
-
.calls[0][1];
|
|
1034
|
+
.calls[0]?.[1];
|
|
1035
1035
|
expect(envelope.docket.importance).toBe('must-investigate');
|
|
1036
1036
|
});
|
|
1037
1037
|
it('should default to should-investigate when importance not specified', async () => {
|
|
@@ -1047,7 +1047,7 @@ describe('FanoutEngine', () => {
|
|
|
1047
1047
|
});
|
|
1048
1048
|
await fanout.send(UserCreatedEvent, event);
|
|
1049
1049
|
const envelope = transport.send.mock
|
|
1050
|
-
.calls[0][1];
|
|
1050
|
+
.calls[0]?.[1];
|
|
1051
1051
|
expect(envelope.docket.importance).toBe('should-investigate');
|
|
1052
1052
|
});
|
|
1053
1053
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matador.d.ts","sourceRoot":"","sources":["../../src/core/matador.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"matador.d.ts","sourceRoot":"","sources":["../../src/core/matador.ts"],"names":[],"mappings":"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"}
|
package/dist/core/matador.js
CHANGED
|
@@ -170,13 +170,11 @@ export class Matador {
|
|
|
170
170
|
const event = new eventClass(data);
|
|
171
171
|
return this.fanout.send(eventClass, event, options);
|
|
172
172
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return this.fanout.send(eventClass, event, options);
|
|
179
|
-
}
|
|
173
|
+
// Called as: send(event, options?)
|
|
174
|
+
const event = eventOrClass;
|
|
175
|
+
const options = dataOrOptions;
|
|
176
|
+
const eventClass = event.constructor;
|
|
177
|
+
return this.fanout.send(eventClass, event, options);
|
|
180
178
|
}
|
|
181
179
|
/**
|
|
182
180
|
* Gets current handler state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-errors.d.ts","sourceRoot":"","sources":["../../src/errors/checkpoint-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;aASjC,GAAG,EAAE,MAAM;aACX,cAAc,EAAE,MAAM;IATxC,QAAQ,CAAC,WAAW,SAKmB;gBAGrB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"checkpoint-errors.d.ts","sourceRoot":"","sources":["../../src/errors/checkpoint-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;aASjC,GAAG,EAAE,MAAM;aACX,cAAc,EAAE,MAAM;IATxC,QAAQ,CAAC,WAAW,SAKmB;gBAGrB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM;CAMzC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;aAOlC,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ;aACnC,UAAU,EAAE,MAAM;aAClB,KAAK,EAAE,KAAK;IAR9B,QAAQ,CAAC,WAAW,SAGsD;gBAGxD,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,EACnC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK;CAM/B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAE9B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,oBAAoB,CAE/B"}
|
|
@@ -12,8 +12,7 @@ export class DuplicateIoKeyError extends MatadorError {
|
|
|
12
12
|
'For dynamic operations (e.g., loops), include a unique identifier in the key ' +
|
|
13
13
|
'(e.g., `process-item-${item.id}`).';
|
|
14
14
|
constructor(key, subscriberName) {
|
|
15
|
-
super(`Duplicate io key "${key}" in subscriber "${subscriberName}".
|
|
16
|
-
`Each io() call must have a unique key.`);
|
|
15
|
+
super(`Duplicate io key "${key}" in subscriber "${subscriberName}". Each io() call must have a unique key.`);
|
|
17
16
|
this.key = key;
|
|
18
17
|
this.subscriberName = subscriberName;
|
|
19
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matador-errors.d.ts","sourceRoot":"","sources":["../../src/errors/matador-errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,8BAAsB,YAAa,SAAQ,KAAK;IAC9C;;;OAGG;IACH,SAAiB,IAAI,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAE1B,OAAO,EAAE,MAAM;IAY3B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQlC;AAMD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,WAAW,SAGkD;gBAE1D,SAAS,SAAc;CAKpC;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,QAAQ,CAAC,WAAW,SAI4C;;CAKjE;AAMD;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,YAAY;aAQxC,aAAa,EAAE,MAAM;IAPvC,QAAQ,CAAC,WAAW,SAI+C;gBAGjD,aAAa,EAAE,MAAM,EACrC,SAAS,SAAc;
|
|
1
|
+
{"version":3,"file":"matador-errors.d.ts","sourceRoot":"","sources":["../../src/errors/matador-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,8 +69,7 @@ export class TransportNotConnectedError extends MatadorError {
|
|
|
69
69
|
'Check that the broker (e.g., RabbitMQ) is running and accessible. ' +
|
|
70
70
|
'Verify connection settings (URL, credentials, network access).';
|
|
71
71
|
constructor(transportName, operation = 'operation') {
|
|
72
|
-
super(`Cannot perform ${operation}: Transport "${transportName}" is not connected.
|
|
73
|
-
`Ensure connect() was called and the broker is accessible.`);
|
|
72
|
+
super(`Cannot perform ${operation}: Transport "${transportName}" is not connected. Ensure connect() was called and the broker is accessible.`);
|
|
74
73
|
this.transportName = transportName;
|
|
75
74
|
}
|
|
76
75
|
}
|
|
@@ -145,8 +144,8 @@ export class DelayedMessagesNotSupportedError extends MatadorError {
|
|
|
145
144
|
'Then restart RabbitMQ and reconnect. ' +
|
|
146
145
|
'Alternatively, remove delayMs from your event options if delays are not required.';
|
|
147
146
|
constructor(transportName) {
|
|
148
|
-
super(
|
|
149
|
-
|
|
147
|
+
super('Delayed messages require the RabbitMQ delayed message exchange plugin. ' +
|
|
148
|
+
'Install rabbitmq_delayed_message_exchange or remove delayMs from event options.');
|
|
150
149
|
this.transportName = transportName;
|
|
151
150
|
}
|
|
152
151
|
}
|
|
@@ -163,8 +162,7 @@ export class EventNotRegisteredError extends MatadorError {
|
|
|
163
162
|
'If this occurs during message consumption, it may indicate schema drift between services. ' +
|
|
164
163
|
'Ensure all services have matching schema registrations for shared events.';
|
|
165
164
|
constructor(eventKey) {
|
|
166
|
-
super(`Event "${eventKey}" is not registered in schema.
|
|
167
|
-
`Register it using matador.register(EventClass, subscribers).`);
|
|
165
|
+
super(`Event "${eventKey}" is not registered in schema. Register it using matador.register(EventClass, subscribers).`);
|
|
168
166
|
this.eventKey = eventKey;
|
|
169
167
|
}
|
|
170
168
|
}
|
|
@@ -181,9 +179,7 @@ export class SubscriberNotRegisteredError extends MatadorError {
|
|
|
181
179
|
'(3) A deployment is in progress with different schema versions. ' +
|
|
182
180
|
'Check the dead-letter queue for affected messages.';
|
|
183
181
|
constructor(subscriberName, eventKey) {
|
|
184
|
-
super(`Subscriber "${subscriberName}" is not registered`
|
|
185
|
-
(eventKey ? ` for event "${eventKey}"` : '') +
|
|
186
|
-
'. Check schema registration.');
|
|
182
|
+
super(`Subscriber "${subscriberName}" is not registered${eventKey ? ` for event "${eventKey}"` : ''}. Check schema registration.`);
|
|
187
183
|
this.subscriberName = subscriberName;
|
|
188
184
|
this.eventKey = eventKey;
|
|
189
185
|
}
|
|
@@ -198,8 +194,7 @@ export class NoSubscribersExistError extends MatadorError {
|
|
|
198
194
|
'If subscribers were intentionally removed, consider also removing the event dispatch. ' +
|
|
199
195
|
'Events without subscribers are not useful and may indicate configuration issues.';
|
|
200
196
|
constructor(eventKey) {
|
|
201
|
-
super(`No subscribers registered for event "${eventKey}".
|
|
202
|
-
`Add subscribers using matador.register(EventClass, [subscriber1, subscriber2]).`);
|
|
197
|
+
super(`No subscribers registered for event "${eventKey}". Add subscribers using matador.register(EventClass, [subscriber1, subscriber2]).`);
|
|
203
198
|
this.eventKey = eventKey;
|
|
204
199
|
}
|
|
205
200
|
}
|
|
@@ -215,7 +210,7 @@ export class InvalidSchemaError extends MatadorError {
|
|
|
215
210
|
'(3) Invalid alias configuration. ' +
|
|
216
211
|
'Check the cause property for specific details.';
|
|
217
212
|
constructor(message, cause) {
|
|
218
|
-
super(`Invalid schema: ${message}
|
|
213
|
+
super(`Invalid schema: ${message}${cause ? `. Cause: ${cause}` : ''}`);
|
|
219
214
|
this.cause = cause;
|
|
220
215
|
}
|
|
221
216
|
}
|
|
@@ -230,8 +225,7 @@ export class SubscriberIsStubError extends MatadorError {
|
|
|
230
225
|
'In the consumer service, provide a full Subscriber with a callback function. ' +
|
|
231
226
|
'Remove the stub from the consumer schema and add the actual implementation.';
|
|
232
227
|
constructor(subscriberName) {
|
|
233
|
-
super(`Subscriber "${subscriberName}" is a stub and cannot be processed locally.
|
|
234
|
-
`Replace with a full Subscriber implementation in the consumer schema.`);
|
|
228
|
+
super(`Subscriber "${subscriberName}" is a stub and cannot be processed locally. Replace with a full Subscriber implementation in the consumer schema.`);
|
|
235
229
|
this.subscriberName = subscriberName;
|
|
236
230
|
}
|
|
237
231
|
}
|
|
@@ -245,8 +239,7 @@ export class LocalTransportCannotProcessStubError extends MatadorError {
|
|
|
245
239
|
'If using LocalTransport for testing, provide mock implementations instead of stubs. ' +
|
|
246
240
|
'For production fallback scenarios, be aware that stub-targeted events will be dropped.';
|
|
247
241
|
constructor(subscriberName) {
|
|
248
|
-
super(`LocalTransport cannot process stub subscriber "${subscriberName}".
|
|
249
|
-
`Stub subscribers require a distributed transport like RabbitMQ.`);
|
|
242
|
+
super(`LocalTransport cannot process stub subscriber "${subscriberName}". Stub subscribers require a distributed transport like RabbitMQ.`);
|
|
250
243
|
this.subscriberName = subscriberName;
|
|
251
244
|
}
|
|
252
245
|
}
|
|
@@ -263,8 +256,7 @@ export class QueueNotFoundError extends MatadorError {
|
|
|
263
256
|
'Call transport.applyTopology() or matador.start() to create queues. ' +
|
|
264
257
|
'Check that the queue name matches the topology definition.';
|
|
265
258
|
constructor(queueName) {
|
|
266
|
-
super(`Queue "${queueName}" not found.
|
|
267
|
-
`Ensure it is defined in topology and applyTopology() was called.`);
|
|
259
|
+
super(`Queue "${queueName}" not found. Ensure it is defined in topology and applyTopology() was called.`);
|
|
268
260
|
this.queueName = queueName;
|
|
269
261
|
}
|
|
270
262
|
}
|
|
@@ -282,7 +274,7 @@ export class InvalidEventError extends MatadorError {
|
|
|
282
274
|
'null/undefined data when the event type requires data, ' +
|
|
283
275
|
'malformed event structure from codec decode failure.';
|
|
284
276
|
constructor(message, cause) {
|
|
285
|
-
super(`Invalid event: ${message}
|
|
277
|
+
super(`Invalid event: ${message}${cause ? `. Cause: ${cause}` : ''}`);
|
|
286
278
|
this.cause = cause;
|
|
287
279
|
}
|
|
288
280
|
}
|
|
@@ -304,8 +296,7 @@ export class MessageMaybePoisonedError extends MatadorError {
|
|
|
304
296
|
'(4) Consider increasing processing timeout if the operation is legitimately slow. ' +
|
|
305
297
|
'This message will NOT be retried to prevent crash loops.';
|
|
306
298
|
constructor(eventId, deliveryCount, maxDeliveries) {
|
|
307
|
-
super(`Message "${eventId}" delivered ${deliveryCount} times (max: ${maxDeliveries}).
|
|
308
|
-
`Possible poison message - will not be retried.`);
|
|
299
|
+
super(`Message "${eventId}" delivered ${deliveryCount} times (max: ${maxDeliveries}). Possible poison message - will not be retried.`);
|
|
309
300
|
this.eventId = eventId;
|
|
310
301
|
this.deliveryCount = deliveryCount;
|
|
311
302
|
this.maxDeliveries = maxDeliveries;
|
|
@@ -324,8 +315,7 @@ export class IdempotentMessageCannotRetryError extends MatadorError {
|
|
|
324
315
|
'(3) Manually inspect and replay the message from the dead-letter queue after verification. ' +
|
|
325
316
|
'The message will be sent to the dead-letter queue for manual review.';
|
|
326
317
|
constructor(eventId, subscriberName) {
|
|
327
|
-
super(`Non-idempotent subscriber "${subscriberName}" cannot retry redelivered message "${eventId}".
|
|
328
|
-
`Mark subscriber as idempotent='yes' or implement idempotency handling.`);
|
|
318
|
+
super(`Non-idempotent subscriber "${subscriberName}" cannot retry redelivered message "${eventId}". Mark subscriber as idempotent='yes' or implement idempotency handling.`);
|
|
329
319
|
this.eventId = eventId;
|
|
330
320
|
this.subscriberName = subscriberName;
|
|
331
321
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from 'bun:test';
|
|
2
2
|
import { createEnvelope } from '../types/envelope.js';
|
|
3
|
-
import {
|
|
3
|
+
import { DoRetry, DontRetry, EventAssertionError, assertEvent, isAssertionError, isDoRetry, isDontRetry, } from './retry-errors.js';
|
|
4
4
|
function createTestEnvelope(data = { foo: 'bar' }) {
|
|
5
5
|
return createEnvelope({
|
|
6
6
|
data,
|