@amqp-contract/worker 0.5.0 → 0.7.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 +20 -6
- package/dist/index.cjs +209 -93
- package/dist/index.d.cts +99 -41
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +99 -41
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +209 -93
- package/dist/index.mjs.map +1 -1
- package/docs/index.md +306 -55
- package/package.json +16 -9
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/
|
|
11
|
+
Defined in: [packages/worker/src/errors.ts:35](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/
|
|
27
|
+
Defined in: [packages/worker/src/errors.ts:36](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/
|
|
52
|
-
| <a id="issues"></a> `issues` | `readonly` | `unknown` | - | - | [packages/worker/src/errors.ts:38](https://github.com/btravers/amqp-contract/blob/
|
|
51
|
+
| <a id="consumername"></a> `consumerName` | `readonly` | `string` | - | - | [packages/worker/src/errors.ts:37](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/
|
|
162
|
+
Defined in: [packages/worker/src/errors.ts:22](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/
|
|
179
|
+
Defined in: [packages/worker/src/errors.ts:23](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/
|
|
202
|
+
| <a id="cause-1"></a> `cause?` | `readonly` | `unknown` | - | `WorkerError.cause` | [packages/worker/src/errors.ts:25](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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:
|
|
312
|
+
Defined in: [packages/worker/src/worker.ts:130](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L130)
|
|
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:
|
|
366
|
+
Defined in: [packages/worker/src/worker.ts:244](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L244)
|
|
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:
|
|
394
|
+
Defined in: [packages/worker/src/worker.ts:205](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L205)
|
|
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:
|
|
448
|
+
Defined in: [packages/worker/src/worker.ts:77](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L77)
|
|
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:
|
|
481
|
-
| <a id="contract"></a> `contract` | `TContract` | The AMQP contract definition specifying consumers and their message schemas | [packages/worker/src/worker.ts:
|
|
482
|
-
| <a id="handlers"></a> `handlers` | [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)\<`TContract`\> | Handlers for each consumer defined in the contract | [packages/worker/src/worker.ts:
|
|
483
|
-
| <a id="logger"></a> `logger?` | `Logger` | Optional logger for logging message consumption and errors | [packages/worker/src/worker.ts:
|
|
484
|
-
| <a id="urls"></a> `urls` | `ConnectionUrl`[] | AMQP broker URL(s). Multiple URLs provide failover support | [packages/worker/src/worker.ts:
|
|
495
|
+
| <a id="connectionoptions"></a> `connectionOptions?` | `AmqpConnectionManagerOptions` | Optional connection configuration (heartbeat, reconnect settings, etc.) | [packages/worker/src/worker.ts:85](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L85) |
|
|
496
|
+
| <a id="contract"></a> `contract` | `TContract` | The AMQP contract definition specifying consumers and their message schemas | [packages/worker/src/worker.ts:79](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L79) |
|
|
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:81](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L81) |
|
|
498
|
+
| <a id="logger"></a> `logger?` | `Logger` | Optional logger for logging message consumption and errors | [packages/worker/src/worker.ts:87](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L87) |
|
|
499
|
+
| <a id="urls"></a> `urls` | `ConnectionUrl`[] | AMQP broker URL(s). Multiple URLs provide failover support | [packages/worker/src/worker.ts:83](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/packages/worker/src/worker.ts#L83) |
|
|
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/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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:
|
|
539
|
+
Defined in: [packages/worker/src/types.ts:47](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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>]:
|
|
602
|
+
type WorkerInferConsumerHandlers<TContract> = { [K in InferConsumerNames<TContract>]: WorkerInferConsumerHandlerEntry<TContract, K> };
|
|
521
603
|
```
|
|
522
604
|
|
|
523
|
-
Defined in: [packages/worker/src/types.ts:
|
|
605
|
+
Defined in: [packages/worker/src/types.ts:87](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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/
|
|
624
|
+
Defined in: [packages/worker/src/types.ts:37](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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):
|
|
645
|
+
handler): WorkerInferConsumerHandlerEntry<TContract, TName>;
|
|
561
646
|
```
|
|
562
647
|
|
|
563
|
-
Defined in: [packages/worker/src/handlers.ts:
|
|
648
|
+
Defined in: [packages/worker/src/handlers.ts:70](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
678
|
+
##### Returns
|
|
586
679
|
|
|
587
|
-
[`
|
|
680
|
+
[`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)\<`TContract`, `TName`\>
|
|
588
681
|
|
|
589
682
|
A type-safe handler that can be used with TypedAmqpWorker
|
|
590
683
|
|
|
591
|
-
|
|
684
|
+
##### Example
|
|
592
685
|
|
|
593
686
|
```typescript
|
|
594
687
|
import { defineHandler } from '@amqp-contract/worker';
|
|
595
688
|
import { orderContract } from './contract';
|
|
596
689
|
|
|
597
|
-
//
|
|
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
|
-
//
|
|
609
|
-
const
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
700
|
+
// Single-message handler with prefetch
|
|
701
|
+
const processOrderWithPrefetch = defineHandler(
|
|
702
|
+
orderContract,
|
|
703
|
+
'processOrder',
|
|
704
|
+
async (message) => {
|
|
705
|
+
await processOrder(message);
|
|
613
706
|
},
|
|
614
|
-
|
|
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/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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
|
-
|
|
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
|
-
|
|
783
|
+
console.log('Processing order:', message.orderId);
|
|
784
|
+
await processPayment(message);
|
|
625
785
|
}
|
|
626
786
|
);
|
|
627
787
|
|
|
628
|
-
|
|
788
|
+
// Single-message handler with prefetch
|
|
789
|
+
const processOrderWithPrefetch = defineHandler(
|
|
629
790
|
orderContract,
|
|
630
|
-
'
|
|
791
|
+
'processOrder',
|
|
631
792
|
async (message) => {
|
|
632
|
-
await
|
|
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/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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
|
-
//
|
|
637
|
-
const
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
876
|
+
// Single-message handler with prefetch
|
|
877
|
+
const processOrderWithPrefetch = defineHandler(
|
|
878
|
+
orderContract,
|
|
879
|
+
'processOrder',
|
|
880
|
+
async (message) => {
|
|
881
|
+
await processOrder(message);
|
|
642
882
|
},
|
|
643
|
-
|
|
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:
|
|
906
|
+
Defined in: [packages/worker/src/handlers.ts:181](https://github.com/btravers/amqp-contract/blob/382c6d2fbfc563c9f6f16cb71cb33fd4a3d41d77/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,13 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amqp-contract/worker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Worker utilities for consuming messages using amqp-contract",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"amqp",
|
|
7
7
|
"contract",
|
|
8
8
|
"rabbitmq",
|
|
9
9
|
"typescript",
|
|
10
|
-
"worker"
|
|
10
|
+
"worker",
|
|
11
|
+
"nodejs",
|
|
12
|
+
"messaging",
|
|
13
|
+
"type-safe",
|
|
14
|
+
"schema",
|
|
15
|
+
"validation",
|
|
16
|
+
"message-broker",
|
|
17
|
+
"message-queue",
|
|
18
|
+
"consumer"
|
|
11
19
|
],
|
|
12
20
|
"homepage": "https://github.com/btravers/amqp-contract#readme",
|
|
13
21
|
"bugs": {
|
|
@@ -44,8 +52,8 @@
|
|
|
44
52
|
"dependencies": {
|
|
45
53
|
"@standard-schema/spec": "1.1.0",
|
|
46
54
|
"@swan-io/boxed": "3.2.1",
|
|
47
|
-
"@amqp-contract/contract": "0.
|
|
48
|
-
"@amqp-contract/core": "0.
|
|
55
|
+
"@amqp-contract/contract": "0.7.0",
|
|
56
|
+
"@amqp-contract/core": "0.7.0"
|
|
49
57
|
},
|
|
50
58
|
"devDependencies": {
|
|
51
59
|
"@types/amqplib": "0.10.8",
|
|
@@ -53,13 +61,13 @@
|
|
|
53
61
|
"@vitest/coverage-v8": "4.0.16",
|
|
54
62
|
"amqp-connection-manager": "5.0.0",
|
|
55
63
|
"amqplib": "0.10.9",
|
|
56
|
-
"tsdown": "0.18.
|
|
64
|
+
"tsdown": "0.18.4",
|
|
57
65
|
"typedoc": "0.28.15",
|
|
58
66
|
"typedoc-plugin-markdown": "4.9.0",
|
|
59
67
|
"typescript": "5.9.3",
|
|
60
68
|
"vitest": "4.0.16",
|
|
61
|
-
"zod": "4.
|
|
62
|
-
"@amqp-contract/testing": "0.
|
|
69
|
+
"zod": "4.3.5",
|
|
70
|
+
"@amqp-contract/testing": "0.7.0",
|
|
63
71
|
"@amqp-contract/tsconfig": "0.0.0",
|
|
64
72
|
"@amqp-contract/typedoc": "0.0.1"
|
|
65
73
|
},
|
|
@@ -67,9 +75,8 @@
|
|
|
67
75
|
"build": "tsdown src/index.ts --format cjs,esm --dts --clean",
|
|
68
76
|
"build:docs": "typedoc",
|
|
69
77
|
"dev": "tsdown src/index.ts --format cjs,esm --dts --watch",
|
|
70
|
-
"test": "vitest run --project
|
|
78
|
+
"test": "vitest run --project unit",
|
|
71
79
|
"test:integration": "vitest run --project integration",
|
|
72
|
-
"test:watch": "vitest --project integration",
|
|
73
80
|
"typecheck": "tsc --noEmit"
|
|
74
81
|
}
|
|
75
82
|
}
|