@amqp-contract/worker 0.12.0 → 0.13.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:4](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L4)
11
+ Defined in: [packages/worker/src/errors.ts:4](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L4)
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:5](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L5)
27
+ Defined in: [packages/worker/src/errors.ts:5](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L5)
28
28
 
29
29
  ###### Parameters
30
30
 
@@ -48,8 +48,8 @@ Error.constructor
48
48
  | Property | Modifier | Type | Description | Inherited from | Defined in |
49
49
  | ------ | ------ | ------ | ------ | ------ | ------ |
50
50
  | <a id="cause"></a> `cause?` | `public` | `unknown` | - | `Error.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:6](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L6) |
52
- | <a id="issues"></a> `issues` | `readonly` | `unknown` | - | - | [packages/worker/src/errors.ts:7](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L7) |
51
+ | <a id="consumername"></a> `consumerName` | `readonly` | `string` | - | - | [packages/worker/src/errors.ts:6](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L6) |
52
+ | <a id="issues"></a> `issues` | `readonly` | `unknown` | - | - | [packages/worker/src/errors.ts:7](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L7) |
53
53
  | <a id="message"></a> `message` | `public` | `string` | - | `Error.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` | - | `Error.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` | - | `Error.stack` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1078 |
@@ -159,7 +159,7 @@ Error.prepareStackTrace
159
159
 
160
160
  ### NonRetryableError
161
161
 
162
- Defined in: [packages/worker/src/errors.ts:52](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L52)
162
+ Defined in: [packages/worker/src/errors.ts:52](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L52)
163
163
 
164
164
  Non-retryable errors - permanent failures that should not be retried
165
165
  Examples: invalid data, business rule violations, permanent external failures
@@ -179,7 +179,7 @@ immediately sent to the dead letter queue (DLQ) if configured.
179
179
  new NonRetryableError(message, cause?): NonRetryableError;
180
180
  ```
181
181
 
182
- Defined in: [packages/worker/src/errors.ts:53](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L53)
182
+ Defined in: [packages/worker/src/errors.ts:53](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L53)
183
183
 
184
184
  ###### Parameters
185
185
 
@@ -202,7 +202,7 @@ Error.constructor
202
202
 
203
203
  | Property | Modifier | Type | Description | Inherited from | Defined in |
204
204
  | ------ | ------ | ------ | ------ | ------ | ------ |
205
- | <a id="cause-1"></a> `cause?` | `readonly` | `unknown` | - | `Error.cause` | [packages/worker/src/errors.ts:55](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L55) |
205
+ | <a id="cause-1"></a> `cause?` | `readonly` | `unknown` | - | `Error.cause` | [packages/worker/src/errors.ts:55](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L55) |
206
206
  | <a id="message-1"></a> `message` | `public` | `string` | - | `Error.message` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1077 |
207
207
  | <a id="name-1"></a> `name` | `public` | `string` | - | `Error.name` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1076 |
208
208
  | <a id="stack-1"></a> `stack?` | `public` | `string` | - | `Error.stack` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1078 |
@@ -312,7 +312,7 @@ Error.prepareStackTrace
312
312
 
313
313
  ### RetryableError
314
314
 
315
- Defined in: [packages/worker/src/errors.ts:28](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L28)
315
+ Defined in: [packages/worker/src/errors.ts:28](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L28)
316
316
 
317
317
  Retryable errors - transient failures that may succeed on retry
318
318
  Examples: network timeouts, rate limiting, temporary service unavailability
@@ -332,7 +332,7 @@ The worker will apply exponential backoff and retry the message.
332
332
  new RetryableError(message, cause?): RetryableError;
333
333
  ```
334
334
 
335
- Defined in: [packages/worker/src/errors.ts:29](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L29)
335
+ Defined in: [packages/worker/src/errors.ts:29](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L29)
336
336
 
337
337
  ###### Parameters
338
338
 
@@ -355,7 +355,7 @@ Error.constructor
355
355
 
356
356
  | Property | Modifier | Type | Description | Inherited from | Defined in |
357
357
  | ------ | ------ | ------ | ------ | ------ | ------ |
358
- | <a id="cause-2"></a> `cause?` | `readonly` | `unknown` | - | `Error.cause` | [packages/worker/src/errors.ts:31](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L31) |
358
+ | <a id="cause-2"></a> `cause?` | `readonly` | `unknown` | - | `Error.cause` | [packages/worker/src/errors.ts:31](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L31) |
359
359
  | <a id="message-2"></a> `message` | `public` | `string` | - | `Error.message` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1077 |
360
360
  | <a id="name-2"></a> `name` | `public` | `string` | - | `Error.name` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1076 |
361
361
  | <a id="stack-2"></a> `stack?` | `public` | `string` | - | `Error.stack` | node\_modules/.pnpm/typescript@5.9.3/node\_modules/typescript/lib/lib.es5.d.ts:1078 |
@@ -465,7 +465,7 @@ Error.prepareStackTrace
465
465
 
466
466
  ### TypedAmqpWorker
467
467
 
468
- Defined in: [packages/worker/src/worker.ts:156](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L156)
468
+ Defined in: [packages/worker/src/worker.ts:156](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L156)
469
469
 
470
470
  Type-safe AMQP worker for consuming messages from RabbitMQ.
471
471
 
@@ -519,7 +519,7 @@ await worker.close().resultToPromise();
519
519
  close(): Future<Result<void, TechnicalError>>;
520
520
  ```
521
521
 
522
- Defined in: [packages/worker/src/worker.ts:276](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L276)
522
+ Defined in: [packages/worker/src/worker.ts:276](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L276)
523
523
 
524
524
  Close the AMQP channel and connection.
525
525
 
@@ -547,7 +547,7 @@ if (closeResult.isOk()) {
547
547
  static create<TContract>(options): Future<Result<TypedAmqpWorker<TContract>, TechnicalError>>;
548
548
  ```
549
549
 
550
- Defined in: [packages/worker/src/worker.ts:233](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L233)
550
+ Defined in: [packages/worker/src/worker.ts:233](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L233)
551
551
 
552
552
  Create a type-safe AMQP worker from a contract.
553
553
 
@@ -597,7 +597,7 @@ const worker = await TypedAmqpWorker.create({
597
597
  type CreateWorkerOptions<TContract> = object;
598
598
  ```
599
599
 
600
- Defined in: [packages/worker/src/worker.ts:93](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L93)
600
+ Defined in: [packages/worker/src/worker.ts:93](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L93)
601
601
 
602
602
  Options for creating a type-safe AMQP worker.
603
603
 
@@ -642,12 +642,12 @@ not at the handler level. See `QueueDefinition.retry` for configuration options.
642
642
 
643
643
  | Property | Type | Description | Defined in |
644
644
  | ------ | ------ | ------ | ------ |
645
- | <a id="connectionoptions"></a> `connectionOptions?` | `AmqpConnectionManagerOptions` | Optional connection configuration (heartbeat, reconnect settings, etc.) | [packages/worker/src/worker.ts:105](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L105) |
646
- | <a id="contract"></a> `contract` | `TContract` | The AMQP contract definition specifying consumers and their message schemas | [packages/worker/src/worker.ts:95](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L95) |
647
- | <a id="handlers"></a> `handlers` | [`WorkerInferSafeConsumerHandlers`](#workerinfersafeconsumerhandlers)&lt;`TContract`&gt; | Handlers for each consumer defined in the contract. Handlers must return `Future<Result<void, HandlerError>>` for explicit error handling. Use defineHandler() to create handlers. | [packages/worker/src/worker.ts:101](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L101) |
648
- | <a id="logger"></a> `logger?` | `Logger` | Optional logger for logging message consumption and errors | [packages/worker/src/worker.ts:107](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L107) |
649
- | <a id="telemetry"></a> `telemetry?` | `TelemetryProvider` | Optional telemetry provider for tracing and metrics. If not provided, uses the default provider which attempts to load OpenTelemetry. OpenTelemetry instrumentation is automatically enabled if @opentelemetry/api is installed. | [packages/worker/src/worker.ts:113](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L113) |
650
- | <a id="urls"></a> `urls` | `ConnectionUrl`[] | AMQP broker URL(s). Multiple URLs provide failover support | [packages/worker/src/worker.ts:103](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/worker.ts#L103) |
645
+ | <a id="connectionoptions"></a> `connectionOptions?` | `AmqpConnectionManagerOptions` | Optional connection configuration (heartbeat, reconnect settings, etc.) | [packages/worker/src/worker.ts:105](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L105) |
646
+ | <a id="contract"></a> `contract` | `TContract` | The AMQP contract definition specifying consumers and their message schemas | [packages/worker/src/worker.ts:95](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L95) |
647
+ | <a id="handlers"></a> `handlers` | [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)&lt;`TContract`&gt; | Handlers for each consumer defined in the contract. Handlers must return `Future<Result<void, HandlerError>>` for explicit error handling. Use defineHandler() to create handlers. | [packages/worker/src/worker.ts:101](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L101) |
648
+ | <a id="logger"></a> `logger?` | `Logger` | Optional logger for logging message consumption and errors | [packages/worker/src/worker.ts:107](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L107) |
649
+ | <a id="telemetry"></a> `telemetry?` | `TelemetryProvider` | Optional telemetry provider for tracing and metrics. If not provided, uses the default provider which attempts to load OpenTelemetry. OpenTelemetry instrumentation is automatically enabled if @opentelemetry/api is installed. | [packages/worker/src/worker.ts:113](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L113) |
650
+ | <a id="urls"></a> `urls` | `ConnectionUrl`[] | AMQP broker URL(s). Multiple URLs provide failover support | [packages/worker/src/worker.ts:103](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/worker.ts#L103) |
651
651
 
652
652
  ***
653
653
 
@@ -659,7 +659,7 @@ type HandlerError =
659
659
  | NonRetryableError;
660
660
  ```
661
661
 
662
- Defined in: [packages/worker/src/errors.ts:73](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/errors.ts#L73)
662
+ Defined in: [packages/worker/src/errors.ts:73](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L73)
663
663
 
664
664
  Union type representing all handler errors.
665
665
  Use this type when defining handlers that explicitly signal error outcomes.
@@ -672,7 +672,7 @@ Use this type when defining handlers that explicitly signal error outcomes.
672
672
  type WorkerConsumedMessage<TPayload, THeaders> = object;
673
673
  ```
674
674
 
675
- Defined in: [packages/worker/src/types.ts:86](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L86)
675
+ Defined in: [packages/worker/src/types.ts:86](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L86)
676
676
 
677
677
  A consumed message containing parsed payload and headers.
678
678
 
@@ -702,8 +702,8 @@ const handler = defineHandler(contract, 'processOrder', (message, rawMessage) =>
702
702
 
703
703
  | Property | Type | Description | Defined in |
704
704
  | ------ | ------ | ------ | ------ |
705
- | <a id="headers"></a> `headers` | `THeaders` *extends* `undefined` ? `undefined` : `THeaders` | The validated message headers (present only when headers schema is defined) | [packages/worker/src/types.ts:90](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L90) |
706
- | <a id="payload"></a> `payload` | `TPayload` | The validated message payload | [packages/worker/src/types.ts:88](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L88) |
705
+ | <a id="headers"></a> `headers` | `THeaders` *extends* `undefined` ? `undefined` : `THeaders` | The validated message headers (present only when headers schema is defined) | [packages/worker/src/types.ts:90](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L90) |
706
+ | <a id="payload"></a> `payload` | `TPayload` | The validated message payload | [packages/worker/src/types.ts:88](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L88) |
707
707
 
708
708
  ***
709
709
 
@@ -713,7 +713,7 @@ const handler = defineHandler(contract, 'processOrder', (message, rawMessage) =>
713
713
  type WorkerInferConsumedMessage<TContract, TName> = WorkerConsumedMessage<WorkerInferConsumerPayload<TContract, TName>, WorkerInferConsumerHeaders<TContract, TName>>;
714
714
  ```
715
715
 
716
- Defined in: [packages/worker/src/types.ts:97](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L97)
716
+ Defined in: [packages/worker/src/types.ts:97](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L97)
717
717
 
718
718
  Infer the full consumed message type for a specific consumer.
719
719
  Includes both payload and headers (if defined).
@@ -727,41 +727,24 @@ Includes both payload and headers (if defined).
727
727
 
728
728
  ***
729
729
 
730
- ### WorkerInferConsumerHeaders
730
+ ### WorkerInferConsumerHandler()
731
731
 
732
732
  ```ts
733
- type WorkerInferConsumerHeaders<TContract, TName> = ConsumerInferHeadersInput<InferConsumer<TContract, TName>>;
733
+ type WorkerInferConsumerHandler<TContract, TName> = (message, rawMessage) => Future<Result<void, HandlerError>>;
734
734
  ```
735
735
 
736
- Defined in: [packages/worker/src/types.ts:61](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L61)
737
-
738
- Infer the headers type for a specific consumer
739
- Returns undefined if no headers schema is defined
740
-
741
- #### Type Parameters
742
-
743
- | Type Parameter |
744
- | ------ |
745
- | `TContract` *extends* `ContractDefinition` |
746
- | `TName` *extends* `InferConsumerNames`&lt;`TContract`&gt; |
747
-
748
- ***
749
-
750
- ### WorkerInferSafeConsumerHandler()
736
+ Defined in: [packages/worker/src/types.ts:136](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L136)
751
737
 
752
- ```ts
753
- type WorkerInferSafeConsumerHandler<TContract, TName> = (message, rawMessage) => Future<Result<void, HandlerError>>;
754
- ```
755
-
756
- Defined in: [packages/worker/src/types.ts:133](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L133)
757
-
758
- Safe consumer handler type for a specific consumer.
738
+ Consumer handler type for a specific consumer.
759
739
  Returns a `Future<Result<void, HandlerError>>` for explicit error handling.
760
740
 
761
- **Recommended over unsafe handlers** for better error control:
741
+ Error handling:
762
742
  - RetryableError: Message will be retried with exponential backoff
763
743
  - NonRetryableError: Message will be immediately sent to DLQ
764
744
 
745
+ The `WorkerInfer*` naming pattern indicates type inference helpers that extract
746
+ types from a contract definition at compile time.
747
+
765
748
  #### Type Parameters
766
749
 
767
750
  | Type Parameter |
@@ -783,7 +766,7 @@ Returns a `Future<Result<void, HandlerError>>` for explicit error handling.
783
766
  #### Example
784
767
 
785
768
  ```typescript
786
- const handler: WorkerInferSafeConsumerHandler<typeof contract, 'processOrder'> =
769
+ const handler: WorkerInferConsumerHandler<typeof contract, 'processOrder'> =
787
770
  ({ payload }, rawMessage) => {
788
771
  console.log(payload.orderId); // Typed payload
789
772
  console.log(rawMessage.fields.deliveryTag); // Raw AMQP message
@@ -793,19 +776,19 @@ const handler: WorkerInferSafeConsumerHandler<typeof contract, 'processOrder'> =
793
776
 
794
777
  ***
795
778
 
796
- ### WorkerInferSafeConsumerHandlerEntry
779
+ ### WorkerInferConsumerHandlerEntry
797
780
 
798
781
  ```ts
799
- type WorkerInferSafeConsumerHandlerEntry<TContract, TName> =
800
- | WorkerInferSafeConsumerHandler<TContract, TName>
801
- | readonly [WorkerInferSafeConsumerHandler<TContract, TName>, {
782
+ type WorkerInferConsumerHandlerEntry<TContract, TName> =
783
+ | WorkerInferConsumerHandler<TContract, TName>
784
+ | readonly [WorkerInferConsumerHandler<TContract, TName>, {
802
785
  prefetch?: number;
803
786
  }];
804
787
  ```
805
788
 
806
- Defined in: [packages/worker/src/types.ts:151](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L151)
789
+ Defined in: [packages/worker/src/types.ts:154](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L154)
807
790
 
808
- Safe handler entry for a consumer - either a function or a tuple of [handler, options].
791
+ Handler entry for a consumer - either a function or a tuple of [handler, options].
809
792
 
810
793
  Two patterns are supported:
811
794
  1. Simple handler: `({ payload }, rawMessage) => Future.value(Result.Ok(undefined))`
@@ -823,15 +806,15 @@ not at the handler level. See `QueueDefinition.retry` for configuration options.
823
806
 
824
807
  ***
825
808
 
826
- ### WorkerInferSafeConsumerHandlers
809
+ ### WorkerInferConsumerHandlers
827
810
 
828
811
  ```ts
829
- type WorkerInferSafeConsumerHandlers<TContract> = { [K in InferConsumerNames<TContract>]: WorkerInferSafeConsumerHandlerEntry<TContract, K> };
812
+ type WorkerInferConsumerHandlers<TContract> = { [K in InferConsumerNames<TContract>]: WorkerInferConsumerHandlerEntry<TContract, K> };
830
813
  ```
831
814
 
832
- Defined in: [packages/worker/src/types.ts:162](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/types.ts#L162)
815
+ Defined in: [packages/worker/src/types.ts:175](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L175)
833
816
 
834
- Safe consumer handlers for a contract.
817
+ Consumer handlers for a contract.
835
818
  All handlers return `Future<Result<void, HandlerError>>` for explicit error control.
836
819
 
837
820
  #### Type Parameters
@@ -840,6 +823,99 @@ All handlers return `Future<Result<void, HandlerError>>` for explicit error cont
840
823
  | ------ |
841
824
  | `TContract` *extends* `ContractDefinition` |
842
825
 
826
+ #### Example
827
+
828
+ ```typescript
829
+ const handlers: WorkerInferConsumerHandlers<typeof contract> = {
830
+ processOrder: ({ payload }) =>
831
+ Future.fromPromise(processPayment(payload))
832
+ .mapOk(() => undefined)
833
+ .mapError((error) => new RetryableError('Payment failed', error)),
834
+ };
835
+ ```
836
+
837
+ ***
838
+
839
+ ### WorkerInferConsumerHeaders
840
+
841
+ ```ts
842
+ type WorkerInferConsumerHeaders<TContract, TName> = ConsumerInferHeadersInput<InferConsumer<TContract, TName>>;
843
+ ```
844
+
845
+ Defined in: [packages/worker/src/types.ts:61](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L61)
846
+
847
+ Infer the headers type for a specific consumer
848
+ Returns undefined if no headers schema is defined
849
+
850
+ #### Type Parameters
851
+
852
+ | Type Parameter |
853
+ | ------ |
854
+ | `TContract` *extends* `ContractDefinition` |
855
+ | `TName` *extends* `InferConsumerNames`&lt;`TContract`&gt; |
856
+
857
+ ***
858
+
859
+ ### ~~WorkerInferSafeConsumerHandler~~
860
+
861
+ ```ts
862
+ type WorkerInferSafeConsumerHandler<TContract, TName> = WorkerInferConsumerHandler<TContract, TName>;
863
+ ```
864
+
865
+ Defined in: [packages/worker/src/types.ts:187](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L187)
866
+
867
+ #### Type Parameters
868
+
869
+ | Type Parameter |
870
+ | ------ |
871
+ | `TContract` *extends* `ContractDefinition` |
872
+ | `TName` *extends* `InferConsumerNames`&lt;`TContract`&gt; |
873
+
874
+ #### Deprecated
875
+
876
+ Use `WorkerInferConsumerHandler` instead. Will be removed in next major version.
877
+
878
+ ***
879
+
880
+ ### ~~WorkerInferSafeConsumerHandlerEntry~~
881
+
882
+ ```ts
883
+ type WorkerInferSafeConsumerHandlerEntry<TContract, TName> = WorkerInferConsumerHandlerEntry<TContract, TName>;
884
+ ```
885
+
886
+ Defined in: [packages/worker/src/types.ts:195](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L195)
887
+
888
+ #### Type Parameters
889
+
890
+ | Type Parameter |
891
+ | ------ |
892
+ | `TContract` *extends* `ContractDefinition` |
893
+ | `TName` *extends* `InferConsumerNames`&lt;`TContract`&gt; |
894
+
895
+ #### Deprecated
896
+
897
+ Use `WorkerInferConsumerHandlerEntry` instead. Will be removed in next major version.
898
+
899
+ ***
900
+
901
+ ### ~~WorkerInferSafeConsumerHandlers~~
902
+
903
+ ```ts
904
+ type WorkerInferSafeConsumerHandlers<TContract> = WorkerInferConsumerHandlers<TContract>;
905
+ ```
906
+
907
+ Defined in: [packages/worker/src/types.ts:203](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/types.ts#L203)
908
+
909
+ #### Type Parameters
910
+
911
+ | Type Parameter |
912
+ | ------ |
913
+ | `TContract` *extends* `ContractDefinition` |
914
+
915
+ #### Deprecated
916
+
917
+ Use `WorkerInferConsumerHandlers` instead. Will be removed in next major version.
918
+
843
919
  ## Functions
844
920
 
845
921
  ### defineHandler()
@@ -850,10 +926,10 @@ All handlers return `Future<Result<void, HandlerError>>` for explicit error cont
850
926
  function defineHandler<TContract, TName>(
851
927
  contract,
852
928
  consumerName,
853
- handler): WorkerInferSafeConsumerHandlerEntry<TContract, TName>;
929
+ handler): WorkerInferConsumerHandlerEntry<TContract, TName>;
854
930
  ```
855
931
 
856
- Defined in: [packages/worker/src/handlers.ts:103](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/handlers.ts#L103)
932
+ Defined in: [packages/worker/src/handlers.ts:103](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/handlers.ts#L103)
857
933
 
858
934
  Define a type-safe handler for a specific consumer in a contract.
859
935
 
@@ -877,11 +953,11 @@ Supports two patterns:
877
953
  | ------ | ------ | ------ |
878
954
  | `contract` | `TContract` | The contract definition containing the consumer |
879
955
  | `consumerName` | `TName` | The name of the consumer from the contract |
880
- | `handler` | [`WorkerInferSafeConsumerHandler`](#workerinfersafeconsumerhandler)&lt;`TContract`, `TName`&gt; | The handler function that returns `Future<Result<void, HandlerError>>` |
956
+ | `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)&lt;`TContract`, `TName`&gt; | The handler function that returns `Future<Result<void, HandlerError>>` |
881
957
 
882
958
  ##### Returns
883
959
 
884
- [`WorkerInferSafeConsumerHandlerEntry`](#workerinfersafeconsumerhandlerentry)&lt;`TContract`, `TName`&gt;
960
+ [`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)&lt;`TContract`, `TName`&gt;
885
961
 
886
962
  A type-safe handler that can be used with TypedAmqpWorker
887
963
 
@@ -923,10 +999,10 @@ function defineHandler<TContract, TName>(
923
999
  contract,
924
1000
  consumerName,
925
1001
  handler,
926
- options): WorkerInferSafeConsumerHandlerEntry<TContract, TName>;
1002
+ options): WorkerInferConsumerHandlerEntry<TContract, TName>;
927
1003
  ```
928
1004
 
929
- Defined in: [packages/worker/src/handlers.ts:111](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/handlers.ts#L111)
1005
+ Defined in: [packages/worker/src/handlers.ts:111](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/handlers.ts#L111)
930
1006
 
931
1007
  Define a type-safe handler for a specific consumer in a contract.
932
1008
 
@@ -950,13 +1026,13 @@ Supports two patterns:
950
1026
  | ------ | ------ | ------ |
951
1027
  | `contract` | `TContract` | The contract definition containing the consumer |
952
1028
  | `consumerName` | `TName` | The name of the consumer from the contract |
953
- | `handler` | [`WorkerInferSafeConsumerHandler`](#workerinfersafeconsumerhandler)&lt;`TContract`, `TName`&gt; | The handler function that returns `Future<Result<void, HandlerError>>` |
1029
+ | `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)&lt;`TContract`, `TName`&gt; | The handler function that returns `Future<Result<void, HandlerError>>` |
954
1030
  | `options` | \{ `prefetch?`: `number`; \} | Optional consumer options (prefetch) |
955
1031
  | `options.prefetch?` | `number` | - |
956
1032
 
957
1033
  ##### Returns
958
1034
 
959
- [`WorkerInferSafeConsumerHandlerEntry`](#workerinfersafeconsumerhandlerentry)&lt;`TContract`, `TName`&gt;
1035
+ [`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)&lt;`TContract`, `TName`&gt;
960
1036
 
961
1037
  A type-safe handler that can be used with TypedAmqpWorker
962
1038
 
@@ -996,10 +1072,10 @@ const validateOrderHandler = defineHandler(
996
1072
  ### defineHandlers()
997
1073
 
998
1074
  ```ts
999
- function defineHandlers<TContract>(contract, handlers): WorkerInferSafeConsumerHandlers<TContract>;
1075
+ function defineHandlers<TContract>(contract, handlers): WorkerInferConsumerHandlers<TContract>;
1000
1076
  ```
1001
1077
 
1002
- Defined in: [packages/worker/src/handlers.ts:166](https://github.com/btravers/amqp-contract/blob/c50b9d5f661ce899d34d7eebcfafa47844bd1087/packages/worker/src/handlers.ts#L166)
1078
+ Defined in: [packages/worker/src/handlers.ts:166](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/handlers.ts#L166)
1003
1079
 
1004
1080
  Define multiple type-safe handlers for consumers in a contract.
1005
1081
 
@@ -1017,11 +1093,11 @@ providing explicit error handling and better control over retry behavior.
1017
1093
  | Parameter | Type | Description |
1018
1094
  | ------ | ------ | ------ |
1019
1095
  | `contract` | `TContract` | The contract definition containing the consumers |
1020
- | `handlers` | [`WorkerInferSafeConsumerHandlers`](#workerinfersafeconsumerhandlers)&lt;`TContract`&gt; | An object with handler functions for each consumer |
1096
+ | `handlers` | [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)&lt;`TContract`&gt; | An object with handler functions for each consumer |
1021
1097
 
1022
1098
  #### Returns
1023
1099
 
1024
- [`WorkerInferSafeConsumerHandlers`](#workerinfersafeconsumerhandlers)&lt;`TContract`&gt;
1100
+ [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)&lt;`TContract`&gt;
1025
1101
 
1026
1102
  A type-safe handlers object that can be used with TypedAmqpWorker
1027
1103
 
@@ -1043,3 +1119,210 @@ const handlers = defineHandlers(orderContract, {
1043
1119
  .mapError((error) => new RetryableError('Notification failed', error)),
1044
1120
  });
1045
1121
  ```
1122
+
1123
+ ***
1124
+
1125
+ ### isHandlerError()
1126
+
1127
+ ```ts
1128
+ function isHandlerError(error): error is HandlerError;
1129
+ ```
1130
+
1131
+ Defined in: [packages/worker/src/errors.ts:149](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L149)
1132
+
1133
+ Type guard to check if an error is any HandlerError (RetryableError or NonRetryableError).
1134
+
1135
+ #### Parameters
1136
+
1137
+ | Parameter | Type | Description |
1138
+ | ------ | ------ | ------ |
1139
+ | `error` | `unknown` | The error to check |
1140
+
1141
+ #### Returns
1142
+
1143
+ `error is HandlerError`
1144
+
1145
+ True if the error is a HandlerError
1146
+
1147
+ #### Example
1148
+
1149
+ ```typescript
1150
+ import { isHandlerError } from '@amqp-contract/worker';
1151
+
1152
+ function handleError(error: unknown) {
1153
+ if (isHandlerError(error)) {
1154
+ // error is RetryableError | NonRetryableError
1155
+ console.log('Handler error:', error.name, error.message);
1156
+ }
1157
+ }
1158
+ ```
1159
+
1160
+ ***
1161
+
1162
+ ### isNonRetryableError()
1163
+
1164
+ ```ts
1165
+ function isNonRetryableError(error): error is NonRetryableError;
1166
+ ```
1167
+
1168
+ Defined in: [packages/worker/src/errors.ts:127](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L127)
1169
+
1170
+ Type guard to check if an error is a NonRetryableError.
1171
+
1172
+ Use this to check error types in catch blocks or error handlers.
1173
+
1174
+ #### Parameters
1175
+
1176
+ | Parameter | Type | Description |
1177
+ | ------ | ------ | ------ |
1178
+ | `error` | `unknown` | The error to check |
1179
+
1180
+ #### Returns
1181
+
1182
+ `error is NonRetryableError`
1183
+
1184
+ True if the error is a NonRetryableError
1185
+
1186
+ #### Example
1187
+
1188
+ ```typescript
1189
+ import { isNonRetryableError } from '@amqp-contract/worker';
1190
+
1191
+ try {
1192
+ await processMessage();
1193
+ } catch (error) {
1194
+ if (isNonRetryableError(error)) {
1195
+ console.log('Will not retry:', error.message);
1196
+ }
1197
+ }
1198
+ ```
1199
+
1200
+ ***
1201
+
1202
+ ### isRetryableError()
1203
+
1204
+ ```ts
1205
+ function isRetryableError(error): error is RetryableError;
1206
+ ```
1207
+
1208
+ Defined in: [packages/worker/src/errors.ts:102](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L102)
1209
+
1210
+ Type guard to check if an error is a RetryableError.
1211
+
1212
+ Use this to check error types in catch blocks or error handlers.
1213
+
1214
+ #### Parameters
1215
+
1216
+ | Parameter | Type | Description |
1217
+ | ------ | ------ | ------ |
1218
+ | `error` | `unknown` | The error to check |
1219
+
1220
+ #### Returns
1221
+
1222
+ `error is RetryableError`
1223
+
1224
+ True if the error is a RetryableError
1225
+
1226
+ #### Example
1227
+
1228
+ ```typescript
1229
+ import { isRetryableError } from '@amqp-contract/worker';
1230
+
1231
+ try {
1232
+ await processMessage();
1233
+ } catch (error) {
1234
+ if (isRetryableError(error)) {
1235
+ console.log('Will retry:', error.message);
1236
+ } else {
1237
+ console.log('Permanent failure:', error);
1238
+ }
1239
+ }
1240
+ ```
1241
+
1242
+ ***
1243
+
1244
+ ### nonRetryable()
1245
+
1246
+ ```ts
1247
+ function nonRetryable(message, cause?): NonRetryableError;
1248
+ ```
1249
+
1250
+ Defined in: [packages/worker/src/errors.ts:211](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L211)
1251
+
1252
+ Create a NonRetryableError with less verbosity.
1253
+
1254
+ This is a shorthand factory function for creating NonRetryableError instances.
1255
+ Use it for cleaner error creation in handlers.
1256
+
1257
+ #### Parameters
1258
+
1259
+ | Parameter | Type | Description |
1260
+ | ------ | ------ | ------ |
1261
+ | `message` | `string` | Error message describing the failure |
1262
+ | `cause?` | `unknown` | Optional underlying error that caused this failure |
1263
+
1264
+ #### Returns
1265
+
1266
+ [`NonRetryableError`](#nonretryableerror)
1267
+
1268
+ A new NonRetryableError instance
1269
+
1270
+ #### Example
1271
+
1272
+ ```typescript
1273
+ import { nonRetryable } from '@amqp-contract/worker';
1274
+ import { Future, Result } from '@swan-io/boxed';
1275
+
1276
+ const handler = ({ payload }) => {
1277
+ if (!isValidPayload(payload)) {
1278
+ return Future.value(Result.Error(nonRetryable('Invalid payload format')));
1279
+ }
1280
+ return Future.value(Result.Ok(undefined));
1281
+ };
1282
+
1283
+ // Equivalent to:
1284
+ // return Future.value(Result.Error(new NonRetryableError('Invalid payload format')));
1285
+ ```
1286
+
1287
+ ***
1288
+
1289
+ ### retryable()
1290
+
1291
+ ```ts
1292
+ function retryable(message, cause?): RetryableError;
1293
+ ```
1294
+
1295
+ Defined in: [packages/worker/src/errors.ts:181](https://github.com/btravers/amqp-contract/blob/69a6467d137997be809af2ea5c4332c378579b49/packages/worker/src/errors.ts#L181)
1296
+
1297
+ Create a RetryableError with less verbosity.
1298
+
1299
+ This is a shorthand factory function for creating RetryableError instances.
1300
+ Use it for cleaner error creation in handlers.
1301
+
1302
+ #### Parameters
1303
+
1304
+ | Parameter | Type | Description |
1305
+ | ------ | ------ | ------ |
1306
+ | `message` | `string` | Error message describing the failure |
1307
+ | `cause?` | `unknown` | Optional underlying error that caused this failure |
1308
+
1309
+ #### Returns
1310
+
1311
+ [`RetryableError`](#retryableerror)
1312
+
1313
+ A new RetryableError instance
1314
+
1315
+ #### Example
1316
+
1317
+ ```typescript
1318
+ import { retryable } from '@amqp-contract/worker';
1319
+ import { Future, Result } from '@swan-io/boxed';
1320
+
1321
+ const handler = ({ payload }) =>
1322
+ Future.fromPromise(processPayment(payload))
1323
+ .mapOk(() => undefined)
1324
+ .mapError((e) => retryable('Payment service unavailable', e));
1325
+
1326
+ // Equivalent to:
1327
+ // .mapError((e) => new RetryableError('Payment service unavailable', e));
1328
+ ```