@amqp-contract/worker 0.24.0 → 1.0.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.d.cts CHANGED
@@ -1,14 +1,148 @@
1
1
  import { ConsumerDefinition, ConsumerEntry, ContractDefinition, InferConsumerNames, InferRpcNames, MessageDefinition, RpcDefinition } from "@amqp-contract/contract";
2
2
  import { ConsumerOptions as ConsumerOptions$1, Logger, MessageValidationError, TechnicalError, TelemetryProvider } from "@amqp-contract/core";
3
- import * as amqp from "amqplib";
4
- import { ConsumeMessage } from "amqplib";
5
- import { TcpSocketConnectOpts } from "net";
6
3
  import { ConnectionOptions } from "tls";
7
- import { ResultAsync } from "neverthrow";
4
+ import { TcpSocketConnectOpts } from "net";
5
+ import { AsyncResult } from "unthrown";
8
6
  import { StandardSchemaV1 } from "@standard-schema/spec";
9
7
 
10
- //#region ../../node_modules/.pnpm/amqp-connection-manager@5.0.0_amqplib@0.10.9/node_modules/amqp-connection-manager/dist/types/AmqpConnectionManager.d.ts
11
- type ConnectionUrl = string | amqp.Options.Connect | {
8
+ //#region ../../node_modules/.pnpm/amqplib@2.0.1/node_modules/amqplib/lib/properties.d.ts
9
+ declare namespace Options {
10
+ interface Connect {
11
+ protocol?: string;
12
+ hostname?: string;
13
+ port?: number;
14
+ username?: string;
15
+ password?: string;
16
+ locale?: string;
17
+ frameMax?: number;
18
+ heartbeat?: number;
19
+ vhost?: string;
20
+ channelMax?: number;
21
+ credentials?: {
22
+ mechanism: string;
23
+ response(): Buffer;
24
+ username?: string;
25
+ password?: string;
26
+ };
27
+ }
28
+ interface AssertQueue {
29
+ exclusive?: boolean;
30
+ durable?: boolean;
31
+ autoDelete?: boolean;
32
+ arguments?: any;
33
+ messageTtl?: number;
34
+ expires?: number;
35
+ deadLetterExchange?: string;
36
+ deadLetterRoutingKey?: string;
37
+ maxLength?: number;
38
+ maxPriority?: number;
39
+ overflow?: string;
40
+ queueMode?: string;
41
+ }
42
+ interface DeleteQueue {
43
+ ifUnused?: boolean;
44
+ ifEmpty?: boolean;
45
+ }
46
+ interface AssertExchange {
47
+ durable?: boolean;
48
+ internal?: boolean;
49
+ autoDelete?: boolean;
50
+ alternateExchange?: string;
51
+ arguments?: any;
52
+ }
53
+ interface DeleteExchange {
54
+ ifUnused?: boolean;
55
+ }
56
+ interface Publish {
57
+ expiration?: string | number;
58
+ userId?: string;
59
+ CC?: string | string[];
60
+ mandatory?: boolean;
61
+ persistent?: boolean;
62
+ deliveryMode?: boolean | number;
63
+ BCC?: string | string[];
64
+ contentType?: string;
65
+ contentEncoding?: string;
66
+ headers?: any;
67
+ priority?: number;
68
+ correlationId?: string;
69
+ replyTo?: string;
70
+ messageId?: string;
71
+ timestamp?: number;
72
+ type?: string;
73
+ appId?: string;
74
+ }
75
+ interface Consume {
76
+ consumerTag?: string;
77
+ noLocal?: boolean;
78
+ noAck?: boolean;
79
+ exclusive?: boolean;
80
+ priority?: number;
81
+ arguments?: any;
82
+ }
83
+ interface Get {
84
+ noAck?: boolean;
85
+ }
86
+ }
87
+ interface Message {
88
+ content: Buffer;
89
+ fields: MessageFields;
90
+ properties: MessageProperties;
91
+ }
92
+ interface ConsumeMessage extends Message {
93
+ fields: ConsumeMessageFields;
94
+ }
95
+ interface CommonMessageFields {
96
+ deliveryTag: number;
97
+ redelivered: boolean;
98
+ exchange: string;
99
+ routingKey: string;
100
+ }
101
+ interface MessageFields extends CommonMessageFields {
102
+ messageCount?: number;
103
+ consumerTag?: string;
104
+ }
105
+ interface ConsumeMessageFields extends CommonMessageFields {
106
+ consumerTag: string;
107
+ }
108
+ interface MessageProperties {
109
+ contentType: any | undefined;
110
+ contentEncoding: any | undefined;
111
+ headers: MessagePropertyHeaders | undefined;
112
+ deliveryMode: any | undefined;
113
+ priority: any | undefined;
114
+ correlationId: any | undefined;
115
+ replyTo: any | undefined;
116
+ expiration: any | undefined;
117
+ messageId: any | undefined;
118
+ timestamp: any | undefined;
119
+ type: any | undefined;
120
+ userId: any | undefined;
121
+ appId: any | undefined;
122
+ clusterId: any | undefined;
123
+ }
124
+ interface MessagePropertyHeaders {
125
+ 'x-first-death-exchange'?: string;
126
+ 'x-first-death-queue'?: string;
127
+ 'x-first-death-reason'?: string;
128
+ 'x-death'?: XDeath[];
129
+ [key: string]: any;
130
+ }
131
+ interface XDeath {
132
+ count: number;
133
+ reason: 'rejected' | 'expired' | 'maxlen';
134
+ queue: string;
135
+ time: {
136
+ '!': 'timestamp';
137
+ value: number;
138
+ };
139
+ exchange: string;
140
+ 'original-expiration'?: any;
141
+ 'routing-keys': string[];
142
+ }
143
+ //#endregion
144
+ //#region ../../node_modules/.pnpm/amqp-connection-manager@5.0.0_amqplib@2.0.1/node_modules/amqp-connection-manager/dist/types/AmqpConnectionManager.d.ts
145
+ type ConnectionUrl = string | Options.Connect | {
12
146
  url: string;
13
147
  connectionOptions?: AmqpConnectionOptions;
14
148
  };
@@ -49,31 +183,50 @@ interface AmqpConnectionManagerOptions {
49
183
  }
50
184
  //#endregion
51
185
  //#region src/errors.d.ts
186
+ declare const RetryableError_base: import("unthrown").TaggedErrorConstructor<"@amqp-contract/RetryableError">;
52
187
  /**
53
188
  * Retryable errors - transient failures that may succeed on retry
54
189
  * Examples: network timeouts, rate limiting, temporary service unavailability
55
190
  *
56
191
  * Use this error type when the operation might succeed if retried.
57
192
  * The worker will apply exponential backoff and retry the message.
193
+ *
194
+ * Built on unthrown's {@link TaggedError}, so it carries a namespaced `_tag` of
195
+ * `"@amqp-contract/RetryableError"` (to avoid colliding with other libraries'
196
+ * tags in a shared `matchTags`) for exhaustive dispatch; the `Error.name` is
197
+ * kept bare (`"RetryableError"`).
58
198
  */
59
- declare class RetryableError extends Error {
60
- readonly cause?: unknown | undefined;
61
- constructor(message: string, cause?: unknown | undefined);
199
+ declare class RetryableError extends RetryableError_base<{
200
+ message: string;
201
+ cause?: unknown;
202
+ }> {
203
+ constructor(message: string, cause?: unknown);
62
204
  }
205
+ declare const NonRetryableError_base: import("unthrown").TaggedErrorConstructor<"@amqp-contract/NonRetryableError">;
63
206
  /**
64
207
  * Non-retryable errors - permanent failures that should not be retried
65
208
  * Examples: invalid data, business rule violations, permanent external failures
66
209
  *
67
210
  * Use this error type when retrying would not help - the message will be
68
- * immediately sent to the dead letter queue (DLQ) if configured.
211
+ * immediately sent to the dead letter queue (DLQ) if configured. Carries a
212
+ * namespaced `_tag` of `"@amqp-contract/NonRetryableError"`; the `Error.name` is
213
+ * kept bare (`"NonRetryableError"`).
69
214
  */
70
- declare class NonRetryableError extends Error {
71
- readonly cause?: unknown | undefined;
72
- constructor(message: string, cause?: unknown | undefined);
215
+ declare class NonRetryableError extends NonRetryableError_base<{
216
+ message: string;
217
+ cause?: unknown;
218
+ }> {
219
+ constructor(message: string, cause?: unknown);
73
220
  }
74
221
  /**
75
- * Union type representing all handler errors.
76
- * Use this type when defining handlers that explicitly signal error outcomes.
222
+ * Any handler-signalled error the union a handler may put in the `Err`
223
+ * channel of its `AsyncResult`. Discriminate on `_tag`
224
+ * (`"@amqp-contract/RetryableError"` / `"@amqp-contract/NonRetryableError"`),
225
+ * e.g. with `matchTags`.
226
+ *
227
+ * Previously an abstract base class; now a tagged union, because unthrown's
228
+ * `TaggedError` mints a distinct base class per tag. Use {@link isHandlerError}
229
+ * for runtime narrowing instead of `instanceof HandlerError`.
77
230
  */
78
231
  type HandlerError = RetryableError | NonRetryableError;
79
232
  /**
@@ -154,16 +307,16 @@ declare function isHandlerError(error: unknown): error is HandlerError;
154
307
  * @example
155
308
  * ```typescript
156
309
  * import { retryable } from '@amqp-contract/worker';
157
- * import { ResultAsync } from 'neverthrow';
310
+ * import { fromPromise } from 'unthrown';
158
311
  *
159
312
  * const handler = ({ payload }) =>
160
- * ResultAsync.fromPromise(
313
+ * fromPromise(
161
314
  * processPayment(payload),
162
315
  * (e) => retryable('Payment service unavailable', e),
163
316
  * ).map(() => undefined);
164
317
  *
165
318
  * // Equivalent to:
166
- * // ResultAsync.fromPromise(processPayment(payload), (e) => new RetryableError('...', e))
319
+ * // fromPromise(processPayment(payload), (e) => new RetryableError('...', e))
167
320
  * ```
168
321
  */
169
322
  declare function retryable(message: string, cause?: unknown): RetryableError;
@@ -180,17 +333,17 @@ declare function retryable(message: string, cause?: unknown): RetryableError;
180
333
  * @example
181
334
  * ```typescript
182
335
  * import { nonRetryable } from '@amqp-contract/worker';
183
- * import { errAsync, okAsync } from 'neverthrow';
336
+ * import { err, ok } from 'unthrown';
184
337
  *
185
338
  * const handler = ({ payload }) => {
186
339
  * if (!isValidPayload(payload)) {
187
- * return errAsync(nonRetryable('Invalid payload format'));
340
+ * return err(nonRetryable('Invalid payload format')).toAsync();
188
341
  * }
189
- * return okAsync(undefined);
342
+ * return ok(undefined).toAsync();
190
343
  * };
191
344
  *
192
345
  * // Equivalent to:
193
- * // return errAsync(new NonRetryableError('Invalid payload format'));
346
+ * // return err(new NonRetryableError('Invalid payload format')).toAsync();
194
347
  * ```
195
348
  */
196
349
  declare function nonRetryable(message: string, cause?: unknown): NonRetryableError;
@@ -241,7 +394,7 @@ type WorkerInferRpcRequest<TContract extends ContractDefinition, TName extends I
241
394
  type WorkerInferRpcHeaders<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>> = InferRpc<TContract, TName> extends RpcDefinition<infer TRequest, MessageDefinition> ? TRequest extends MessageDefinition<infer _TPayload, infer THeaders> ? THeaders extends StandardSchemaV1<Record<string, unknown>> ? InferSchemaOutput<THeaders> : undefined : undefined : undefined;
242
395
  /**
243
396
  * Infer the response payload type for an RPC. The handler must return a
244
- * `ResultAsync<TResponse, HandlerError>` matching this shape.
397
+ * `AsyncResult<TResponse, HandlerError>` matching this shape.
245
398
  */
246
399
  type WorkerInferRpcResponse<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>> = InferRpc<TContract, TName> extends RpcDefinition<MessageDefinition, infer TResponse> ? TResponse extends MessageDefinition ? InferSchemaOutput<TResponse["payload"]> : never : never;
247
400
  /**
@@ -259,7 +412,7 @@ type WorkerInferRpcResponse<TContract extends ContractDefinition, TName extends
259
412
  * console.log(message.payload.orderId); // Typed payload
260
413
  * console.log(message.headers?.priority); // Typed headers (if defined)
261
414
  * console.log(rawMessage.fields.deliveryTag); // Raw AMQP message
262
- * return okAsync(undefined);
415
+ * return ok(undefined).toAsync();
263
416
  * });
264
417
  * ```
265
418
  */
@@ -278,17 +431,17 @@ type WorkerInferConsumedMessage<TContract extends ContractDefinition, TName exte
278
431
  type WorkerInferRpcConsumedMessage<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>> = WorkerConsumedMessage<WorkerInferRpcRequest<TContract, TName>, WorkerInferRpcHeaders<TContract, TName>>;
279
432
  /**
280
433
  * Handler signature for a regular consumer (event/command). Returns
281
- * `ResultAsync<void, HandlerError>` — there is no response message.
434
+ * `AsyncResult<void, HandlerError>` — there is no response message.
282
435
  */
283
- type WorkerInferConsumerHandler<TContract extends ContractDefinition, TName extends InferConsumerNames<TContract>> = (message: WorkerInferConsumedMessage<TContract, TName>, rawMessage: ConsumeMessage) => ResultAsync<void, HandlerError>;
436
+ type WorkerInferConsumerHandler<TContract extends ContractDefinition, TName extends InferConsumerNames<TContract>> = (message: WorkerInferConsumedMessage<TContract, TName>, rawMessage: ConsumeMessage) => AsyncResult<void, HandlerError>;
284
437
  /**
285
438
  * Handler signature for an RPC. Returns
286
- * `ResultAsync<TResponse, HandlerError>` where `TResponse` is the inferred
439
+ * `AsyncResult<TResponse, HandlerError>` where `TResponse` is the inferred
287
440
  * response payload. The worker validates the response against the RPC's
288
441
  * response schema and publishes it back to `msg.properties.replyTo` with the
289
442
  * same `correlationId`.
290
443
  */
291
- type WorkerInferRpcHandler<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>> = (message: WorkerInferRpcConsumedMessage<TContract, TName>, rawMessage: ConsumeMessage) => ResultAsync<WorkerInferRpcResponse<TContract, TName>, HandlerError>;
444
+ type WorkerInferRpcHandler<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>> = (message: WorkerInferRpcConsumedMessage<TContract, TName>, rawMessage: ConsumeMessage) => AsyncResult<WorkerInferRpcResponse<TContract, TName>, HandlerError>;
292
445
  /**
293
446
  * Handler entry for a regular consumer — function or `[handler, options]`.
294
447
  */
@@ -306,19 +459,15 @@ type WorkerInferRpcHandlerEntry<TContract extends ContractDefinition, TName exte
306
459
  * ```typescript
307
460
  * const handlers: WorkerInferHandlers<typeof contract> = {
308
461
  * processOrder: ({ payload }) =>
309
- * ResultAsync.fromPromise(
462
+ * fromPromise(
310
463
  * processPayment(payload),
311
464
  * (error) => new RetryableError('Payment failed', error),
312
465
  * ).map(() => undefined),
313
- * calculate: ({ payload }) => okAsync({ sum: payload.a + payload.b }),
466
+ * calculate: ({ payload }) => ok({ sum: payload.a + payload.b }).toAsync(),
314
467
  * };
315
468
  * ```
316
469
  */
317
470
  type WorkerInferHandlers<TContract extends ContractDefinition> = ([InferConsumerNames<TContract>] extends [never] ? {} : { [K in InferConsumerNames<TContract>]: WorkerInferConsumerHandlerEntry<TContract, K> }) & ([InferRpcNames<TContract>] extends [never] ? {} : { [K in InferRpcNames<TContract>]: WorkerInferRpcHandlerEntry<TContract, K> });
318
- /**
319
- * @deprecated Use `WorkerInferHandlers` — handlers now span consumers ∪ rpcs.
320
- */
321
- type WorkerInferConsumerHandlers<TContract extends ContractDefinition> = WorkerInferHandlers<TContract>;
322
471
  //#endregion
323
472
  //#region src/worker.d.ts
324
473
  type ConsumerOptions = ConsumerOptions$1;
@@ -335,13 +484,13 @@ type ConsumerOptions = ConsumerOptions$1;
335
484
  * // Simple handler
336
485
  * processOrder: ({ payload }) => {
337
486
  * console.log('Processing order:', payload.orderId);
338
- * return okAsync(undefined);
487
+ * return ok(undefined).toAsync();
339
488
  * },
340
489
  * // Handler with prefetch configuration
341
490
  * processPayment: [
342
491
  * ({ payload }) => {
343
492
  * console.log('Processing payment:', payload.paymentId);
344
- * return okAsync(undefined);
493
+ * return ok(undefined).toAsync();
345
494
  * },
346
495
  * { prefetch: 10 }
347
496
  * ]
@@ -365,8 +514,8 @@ type CreateWorkerOptions<TContract extends ContractDefinition> = {
365
514
  /**
366
515
  * Handlers for each `consumers` and `rpcs` entry in the contract.
367
516
  *
368
- * - Regular consumers return `ResultAsync<void, HandlerError>`.
369
- * - RPC handlers return `ResultAsync<TResponse, HandlerError>` where
517
+ * - Regular consumers return `AsyncResult<void, HandlerError>`.
518
+ * - RPC handlers return `AsyncResult<TResponse, HandlerError>` where
370
519
  * `TResponse` is inferred from the RPC's response message schema.
371
520
  *
372
521
  * Use `defineHandler` / `defineHandlers` to create handlers with full type
@@ -407,7 +556,7 @@ type CreateWorkerOptions<TContract extends ContractDefinition> = {
407
556
  * ```typescript
408
557
  * import { TypedAmqpWorker } from '@amqp-contract/worker';
409
558
  * import { defineQueue, defineMessage, defineContract, defineConsumer } from '@amqp-contract/contract';
410
- * import { okAsync } from 'neverthrow';
559
+ * import { ok } from 'unthrown';
411
560
  * import { z } from 'zod';
412
561
  *
413
562
  * const orderQueue = defineQueue('order-processing');
@@ -427,14 +576,13 @@ type CreateWorkerOptions<TContract extends ContractDefinition> = {
427
576
  * handlers: {
428
577
  * processOrder: ({ payload }) => {
429
578
  * console.log('Processing order', payload.orderId);
430
- * return okAsync(undefined);
579
+ * return ok(undefined).toAsync();
431
580
  * },
432
581
  * },
433
582
  * urls: ['amqp://localhost'],
434
583
  * });
435
584
  *
436
- * if (result.isErr()) throw result.error;
437
- * const worker = result.value;
585
+ * const worker = result.unwrap();
438
586
  *
439
587
  * // Close when done
440
588
  * await worker.close();
@@ -475,14 +623,14 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
475
623
  * Connections are automatically shared across clients and workers with the same
476
624
  * URLs and connection options, following RabbitMQ best practices.
477
625
  *
478
- * @returns A ResultAsync that resolves to the worker or a TechnicalError.
626
+ * @returns A AsyncResult that resolves to the worker or a TechnicalError.
479
627
  *
480
628
  * @example
481
629
  * ```typescript
482
630
  * const result = await TypedAmqpWorker.create({
483
631
  * contract: myContract,
484
632
  * handlers: {
485
- * processOrder: ({ payload }) => okAsync(undefined),
633
+ * processOrder: ({ payload }) => ok(undefined).toAsync(),
486
634
  * },
487
635
  * urls: ['amqp://localhost'],
488
636
  * });
@@ -497,7 +645,7 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
497
645
  logger,
498
646
  telemetry,
499
647
  connectTimeoutMs
500
- }: CreateWorkerOptions<TContract>): ResultAsync<TypedAmqpWorker<TContract>, TechnicalError>;
648
+ }: CreateWorkerOptions<TContract>): AsyncResult<TypedAmqpWorker<TContract>, TechnicalError>;
501
649
  /**
502
650
  * Close the AMQP channel and connection.
503
651
  *
@@ -512,7 +660,7 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
512
660
  * }
513
661
  * ```
514
662
  */
515
- close(): ResultAsync<void, TechnicalError>;
663
+ close(): AsyncResult<void, TechnicalError>;
516
664
  /**
517
665
  * Start consuming for every entry in `contract.consumers` and `contract.rpcs`.
518
666
  */
@@ -556,9 +704,42 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
556
704
  * inbox.
557
705
  */
558
706
  private publishRpcResponse;
707
+ /**
708
+ * Parse and validate the message; on failure, nack(requeue=false) so the
709
+ * queue's DLX (if configured) receives the poison message and bypass the
710
+ * retry pipeline — a malformed payload is deterministic and retrying it
711
+ * would burn the queue's retry budget on a guaranteed failure.
712
+ */
713
+ private parseAndValidateOrNack;
714
+ /**
715
+ * Invoke the handler and ack the message on success. Returns the handler's
716
+ * response (RPC) or `undefined` (regular consumer). Errors propagate as
717
+ * `HandlerError` for downstream RPC reply publishing or routing via
718
+ * {@link handleError}.
719
+ */
720
+ private runHandler;
721
+ /**
722
+ * For RPC handlers, validate and publish the reply on the caller's
723
+ * `replyTo` / `correlationId`. For non-RPC consumers, this is a no-op that
724
+ * resolves to `ok(undefined).toAsync()`.
725
+ */
726
+ private publishReplyIfRpc;
559
727
  /**
560
728
  * Process a single consumed message: validate, invoke handler, optionally
561
- * publish the RPC response, record telemetry, and handle errors.
729
+ * publish the RPC response, record telemetry, and route errors.
730
+ *
731
+ * The caller-supplied `state` is mutated as the message is ack'd/nack'd so
732
+ * the consume callback's catch-all guard can tell whether a defensive nack
733
+ * is still needed (see {@link consumeSingle}).
734
+ *
735
+ * Success-vs-failure telemetry is data-driven: the chain resolves to
736
+ * `ok(undefined)` only on handler success (and reply-publish success for
737
+ * RPC). Handler failures — even when {@link handleError} routes them
738
+ * successfully to retry/DLQ — are classified as failures for metrics by
739
+ * re-failing the chain with a `TechnicalError` whose `cause` is the
740
+ * original `HandlerError`. The terminal `orTee` unwraps the cause before
741
+ * recording the span exception so traces keep the original
742
+ * `RetryableError` / `NonRetryableError` class as the exception type.
562
743
  */
563
744
  private processMessage;
564
745
  /**
@@ -569,88 +750,88 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
569
750
  //#endregion
570
751
  //#region src/handlers.d.ts
571
752
  /**
572
- * Define a type-safe handler for a specific consumer in a contract.
753
+ * Define a type-safe handler for a specific consumer or RPC in a contract.
573
754
  *
574
- * **Recommended:** This function creates handlers that return `ResultAsync<void, HandlerError>`,
575
- * providing explicit error handling and better control over retry behavior.
755
+ * **Recommended:** This function creates handlers that return
756
+ * `AsyncResult<void, HandlerError>` (consumers) or
757
+ * `AsyncResult<TResponse, HandlerError>` (RPCs), providing explicit error
758
+ * handling and better control over retry behavior.
576
759
  *
577
760
  * Supports two patterns:
578
761
  * 1. Simple handler: just the function
579
- * 2. Handler with options: [handler, { prefetch: 10 }]
762
+ * 2. Handler with options: `[handler, { prefetch: 10 }]`
580
763
  *
581
764
  * @template TContract - The contract definition type
582
- * @template TName - The consumer name from the contract
583
- * @param contract - The contract definition containing the consumer
584
- * @param consumerName - The name of the consumer from the contract
585
- * @param handler - The handler function that returns `ResultAsync<void, HandlerError>`
765
+ * @template TName - The consumer or RPC name from the contract
766
+ * @param contract - The contract definition containing the consumer or RPC
767
+ * @param name - The name of the consumer or RPC from the contract
768
+ * @param handler - The handler function for consumers, returns
769
+ * `AsyncResult<void, HandlerError>`; for RPCs, returns
770
+ * `AsyncResult<TResponse, HandlerError>`.
586
771
  * @param options - Optional consumer options (prefetch)
587
772
  * @returns A type-safe handler that can be used with TypedAmqpWorker
588
773
  *
589
- * @example
774
+ * @example Consumer handler
590
775
  * ```typescript
591
776
  * import { defineHandler, RetryableError, NonRetryableError } from '@amqp-contract/worker';
592
- * import { errAsync, okAsync, ResultAsync } from 'neverthrow';
593
- * import { orderContract } from './contract';
777
+ * import { fromPromise, ok } from 'unthrown';
594
778
  *
595
- * // Simple handler with explicit error handling
596
779
  * const processOrderHandler = defineHandler(
597
780
  * orderContract,
598
781
  * 'processOrder',
599
782
  * ({ payload }) =>
600
- * ResultAsync.fromPromise(
783
+ * fromPromise(
601
784
  * processPayment(payload),
602
785
  * (error) => new RetryableError('Payment failed', error),
603
786
  * ).map(() => undefined),
604
787
  * );
788
+ * ```
605
789
  *
606
- * // Handler with validation (non-retryable error)
607
- * const validateOrderHandler = defineHandler(
608
- * orderContract,
609
- * 'validateOrder',
610
- * ({ payload }) => {
611
- * if (payload.amount < 1) {
612
- * // Won't be retried - goes directly to DLQ
613
- * return errAsync(new NonRetryableError('Invalid order amount'));
614
- * }
615
- * return okAsync(undefined);
616
- * },
790
+ * @example RPC handler
791
+ * ```typescript
792
+ * const calculateHandler = defineHandler(
793
+ * rpcContract,
794
+ * 'calculate',
795
+ * ({ payload }) => ok({ sum: payload.a + payload.b }).toAsync(),
617
796
  * );
618
797
  * ```
619
798
  */
620
- declare function defineHandler<TContract extends ContractDefinition, TName extends InferConsumerNames<TContract>>(contract: TContract, consumerName: TName, handler: WorkerInferConsumerHandler<TContract, TName>): WorkerInferConsumerHandlerEntry<TContract, TName>;
621
- declare function defineHandler<TContract extends ContractDefinition, TName extends InferConsumerNames<TContract>>(contract: TContract, consumerName: TName, handler: WorkerInferConsumerHandler<TContract, TName>, options: ConsumerOptions): WorkerInferConsumerHandlerEntry<TContract, TName>;
799
+ declare function defineHandler<TContract extends ContractDefinition, TName extends InferConsumerNames<TContract>>(contract: TContract, name: TName, handler: WorkerInferConsumerHandler<TContract, TName>): WorkerInferConsumerHandlerEntry<TContract, TName>;
800
+ declare function defineHandler<TContract extends ContractDefinition, TName extends InferConsumerNames<TContract>>(contract: TContract, name: TName, handler: WorkerInferConsumerHandler<TContract, TName>, options: ConsumerOptions): WorkerInferConsumerHandlerEntry<TContract, TName>;
801
+ declare function defineHandler<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>>(contract: TContract, name: TName, handler: WorkerInferRpcHandler<TContract, TName>): WorkerInferRpcHandlerEntry<TContract, TName>;
802
+ declare function defineHandler<TContract extends ContractDefinition, TName extends InferRpcNames<TContract>>(contract: TContract, name: TName, handler: WorkerInferRpcHandler<TContract, TName>, options: ConsumerOptions): WorkerInferRpcHandlerEntry<TContract, TName>;
622
803
  /**
623
- * Define multiple type-safe handlers for consumers in a contract.
804
+ * Define multiple type-safe handlers for consumers and RPCs in a contract.
805
+ *
806
+ * **Recommended:** This function creates handlers that return
807
+ * `AsyncResult<void, HandlerError>` (consumers) or
808
+ * `AsyncResult<TResponse, HandlerError>` (RPCs), providing explicit error
809
+ * handling and better control over retry behavior.
624
810
  *
625
- * **Recommended:** This function creates handlers that return `ResultAsync<void, HandlerError>`,
626
- * providing explicit error handling and better control over retry behavior.
811
+ * The handlers object must contain exactly one entry per `consumers` and
812
+ * `rpcs` key in the contract see {@link WorkerInferHandlers}.
627
813
  *
628
814
  * @template TContract - The contract definition type
629
- * @param contract - The contract definition containing the consumers
630
- * @param handlers - An object with handler functions for each consumer
815
+ * @param contract - The contract definition containing the consumers and RPCs
816
+ * @param handlers - An object with handler functions for each consumer and RPC
631
817
  * @returns A type-safe handlers object that can be used with TypedAmqpWorker
632
818
  *
633
819
  * @example
634
820
  * ```typescript
635
821
  * import { defineHandlers, RetryableError } from '@amqp-contract/worker';
636
- * import { ResultAsync } from 'neverthrow';
637
- * import { orderContract } from './contract';
822
+ * import { fromPromise, ok } from 'unthrown';
638
823
  *
639
824
  * const handlers = defineHandlers(orderContract, {
640
825
  * processOrder: ({ payload }) =>
641
- * ResultAsync.fromPromise(
826
+ * fromPromise(
642
827
  * processPayment(payload),
643
828
  * (error) => new RetryableError('Payment failed', error),
644
829
  * ).map(() => undefined),
645
- * notifyOrder: ({ payload }) =>
646
- * ResultAsync.fromPromise(
647
- * sendNotification(payload),
648
- * (error) => new RetryableError('Notification failed', error),
649
- * ).map(() => undefined),
830
+ * calculate: ({ payload }) => ok({ sum: payload.a + payload.b }).toAsync(),
650
831
  * });
651
832
  * ```
652
833
  */
653
- declare function defineHandlers<TContract extends ContractDefinition>(contract: TContract, handlers: WorkerInferConsumerHandlers<TContract>): WorkerInferConsumerHandlers<TContract>;
834
+ declare function defineHandlers<TContract extends ContractDefinition>(contract: TContract, handlers: WorkerInferHandlers<TContract>): WorkerInferHandlers<TContract>;
654
835
  //#endregion
655
- export { type ConsumerOptions, type CreateWorkerOptions, type HandlerError, MessageValidationError, NonRetryableError, RetryableError, TypedAmqpWorker, type WorkerConsumedMessage, type WorkerInferConsumedMessage, type WorkerInferConsumerHandler, type WorkerInferConsumerHandlerEntry, type WorkerInferConsumerHandlers, type WorkerInferConsumerHeaders, defineHandler, defineHandlers, isHandlerError, isNonRetryableError, isRetryableError, nonRetryable, retryable };
836
+ export { type ConsumerOptions, type CreateWorkerOptions, type HandlerError, MessageValidationError, NonRetryableError, RetryableError, TypedAmqpWorker, type WorkerConsumedMessage, type WorkerInferConsumedMessage, type WorkerInferConsumerHandler, type WorkerInferConsumerHandlerEntry, type WorkerInferConsumerHeaders, type WorkerInferHandlers, type WorkerInferRpcConsumedMessage, type WorkerInferRpcHandler, type WorkerInferRpcHandlerEntry, type WorkerInferRpcHeaders, type WorkerInferRpcRequest, type WorkerInferRpcResponse, defineHandler, defineHandlers, isHandlerError, isNonRetryableError, isRetryableError, nonRetryable, retryable };
656
837
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":["amqp","EventEmitter","TcpSocketConnectOpts","ConnectionOptions","ChannelWrapper","CreateChannelOpts","ConnectionUrl","Options","Connect","AmqpConnectionOptions","url","connectionOptions","ConnectListener","Connection","connection","arg","ConnectFailedListener","Error","err","Buffer","noDelay","timeout","keepAlive","keepAliveDelay","clientProperties","credentials","mechanism","username","password","response","AmqpConnectionManagerOptions","Promise","heartbeatIntervalInSeconds","reconnectTimeInSeconds","findServers","urls","callback","IAmqpConnectionManager","Function","ChannelModel","addListener","event","args","listener","reason","listeners","eventName","on","once","prependListener","prependOnceListener","removeListener","connect","options","reconnect","createChannel","close","isConnected","channelCount","AmqpConnectionManager","_channels","_currentUrl","_closed","_cancelRetriesHandler","_connectPromise","_currentConnection","_findServers","_urls","constructor","_connect","default"],"sources":["../../../node_modules/.pnpm/amqp-connection-manager@5.0.0_amqplib@0.10.9/node_modules/amqp-connection-manager/dist/types/AmqpConnectionManager.d.ts","../src/errors.ts","../src/types.ts","../src/worker.ts","../src/handlers.ts"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":["Empty","AssertQueue","queue","messageCount","consumerCount","PurgeQueue","DeleteQueue","AssertExchange","exchange","Consume","consumerTag","Connect","protocol","hostname","port","username","password","locale","frameMax","heartbeat","vhost","channelMax","credentials","mechanism","response","Buffer","exclusive","durable","autoDelete","arguments","messageTtl","expires","deadLetterExchange","deadLetterRoutingKey","maxLength","maxPriority","overflow","queueMode","ifUnused","ifEmpty","internal","alternateExchange","DeleteExchange","Publish","expiration","userId","CC","mandatory","persistent","deliveryMode","BCC","contentType","contentEncoding","headers","priority","correlationId","replyTo","messageId","timestamp","type","appId","noLocal","noAck","Get","tls","ConnectionOptions","noDelay","timeout","keepAlive","keepAliveDelay","clientProperties","Record","highWaterMark","content","fields","MessageFields","properties","MessageProperties","Message","GetMessageFields","ConsumeMessageFields","deliveryTag","redelivered","routingKey","CommonMessageFields","MessagePropertyHeaders","clusterId","XDeath","key","count","reason","time","value","host","product","version","platform","copyright","information","amqp","Options","Connect","url","connectionOptions","AmqpConnectionOptions","connection","Connection","arg","err","Error","ConnectionOptions","TcpSocketConnectOpts","noDelay","timeout","keepAlive","keepAliveDelay","clientProperties","credentials","mechanism","username","password","response","Buffer","heartbeatIntervalInSeconds","reconnectTimeInSeconds","findServers","ConnectionUrl","urls","callback","Promise","EventEmitter","addListener","event","args","listener","ConnectListener","ConnectFailedListener","reason","listeners","eventName","Function","on","once","prependListener","prependOnceListener","removeListener","connect","options","reconnect","createChannel","CreateChannelOpts","ChannelWrapper","close","isConnected","ChannelModel","channelCount","IAmqpConnectionManager","_channels","_currentUrl","_closed","_cancelRetriesHandler","_connectPromise","_currentConnection","_findServers","_urls","constructor","AmqpConnectionManagerOptions","_connect"],"sources":["../../../node_modules/.pnpm/amqplib@2.0.1/node_modules/amqplib/lib/properties.d.ts","../../../node_modules/.pnpm/amqp-connection-manager@5.0.0_amqplib@2.0.1/node_modules/amqp-connection-manager/dist/types/AmqpConnectionManager.d.ts","../src/errors.ts","../src/types.ts","../src/worker.ts","../src/handlers.ts"],"x_google_ignoreList":[0,1],"mappings":";;;;;;;;kBAuBiB,OAAA;EAAA,UACLW,OAAAA;IACRC,QAAAA;IACAC,QAAAA;IACAC,IAAAA;IACAC,QAAAA;IACAC,QAAAA;IACAC,MAAAA;IACAC,QAAAA;IACAC,SAAAA;IACAC,KAAAA;IACAC,UAAAA;IACAC,WAAAA;MACEC,SAAAA;MACAC,QAAAA,IAAY,MAAM;MAClBT,QAAAA;MACAC,QAAAA;IAAAA;EAAAA;EAAAA,UAIMf,WAAAA;IACRyB,SAAAA;IACAC,OAAAA;IACAC,UAAAA;IACAC,SAAAA;IACAC,UAAAA;IACAC,OAAAA;IACAC,kBAAAA;IACAC,oBAAAA;IACAC,SAAAA;IACAC,WAAAA;IACAC,QAAAA;IACAC,SAAAA;EAAAA;EAAAA,UAGQ/B,WAAAA;IACRgC,QAAAA;IACAC,OAAAA;EAAAA;EAAAA,UAGQhC,cAAAA;IACRoB,OAAAA;IACAa,QAAAA;IACAZ,UAAAA;IACAa,iBAAAA;IACAZ,SAAAA;EAAAA;EAAAA,UAGQa,cAAAA;IACRJ,QAAAA;EAAAA;EAAAA,UAGQK,OAAAA;IACRC,UAAAA;IACAC,MAAAA;IACAC,EAAAA;IACAC,SAAAA;IACAC,UAAAA;IACAC,YAAAA;IACAC,GAAAA;IACAC,WAAAA;IACAC,eAAAA;IACAC,OAAAA;IACAC,QAAAA;IACAC,aAAAA;IACAC,OAAAA;IACAC,SAAAA;IACAC,SAAAA;IACAC,IAAAA;IACAC,KAAAA;EAAAA;EAAAA,UAGQnD,OAAAA;IACRC,WAAAA;IACAmD,OAAAA;IACAC,KAAAA;IACApC,SAAAA;IACA4B,QAAAA;IACAzB,SAAAA;EAAAA;EAAAA,UAGQkC,GAAAA;IACRD,KAAAA;EAAAA;AAAAA;AAAAA,UAsBa,OAAA;EACfW,OAAAA,EAAS,MAAA;EACTC,MAAAA,EAAQ,aAAA;EACRE,UAAAA,EAAY,iBAAA;AAAA;AAAA,UAOG,cAAA,SAAuB,OAAO;EAC7CF,MAAAA,EAAQ,oBAAA;AAAA;AAAA,UAGO,mBAAA;EACfO,WAAAA;EACAC,WAAAA;EACA1E,QAAAA;EACA2E,UAAAA;AAAAA;AAAAA,UAGe,aAAA,SAAsB,mBAAmB;EACxDhF,YAAAA;EACAO,WAAAA;AAAAA;AAAAA,UAOe,oBAAA,SAA6B,mBAAmB;EAC/DA,WAAW;AAAA;AAAA,UAGI,iBAAA;EACfyC,WAAAA;EACAC,eAAAA;EACAC,OAAAA,EAAS,sBAAsB;EAC/BJ,YAAAA;EACAK,QAAAA;EACAC,aAAAA;EACAC,OAAAA;EACAZ,UAAAA;EACAa,SAAAA;EACAC,SAAAA;EACAC,IAAAA;EACAd,MAAAA;EACAe,KAAAA;EACA0B,SAAAA;AAAAA;AAAAA,UAGe,sBAAA;EACf,wBAAA;EACA,qBAAA;EACA,sBAAA;EACA,SAAA,GAAY,MAAM;EAAA,CACjBE,GAAAA;AAAAA;AAAAA,UAGc,MAAA;EACfC,KAAAA;EACAC,MAAAA;EACAxF,KAAAA;EACAyF,IAAAA;IACE,GAAA;IACAC,KAAAA;EAAAA;EAEFpF,QAAAA;EACA,qBAAA;EACA,cAAA;AAAA;;;KC/LU,aAAA,YAAa,OAAA,CAAyB,OAAA;EAC9C8F,GAAAA;EACAC,iBAAAA,GAAoB,qBAAqB;AAAA;AAAA,KAcjC,qBAAA,IAAyB,iBAAA,GAAoB,oBAAA;EACrDS,OAAAA;EACAC,OAAAA;EACAC,SAAAA;EACAC,cAAAA;EACAC,gBAAAA;EACAC,WAAAA;IACIC,SAAAA;IACAC,QAAAA;IACAC,QAAAA;IACAC,QAAAA,QAAgB,MAAA;EAAA;IAEhBH,SAAAA;IACAG,QAAAA,QAAgB,MAAA;EAAA;AAAA;AAAA,UAGP,4BAAA;EDebvF;ECbAyF,0BAAAA;EDeAvF;;;;ECVAwF,sBAAAA;EDmBQrH;;;;;;;ECXRsH,WAAAA,KAAgBG,QAAAA,GAAWD,IAAAA,EAAM,aAAA,GAAgB,aAAA,+BAA4C,OAAA,CAAQ,aAAA,GAAgB,aAAA;EDuB7GpF;ECrBR4D,iBAAAA,GAAoB,qBAAA;AAAA;;;cCpDqC,mBAAA;;;;;;;AFqB7D;;;;;;cEPa,cAAA,SAAuB,mBAAA;EAGlC,OAAA;EACA,KAAA;AAAA;cAEY,OAAA,UAAiB,KAAA;AAAA;AAAA,cAG9B,sBAAA;;;;;;;;;;cAWY,iBAAA,SAA0B,sBAAA;EAGrC,OAAA;EACA,KAAA;AAAA;cAEY,OAAA,UAAiB,KAAA;AAAA;;;;;;;;;;;KAenB,YAAA,GAAe,cAAA,GAAiB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;iBA6B7C,gBAAA,CAAiB,KAAA,YAAiB,KAAA,IAAS,cAAc;;;;;;;;;;;AFmBhE;AAsBT;;;;;;;;;;iBEhBgB,mBAAA,CAAoB,KAAA,YAAiB,KAAA,IAAS,iBAAiB;;;;;AFmBhD;AAO/B;;;;;;;;AAC8B;AAG9B;;;;iBERgB,cAAA,CAAe,KAAA,YAAiB,KAAA,IAAS,YAAY;;;;;AFYzD;AAGZ;;;;;;;;AAEa;AAOb;;;;AACa;AAGb;;;;;;iBEKgB,SAAA,CAAU,OAAA,UAAiB,KAAA,aAAkB,cAAc;;;;;;;;;;;;;;AFShE;AAGX;;;;;;;;;;;AAKc;iBEaE,YAAA,CAAa,OAAA,UAAiB,KAAA,aAAkB,iBAAiB;;;;;AF7KjF;KGLK,iBAAA,iBAAkC,gBAAA,IACrC,OAAA,SAAgB,gBAAA,iCAAiD,OAAA;;;;;KAM9D,yBAAA,WAAoC,aAAA,IAAiB,CAAA,SAAU,kBAAA,GAChE,CAAA,GACA,CAAA;EAAY,QAAA,EAAU,kBAAA;AAAA,IACpB,CAAA;;;;;KAOD,0BAAA,mBAA6C,aAAA,IAChD,yBAAA,CAA0B,SAAA,UAAmB,kBAAA,GACzC,iBAAA,CAAkB,yBAAA,CAA0B,SAAA;;;;;KAO7C,0BAAA,mBAA6C,aAAA,IAChD,yBAAA,CAA0B,SAAA,UAAmB,kBAAA,GACzC,yBAAA,CAA0B,SAAA,qBAA8B,iBAAA,oCAItD,QAAA,SAAiB,gBAAA,CAAiB,MAAA,qBAChC,iBAAA,CAAkB,QAAA;AAAA,KASvB,cAAA,mBAAiC,kBAAA,IAAsB,WAAA,CAAY,SAAA;AAAA,KACnE,aAAA,mBACe,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,KAC/B,cAAA,CAAe,SAAA,EAAW,KAAA;AAAA,KAEzB,SAAA,mBAA4B,kBAAA,IAAsB,WAAA,CAAY,SAAA;AAAA,KAC9D,QAAA,mBACe,kBAAA,gBACJ,aAAA,CAAc,SAAA,KAC1B,SAAA,CAAU,SAAA,EAAW,KAAA;;;;KAKpB,0BAAA,mBACe,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,KAC/B,0BAAA,CAA2B,aAAA,CAAc,SAAA,EAAW,KAAA;;;;;KAM5C,0BAAA,mBACQ,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,KAC/B,0BAAA,CAA2B,aAAA,CAAc,SAAA,EAAW,KAAA;;;;KAK5C,qBAAA,mBACQ,kBAAA,gBACJ,aAAA,CAAc,SAAA,KAE5B,QAAA,CAAS,SAAA,EAAW,KAAA,UAAe,aAAA,iBAA8B,iBAAA,IAC7D,QAAA,SAAiB,iBAAA,GACf,iBAAA,CAAkB,QAAA;;;;;KAQd,qBAAA,mBACQ,kBAAA,gBACJ,aAAA,CAAc,SAAA,KAE5B,QAAA,CAAS,SAAA,EAAW,KAAA,UAAe,aAAA,iBAA8B,iBAAA,IAC7D,QAAA,SAAiB,iBAAA,oCACf,QAAA,SAAiB,gBAAA,CAAiB,MAAA,qBAChC,iBAAA,CAAkB,QAAA;;;;;KAShB,sBAAA,mBACQ,kBAAA,gBACJ,aAAA,CAAc,SAAA,KAE5B,QAAA,CAAS,SAAA,EAAW,KAAA,UAAe,aAAA,CAAc,iBAAA,qBAC7C,SAAA,SAAkB,iBAAA,GAChB,iBAAA,CAAkB,SAAA;;;;;;;;;;;;;;;;;;;;KA2Bd,qBAAA;EHzDRzC,oCG2DF,OAAA,EAAS,QAAA,EHzDPR;EG2DF,OAAA,EAAS,QAAA,iCAAyC,QAAA;AAAA;;;AHtD3C;KG4DG,0BAAA,mBACQ,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,KAC/B,qBAAA,CACF,0BAAA,CAA2B,SAAA,EAAW,KAAA,GACtC,0BAAA,CAA2B,SAAA,EAAW,KAAA;;;;;KAO5B,6BAAA,mBACQ,kBAAA,gBACJ,aAAA,CAAc,SAAA,KAC1B,qBAAA,CACF,qBAAA,CAAsB,SAAA,EAAW,KAAA,GACjC,qBAAA,CAAsB,SAAA,EAAW,KAAA;;;;;KAcvB,0BAAA,mBACQ,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,MAEjC,OAAA,EAAS,0BAAA,CAA2B,SAAA,EAAW,KAAA,GAC/C,UAAA,EAAY,cAAA,KACT,WAAA,OAAkB,YAAA;;;;;AHxEQ;AAO/B;;KG0EY,qBAAA,mBACQ,kBAAA,gBACJ,aAAA,CAAc,SAAA,MAE5B,OAAA,EAAS,6BAAA,CAA8B,SAAA,EAAW,KAAA,GAClD,UAAA,EAAY,cAAA,KACT,WAAA,CAAY,sBAAA,CAAuB,SAAA,EAAW,KAAA,GAAQ,YAAA;;;;KAK/C,+BAAA,mBACQ,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,KAE/B,0BAAA,CAA2B,SAAA,EAAW,KAAA,cAC5B,0BAAA,CAA2B,SAAA,EAAW,KAAA,GAAQ,eAAA;;AHzF9B;AAG9B;KG2FY,0BAAA,mBACQ,kBAAA,gBACJ,aAAA,CAAc,SAAA,KAE1B,qBAAA,CAAsB,SAAA,EAAW,KAAA,cACvB,qBAAA,CAAsB,SAAA,EAAW,KAAA,GAAQ,eAAA;;;;;;;;AH5F3C;AAGZ;;;;;;;;AAEa;KG0GD,mBAAA,mBAAsC,kBAAA,MAChD,kBAAA,CAAmB,SAAA,kCAGT,kBAAA,CAAmB,SAAA,IAAa,+BAAA,CAAgC,SAAA,EAAW,CAAA,SACnF,aAAA,CAAc,SAAA,kCAEJ,aAAA,CAAc,SAAA,IAAa,0BAAA,CAA2B,SAAA,EAAW,CAAA;;;KC9MnE,eAAA,GAAkB,iBAAyB;;;AJlCvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KIiFY,mBAAA,mBAAsC,kBAAA;EJzCtC/C,kFI2CV,QAAA,EAAU,SAAA;EJzCRiC;;;;;;;;;;EIoDF,QAAA,EAAU,mBAAA,CAAoB,SAAA,GJrC5BQ;EIuCF,IAAA,EAAM,aAAA,IJrCJE;EIuCF,iBAAA,GAAoB,4BAAA,cJrClBE;EIuCF,MAAA,GAAS,MAAA;EJrCPE;;;;;EI2CF,SAAA,GAAY,iBAAA;EJrCVM;;;;EI0CF,sBAAA,GAAyB,eAAA;EJnCvBlC;;;;;;EI0CF,gBAAA;AAAA;;;;;;;;;;;;;;;AJX6B;AAO/B;;;;;;;;AAC8B;AAG9B;;;;;;;;;AAIY;AAGZ;;;;;;;;AAEa;AAOb;cI+Ba,eAAA,mBAAkC,kBAAA;EAAA,iBAa1B,QAAA;EAAA,iBACA,UAAA;EAAA,iBAEA,sBAAA;EAAA,iBACA,MAAA;EJ5Ca;;;;;;EAAA,iBIkCf,cAAA;EAAA,iBACA,eAAA;EAAA,iBACA,YAAA;EAAA,iBACA,SAAA;EAAA,QAEV,WAAA;EJ/BPkB;;;;;;;EAAAA,QIuEQ,mBAAA;EJjEC;AAGX;;;;;;;;;;;AAKc;AAGd;;;;;;;;;;;EAXW,OIgHF,MAAA,mBAAyB,kBAAA;IAC9B,QAAA;IACA,QAAA;IACA,IAAA;IACA,iBAAA;IACA,sBAAA;IACA,MAAA;IACA,SAAA;IACA;EAAA,GACC,mBAAA,CAAoB,SAAA,IAAa,WAAA,CAAY,eAAA,CAAgB,SAAA,GAAY,cAAA;EJpG5E;;AAAc;;;;AC/LhB;;;;;;;;EGwVE,KAAA,IAAS,WAAA,OAAkB,cAAA;EHtVL4D;;AAAqB;EAArBA,QG2Wd,UAAA;EAAA,QAUA,sBAAA;;;;;UAQA,OAAA;EHlWoB;;;;EAAA,QGiXpB,cAAA;EH5XNS;;;;;;;EAAAA,QG4ZM,uBAAA;EHpZFQ;;;;;;AAGsB;AAG9B;;;;;;;;;;;;EANQA,QG0cE,kBAAA;EHrbNI;;;;;;EAAAA,QGkhBM,sBAAA;EHlhB+GC;;;;AAE5E;;EAF4EA,QGmiB/G,UAAA;;AFrlBmD;;;;UEkmBnD,iBAAA;EFplBG;;;;;;;;;;;AAMiC;AAG7C;;;;;EATY,QEknBH,cAAA;EF9lBqB;;;EAAA,QEkuBrB,aAAA;AAAA;;;;;;;;AJ/uBV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBKiGgB,aAAA,mBACI,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,GAEjC,QAAA,EAAU,SAAA,EACV,IAAA,EAAM,KAAA,EACN,OAAA,EAAS,0BAAA,CAA2B,SAAA,EAAW,KAAA,IAC9C,+BAAA,CAAgC,SAAA,EAAW,KAAA;AAAA,iBAC9B,aAAA,mBACI,kBAAA,gBACJ,kBAAA,CAAmB,SAAA,GAEjC,QAAA,EAAU,SAAA,EACV,IAAA,EAAM,KAAA,EACN,OAAA,EAAS,0BAAA,CAA2B,SAAA,EAAW,KAAA,GAC/C,OAAA,EAAS,eAAA,GACR,+BAAA,CAAgC,SAAA,EAAW,KAAA;AAAA,iBAC9B,aAAA,mBACI,kBAAA,gBACJ,aAAA,CAAc,SAAA,GAE5B,QAAA,EAAU,SAAA,EACV,IAAA,EAAM,KAAA,EACN,OAAA,EAAS,qBAAA,CAAsB,SAAA,EAAW,KAAA,IACzC,0BAAA,CAA2B,SAAA,EAAW,KAAA;AAAA,iBACzB,aAAA,mBACI,kBAAA,gBACJ,aAAA,CAAc,SAAA,GAE5B,QAAA,EAAU,SAAA,EACV,IAAA,EAAM,KAAA,EACN,OAAA,EAAS,qBAAA,CAAsB,SAAA,EAAW,KAAA,GAC1C,OAAA,EAAS,eAAA,GACR,0BAAA,CAA2B,SAAA,EAAW,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ALhDhC;AAsBT;;;iBKsEgB,cAAA,mBAAiC,kBAAA,EAC/C,QAAA,EAAU,SAAA,EACV,QAAA,EAAU,mBAAA,CAAoB,SAAA,IAC7B,mBAAA,CAAoB,SAAA"}