@ido_kawaz/amqp-client 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/kawaz-video-streaming/amqp-client/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/kawaz-video-streaming/amqp-client/actions/workflows/ci.yml)
4
4
 
5
- TypeScript Amqp client for RabbitMQ publishers and consumers.
5
+ TypeScript AMQP client for RabbitMQ publishers and consumers.
6
6
 
7
7
  ## Installation
8
8
 
@@ -10,28 +10,48 @@ TypeScript Amqp client for RabbitMQ publishers and consumers.
10
10
  npm install @ido_kawaz/amqp-client
11
11
  ```
12
12
 
13
- ## Quick start
13
+ ## Quick Start
14
14
 
15
15
  ```ts
16
- import { AmqpClient, Consumer, AmqpConfig } from '@ido_kawaz/amqp-client';
16
+ import {
17
+ AmqpClient,
18
+ Consumer,
19
+ createConsumerBinding,
20
+ type AmqpConfig,
21
+ AmqpRetriableError,
22
+ } from '@ido_kawaz/amqp-client';
23
+
24
+ type OrderCreatedPayload = {
25
+ orderId: string;
26
+ total: number;
27
+ };
28
+
29
+ const binding = createConsumerBinding(
30
+ 'orders.created.queue',
31
+ 'orders.exchange',
32
+ 'orders.created',
33
+ );
34
+
35
+ const isOrderCreatedPayload = (payload: object): payload is OrderCreatedPayload => {
36
+ const candidate = payload as Partial<OrderCreatedPayload>;
37
+ return typeof candidate.orderId === 'string' && typeof candidate.total === 'number';
38
+ };
17
39
 
18
40
  const config: AmqpConfig = {
19
41
  amqpConnectionString: 'amqp://guest:guest@localhost:5672',
20
42
  };
21
43
 
22
44
  async function bootstrap() {
23
- const consumer = new Consumer(
24
- 'orders.queue',
25
- 'orders.exchange',
26
- 'orders.created',
27
- async (message) => {
28
- if (!message) {
29
- return;
45
+ const consumer = new Consumer<OrderCreatedPayload>(
46
+ binding,
47
+ isOrderCreatedPayload,
48
+ async (payload) => {
49
+ if (payload.total <= 0) {
50
+ throw new AmqpRetriableError(new Error('Amount not ready yet'), 5);
30
51
  }
31
52
 
32
- const payload = JSON.parse(message.content.toString());
33
- console.log('received:', payload);
34
- },
53
+ console.log('received order:', payload.orderId);
54
+ }
35
55
  );
36
56
 
37
57
  const client = new AmqpClient(config, [consumer]);
@@ -54,8 +74,7 @@ bootstrap().catch(console.error);
54
74
 
55
75
  `AmqpConfig`
56
76
 
57
- - `amqpConnectionString`: RabbitMQ hostname
58
- - Full RabbitMQ connection URL (for example `amqp://guest:guest@localhost:5672`)
77
+ - `amqpConnectionString`: Full RabbitMQ connection URL (for example `amqp://guest:guest@localhost:5672`)
59
78
 
60
79
  ## API
61
80
 
@@ -65,21 +84,29 @@ bootstrap().catch(console.error);
65
84
  - `start(): Promise<void>`
66
85
  - Connects to RabbitMQ and starts all consumer registrations.
67
86
  - `publish<T>(exchange: string, topic: string, message: T): void`
68
- - JSON serializes payload and publishes it.
87
+ - Serializes payload to JSON and publishes it.
69
88
  - Throws `AmqpUninitializedError` if `start()` has not been called.
70
- - Throws `AmqpPublisherError` if publish returns false.
89
+ - Throws `AmqpPublisherError` if publish returns `false`.
71
90
  - `stop(): Promise<void>`
72
- - Closes channel and connection.
91
+ - Closes channel and connection (if initialized).
73
92
 
74
93
  ### `Consumer`
75
94
 
76
- - `new Consumer(queue, exchange, topic, handler)`
77
- - Asserts queue and exchange and binds queue to topic.
78
- - Calls handler for each message.
95
+ - `new Consumer<Payload>(binding, validatePayload, handlePayload)`
96
+ - Generic `Payload` type is required; binding type is inferred from the binding parameter.
97
+ - `binding: ConsumerBinding` contains `queue`, `exchange`, `topic`.
98
+ - `validatePayload(payload): payload is Payload` validates parsed JSON before handling.
99
+ - `handlePayload(payload)` runs only for valid payloads.
79
100
  - `ack`s on success.
80
- - `nack`s with requeue logic for `AmqpRetriableError`.
101
+ - `nack`s invalid payloads without requeue.
102
+ - `nack`s with requeue for `AmqpRetriableError` while `x-delivery-count < retryLimit`.
81
103
  - `nack`s without requeue for all other errors.
82
104
 
105
+ ### `createConsumerBinding`
106
+
107
+ - `createConsumerBinding(queue, exchange, topic): ConsumerBinding`
108
+ - Helper for creating typed queue/exchange/topic bindings.
109
+
83
110
  ## Errors
84
111
 
85
112
  - `AmqpError`
@@ -97,9 +124,10 @@ bootstrap().catch(console.error);
97
124
  - `npm run clean` — remove build output
98
125
  - `npm test` — run unit tests
99
126
 
100
- ## Publish
127
+ ## Publishing
128
+
101
129
 
102
- - `npm run publish`
130
+ - `npm run package`
103
131
  - Cleans workspace deeply
104
132
  - Reinstalls dependencies
105
133
  - Builds library
@@ -16,23 +16,35 @@ describe('AmqpClient', () => {
16
16
  const baseConfig = {
17
17
  amqpConnectionString: 'amqp://guest:guest@localhost:5672',
18
18
  };
19
- it('starts client and starts registered consumers', async () => {
20
- const consumerStart = jest.fn().mockResolvedValue(undefined);
21
- const consumer = { start: consumerStart };
22
- const channel = {
23
- publish: jest.fn().mockReturnValue(true),
19
+ function createChannel(isPublished = true) {
20
+ return {
21
+ publish: jest.fn().mockReturnValue(isPublished),
24
22
  close: jest.fn().mockResolvedValue(undefined),
25
23
  };
26
- const connection = {
24
+ }
25
+ function createConnection(channel) {
26
+ return {
27
27
  createChannel: jest.fn().mockResolvedValue(channel),
28
28
  close: jest.fn().mockResolvedValue(undefined),
29
29
  };
30
+ }
31
+ beforeEach(() => {
32
+ jest.clearAllMocks();
33
+ });
34
+ it('starts client and starts all registered consumers', async () => {
35
+ const firstConsumerStart = jest.fn().mockResolvedValue(undefined);
36
+ const secondConsumerStart = jest.fn().mockResolvedValue(undefined);
37
+ const firstConsumer = { start: firstConsumerStart };
38
+ const secondConsumer = { start: secondConsumerStart };
39
+ const channel = createChannel();
40
+ const connection = createConnection(channel);
30
41
  amqplib_1.default.connect.mockResolvedValue(connection);
31
- const client = new amqpClient_1.AmqpClient(baseConfig, [consumer]);
42
+ const client = new amqpClient_1.AmqpClient(baseConfig, [firstConsumer, secondConsumer]);
32
43
  await client.start();
33
44
  expect(amqplib_1.default.connect).toHaveBeenCalledWith('amqp://guest:guest@localhost:5672');
34
45
  expect(connection.createChannel).toHaveBeenCalledTimes(1);
35
- expect(consumerStart).toHaveBeenCalledWith(channel);
46
+ expect(firstConsumerStart).toHaveBeenCalledWith(channel);
47
+ expect(secondConsumerStart).toHaveBeenCalledWith(channel);
36
48
  });
37
49
  it('throws AmqpConnectionError when connect fails', async () => {
38
50
  amqplib_1.default.connect.mockRejectedValue(new Error('boom'));
@@ -43,29 +55,27 @@ describe('AmqpClient', () => {
43
55
  const client = new amqpClient_1.AmqpClient(baseConfig, []);
44
56
  expect(() => client.publish('ex', 'topic', { x: 1 })).toThrow(errors_1.AmqpUninitializedError);
45
57
  });
58
+ it('publishes serialized payload when initialized', async () => {
59
+ const channel = createChannel(true);
60
+ const connection = createConnection(channel);
61
+ amqplib_1.default.connect.mockResolvedValue(connection);
62
+ const client = new amqpClient_1.AmqpClient(baseConfig, []);
63
+ await client.start();
64
+ const payload = { orderId: '1', total: 42 };
65
+ client.publish('orders.exchange', 'orders.created', payload);
66
+ expect(channel.publish).toHaveBeenCalledWith('orders.exchange', 'orders.created', Buffer.from(JSON.stringify(payload)));
67
+ });
46
68
  it('throws AmqpPublisherError when publish returns false', async () => {
47
- const channel = {
48
- publish: jest.fn().mockReturnValue(false),
49
- close: jest.fn().mockResolvedValue(undefined),
50
- };
51
- const connection = {
52
- createChannel: jest.fn().mockResolvedValue(channel),
53
- close: jest.fn().mockResolvedValue(undefined),
54
- };
69
+ const channel = createChannel(false);
70
+ const connection = createConnection(channel);
55
71
  amqplib_1.default.connect.mockResolvedValue(connection);
56
72
  const client = new amqpClient_1.AmqpClient(baseConfig, []);
57
73
  await client.start();
58
74
  expect(() => client.publish('ex', 'rk', { ok: true })).toThrow(errors_1.AmqpPublisherError);
59
75
  });
60
76
  it('stops by closing channel and connection', async () => {
61
- const channel = {
62
- publish: jest.fn().mockReturnValue(true),
63
- close: jest.fn().mockResolvedValue(undefined),
64
- };
65
- const connection = {
66
- createChannel: jest.fn().mockResolvedValue(channel),
67
- close: jest.fn().mockResolvedValue(undefined),
68
- };
77
+ const channel = createChannel();
78
+ const connection = createConnection(channel);
69
79
  amqplib_1.default.connect.mockResolvedValue(connection);
70
80
  const client = new amqpClient_1.AmqpClient(baseConfig, []);
71
81
  await client.start();
@@ -73,5 +83,9 @@ describe('AmqpClient', () => {
73
83
  expect(channel.close).toHaveBeenCalledTimes(1);
74
84
  expect(connection.close).toHaveBeenCalledTimes(1);
75
85
  });
86
+ it('stopping before start does not throw', async () => {
87
+ const client = new amqpClient_1.AmqpClient(baseConfig, []);
88
+ await expect(client.stop()).resolves.toBeUndefined();
89
+ });
76
90
  });
77
91
  //# sourceMappingURL=amqpClient.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"amqpClient.test.js","sourceRoot":"","sources":["../../src/__tests__/amqpClient.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"amqpClient.test.js","sourceRoot":"","sources":["../../src/__tests__/amqpClient.test.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const consumer_1 = require("../consumer");
4
4
  const errors_1 = require("../errors");
5
+ const binding_1 = require("../binding");
5
6
  describe('Consumer', () => {
6
- function createMessage(deliveryCount) {
7
+ const binding = (0, binding_1.createConsumerBinding)('orders.queue', 'orders.exchange', 'orders.created');
8
+ function createMessage(payload = { id: '1' }, deliveryCount) {
7
9
  return {
8
10
  properties: {
9
11
  headers: deliveryCount === undefined ? {} : { 'x-delivery-count': deliveryCount },
10
12
  },
11
- content: Buffer.from(JSON.stringify({ id: '1' })),
13
+ content: Buffer.from(JSON.stringify(payload)),
12
14
  };
13
15
  }
14
16
  function createChannel() {
@@ -21,15 +23,20 @@ describe('Consumer', () => {
21
23
  nack: jest.fn(),
22
24
  };
23
25
  }
24
- it('binds queue and acknowledges message on success', async () => {
25
- const handler = jest.fn().mockResolvedValue(undefined);
26
- const consumer = new consumer_1.Consumer('orders.queue', 'orders.exchange', 'orders.created', handler);
26
+ function createConsumer(validatePayload, handlePayload) {
27
+ return new consumer_1.Consumer(binding, validatePayload, handlePayload);
28
+ }
29
+ function createValidationHarness(implementation) {
30
+ const validatePayloadMock = jest.fn(implementation);
31
+ const validatePayload = (payload) => validatePayloadMock(payload);
32
+ return { validatePayload, validatePayloadMock };
33
+ }
34
+ it('establishes binding and starts consuming from queue', async () => {
35
+ const { validatePayload } = createValidationHarness((payload) => typeof payload.id === 'string');
36
+ const handlePayload = jest.fn().mockResolvedValue(undefined);
37
+ const consumer = createConsumer(validatePayload, handlePayload);
27
38
  const channel = createChannel();
28
- const message = createMessage();
29
- channel.consume.mockImplementation(async (_queue, onMessage) => {
30
- await onMessage(message);
31
- return { consumerTag: 'tag' };
32
- });
39
+ channel.consume.mockResolvedValue({ consumerTag: 'tag' });
33
40
  await consumer.start(channel);
34
41
  expect(channel.assertQueue).toHaveBeenCalledWith('orders.queue', {
35
42
  durable: true,
@@ -37,15 +44,60 @@ describe('Consumer', () => {
37
44
  });
38
45
  expect(channel.assertExchange).toHaveBeenCalledWith('orders.exchange', 'topic', { durable: true });
39
46
  expect(channel.bindQueue).toHaveBeenCalledWith('orders.queue', 'orders.exchange', 'orders.created');
40
- expect(handler).toHaveBeenCalledWith(message);
47
+ expect(channel.consume).toHaveBeenCalledWith('orders.queue', expect.any(Function));
48
+ });
49
+ it('ignores null message', async () => {
50
+ const { validatePayload, validatePayloadMock } = createValidationHarness((payload) => typeof payload.id === 'string');
51
+ const handlePayload = jest.fn().mockResolvedValue(undefined);
52
+ const consumer = createConsumer(validatePayload, handlePayload);
53
+ const channel = createChannel();
54
+ channel.consume.mockImplementation(async (_queue, onMessage) => {
55
+ await onMessage(null);
56
+ return { consumerTag: 'tag' };
57
+ });
58
+ await consumer.start(channel);
59
+ expect(validatePayloadMock).not.toHaveBeenCalled();
60
+ expect(handlePayload).not.toHaveBeenCalled();
61
+ expect(channel.ack).not.toHaveBeenCalled();
62
+ expect(channel.nack).not.toHaveBeenCalled();
63
+ });
64
+ it('nacks without requeue when payload validation fails', async () => {
65
+ const { validatePayload, validatePayloadMock } = createValidationHarness((_payload) => false);
66
+ const handlePayload = jest.fn().mockResolvedValue(undefined);
67
+ const consumer = createConsumer(validatePayload, handlePayload);
68
+ const channel = createChannel();
69
+ const message = createMessage({ invalid: true });
70
+ channel.consume.mockImplementation(async (_queue, onMessage) => {
71
+ await onMessage(message);
72
+ return { consumerTag: 'tag' };
73
+ });
74
+ await consumer.start(channel);
75
+ expect(validatePayloadMock).toHaveBeenCalledWith({ invalid: true });
76
+ expect(handlePayload).not.toHaveBeenCalled();
77
+ expect(channel.ack).not.toHaveBeenCalled();
78
+ expect(channel.nack).toHaveBeenCalledWith(message, false, false);
79
+ });
80
+ it('acknowledges message when payload is valid and handler succeeds', async () => {
81
+ const { validatePayload } = createValidationHarness((payload) => typeof payload.id === 'string');
82
+ const handlePayload = jest.fn().mockResolvedValue(undefined);
83
+ const consumer = createConsumer(validatePayload, handlePayload);
84
+ const channel = createChannel();
85
+ const message = createMessage({ id: '123' });
86
+ channel.consume.mockImplementation(async (_queue, onMessage) => {
87
+ await onMessage(message);
88
+ return { consumerTag: 'tag' };
89
+ });
90
+ await consumer.start(channel);
91
+ expect(handlePayload).toHaveBeenCalledWith({ id: '123' });
41
92
  expect(channel.ack).toHaveBeenCalledWith(message);
42
93
  expect(channel.nack).not.toHaveBeenCalled();
43
94
  });
44
95
  it('requeues retriable error when delivery count is below retry limit', async () => {
45
- const handler = jest.fn().mockRejectedValue(new errors_1.AmqpRetriableError(new Error('retry'), 3));
46
- const consumer = new consumer_1.Consumer('q', 'ex', 'topic', handler);
96
+ const { validatePayload } = createValidationHarness((payload) => typeof payload.id === 'string');
97
+ const handlePayload = jest.fn().mockRejectedValue(new errors_1.AmqpRetriableError(new Error('retry'), 3));
98
+ const consumer = createConsumer(validatePayload, handlePayload);
47
99
  const channel = createChannel();
48
- const message = createMessage(1);
100
+ const message = createMessage({ id: '1' }, 1);
49
101
  channel.consume.mockImplementation(async (_queue, onMessage) => {
50
102
  await onMessage(message);
51
103
  return { consumerTag: 'tag' };
@@ -54,10 +106,11 @@ describe('Consumer', () => {
54
106
  expect(channel.nack).toHaveBeenCalledWith(message, false, true);
55
107
  });
56
108
  it('does not requeue retriable error after retry limit', async () => {
57
- const handler = jest.fn().mockRejectedValue(new errors_1.AmqpRetriableError(new Error('retry'), 2));
58
- const consumer = new consumer_1.Consumer('q', 'ex', 'topic', handler);
109
+ const { validatePayload } = createValidationHarness((payload) => typeof payload.id === 'string');
110
+ const handlePayload = jest.fn().mockRejectedValue(new errors_1.AmqpRetriableError(new Error('retry'), 2));
111
+ const consumer = createConsumer(validatePayload, handlePayload);
59
112
  const channel = createChannel();
60
- const message = createMessage('2');
113
+ const message = createMessage({ id: '1' }, '2');
61
114
  channel.consume.mockImplementation(async (_queue, onMessage) => {
62
115
  await onMessage(message);
63
116
  return { consumerTag: 'tag' };
@@ -66,8 +119,9 @@ describe('Consumer', () => {
66
119
  expect(channel.nack).toHaveBeenCalledWith(message, false, false);
67
120
  });
68
121
  it('nacks without requeue for non-retriable errors', async () => {
69
- const handler = jest.fn().mockRejectedValue(new Error('bad-message'));
70
- const consumer = new consumer_1.Consumer('q', 'ex', 'topic', handler);
122
+ const { validatePayload } = createValidationHarness((payload) => typeof payload.id === 'string');
123
+ const handlePayload = jest.fn().mockRejectedValue(new Error('bad-message'));
124
+ const consumer = createConsumer(validatePayload, handlePayload);
71
125
  const channel = createChannel();
72
126
  const message = createMessage();
73
127
  channel.consume.mockImplementation(async (_queue, onMessage) => {
@@ -1 +1 @@
1
- {"version":3,"file":"consumer.test.js","sourceRoot":"","sources":["../../src/__tests__/consumer.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consumer.test.js","sourceRoot":"","sources":["../../src/__tests__/consumer.test.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export declare class AmqpClient {
6
6
  private readonly consumers;
7
7
  connection: ChannelModel | undefined;
8
8
  channel: Channel | undefined;
9
- constructor(config: AmqpConfig, consumers: Consumer[]);
9
+ constructor(config: AmqpConfig, consumers: Consumer<any, any>[]);
10
10
  start(): Promise<void>;
11
11
  publish<T>(exchange: string, topic: string, message: T): void;
12
12
  stop(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"amqpClient.d.ts","sourceRoot":"","sources":["../src/amqpClient.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,qBAAa,UAAU;IAGP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,SAAS;IAF3E,UAAU,EAAE,YAAY,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;gBACA,MAAM,EAAE,UAAU,EAAmB,SAAS,EAAE,QAAQ,EAAE;IAGjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAWvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ9B"}
1
+ {"version":3,"file":"amqpClient.d.ts","sourceRoot":"","sources":["../src/amqpClient.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,qBAAa,UAAU;IAGP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,SAAS;IAF3E,UAAU,EAAE,YAAY,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;gBACA,MAAM,EAAE,UAAU,EAAmB,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IAG3F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAWvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"amqpClient.js","sourceRoot":"","sources":["../src/amqpClient.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAsD;AAEtD,qCAA2F;AAC3F,iCAAwC;AAGxC,MAAa,UAAU;IAGnB,YAA6B,MAAkB,EAAmB,SAAqB;QAA1D,WAAM,GAAN,MAAM,CAAY;QAAmB,cAAS,GAAT,SAAS,CAAY;IACvF,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,iBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACnE,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7E,OAAO,OAAO,CAAC;YACnB,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,4BAAmB,CAAE,KAAe,CAAC,OAAO,EAAE,EAAE,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACxH,CAAC;IACL,CAAC;IAED,OAAO,CAAI,QAAgB,EAAE,KAAa,EAAE,OAAU;QAClD,IAAI,IAAA,aAAK,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,+BAAsB,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,2BAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,IAAA,gBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,IAAA,gBAAQ,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;IACL,CAAC;CACJ;AAtCD,gCAsCC"}
1
+ {"version":3,"file":"amqpClient.js","sourceRoot":"","sources":["../src/amqpClient.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAsD;AAEtD,qCAA2F;AAC3F,iCAAwC;AAGxC,MAAa,UAAU;IAGnB,YAA6B,MAAkB,EAAmB,SAA+B;QAApE,WAAM,GAAN,MAAM,CAAY;QAAmB,cAAS,GAAT,SAAS,CAAsB;IACjG,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,iBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACnE,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7E,OAAO,OAAO,CAAC;YACnB,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,4BAAmB,CAAE,KAAe,CAAC,OAAO,EAAE,EAAE,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACxH,CAAC;IACL,CAAC;IAED,OAAO,CAAI,QAAgB,EAAE,KAAa,EAAE,OAAU;QAClD,IAAI,IAAA,aAAK,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,+BAAsB,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,2BAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,IAAA,gBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,IAAA,gBAAQ,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;IACL,CAAC;CACJ;AAtCD,gCAsCC"}
@@ -0,0 +1,6 @@
1
+ export declare const createConsumerBinding: <Queue extends string, Exchange extends string, Topic extends string>(queue: Queue, exchange: Exchange, topic: Topic) => {
2
+ readonly queue: Queue;
3
+ readonly exchange: Exchange;
4
+ readonly topic: Topic;
5
+ };
6
+ //# sourceMappingURL=binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,GAC9B,KAAK,SAAS,MAAM,EACpB,QAAQ,SAAS,MAAM,EACvB,KAAK,SAAS,MAAM,EACtB,OAAO,KAAK,EAAE,UAAU,QAAQ,EAAE,OAAO,KAAK;;;;CAIrC,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConsumerBinding = void 0;
4
+ const createConsumerBinding = (queue, exchange, topic) => ({
5
+ queue,
6
+ exchange,
7
+ topic,
8
+ });
9
+ exports.createConsumerBinding = createConsumerBinding;
10
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":";;;AAAO,MAAM,qBAAqB,GAAG,CAInC,KAAY,EAAE,QAAkB,EAAE,KAAY,EAAE,EAAE,CAAC,CAAC;IAClD,KAAK;IACL,QAAQ;IACR,KAAK;CACE,CAAA,CAAC;AARC,QAAA,qBAAqB,yBAQtB"}
@@ -1,14 +1,14 @@
1
- import amqp, { Channel } from 'amqplib';
2
- export declare class Consumer {
3
- private readonly queue;
4
- private readonly exchange;
5
- private readonly topic;
6
- private readonly handler;
7
- constructor(queue: string, exchange: string, topic: string, handler: (message: amqp.Message | null) => Promise<void>);
1
+ import { Channel } from 'amqplib';
2
+ import { ConsumerBinding } from './types';
3
+ export declare class Consumer<Payload extends object, Binding extends ConsumerBinding> {
4
+ private readonly binding;
5
+ private readonly validatePayload;
6
+ private readonly handlePayload;
7
+ constructor(binding: Binding, validatePayload: (payload: object) => payload is Payload, handlePayload: (payload: Payload) => Promise<void>);
8
8
  start(channel: Channel): Promise<void>;
9
9
  private shouldRequeue;
10
10
  private getDeliveryCount;
11
- private createAndBindQueue;
11
+ private establishConsumerBinding;
12
12
  private assertQueue;
13
13
  private assertExchange;
14
14
  private bindQueue;
@@ -1 +1 @@
1
- {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGxC,qBAAa,QAAQ;IAEb,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;IAGvE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5C,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;YAYV,kBAAkB;YAMlB,WAAW;YAIX,cAAc;YAId,SAAS;CAG1B"}
1
+ {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,qBAAa,QAAQ,CAAC,OAAO,SAAS,MAAM,EAAE,OAAO,SAAS,eAAe;IAErE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,IAAI,OAAO,EACxD,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC;IAGjE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5C,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;YAYV,wBAAwB;YAMxB,WAAW;YAIX,cAAc;YAId,SAAS;CAG1B"}
package/dist/consumer.js CHANGED
@@ -3,20 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Consumer = void 0;
4
4
  const errors_1 = require("./errors");
5
5
  class Consumer {
6
- constructor(queue, exchange, topic, handler) {
7
- this.queue = queue;
8
- this.exchange = exchange;
9
- this.topic = topic;
10
- this.handler = handler;
6
+ constructor(binding, validatePayload, handlePayload) {
7
+ this.binding = binding;
8
+ this.validatePayload = validatePayload;
9
+ this.handlePayload = handlePayload;
11
10
  }
12
11
  async start(channel) {
13
- await this.createAndBindQueue(channel, this.queue, this.exchange, this.topic);
14
- await channel.consume(this.queue, async (message) => {
12
+ await this.establishConsumerBinding(channel);
13
+ await channel.consume(this.binding.queue, async (message) => {
15
14
  if (!message) {
16
15
  return;
17
16
  }
17
+ const payload = JSON.parse(message.content.toString());
18
+ if (!this.validatePayload(payload)) {
19
+ channel.nack(message, false, false);
20
+ return;
21
+ }
18
22
  try {
19
- await this.handler(message);
23
+ await this.handlePayload(payload);
20
24
  channel.ack(message);
21
25
  }
22
26
  catch (error) {
@@ -45,10 +49,10 @@ class Consumer {
45
49
  }
46
50
  return 0;
47
51
  }
48
- async createAndBindQueue(channel, queue, exchange, topic) {
49
- await this.assertQueue(channel, queue);
50
- await this.assertExchange(channel, exchange);
51
- await this.bindQueue(channel, queue, exchange, topic);
52
+ async establishConsumerBinding(channel) {
53
+ await this.assertQueue(channel, this.binding.queue);
54
+ await this.assertExchange(channel, this.binding.exchange);
55
+ await this.bindQueue(channel, this.binding.queue, this.binding.exchange, this.binding.topic);
52
56
  }
53
57
  async assertQueue(channel, queue) {
54
58
  await channel.assertQueue(queue, { durable: true, arguments: { 'x-queue-type': 'quorum' } });
@@ -1 +1 @@
1
- {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { AmqpClient } from './amqpClient';
2
2
  export { AmqpConfig } from './config';
3
3
  export { Consumer } from './consumer';
4
+ export { createConsumerBinding } from './binding';
4
5
  export { AmqpError, AmqpConnectionError, AmqpPublisherError, AmqpConsumerError, AmqpRetriableError, AmqpFatalError, } from './errors';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EACH,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACjB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EACH,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACjB,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AmqpFatalError = exports.AmqpRetriableError = exports.AmqpConsumerError = exports.AmqpPublisherError = exports.AmqpConnectionError = exports.AmqpError = exports.Consumer = exports.AmqpClient = void 0;
3
+ exports.AmqpFatalError = exports.AmqpRetriableError = exports.AmqpConsumerError = exports.AmqpPublisherError = exports.AmqpConnectionError = exports.AmqpError = exports.createConsumerBinding = exports.Consumer = exports.AmqpClient = void 0;
4
4
  var amqpClient_1 = require("./amqpClient");
5
5
  Object.defineProperty(exports, "AmqpClient", { enumerable: true, get: function () { return amqpClient_1.AmqpClient; } });
6
6
  var consumer_1 = require("./consumer");
7
7
  Object.defineProperty(exports, "Consumer", { enumerable: true, get: function () { return consumer_1.Consumer; } });
8
+ var binding_1 = require("./binding");
9
+ Object.defineProperty(exports, "createConsumerBinding", { enumerable: true, get: function () { return binding_1.createConsumerBinding; } });
8
10
  var errors_1 = require("./errors");
9
11
  Object.defineProperty(exports, "AmqpError", { enumerable: true, get: function () { return errors_1.AmqpError; } });
10
12
  Object.defineProperty(exports, "AmqpConnectionError", { enumerable: true, get: function () { return errors_1.AmqpConnectionError; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AAEnB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,mCAOkB;AANd,mGAAA,SAAS,OAAA;AACT,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAClB,2GAAA,iBAAiB,OAAA;AACjB,4GAAA,kBAAkB,OAAA;AAClB,wGAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AAEnB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAC9B,mCAOkB;AANd,mGAAA,SAAS,OAAA;AACT,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAClB,2GAAA,iBAAiB,OAAA;AACjB,4GAAA,kBAAkB,OAAA;AAClB,wGAAA,cAAc,OAAA"}
package/dist/types.d.ts CHANGED
@@ -6,4 +6,9 @@ export interface AmqpPublishArgs<T> {
6
6
  topic: string;
7
7
  message: T;
8
8
  }
9
+ export interface ConsumerBinding {
10
+ queue: string;
11
+ exchange: string;
12
+ topic: string;
13
+ }
9
14
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC;CACd"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ido_kawaz/amqp-client",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "description": "AMQP client library for Kawaz Plus services",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",