@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/dist/index.cjs +133 -1
- package/dist/index.d.cts +156 -14
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +156 -14
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +128 -1
- package/dist/index.mjs.map +1 -1
- package/docs/index.md +356 -73
- package/package.json +4 -4
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/
|
|
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/
|
|
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/
|
|
52
|
-
| <a id="issues"></a> `issues` | `readonly` | `unknown` | - | - | [packages/worker/src/errors.ts:7](https://github.com/btravers/amqp-contract/blob/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
647
|
-
| <a id="handlers"></a> `handlers` | [`
|
|
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/
|
|
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/
|
|
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/
|
|
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)<`TContract`> | 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/
|
|
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/
|
|
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/
|
|
706
|
-
| <a id="payload"></a> `payload` | `TPayload` | The validated message payload | [packages/worker/src/types.ts:88](https://github.com/btravers/amqp-contract/blob/
|
|
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/
|
|
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
|
-
###
|
|
730
|
+
### WorkerInferConsumerHandler()
|
|
731
731
|
|
|
732
732
|
```ts
|
|
733
|
-
type
|
|
733
|
+
type WorkerInferConsumerHandler<TContract, TName> = (message, rawMessage) => Future<Result<void, HandlerError>>;
|
|
734
734
|
```
|
|
735
735
|
|
|
736
|
-
Defined in: [packages/worker/src/types.ts:
|
|
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`<`TContract`> |
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
###
|
|
779
|
+
### WorkerInferConsumerHandlerEntry
|
|
797
780
|
|
|
798
781
|
```ts
|
|
799
|
-
type
|
|
800
|
-
|
|
|
801
|
-
| readonly [
|
|
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:
|
|
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
|
-
|
|
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
|
-
###
|
|
809
|
+
### WorkerInferConsumerHandlers
|
|
827
810
|
|
|
828
811
|
```ts
|
|
829
|
-
type
|
|
812
|
+
type WorkerInferConsumerHandlers<TContract> = { [K in InferConsumerNames<TContract>]: WorkerInferConsumerHandlerEntry<TContract, K> };
|
|
830
813
|
```
|
|
831
814
|
|
|
832
|
-
Defined in: [packages/worker/src/types.ts:
|
|
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
|
-
|
|
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`<`TContract`> |
|
|
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`<`TContract`> |
|
|
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`<`TContract`> |
|
|
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):
|
|
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/
|
|
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` | [`
|
|
956
|
+
| `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)<`TContract`, `TName`> | The handler function that returns `Future<Result<void, HandlerError>>` |
|
|
881
957
|
|
|
882
958
|
##### Returns
|
|
883
959
|
|
|
884
|
-
[`
|
|
960
|
+
[`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)<`TContract`, `TName`>
|
|
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):
|
|
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/
|
|
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` | [`
|
|
1029
|
+
| `handler` | [`WorkerInferConsumerHandler`](#workerinferconsumerhandler)<`TContract`, `TName`> | 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
|
-
[`
|
|
1035
|
+
[`WorkerInferConsumerHandlerEntry`](#workerinferconsumerhandlerentry)<`TContract`, `TName`>
|
|
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):
|
|
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/
|
|
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` | [`
|
|
1096
|
+
| `handlers` | [`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)<`TContract`> | An object with handler functions for each consumer |
|
|
1021
1097
|
|
|
1022
1098
|
#### Returns
|
|
1023
1099
|
|
|
1024
|
-
[`
|
|
1100
|
+
[`WorkerInferConsumerHandlers`](#workerinferconsumerhandlers)<`TContract`>
|
|
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
|
+
```
|