@amqp-contract/worker 0.4.0 → 0.6.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/docs/index.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ### MessageValidationError
10
10
 
11
- Defined in: [packages/worker/src/errors.ts:35](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L35)
11
+ Defined in: [packages/worker/src/errors.ts:35](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L35)
12
12
 
13
13
  Error thrown when message validation fails
14
14
 
@@ -24,7 +24,7 @@ Error thrown when message validation fails
24
24
  new MessageValidationError(consumerName, issues): MessageValidationError;
25
25
  ```
26
26
 
27
- Defined in: [packages/worker/src/errors.ts:36](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L36)
27
+ Defined in: [packages/worker/src/errors.ts:36](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L36)
28
28
 
29
29
  ###### Parameters
30
30
 
@@ -48,8 +48,8 @@ WorkerError.constructor
48
48
  | Property | Modifier | Type | Description | Inherited from | Defined in |
49
49
  | ------ | ------ | ------ | ------ | ------ | ------ |
50
50
  | <a id="cause"></a> `cause?` | `public` | `unknown` | - | `WorkerError.cause` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es2022.error.d.ts:26 |
51
- | <a id="consumername"></a> `consumerName` | `readonly` | `string` | - | - | [packages/worker/src/errors.ts:37](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L37) |
52
- | <a id="issues"></a> `issues` | `readonly` | `unknown` | - | - | [packages/worker/src/errors.ts:38](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L38) |
51
+ | <a id="consumername"></a> `consumerName` | `readonly` | `string` | - | - | [packages/worker/src/errors.ts:37](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L37) |
52
+ | <a id="issues"></a> `issues` | `readonly` | `unknown` | - | - | [packages/worker/src/errors.ts:38](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L38) |
53
53
  | <a id="message"></a> `message` | `public` | `string` | - | `WorkerError.message` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1077 |
54
54
  | <a id="name"></a> `name` | `public` | `string` | - | `WorkerError.name` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1076 |
55
55
  | <a id="stack"></a> `stack?` | `public` | `string` | - | `WorkerError.stack` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1078 |
@@ -159,7 +159,7 @@ WorkerError.prepareStackTrace
159
159
 
160
160
  ### TechnicalError
161
161
 
162
- Defined in: [packages/worker/src/errors.ts:22](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L22)
162
+ Defined in: [packages/worker/src/errors.ts:22](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L22)
163
163
 
164
164
  Error for technical/runtime failures in worker operations
165
165
  This includes validation failures, parsing failures, and processing failures
@@ -176,7 +176,7 @@ This includes validation failures, parsing failures, and processing failures
176
176
  new TechnicalError(message, cause?): TechnicalError;
177
177
  ```
178
178
 
179
- Defined in: [packages/worker/src/errors.ts:23](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L23)
179
+ Defined in: [packages/worker/src/errors.ts:23](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L23)
180
180
 
181
181
  ###### Parameters
182
182
 
@@ -199,7 +199,7 @@ WorkerError.constructor
199
199
 
200
200
  | Property | Modifier | Type | Description | Inherited from | Defined in |
201
201
  | ------ | ------ | ------ | ------ | ------ | ------ |
202
- | <a id="cause-1"></a> `cause?` | `readonly` | `unknown` | - | `WorkerError.cause` | [packages/worker/src/errors.ts:25](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/errors.ts#L25) |
202
+ | <a id="cause-1"></a> `cause?` | `readonly` | `unknown` | - | `WorkerError.cause` | [packages/worker/src/errors.ts:25](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/errors.ts#L25) |
203
203
  | <a id="message-1"></a> `message` | `public` | `string` | - | `WorkerError.message` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1077 |
204
204
  | <a id="name-1"></a> `name` | `public` | `string` | - | `WorkerError.name` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1076 |
205
205
  | <a id="stack-1"></a> `stack?` | `public` | `string` | - | `WorkerError.stack` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1078 |
@@ -309,7 +309,7 @@ WorkerError.prepareStackTrace
309
309
 
310
310
  ### TypedAmqpWorker
311
311
 
312
- Defined in: [packages/worker/src/worker.ts:83](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L83)
312
+ Defined in: [packages/worker/src/worker.ts:129](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L129)
313
313
 
314
314
  Type-safe AMQP worker for consuming messages from RabbitMQ.
315
315
 
@@ -363,7 +363,7 @@ await worker.close().resultToPromise();
363
363
  close(): Future<Result<void, TechnicalError>>;
364
364
  ```
365
365
 
366
- Defined in: [packages/worker/src/worker.ts:159](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L159)
366
+ Defined in: [packages/worker/src/worker.ts:242](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L242)
367
367
 
368
368
  Close the AMQP channel and connection.
369
369
 
@@ -391,12 +391,12 @@ if (closeResult.isOk()) {
391
391
  static create<TContract>(options): Future<Result<TypedAmqpWorker<TContract>, TechnicalError>>;
392
392
  ```
393
393
 
394
- Defined in: [packages/worker/src/worker.ts:120](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L120)
394
+ Defined in: [packages/worker/src/worker.ts:203](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L203)
395
395
 
396
396
  Create a type-safe AMQP worker from a contract.
397
397
 
398
398
  Connection management (including automatic reconnection) is handled internally
399
- by amqp-connection-manager via the AmqpClient. The worker will set up
399
+ by amqp-connection-manager via the [AmqpClient](https://btravers.github.io/amqp-contract/api/core#amqpclient). The worker will set up
400
400
  consumers for all contract-defined handlers asynchronously in the background
401
401
  once the underlying connection and channels are ready.
402
402
 
@@ -445,7 +445,7 @@ if (workerResult.isError()) {
445
445
  type CreateWorkerOptions<TContract> = object;
446
446
  ```
447
447
 
448
- Defined in: [packages/worker/src/worker.ts:30](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L30)
448
+ Defined in: [packages/worker/src/worker.ts:76](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L76)
449
449
 
450
450
  Options for creating a type-safe AMQP worker.
451
451
 
@@ -455,9 +455,24 @@ Options for creating a type-safe AMQP worker.
455
455
  const options: CreateWorkerOptions<typeof contract> = {
456
456
  contract: myContract,
457
457
  handlers: {
458
+ // Simple handler
458
459
  processOrder: async (message) => {
459
460
  console.log('Processing order:', message.orderId);
460
- }
461
+ },
462
+ // Handler with options (prefetch)
463
+ processPayment: [
464
+ async (message) => {
465
+ console.log('Processing payment:', message.paymentId);
466
+ },
467
+ { prefetch: 10 }
468
+ ],
469
+ // Handler with batch processing
470
+ processNotifications: [
471
+ async (messages) => {
472
+ console.log('Processing batch:', messages.length);
473
+ },
474
+ { batchSize: 5, batchTimeout: 1000 }
475
+ ]
461
476
  },
462
477
  urls: ['amqp://localhost'],
463
478
  connectionOptions: {
@@ -477,11 +492,41 @@ const options: CreateWorkerOptions<typeof contract> = {
477
492
 
478
493
  | Property | Type | Description | Defined in |
479
494
  | ------ | ------ | ------ | ------ |
480
- | <a id="connectionoptions"></a> `connectionOptions?` | `AmqpConnectionManagerOptions` | Optional connection configuration (heartbeat, reconnect settings, etc.) | [packages/worker/src/worker.ts:38](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L38) |
481
- | <a id="contract"></a> `contract` | `TContract` | The AMQP contract definition specifying consumers and their message schemas | [packages/worker/src/worker.ts:32](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L32) |
482
- | <a id="handlers"></a> `handlers` | [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)\<`TContract`\> | Handlers for each consumer defined in the contract | [packages/worker/src/worker.ts:34](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L34) |
483
- | <a id="logger"></a> `logger?` | `Logger` | Optional logger for logging message consumption and errors | [packages/worker/src/worker.ts:40](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L40) |
484
- | <a id="urls"></a> `urls` | `ConnectionUrl`[] | AMQP broker URL(s). Multiple URLs provide failover support | [packages/worker/src/worker.ts:36](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/worker.ts#L36) |
495
+ | <a id="connectionoptions"></a> `connectionOptions?` | `AmqpConnectionManagerOptions` | Optional connection configuration (heartbeat, reconnect settings, etc.) | [packages/worker/src/worker.ts:84](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L84) |
496
+ | <a id="contract"></a> `contract` | `TContract` | The AMQP contract definition specifying consumers and their message schemas | [packages/worker/src/worker.ts:78](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L78) |
497
+ | <a id="handlers"></a> `handlers` | [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)\<`TContract`\> | Handlers for each consumer defined in the contract. Can be a function or a tuple of [handler, options] | [packages/worker/src/worker.ts:80](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L80) |
498
+ | <a id="logger"></a> `logger?` | `Logger` | Optional logger for logging message consumption and errors | [packages/worker/src/worker.ts:86](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L86) |
499
+ | <a id="urls"></a> `urls` | `ConnectionUrl`[] | AMQP broker URL(s). Multiple URLs provide failover support | [packages/worker/src/worker.ts:82](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/worker.ts#L82) |
500
+
501
+ ***
502
+
503
+ ### WorkerInferConsumerBatchHandler()
504
+
505
+ ```ts
506
+ type WorkerInferConsumerBatchHandler<TContract, TName> = (messages) => Promise<void>;
507
+ ```
508
+
509
+ Defined in: [packages/worker/src/types.ts:56](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/types.ts#L56)
510
+
511
+ Infer consumer handler type for batch processing.
512
+ Batch handlers receive an array of messages.
513
+
514
+ #### Type Parameters
515
+
516
+ | Type Parameter |
517
+ | ------ |
518
+ | `TContract` *extends* `ContractDefinition` |
519
+ | `TName` *extends* `InferConsumerNames`\<`TContract`\> |
520
+
521
+ #### Parameters
522
+
523
+ | Parameter | Type |
524
+ | ------ | ------ |
525
+ | `messages` | [`WorkerInferConsumerInput`](#workerinferconsumerinput)\<`TContract`, `TName`\>[] |
526
+
527
+ #### Returns
528
+
529
+ `Promise`\<`void`\>
485
530
 
486
531
  ***
487
532
 
@@ -491,9 +536,11 @@ const options: CreateWorkerOptions<typeof contract> = {
491
536
  type WorkerInferConsumerHandler<TContract, TName> = (message) => Promise<void>;
492
537
  ```
493
538
 
494
- Defined in: [packages/worker/src/types.ts:45](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/types.ts#L45)
539
+ Defined in: [packages/worker/src/types.ts:47](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/types.ts#L47)
495
540
 
496
- Infer consumer handler type for a specific consumer
541
+ Infer consumer handler type for a specific consumer.
542
+ Handlers always receive a single message by default.
543
+ For batch processing, use consumerOptions to configure batch behavior.
497
544
 
498
545
  #### Type Parameters
499
546
 
@@ -514,15 +561,51 @@ Infer consumer handler type for a specific consumer
514
561
 
515
562
  ***
516
563
 
564
+ ### WorkerInferConsumerHandlerEntry
565
+
566
+ ```ts
567
+ type WorkerInferConsumerHandlerEntry<TContract, TName> =
568
+ | WorkerInferConsumerHandler<TContract, TName>
569
+ | readonly [WorkerInferConsumerHandler<TContract, TName>, {
570
+ batchSize?: never;
571
+ batchTimeout?: never;
572
+ prefetch?: number;
573
+ }]
574
+ | readonly [WorkerInferConsumerBatchHandler<TContract, TName>, {
575
+ batchSize: number;
576
+ batchTimeout?: number;
577
+ prefetch?: number;
578
+ }];
579
+ ```
580
+
581
+ Defined in: [packages/worker/src/types.ts:69](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/types.ts#L69)
582
+
583
+ Infer handler entry for a consumer - either a function or a tuple of [handler, options].
584
+
585
+ Three patterns are supported:
586
+ 1. Simple handler: `async (message) => { ... }`
587
+ 2. Handler with prefetch: `[async (message) => { ... }, { prefetch: 10 }]`
588
+ 3. Batch handler: `[async (messages) => { ... }, { batchSize: 5, batchTimeout: 1000 }]`
589
+
590
+ #### Type Parameters
591
+
592
+ | Type Parameter |
593
+ | ------ |
594
+ | `TContract` *extends* `ContractDefinition` |
595
+ | `TName` *extends* `InferConsumerNames`\<`TContract`\> |
596
+
597
+ ***
598
+
517
599
  ### WorkerInferConsumerHandlers
518
600
 
519
601
  ```ts
520
- type WorkerInferConsumerHandlers<TContract> = { [K in InferConsumerNames<TContract>]: WorkerInferConsumerHandler<TContract, K> };
602
+ type WorkerInferConsumerHandlers<TContract> = { [K in InferConsumerNames<TContract>]: WorkerInferConsumerHandlerEntry<TContract, K> };
521
603
  ```
522
604
 
523
- Defined in: [packages/worker/src/types.ts:53](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/types.ts#L53)
605
+ Defined in: [packages/worker/src/types.ts:87](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/types.ts#L87)
524
606
 
525
- Infer all consumer handlers for a contract
607
+ Infer all consumer handlers for a contract.
608
+ Handlers can be either single-message handlers, batch handlers, or a tuple of [handler, options].
526
609
 
527
610
  #### Type Parameters
528
611
 
@@ -538,7 +621,7 @@ Infer all consumer handlers for a contract
538
621
  type WorkerInferConsumerInput<TContract, TName> = ConsumerInferInput<InferConsumer<TContract, TName>>;
539
622
  ```
540
623
 
541
- Defined in: [packages/worker/src/types.ts:37](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/types.ts#L37)
624
+ Defined in: [packages/worker/src/types.ts:37](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/types.ts#L37)
542
625
 
543
626
  Worker perspective types - for consuming messages
544
627
 
@@ -553,95 +636,263 @@ Worker perspective types - for consuming messages
553
636
 
554
637
  ### defineHandler()
555
638
 
639
+ #### Call Signature
640
+
556
641
  ```ts
557
642
  function defineHandler<TContract, TName>(
558
643
  contract,
559
644
  consumerName,
560
- handler): WorkerInferConsumerHandler<TContract, TName>;
645
+ handler): WorkerInferConsumerHandlerEntry<TContract, TName>;
561
646
  ```
562
647
 
563
- Defined in: [packages/worker/src/handlers.ts:73](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/handlers.ts#L73)
648
+ Defined in: [packages/worker/src/handlers.ts:70](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/handlers.ts#L70)
564
649
 
565
650
  Define a type-safe handler for a specific consumer in a contract.
566
651
 
567
652
  This utility allows you to define handlers outside of the worker creation,
568
653
  providing better code organization and reusability.
569
654
 
570
- #### Type Parameters
655
+ Supports three patterns:
656
+ 1. Simple handler: just the function (single message handler)
657
+ 2. Handler with prefetch: [handler, { prefetch: 10 }] (single message handler with config)
658
+ 3. Batch handler: [batchHandler, { batchSize: 5, batchTimeout: 1000 }] (REQUIRES batchSize config)
659
+
660
+ **Important**: Batch handlers (handlers that accept an array of messages) MUST include
661
+ batchSize configuration. You cannot create a batch handler without specifying batchSize.
662
+
663
+ ##### Type Parameters
571
664
 
572
665
  | Type Parameter | Description |
573
666
  | ------ | ------ |
574
667
  | `TContract` *extends* `ContractDefinition` | The contract definition type |
575
668
  | `TName` *extends* `string` \| `number` \| `symbol` | The consumer name from the contract |
576
669
 
577
- #### Parameters
670
+ ##### Parameters
578
671
 
579
672
  | Parameter | Type | Description |
580
673
  | ------ | ------ | ------ |
581
674
  | `contract` | `TContract` | The contract definition containing the consumer |
582
675
  | `consumerName` | `TName` | The name of the consumer from the contract |
583
- | `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)\<`TContract`, `TName`\> | The async handler function that processes messages |
676
+ | `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)\<`TContract`, `TName`\> | The async handler function that processes messages (single or batch) |
584
677
 
585
- #### Returns
678
+ ##### Returns
586
679
 
587
- [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)\<`TContract`, `TName`\>
680
+ [`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)\<`TContract`, `TName`\>
588
681
 
589
682
  A type-safe handler that can be used with TypedAmqpWorker
590
683
 
591
- #### Examples
684
+ ##### Example
592
685
 
593
686
  ```typescript
594
687
  import { defineHandler } from '@amqp-contract/worker';
595
688
  import { orderContract } from './contract';
596
689
 
597
- // Define handler outside of worker creation
690
+ // Simple single-message handler without options
598
691
  const processOrderHandler = defineHandler(
599
692
  orderContract,
600
693
  'processOrder',
601
694
  async (message) => {
602
- // message is fully typed based on the contract
603
695
  console.log('Processing order:', message.orderId);
604
696
  await processPayment(message);
605
697
  }
606
698
  );
607
699
 
608
- // Use the handler in worker
609
- const worker = await TypedAmqpWorker.create({
610
- contract: orderContract,
611
- handlers: {
612
- processOrder: processOrderHandler,
700
+ // Single-message handler with prefetch
701
+ const processOrderWithPrefetch = defineHandler(
702
+ orderContract,
703
+ 'processOrder',
704
+ async (message) => {
705
+ await processOrder(message);
613
706
  },
614
- connection: 'amqp://localhost',
615
- });
707
+ { prefetch: 10 }
708
+ );
709
+
710
+ // Batch handler - MUST include batchSize
711
+ const processBatchOrders = defineHandler(
712
+ orderContract,
713
+ 'processOrders',
714
+ async (messages) => {
715
+ // messages is an array - batchSize configuration is REQUIRED
716
+ await db.insertMany(messages);
717
+ },
718
+ { batchSize: 5, batchTimeout: 1000 }
719
+ );
616
720
  ```
617
721
 
722
+ #### Call Signature
723
+
724
+ ```ts
725
+ function defineHandler<TContract, TName>(
726
+ contract,
727
+ consumerName,
728
+ handler,
729
+ options): WorkerInferConsumerHandlerEntry<TContract, TName>;
730
+ ```
731
+
732
+ Defined in: [packages/worker/src/handlers.ts:78](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/handlers.ts#L78)
733
+
734
+ Define a type-safe handler for a specific consumer in a contract.
735
+
736
+ This utility allows you to define handlers outside of the worker creation,
737
+ providing better code organization and reusability.
738
+
739
+ Supports three patterns:
740
+ 1. Simple handler: just the function (single message handler)
741
+ 2. Handler with prefetch: [handler, { prefetch: 10 }] (single message handler with config)
742
+ 3. Batch handler: [batchHandler, { batchSize: 5, batchTimeout: 1000 }] (REQUIRES batchSize config)
743
+
744
+ **Important**: Batch handlers (handlers that accept an array of messages) MUST include
745
+ batchSize configuration. You cannot create a batch handler without specifying batchSize.
746
+
747
+ ##### Type Parameters
748
+
749
+ | Type Parameter | Description |
750
+ | ------ | ------ |
751
+ | `TContract` *extends* `ContractDefinition` | The contract definition type |
752
+ | `TName` *extends* `string` \| `number` \| `symbol` | The consumer name from the contract |
753
+
754
+ ##### Parameters
755
+
756
+ | Parameter | Type | Description |
757
+ | ------ | ------ | ------ |
758
+ | `contract` | `TContract` | The contract definition containing the consumer |
759
+ | `consumerName` | `TName` | The name of the consumer from the contract |
760
+ | `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)\<`TContract`, `TName`\> | The async handler function that processes messages (single or batch) |
761
+ | `options` | \{ `batchSize?`: `undefined`; `batchTimeout?`: `undefined`; `prefetch?`: `number`; \} | Optional consumer options (prefetch, batchSize, batchTimeout) - For single-message handlers: { prefetch?: number } is optional - For batch handlers: { batchSize: number, batchTimeout?: number } is REQUIRED |
762
+ | `options.batchSize?` | `undefined` | - |
763
+ | `options.batchTimeout?` | `undefined` | - |
764
+ | `options.prefetch?` | `number` | - |
765
+
766
+ ##### Returns
767
+
768
+ [`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)\<`TContract`, `TName`\>
769
+
770
+ A type-safe handler that can be used with TypedAmqpWorker
771
+
772
+ ##### Example
773
+
618
774
  ```typescript
619
- // Define multiple handlers
775
+ import { defineHandler } from '@amqp-contract/worker';
776
+ import { orderContract } from './contract';
777
+
778
+ // Simple single-message handler without options
620
779
  const processOrderHandler = defineHandler(
621
780
  orderContract,
622
781
  'processOrder',
623
782
  async (message) => {
624
- await processOrder(message);
783
+ console.log('Processing order:', message.orderId);
784
+ await processPayment(message);
625
785
  }
626
786
  );
627
787
 
628
- const notifyOrderHandler = defineHandler(
788
+ // Single-message handler with prefetch
789
+ const processOrderWithPrefetch = defineHandler(
629
790
  orderContract,
630
- 'notifyOrder',
791
+ 'processOrder',
631
792
  async (message) => {
632
- await sendNotification(message);
793
+ await processOrder(message);
794
+ },
795
+ { prefetch: 10 }
796
+ );
797
+
798
+ // Batch handler - MUST include batchSize
799
+ const processBatchOrders = defineHandler(
800
+ orderContract,
801
+ 'processOrders',
802
+ async (messages) => {
803
+ // messages is an array - batchSize configuration is REQUIRED
804
+ await db.insertMany(messages);
805
+ },
806
+ { batchSize: 5, batchTimeout: 1000 }
807
+ );
808
+ ```
809
+
810
+ #### Call Signature
811
+
812
+ ```ts
813
+ function defineHandler<TContract, TName>(
814
+ contract,
815
+ consumerName,
816
+ handler,
817
+ options): WorkerInferConsumerHandlerEntry<TContract, TName>;
818
+ ```
819
+
820
+ Defined in: [packages/worker/src/handlers.ts:87](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/handlers.ts#L87)
821
+
822
+ Define a type-safe handler for a specific consumer in a contract.
823
+
824
+ This utility allows you to define handlers outside of the worker creation,
825
+ providing better code organization and reusability.
826
+
827
+ Supports three patterns:
828
+ 1. Simple handler: just the function (single message handler)
829
+ 2. Handler with prefetch: [handler, { prefetch: 10 }] (single message handler with config)
830
+ 3. Batch handler: [batchHandler, { batchSize: 5, batchTimeout: 1000 }] (REQUIRES batchSize config)
831
+
832
+ **Important**: Batch handlers (handlers that accept an array of messages) MUST include
833
+ batchSize configuration. You cannot create a batch handler without specifying batchSize.
834
+
835
+ ##### Type Parameters
836
+
837
+ | Type Parameter | Description |
838
+ | ------ | ------ |
839
+ | `TContract` *extends* `ContractDefinition` | The contract definition type |
840
+ | `TName` *extends* `string` \| `number` \| `symbol` | The consumer name from the contract |
841
+
842
+ ##### Parameters
843
+
844
+ | Parameter | Type | Description |
845
+ | ------ | ------ | ------ |
846
+ | `contract` | `TContract` | The contract definition containing the consumer |
847
+ | `consumerName` | `TName` | The name of the consumer from the contract |
848
+ | `handler` | [`WorkerInferConsumerBatchHandler`](#workerinferconsumerbatchhandler)\<`TContract`, `TName`\> | The async handler function that processes messages (single or batch) |
849
+ | `options` | \{ `batchSize`: `number`; `batchTimeout?`: `number`; `prefetch?`: `number`; \} | Optional consumer options (prefetch, batchSize, batchTimeout) - For single-message handlers: { prefetch?: number } is optional - For batch handlers: { batchSize: number, batchTimeout?: number } is REQUIRED |
850
+ | `options.batchSize` | `number` | - |
851
+ | `options.batchTimeout?` | `number` | - |
852
+ | `options.prefetch?` | `number` | - |
853
+
854
+ ##### Returns
855
+
856
+ [`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)\<`TContract`, `TName`\>
857
+
858
+ A type-safe handler that can be used with TypedAmqpWorker
859
+
860
+ ##### Example
861
+
862
+ ```typescript
863
+ import { defineHandler } from '@amqp-contract/worker';
864
+ import { orderContract } from './contract';
865
+
866
+ // Simple single-message handler without options
867
+ const processOrderHandler = defineHandler(
868
+ orderContract,
869
+ 'processOrder',
870
+ async (message) => {
871
+ console.log('Processing order:', message.orderId);
872
+ await processPayment(message);
633
873
  }
634
874
  );
635
875
 
636
- // Compose handlers
637
- const worker = await TypedAmqpWorker.create({
638
- contract: orderContract,
639
- handlers: {
640
- processOrder: processOrderHandler,
641
- notifyOrder: notifyOrderHandler,
876
+ // Single-message handler with prefetch
877
+ const processOrderWithPrefetch = defineHandler(
878
+ orderContract,
879
+ 'processOrder',
880
+ async (message) => {
881
+ await processOrder(message);
642
882
  },
643
- connection: 'amqp://localhost',
644
- });
883
+ { prefetch: 10 }
884
+ );
885
+
886
+ // Batch handler - MUST include batchSize
887
+ const processBatchOrders = defineHandler(
888
+ orderContract,
889
+ 'processOrders',
890
+ async (messages) => {
891
+ // messages is an array - batchSize configuration is REQUIRED
892
+ await db.insertMany(messages);
893
+ },
894
+ { batchSize: 5, batchTimeout: 1000 }
895
+ );
645
896
  ```
646
897
 
647
898
  ***
@@ -652,7 +903,7 @@ const worker = await TypedAmqpWorker.create({
652
903
  function defineHandlers<TContract>(contract, handlers): WorkerInferConsumerHandlers<TContract>;
653
904
  ```
654
905
 
655
- Defined in: [packages/worker/src/handlers.ts:152](https://github.com/btravers/amqp-contract/blob/6a6c658de853e244d99f97019419401bb9a8d86d/packages/worker/src/handlers.ts#L152)
906
+ Defined in: [packages/worker/src/handlers.ts:181](https://github.com/btravers/amqp-contract/blob/8711ad20abb1d4e537ec473d43e85fac3ebd4d0b/packages/worker/src/handlers.ts#L181)
656
907
 
657
908
  Define multiple type-safe handlers for consumers in a contract.
658
909
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amqp-contract/worker",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Worker utilities for consuming messages using amqp-contract",
5
5
  "keywords": [
6
6
  "amqp",
@@ -44,8 +44,8 @@
44
44
  "dependencies": {
45
45
  "@standard-schema/spec": "1.1.0",
46
46
  "@swan-io/boxed": "3.2.1",
47
- "@amqp-contract/contract": "0.4.0",
48
- "@amqp-contract/core": "0.4.0"
47
+ "@amqp-contract/contract": "0.6.0",
48
+ "@amqp-contract/core": "0.6.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/amqplib": "0.10.8",
@@ -53,14 +53,13 @@
53
53
  "@vitest/coverage-v8": "4.0.16",
54
54
  "amqp-connection-manager": "5.0.0",
55
55
  "amqplib": "0.10.9",
56
- "tsdown": "0.18.2",
56
+ "tsdown": "0.18.3",
57
57
  "typedoc": "0.28.15",
58
58
  "typedoc-plugin-markdown": "4.9.0",
59
59
  "typescript": "5.9.3",
60
60
  "vitest": "4.0.16",
61
61
  "zod": "4.2.1",
62
- "@amqp-contract/client": "0.4.0",
63
- "@amqp-contract/testing": "0.4.0",
62
+ "@amqp-contract/testing": "0.6.0",
64
63
  "@amqp-contract/tsconfig": "0.0.0",
65
64
  "@amqp-contract/typedoc": "0.0.1"
66
65
  },
@@ -68,9 +67,9 @@
68
67
  "build": "tsdown src/index.ts --format cjs,esm --dts --clean",
69
68
  "build:docs": "typedoc",
70
69
  "dev": "tsdown src/index.ts --format cjs,esm --dts --watch",
71
- "test": "vitest run --project unit",
70
+ "test": "vitest run --project integration",
72
71
  "test:integration": "vitest run --project integration",
73
- "test:watch": "vitest --project unit",
72
+ "test:watch": "vitest --project integration",
74
73
  "typecheck": "tsc --noEmit"
75
74
  }
76
75
  }