@amqp-contract/worker 0.0.4 → 0.0.6

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
@@ -7,21 +7,17 @@ Type-safe AMQP worker for consuming messages using amqp-contract.
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- pnpm add @amqp-contract/worker amqplib
10
+ pnpm add @amqp-contract/worker
11
11
  ```
12
12
 
13
13
  ## Usage
14
14
 
15
15
  ```typescript
16
- import { createWorker } from '@amqp-contract/worker';
17
- import { connect } from 'amqplib';
16
+ import { TypedAmqpWorker } from '@amqp-contract/worker';
18
17
  import { contract } from './contract';
19
18
 
20
- // Connect to RabbitMQ
21
- const connection = await connect('amqp://localhost');
22
-
23
19
  // Create worker from contract with handlers (automatically connects and starts consuming)
24
- const worker = await createWorker({
20
+ const worker = await TypedAmqpWorker.create({
25
21
  contract,
26
22
  handlers: {
27
23
  processOrder: async (message) => {
@@ -29,7 +25,7 @@ const worker = await createWorker({
29
25
  // Your business logic here
30
26
  },
31
27
  },
32
- connection,
28
+ connection: 'amqp://localhost',
33
29
  });
34
30
 
35
31
  // Worker is already consuming messages
@@ -40,7 +36,7 @@ const worker = await createWorker({
40
36
 
41
37
  ## API
42
38
 
43
- ### `createWorker(options)`
39
+ ### `TypedAmqpWorker.create(options)`
44
40
 
45
41
  Create a type-safe AMQP worker from a contract with message handlers. Automatically connects and starts consuming all messages.
46
42
 
@@ -48,29 +44,9 @@ Create a type-safe AMQP worker from a contract with message handlers. Automatica
48
44
 
49
45
  - `options.contract` - Contract definition
50
46
  - `options.handlers` - Object with handler functions for each consumer
51
- - `options.connection` - amqplib Connection object
52
-
53
- ### `AmqpWorker.connect(connection)`
54
-
55
- Connect to an AMQP broker and set up all exchanges, queues, and bindings defined in the contract.
56
-
57
- **Note:** When using `createWorker()`, this is called automatically.
58
-
59
- ### `AmqpWorker.consume(consumerName)`
60
-
61
- Start consuming messages for a specific consumer.
62
-
63
- ### `AmqpWorker.consumeAll()`
64
-
65
- Start consuming messages for all consumers defined in the contract.
66
-
67
- **Note:** When using `createWorker()`, this is called automatically.
68
-
69
- ### `AmqpWorker.stopConsuming()`
70
-
71
- Stop consuming messages from all consumers.
47
+ - `options.connection` - AMQP connection URL (string) or connection options (Options.Connect)
72
48
 
73
- ### `AmqpWorker.close()`
49
+ ### `TypedAmqpWorker.close()`
74
50
 
75
51
  Stop consuming and close the channel and connection.
76
52
 
package/dist/index.cjs CHANGED
@@ -1,41 +1,75 @@
1
+ let amqplib = require("amqplib");
1
2
 
2
3
  //#region src/worker.ts
3
4
  /**
4
5
  * Type-safe AMQP worker for consuming messages
5
6
  */
6
- var AmqpWorker = class {
7
+ var TypedAmqpWorker = class TypedAmqpWorker {
7
8
  channel = null;
8
9
  connection = null;
9
10
  consumerTags = [];
10
- constructor(contract, handlers) {
11
+ constructor(contract, handlers, connectionOptions) {
11
12
  this.contract = contract;
12
13
  this.handlers = handlers;
14
+ this.connectionOptions = connectionOptions;
15
+ }
16
+ /**
17
+ * Create a type-safe AMQP worker from a contract
18
+ * The worker will automatically connect and start consuming all messages
19
+ */
20
+ static async create(options) {
21
+ const worker = new TypedAmqpWorker(options.contract, options.handlers, options.connection);
22
+ await worker.init();
23
+ await worker.consumeAll();
24
+ return worker;
25
+ }
26
+ /**
27
+ * Close the connection
28
+ */
29
+ async close() {
30
+ await this.stopConsuming();
31
+ if (this.channel) {
32
+ await this.channel.close();
33
+ this.channel = null;
34
+ }
35
+ if (this.connection) {
36
+ await this.connection.close();
37
+ this.connection = null;
38
+ }
13
39
  }
14
40
  /**
15
41
  * Connect to AMQP broker
16
42
  */
17
- async connect(connection) {
18
- this.connection = connection;
19
- this.channel = await connection.createChannel();
20
- if (this.contract.exchanges && this.channel) for (const exchange of Object.values(this.contract.exchanges)) await this.channel.assertExchange(exchange.name, exchange.type, {
43
+ async init() {
44
+ this.connection = await (0, amqplib.connect)(this.connectionOptions);
45
+ this.channel = await this.connection.createChannel();
46
+ if (this.contract.exchanges) for (const exchange of Object.values(this.contract.exchanges)) await this.channel.assertExchange(exchange.name, exchange.type, {
21
47
  durable: exchange.durable,
22
48
  autoDelete: exchange.autoDelete,
23
49
  internal: exchange.internal,
24
50
  arguments: exchange.arguments
25
51
  });
26
- if (this.contract.queues && this.channel) for (const queue of Object.values(this.contract.queues)) await this.channel.assertQueue(queue.name, {
52
+ if (this.contract.queues) for (const queue of Object.values(this.contract.queues)) await this.channel.assertQueue(queue.name, {
27
53
  durable: queue.durable,
28
54
  exclusive: queue.exclusive,
29
55
  autoDelete: queue.autoDelete,
30
56
  arguments: queue.arguments
31
57
  });
32
- if (this.contract.bindings && this.channel) for (const binding of Object.values(this.contract.bindings)) await this.channel.bindQueue(binding.queue, binding.exchange, binding.routingKey ?? "", binding.arguments);
58
+ if (this.contract.bindings) for (const binding of Object.values(this.contract.bindings)) await this.channel.bindQueue(binding.queue, binding.exchange, binding.routingKey ?? "", binding.arguments);
59
+ }
60
+ /**
61
+ * Start consuming messages for all consumers
62
+ */
63
+ async consumeAll() {
64
+ if (!this.contract.consumers) throw new Error("No consumers defined in contract");
65
+ const consumerNames = Object.keys(this.contract.consumers);
66
+ for (const consumerName of consumerNames) await this.consume(consumerName);
33
67
  }
34
68
  /**
35
69
  * Start consuming messages for a specific consumer
36
70
  */
37
71
  async consume(consumerName) {
38
- if (!this.channel) throw new Error("Worker not connected. Call connect() first.");
72
+ if (!this.channel) throw new Error("Worker not initialized. Use TypedAmqpWorker.create() to obtain an initialized worker instance.");
39
73
  const consumers = this.contract.consumers;
40
74
  if (!consumers) throw new Error("No consumers defined in contract");
41
75
  const consumer = consumers[consumerName];
@@ -64,14 +98,6 @@ var AmqpWorker = class {
64
98
  this.consumerTags.push(result.consumerTag);
65
99
  }
66
100
  /**
67
- * Start consuming messages for all consumers
68
- */
69
- async consumeAll() {
70
- if (!this.contract.consumers) throw new Error("No consumers defined in contract");
71
- const consumerNames = Object.keys(this.contract.consumers);
72
- for (const consumerName of consumerNames) await this.consume(consumerName);
73
- }
74
- /**
75
101
  * Stop consuming messages
76
102
  */
77
103
  async stopConsuming() {
@@ -79,32 +105,7 @@ var AmqpWorker = class {
79
105
  for (const tag of this.consumerTags) await this.channel.cancel(tag);
80
106
  this.consumerTags = [];
81
107
  }
82
- /**
83
- * Close the connection
84
- */
85
- async close() {
86
- await this.stopConsuming();
87
- if (this.channel) {
88
- await this.channel.close();
89
- this.channel = null;
90
- }
91
- if (this.connection) {
92
- await this.connection.close();
93
- this.connection = null;
94
- }
95
- }
96
108
  };
97
- /**
98
- * Create a type-safe AMQP worker from a contract
99
- * The worker will automatically connect and start consuming all messages
100
- */
101
- async function createWorker(options) {
102
- const worker = new AmqpWorker(options.contract, options.handlers);
103
- await worker.connect(options.connection);
104
- await worker.consumeAll();
105
- return worker;
106
- }
107
109
 
108
110
  //#endregion
109
- exports.AmqpWorker = AmqpWorker;
110
- exports.createWorker = createWorker;
111
+ exports.TypedAmqpWorker = TypedAmqpWorker;
package/dist/index.d.cts CHANGED
@@ -1,52 +1,53 @@
1
- import { ChannelModel } from "amqplib";
2
- import { ContractDefinition, InferConsumerNames, WorkerInferConsumerHandlers } from "@amqp-contract/contract";
1
+ import { Options } from "amqplib";
2
+ import { ContractDefinition, WorkerInferConsumerHandlers } from "@amqp-contract/contract";
3
3
 
4
4
  //#region src/worker.d.ts
5
5
 
6
+ /**
7
+ * Options for creating a worker
8
+ */
9
+ interface CreateWorkerOptions<TContract extends ContractDefinition> {
10
+ contract: TContract;
11
+ handlers: WorkerInferConsumerHandlers<TContract>;
12
+ connection: string | Options.Connect;
13
+ }
6
14
  /**
7
15
  * Type-safe AMQP worker for consuming messages
8
16
  */
9
- declare class AmqpWorker<TContract extends ContractDefinition> {
17
+ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
10
18
  private readonly contract;
11
19
  private readonly handlers;
20
+ private readonly connectionOptions;
12
21
  private channel;
13
22
  private connection;
14
23
  private consumerTags;
15
- constructor(contract: TContract, handlers: WorkerInferConsumerHandlers<TContract>);
24
+ private constructor();
16
25
  /**
17
- * Connect to AMQP broker
26
+ * Create a type-safe AMQP worker from a contract
27
+ * The worker will automatically connect and start consuming all messages
18
28
  */
19
- connect(connection: ChannelModel): Promise<void>;
29
+ static create<TContract extends ContractDefinition>(options: CreateWorkerOptions<TContract>): Promise<TypedAmqpWorker<TContract>>;
20
30
  /**
21
- * Start consuming messages for a specific consumer
31
+ * Close the connection
32
+ */
33
+ close(): Promise<void>;
34
+ /**
35
+ * Connect to AMQP broker
22
36
  */
23
- consume<TName extends InferConsumerNames<TContract>>(consumerName: TName): Promise<void>;
37
+ private init;
24
38
  /**
25
39
  * Start consuming messages for all consumers
26
40
  */
27
- consumeAll(): Promise<void>;
41
+ private consumeAll;
28
42
  /**
29
- * Stop consuming messages
43
+ * Start consuming messages for a specific consumer
30
44
  */
31
- stopConsuming(): Promise<void>;
45
+ private consume;
32
46
  /**
33
- * Close the connection
47
+ * Stop consuming messages
34
48
  */
35
- close(): Promise<void>;
36
- }
37
- /**
38
- * Options for creating a worker
39
- */
40
- interface CreateWorkerOptions<TContract extends ContractDefinition> {
41
- contract: TContract;
42
- handlers: WorkerInferConsumerHandlers<TContract>;
43
- connection: ChannelModel;
49
+ private stopConsuming;
44
50
  }
45
- /**
46
- * Create a type-safe AMQP worker from a contract
47
- * The worker will automatically connect and start consuming all messages
48
- */
49
- declare function createWorker<TContract extends ContractDefinition>(options: CreateWorkerOptions<TContract>): Promise<AmqpWorker<TContract>>;
50
51
  //#endregion
51
- export { AmqpWorker, type CreateWorkerOptions, createWorker };
52
+ export { type CreateWorkerOptions, TypedAmqpWorker };
52
53
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/worker.ts"],"sourcesContent":[],"mappings":";;;;;;;AAUA;AAA0C,cAA7B,UAA6B,CAAA,kBAAA,kBAAA,CAAA,CAAA;EAMX,iBAAA,QAAA;EAC4B,iBAAA,QAAA;EAA5B,QAAA,OAAA;EAMH,QAAA,UAAA;EAAe,QAAA,YAAA;EA4CM,WAAA,CAAA,QAAA,EAnDlB,SAmDkB,EAAA,QAAA,EAlDlB,2BAkDkB,CAlDU,SAkDV,CAAA;EAAnB;;;EAuFR,OAAA,CAAA,UAAA,EAnIM,YAmIN,CAAA,EAnIqB,OAmIrB,CAAA,IAAA,CAAA;EAeG;;;EAiCR,OAAA,CAAA,cAvIa,kBAuIM,CAvIa,SAuIb,CAAA,CAAA,CAAA,YAAA,EAvIuC,KAuIvC,CAAA,EAvI+C,OAuI/C,CAAA,IAAA,CAAA;EAAmB;;;EAE3C,UAAA,CAAA,CAAA,EAlDU,OAkDV,CAAA,IAAA,CAAA;EACE;;AAOd;EAAqD,aAAA,CAAA,CAAA,EA3C5B,OA2C4B,CAAA,IAAA,CAAA;EACtB;;;EACpB,KAAA,CAAA,CAAA,EA9BM,OA8BN,CAAA,IAAA,CAAA;;;;;UAZM,sCAAsC;YAC3C;YACA,4BAA4B;cAC1B;;;;;;iBAOQ,+BAA+B,6BAC1C,oBAAoB,aAC5B,QAAQ,WAAW"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/worker.ts"],"sourcesContent":[],"mappings":";;;;;;;AAWA;AAAuD,UAAtC,mBAAsC,CAAA,kBAAA,kBAAA,CAAA,CAAA;EAC3C,QAAA,EAAA,SAAA;EAC4B,QAAA,EAA5B,2BAA4B,CAAA,SAAA,CAAA;EAA5B,UAAA,EAAA,MAAA,GACW,OAAA,CAAQ,OADnB;;;AAOZ;;AAewC,cAf3B,eAe2B,CAAA,kBAfO,kBAeP,CAAA,CAAA;EACP,iBAAA,QAAA;EAApB,iBAAA,QAAA;EACgB,iBAAA,iBAAA;EAAhB,QAAA,OAAA;EAAR,QAAA,UAAA;EAUY,QAAA,YAAA;EAAO,QAAA,WAAA,CAAA;;;;;kCAZgB,6BAC3B,oBAAoB,aAC5B,QAAQ,gBAAgB;;;;WAUZ"}
package/dist/index.d.mts CHANGED
@@ -1,52 +1,53 @@
1
- import { ChannelModel } from "amqplib";
2
- import { ContractDefinition, InferConsumerNames, WorkerInferConsumerHandlers } from "@amqp-contract/contract";
1
+ import { Options } from "amqplib";
2
+ import { ContractDefinition, WorkerInferConsumerHandlers } from "@amqp-contract/contract";
3
3
 
4
4
  //#region src/worker.d.ts
5
5
 
6
+ /**
7
+ * Options for creating a worker
8
+ */
9
+ interface CreateWorkerOptions<TContract extends ContractDefinition> {
10
+ contract: TContract;
11
+ handlers: WorkerInferConsumerHandlers<TContract>;
12
+ connection: string | Options.Connect;
13
+ }
6
14
  /**
7
15
  * Type-safe AMQP worker for consuming messages
8
16
  */
9
- declare class AmqpWorker<TContract extends ContractDefinition> {
17
+ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
10
18
  private readonly contract;
11
19
  private readonly handlers;
20
+ private readonly connectionOptions;
12
21
  private channel;
13
22
  private connection;
14
23
  private consumerTags;
15
- constructor(contract: TContract, handlers: WorkerInferConsumerHandlers<TContract>);
24
+ private constructor();
16
25
  /**
17
- * Connect to AMQP broker
26
+ * Create a type-safe AMQP worker from a contract
27
+ * The worker will automatically connect and start consuming all messages
18
28
  */
19
- connect(connection: ChannelModel): Promise<void>;
29
+ static create<TContract extends ContractDefinition>(options: CreateWorkerOptions<TContract>): Promise<TypedAmqpWorker<TContract>>;
20
30
  /**
21
- * Start consuming messages for a specific consumer
31
+ * Close the connection
32
+ */
33
+ close(): Promise<void>;
34
+ /**
35
+ * Connect to AMQP broker
22
36
  */
23
- consume<TName extends InferConsumerNames<TContract>>(consumerName: TName): Promise<void>;
37
+ private init;
24
38
  /**
25
39
  * Start consuming messages for all consumers
26
40
  */
27
- consumeAll(): Promise<void>;
41
+ private consumeAll;
28
42
  /**
29
- * Stop consuming messages
43
+ * Start consuming messages for a specific consumer
30
44
  */
31
- stopConsuming(): Promise<void>;
45
+ private consume;
32
46
  /**
33
- * Close the connection
47
+ * Stop consuming messages
34
48
  */
35
- close(): Promise<void>;
36
- }
37
- /**
38
- * Options for creating a worker
39
- */
40
- interface CreateWorkerOptions<TContract extends ContractDefinition> {
41
- contract: TContract;
42
- handlers: WorkerInferConsumerHandlers<TContract>;
43
- connection: ChannelModel;
49
+ private stopConsuming;
44
50
  }
45
- /**
46
- * Create a type-safe AMQP worker from a contract
47
- * The worker will automatically connect and start consuming all messages
48
- */
49
- declare function createWorker<TContract extends ContractDefinition>(options: CreateWorkerOptions<TContract>): Promise<AmqpWorker<TContract>>;
50
51
  //#endregion
51
- export { AmqpWorker, type CreateWorkerOptions, createWorker };
52
+ export { type CreateWorkerOptions, TypedAmqpWorker };
52
53
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/worker.ts"],"sourcesContent":[],"mappings":";;;;;;;AAUA;AAA0C,cAA7B,UAA6B,CAAA,kBAAA,kBAAA,CAAA,CAAA;EAMX,iBAAA,QAAA;EAC4B,iBAAA,QAAA;EAA5B,QAAA,OAAA;EAMH,QAAA,UAAA;EAAe,QAAA,YAAA;EA4CM,WAAA,CAAA,QAAA,EAnDlB,SAmDkB,EAAA,QAAA,EAlDlB,2BAkDkB,CAlDU,SAkDV,CAAA;EAAnB;;;EAuFR,OAAA,CAAA,UAAA,EAnIM,YAmIN,CAAA,EAnIqB,OAmIrB,CAAA,IAAA,CAAA;EAeG;;;EAiCR,OAAA,CAAA,cAvIa,kBAuIM,CAvIa,SAuIb,CAAA,CAAA,CAAA,YAAA,EAvIuC,KAuIvC,CAAA,EAvI+C,OAuI/C,CAAA,IAAA,CAAA;EAAmB;;;EAE3C,UAAA,CAAA,CAAA,EAlDU,OAkDV,CAAA,IAAA,CAAA;EACE;;AAOd;EAAqD,aAAA,CAAA,CAAA,EA3C5B,OA2C4B,CAAA,IAAA,CAAA;EACtB;;;EACpB,KAAA,CAAA,CAAA,EA9BM,OA8BN,CAAA,IAAA,CAAA;;;;;UAZM,sCAAsC;YAC3C;YACA,4BAA4B;cAC1B;;;;;;iBAOQ,+BAA+B,6BAC1C,oBAAoB,aAC5B,QAAQ,WAAW"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/worker.ts"],"sourcesContent":[],"mappings":";;;;;;;AAWA;AAAuD,UAAtC,mBAAsC,CAAA,kBAAA,kBAAA,CAAA,CAAA;EAC3C,QAAA,EAAA,SAAA;EAC4B,QAAA,EAA5B,2BAA4B,CAAA,SAAA,CAAA;EAA5B,UAAA,EAAA,MAAA,GACW,OAAA,CAAQ,OADnB;;;AAOZ;;AAewC,cAf3B,eAe2B,CAAA,kBAfO,kBAeP,CAAA,CAAA;EACP,iBAAA,QAAA;EAApB,iBAAA,QAAA;EACgB,iBAAA,iBAAA;EAAhB,QAAA,OAAA;EAAR,QAAA,UAAA;EAUY,QAAA,YAAA;EAAO,QAAA,WAAA,CAAA;;;;;kCAZgB,6BAC3B,oBAAoB,aAC5B,QAAQ,gBAAgB;;;;WAUZ"}
package/dist/index.mjs CHANGED
@@ -1,40 +1,75 @@
1
+ import { connect } from "amqplib";
2
+
1
3
  //#region src/worker.ts
2
4
  /**
3
5
  * Type-safe AMQP worker for consuming messages
4
6
  */
5
- var AmqpWorker = class {
7
+ var TypedAmqpWorker = class TypedAmqpWorker {
6
8
  channel = null;
7
9
  connection = null;
8
10
  consumerTags = [];
9
- constructor(contract, handlers) {
11
+ constructor(contract, handlers, connectionOptions) {
10
12
  this.contract = contract;
11
13
  this.handlers = handlers;
14
+ this.connectionOptions = connectionOptions;
15
+ }
16
+ /**
17
+ * Create a type-safe AMQP worker from a contract
18
+ * The worker will automatically connect and start consuming all messages
19
+ */
20
+ static async create(options) {
21
+ const worker = new TypedAmqpWorker(options.contract, options.handlers, options.connection);
22
+ await worker.init();
23
+ await worker.consumeAll();
24
+ return worker;
25
+ }
26
+ /**
27
+ * Close the connection
28
+ */
29
+ async close() {
30
+ await this.stopConsuming();
31
+ if (this.channel) {
32
+ await this.channel.close();
33
+ this.channel = null;
34
+ }
35
+ if (this.connection) {
36
+ await this.connection.close();
37
+ this.connection = null;
38
+ }
12
39
  }
13
40
  /**
14
41
  * Connect to AMQP broker
15
42
  */
16
- async connect(connection) {
17
- this.connection = connection;
18
- this.channel = await connection.createChannel();
19
- if (this.contract.exchanges && this.channel) for (const exchange of Object.values(this.contract.exchanges)) await this.channel.assertExchange(exchange.name, exchange.type, {
43
+ async init() {
44
+ this.connection = await connect(this.connectionOptions);
45
+ this.channel = await this.connection.createChannel();
46
+ if (this.contract.exchanges) for (const exchange of Object.values(this.contract.exchanges)) await this.channel.assertExchange(exchange.name, exchange.type, {
20
47
  durable: exchange.durable,
21
48
  autoDelete: exchange.autoDelete,
22
49
  internal: exchange.internal,
23
50
  arguments: exchange.arguments
24
51
  });
25
- if (this.contract.queues && this.channel) for (const queue of Object.values(this.contract.queues)) await this.channel.assertQueue(queue.name, {
52
+ if (this.contract.queues) for (const queue of Object.values(this.contract.queues)) await this.channel.assertQueue(queue.name, {
26
53
  durable: queue.durable,
27
54
  exclusive: queue.exclusive,
28
55
  autoDelete: queue.autoDelete,
29
56
  arguments: queue.arguments
30
57
  });
31
- if (this.contract.bindings && this.channel) for (const binding of Object.values(this.contract.bindings)) await this.channel.bindQueue(binding.queue, binding.exchange, binding.routingKey ?? "", binding.arguments);
58
+ if (this.contract.bindings) for (const binding of Object.values(this.contract.bindings)) await this.channel.bindQueue(binding.queue, binding.exchange, binding.routingKey ?? "", binding.arguments);
59
+ }
60
+ /**
61
+ * Start consuming messages for all consumers
62
+ */
63
+ async consumeAll() {
64
+ if (!this.contract.consumers) throw new Error("No consumers defined in contract");
65
+ const consumerNames = Object.keys(this.contract.consumers);
66
+ for (const consumerName of consumerNames) await this.consume(consumerName);
32
67
  }
33
68
  /**
34
69
  * Start consuming messages for a specific consumer
35
70
  */
36
71
  async consume(consumerName) {
37
- if (!this.channel) throw new Error("Worker not connected. Call connect() first.");
72
+ if (!this.channel) throw new Error("Worker not initialized. Use TypedAmqpWorker.create() to obtain an initialized worker instance.");
38
73
  const consumers = this.contract.consumers;
39
74
  if (!consumers) throw new Error("No consumers defined in contract");
40
75
  const consumer = consumers[consumerName];
@@ -63,14 +98,6 @@ var AmqpWorker = class {
63
98
  this.consumerTags.push(result.consumerTag);
64
99
  }
65
100
  /**
66
- * Start consuming messages for all consumers
67
- */
68
- async consumeAll() {
69
- if (!this.contract.consumers) throw new Error("No consumers defined in contract");
70
- const consumerNames = Object.keys(this.contract.consumers);
71
- for (const consumerName of consumerNames) await this.consume(consumerName);
72
- }
73
- /**
74
101
  * Stop consuming messages
75
102
  */
76
103
  async stopConsuming() {
@@ -78,32 +105,8 @@ var AmqpWorker = class {
78
105
  for (const tag of this.consumerTags) await this.channel.cancel(tag);
79
106
  this.consumerTags = [];
80
107
  }
81
- /**
82
- * Close the connection
83
- */
84
- async close() {
85
- await this.stopConsuming();
86
- if (this.channel) {
87
- await this.channel.close();
88
- this.channel = null;
89
- }
90
- if (this.connection) {
91
- await this.connection.close();
92
- this.connection = null;
93
- }
94
- }
95
108
  };
96
- /**
97
- * Create a type-safe AMQP worker from a contract
98
- * The worker will automatically connect and start consuming all messages
99
- */
100
- async function createWorker(options) {
101
- const worker = new AmqpWorker(options.contract, options.handlers);
102
- await worker.connect(options.connection);
103
- await worker.consumeAll();
104
- return worker;
105
- }
106
109
 
107
110
  //#endregion
108
- export { AmqpWorker, createWorker };
111
+ export { TypedAmqpWorker };
109
112
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["contract: TContract","handlers: WorkerInferConsumerHandlers<TContract>"],"sources":["../src/worker.ts"],"sourcesContent":["import type { Channel, ChannelModel, ConsumeMessage } from \"amqplib\";\nimport type {\n ContractDefinition,\n InferConsumerNames,\n WorkerInferConsumerHandlers,\n} from \"@amqp-contract/contract\";\n\n/**\n * Type-safe AMQP worker for consuming messages\n */\nexport class AmqpWorker<TContract extends ContractDefinition> {\n private channel: Channel | null = null;\n private connection: ChannelModel | null = null;\n private consumerTags: string[] = [];\n\n constructor(\n private readonly contract: TContract,\n private readonly handlers: WorkerInferConsumerHandlers<TContract>,\n ) {}\n\n /**\n * Connect to AMQP broker\n */\n async connect(connection: ChannelModel): Promise<void> {\n this.connection = connection;\n this.channel = await connection.createChannel();\n\n // Setup exchanges\n if (this.contract.exchanges && this.channel) {\n for (const exchange of Object.values(this.contract.exchanges)) {\n await this.channel.assertExchange(exchange.name, exchange.type, {\n durable: exchange.durable,\n autoDelete: exchange.autoDelete,\n internal: exchange.internal,\n arguments: exchange.arguments,\n });\n }\n }\n\n // Setup queues\n if (this.contract.queues && this.channel) {\n for (const queue of Object.values(this.contract.queues)) {\n await this.channel.assertQueue(queue.name, {\n durable: queue.durable,\n exclusive: queue.exclusive,\n autoDelete: queue.autoDelete,\n arguments: queue.arguments,\n });\n }\n }\n\n // Setup bindings\n if (this.contract.bindings && this.channel) {\n for (const binding of Object.values(this.contract.bindings)) {\n await this.channel.bindQueue(\n binding.queue,\n binding.exchange,\n binding.routingKey ?? \"\",\n binding.arguments,\n );\n }\n }\n }\n\n /**\n * Start consuming messages for a specific consumer\n */\n async consume<TName extends InferConsumerNames<TContract>>(consumerName: TName): Promise<void> {\n if (!this.channel) {\n throw new Error(\"Worker not connected. Call connect() first.\");\n }\n\n const consumers = this.contract.consumers as Record<string, unknown>;\n if (!consumers) {\n throw new Error(\"No consumers defined in contract\");\n }\n\n const consumer = consumers[consumerName as string];\n if (!consumer || typeof consumer !== \"object\") {\n throw new Error(`Consumer \"${String(consumerName)}\" not found in contract`);\n }\n\n const consumerDef = consumer as {\n queue: string;\n message: { \"~standard\": { validate: (value: unknown) => unknown } };\n prefetch?: number;\n noAck?: boolean;\n };\n\n const handler = this.handlers[consumerName];\n if (!handler) {\n throw new Error(`Handler for \"${String(consumerName)}\" not provided`);\n }\n\n // Set prefetch if specified\n if (consumerDef.prefetch !== undefined) {\n await this.channel.prefetch(consumerDef.prefetch);\n }\n\n // Start consuming\n const result = await this.channel.consume(\n consumerDef.queue,\n async (msg: ConsumeMessage | null) => {\n if (!msg) {\n return;\n }\n\n try {\n // Parse message\n const content = JSON.parse(msg.content.toString());\n\n // Validate message using schema\n const validation = consumerDef.message[\"~standard\"].validate(content);\n if (\n typeof validation === \"object\" &&\n validation !== null &&\n \"issues\" in validation &&\n validation.issues\n ) {\n console.error(\"Message validation failed:\", validation.issues);\n // Reject message with no requeue\n this.channel?.nack(msg, false, false);\n return;\n }\n\n const validatedMessage =\n typeof validation === \"object\" && validation !== null && \"value\" in validation\n ? validation.value\n : content;\n\n // Call handler\n await handler(validatedMessage);\n\n // Acknowledge message if not in noAck mode\n if (!consumerDef.noAck) {\n this.channel?.ack(msg);\n }\n } catch (error) {\n console.error(\"Error processing message:\", error);\n // Reject message and requeue\n this.channel?.nack(msg, false, true);\n }\n },\n {\n noAck: consumerDef.noAck ?? false,\n },\n );\n\n this.consumerTags.push(result.consumerTag);\n }\n\n /**\n * Start consuming messages for all consumers\n */\n async consumeAll(): Promise<void> {\n if (!this.contract.consumers) {\n throw new Error(\"No consumers defined in contract\");\n }\n\n const consumerNames = Object.keys(this.contract.consumers) as InferConsumerNames<TContract>[];\n\n for (const consumerName of consumerNames) {\n await this.consume(consumerName);\n }\n }\n\n /**\n * Stop consuming messages\n */\n async stopConsuming(): Promise<void> {\n if (!this.channel) {\n return;\n }\n\n for (const tag of this.consumerTags) {\n await this.channel.cancel(tag);\n }\n\n this.consumerTags = [];\n }\n\n /**\n * Close the connection\n */\n async close(): Promise<void> {\n await this.stopConsuming();\n\n if (this.channel) {\n await this.channel.close();\n this.channel = null;\n }\n\n if (this.connection) {\n await (this.connection as unknown as { close(): Promise<void> }).close();\n this.connection = null;\n }\n }\n}\n\n/**\n * Options for creating a worker\n */\nexport interface CreateWorkerOptions<TContract extends ContractDefinition> {\n contract: TContract;\n handlers: WorkerInferConsumerHandlers<TContract>;\n connection: ChannelModel;\n}\n\n/**\n * Create a type-safe AMQP worker from a contract\n * The worker will automatically connect and start consuming all messages\n */\nexport async function createWorker<TContract extends ContractDefinition>(\n options: CreateWorkerOptions<TContract>,\n): Promise<AmqpWorker<TContract>> {\n const worker = new AmqpWorker(options.contract, options.handlers);\n await worker.connect(options.connection);\n await worker.consumeAll();\n return worker;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["contract: TContract","handlers: WorkerInferConsumerHandlers<TContract>","connectionOptions: string | Options.Connect"],"sources":["../src/worker.ts"],"sourcesContent":["import { connect } from \"amqplib\";\nimport type { Channel, ChannelModel, ConsumeMessage, Options } from \"amqplib\";\nimport type {\n ContractDefinition,\n InferConsumerNames,\n WorkerInferConsumerHandlers,\n} from \"@amqp-contract/contract\";\n\n/**\n * Options for creating a worker\n */\nexport interface CreateWorkerOptions<TContract extends ContractDefinition> {\n contract: TContract;\n handlers: WorkerInferConsumerHandlers<TContract>;\n connection: string | Options.Connect;\n}\n\n/**\n * Type-safe AMQP worker for consuming messages\n */\nexport class TypedAmqpWorker<TContract extends ContractDefinition> {\n private channel: Channel | null = null;\n private connection: ChannelModel | null = null;\n private consumerTags: string[] = [];\n\n private constructor(\n private readonly contract: TContract,\n private readonly handlers: WorkerInferConsumerHandlers<TContract>,\n private readonly connectionOptions: string | Options.Connect,\n ) {}\n\n /**\n * Create a type-safe AMQP worker from a contract\n * The worker will automatically connect and start consuming all messages\n */\n static async create<TContract extends ContractDefinition>(\n options: CreateWorkerOptions<TContract>,\n ): Promise<TypedAmqpWorker<TContract>> {\n const worker = new TypedAmqpWorker(options.contract, options.handlers, options.connection);\n await worker.init();\n await worker.consumeAll();\n return worker;\n }\n\n /**\n * Close the connection\n */\n async close(): Promise<void> {\n await this.stopConsuming();\n\n if (this.channel) {\n await this.channel.close();\n this.channel = null;\n }\n\n if (this.connection) {\n await this.connection.close();\n this.connection = null;\n }\n }\n\n /**\n * Connect to AMQP broker\n */\n private async init(): Promise<void> {\n this.connection = await connect(this.connectionOptions);\n this.channel = await this.connection.createChannel();\n\n // Setup exchanges\n if (this.contract.exchanges) {\n for (const exchange of Object.values(this.contract.exchanges)) {\n await this.channel.assertExchange(exchange.name, exchange.type, {\n durable: exchange.durable,\n autoDelete: exchange.autoDelete,\n internal: exchange.internal,\n arguments: exchange.arguments,\n });\n }\n }\n\n // Setup queues\n if (this.contract.queues) {\n for (const queue of Object.values(this.contract.queues)) {\n await this.channel.assertQueue(queue.name, {\n durable: queue.durable,\n exclusive: queue.exclusive,\n autoDelete: queue.autoDelete,\n arguments: queue.arguments,\n });\n }\n }\n\n // Setup bindings\n if (this.contract.bindings) {\n for (const binding of Object.values(this.contract.bindings)) {\n await this.channel.bindQueue(\n binding.queue,\n binding.exchange,\n binding.routingKey ?? \"\",\n binding.arguments,\n );\n }\n }\n }\n\n /**\n * Start consuming messages for all consumers\n */\n private async consumeAll(): Promise<void> {\n if (!this.contract.consumers) {\n throw new Error(\"No consumers defined in contract\");\n }\n\n const consumerNames = Object.keys(this.contract.consumers) as InferConsumerNames<TContract>[];\n\n for (const consumerName of consumerNames) {\n await this.consume(consumerName);\n }\n }\n\n /**\n * Start consuming messages for a specific consumer\n */\n private async consume<TName extends InferConsumerNames<TContract>>(\n consumerName: TName,\n ): Promise<void> {\n if (!this.channel) {\n throw new Error(\n \"Worker not initialized. Use TypedAmqpWorker.create() to obtain an initialized worker instance.\",\n );\n }\n\n const consumers = this.contract.consumers as Record<string, unknown>;\n if (!consumers) {\n throw new Error(\"No consumers defined in contract\");\n }\n\n const consumer = consumers[consumerName as string];\n if (!consumer || typeof consumer !== \"object\") {\n throw new Error(`Consumer \"${String(consumerName)}\" not found in contract`);\n }\n\n const consumerDef = consumer as {\n queue: string;\n message: { \"~standard\": { validate: (value: unknown) => unknown } };\n prefetch?: number;\n noAck?: boolean;\n };\n\n const handler = this.handlers[consumerName];\n if (!handler) {\n throw new Error(`Handler for \"${String(consumerName)}\" not provided`);\n }\n\n // Set prefetch if specified\n if (consumerDef.prefetch !== undefined) {\n await this.channel.prefetch(consumerDef.prefetch);\n }\n\n // Start consuming\n const result = await this.channel.consume(\n consumerDef.queue,\n async (msg: ConsumeMessage | null) => {\n if (!msg) {\n return;\n }\n\n try {\n // Parse message\n const content = JSON.parse(msg.content.toString());\n\n // Validate message using schema\n const validation = consumerDef.message[\"~standard\"].validate(content);\n if (\n typeof validation === \"object\" &&\n validation !== null &&\n \"issues\" in validation &&\n validation.issues\n ) {\n console.error(\"Message validation failed:\", validation.issues);\n // Reject message with no requeue\n this.channel?.nack(msg, false, false);\n return;\n }\n\n const validatedMessage =\n typeof validation === \"object\" && validation !== null && \"value\" in validation\n ? validation.value\n : content;\n\n // Call handler\n await handler(validatedMessage);\n\n // Acknowledge message if not in noAck mode\n if (!consumerDef.noAck) {\n this.channel?.ack(msg);\n }\n } catch (error) {\n console.error(\"Error processing message:\", error);\n // Reject message and requeue\n this.channel?.nack(msg, false, true);\n }\n },\n {\n noAck: consumerDef.noAck ?? false,\n },\n );\n\n this.consumerTags.push(result.consumerTag);\n }\n\n /**\n * Stop consuming messages\n */\n private async stopConsuming(): Promise<void> {\n if (!this.channel) {\n return;\n }\n\n for (const tag of this.consumerTags) {\n await this.channel.cancel(tag);\n }\n\n this.consumerTags = [];\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amqp-contract/worker",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Worker utilities for consuming messages using amqp-contract",
5
5
  "keywords": [
6
6
  "amqp",
@@ -41,7 +41,7 @@
41
41
  "dist"
42
42
  ],
43
43
  "dependencies": {
44
- "@amqp-contract/contract": "0.0.4"
44
+ "@amqp-contract/contract": "0.0.6"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/amqplib": "0.10.8",
@@ -52,8 +52,8 @@
52
52
  "typescript": "5.9.3",
53
53
  "vitest": "4.0.16",
54
54
  "zod": "4.2.1",
55
- "@amqp-contract/client": "0.0.4",
56
- "@amqp-contract/testing": "0.0.4",
55
+ "@amqp-contract/client": "0.0.6",
56
+ "@amqp-contract/testing": "0.0.6",
57
57
  "@amqp-contract/tsconfig": "0.0.0"
58
58
  },
59
59
  "peerDependencies": {