@amqp-contract/worker 0.22.0 → 0.23.1
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 +88 -70
- package/dist/index.d.cts +24 -11
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +24 -11
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +88 -70
- package/dist/index.mjs.map +1 -1
- package/docs/index.md +36 -36
- package/package.json +6 -6
package/dist/index.cjs
CHANGED
|
@@ -356,19 +356,28 @@ function calculateRetryDelay(retryCount, config) {
|
|
|
356
356
|
}
|
|
357
357
|
/**
|
|
358
358
|
* Parse message content for republishing.
|
|
359
|
-
*
|
|
359
|
+
*
|
|
360
|
+
* The channel is configured with `json: true`, so values published as plain
|
|
361
|
+
* objects are encoded once at publish time. Re-publishing the raw `Buffer`
|
|
362
|
+
* would then trigger a *second* JSON.stringify (turning the bytes into a
|
|
363
|
+
* stringified base64 blob), so for JSON payloads we must round-trip back to
|
|
364
|
+
* the parsed value. For any other content type — or when the message is
|
|
365
|
+
* compressed — we pass the bytes through untouched, since re-parsing would
|
|
366
|
+
* either fail or silently corrupt binary data.
|
|
360
367
|
*/
|
|
361
368
|
function parseMessageContentForRetry(ctx, msg, queueName) {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
369
|
+
if (msg.properties.contentEncoding) return msg.content;
|
|
370
|
+
const contentType = msg.properties.contentType;
|
|
371
|
+
if (!(contentType === void 0 || contentType === "application/json" || contentType.startsWith("application/json;") || contentType.endsWith("+json"))) return msg.content;
|
|
372
|
+
try {
|
|
373
|
+
return JSON.parse(msg.content.toString());
|
|
365
374
|
} catch (err) {
|
|
366
|
-
ctx.logger?.warn("Failed to parse message for retry, using original buffer", {
|
|
375
|
+
ctx.logger?.warn("Failed to parse JSON message for retry, using original buffer", {
|
|
367
376
|
queueName,
|
|
368
377
|
error: err
|
|
369
378
|
});
|
|
379
|
+
return msg.content;
|
|
370
380
|
}
|
|
371
|
-
return content;
|
|
372
381
|
}
|
|
373
382
|
/**
|
|
374
383
|
* Publish message with an incremented x-retry-count header and optional TTL.
|
|
@@ -619,55 +628,34 @@ var TypedAmqpWorker = class TypedAmqpWorker {
|
|
|
619
628
|
return this.consumeSingle(name, view, handler);
|
|
620
629
|
}
|
|
621
630
|
/**
|
|
622
|
-
* Validate data against a Standard Schema
|
|
631
|
+
* Validate data against a Standard Schema. No side effects; the caller is
|
|
632
|
+
* responsible for ack/nack based on the Result.
|
|
623
633
|
*/
|
|
624
|
-
validateSchema(schema, data, context
|
|
634
|
+
validateSchema(schema, data, context) {
|
|
625
635
|
const rawValidation = schema["~standard"].validate(data);
|
|
626
636
|
const validationPromise = rawValidation instanceof Promise ? rawValidation : Promise.resolve(rawValidation);
|
|
627
637
|
return _swan_io_boxed.Future.fromPromise(validationPromise).mapError((error) => new _amqp_contract_core.TechnicalError(`Error validating ${context.field}`, error)).mapOkToResult((result) => {
|
|
628
638
|
if (result.issues) return _swan_io_boxed.Result.Error(new _amqp_contract_core.TechnicalError(`${context.field} validation failed`, new _amqp_contract_core.MessageValidationError(context.consumerName, result.issues)));
|
|
629
639
|
return _swan_io_boxed.Result.Ok(result.value);
|
|
630
|
-
}).tapError((error) => {
|
|
631
|
-
this.logger?.error(`${context.field} validation failed`, {
|
|
632
|
-
consumerName: context.consumerName,
|
|
633
|
-
queueName: context.queueName,
|
|
634
|
-
error
|
|
635
|
-
});
|
|
636
|
-
this.amqpClient.nack(msg, false, false);
|
|
637
640
|
});
|
|
638
641
|
}
|
|
639
642
|
/**
|
|
640
|
-
* Parse and validate a message from AMQP.
|
|
641
|
-
*
|
|
643
|
+
* Parse and validate a message from AMQP. Pure: returns the validated payload
|
|
644
|
+
* and headers, or an error. The dispatch path in {@link processMessage} routes
|
|
645
|
+
* validation/parse errors directly to the DLQ (single nack) — they never enter
|
|
646
|
+
* the retry pipeline because retrying an unparseable or schema-violating
|
|
647
|
+
* payload cannot succeed.
|
|
642
648
|
*/
|
|
643
649
|
parseAndValidateMessage(msg, consumer, consumerName) {
|
|
644
|
-
const
|
|
645
|
-
const
|
|
646
|
-
consumerName: String(consumerName),
|
|
647
|
-
queueName: queue.name
|
|
648
|
-
};
|
|
649
|
-
const nackAndError = (message, error) => {
|
|
650
|
-
this.logger?.error(message, {
|
|
651
|
-
...context,
|
|
652
|
-
error
|
|
653
|
-
});
|
|
654
|
-
this.amqpClient.nack(msg, false, false);
|
|
655
|
-
return new _amqp_contract_core.TechnicalError(message, error);
|
|
656
|
-
};
|
|
657
|
-
const parsePayload = decompressBuffer(msg.content, msg.properties.contentEncoding).tapError((error) => {
|
|
658
|
-
this.logger?.error("Failed to decompress message", {
|
|
659
|
-
...context,
|
|
660
|
-
error
|
|
661
|
-
});
|
|
662
|
-
this.amqpClient.nack(msg, false, false);
|
|
663
|
-
}).mapOkToResult((buffer) => _swan_io_boxed.Result.fromExecution(() => JSON.parse(buffer.toString())).mapError((error) => nackAndError("Failed to parse JSON", error))).flatMapOk((parsed) => this.validateSchema(consumer.message.payload, parsed, {
|
|
650
|
+
const context = { consumerName: String(consumerName) };
|
|
651
|
+
const parsePayload = decompressBuffer(msg.content, msg.properties.contentEncoding).mapErrorToResult((error) => _swan_io_boxed.Result.Error(new _amqp_contract_core.TechnicalError("Failed to decompress message", error))).mapOkToResult((buffer) => _swan_io_boxed.Result.fromExecution(() => JSON.parse(buffer.toString())).mapError((error) => new _amqp_contract_core.TechnicalError("Failed to parse JSON", error))).flatMapOk((parsed) => this.validateSchema(consumer.message.payload, parsed, {
|
|
664
652
|
...context,
|
|
665
653
|
field: "payload"
|
|
666
|
-
}
|
|
654
|
+
}));
|
|
667
655
|
const parseHeaders = consumer.message.headers ? this.validateSchema(consumer.message.headers, msg.properties.headers ?? {}, {
|
|
668
656
|
...context,
|
|
669
657
|
field: "headers"
|
|
670
|
-
}
|
|
658
|
+
}) : _swan_io_boxed.Future.value(_swan_io_boxed.Result.Ok(void 0));
|
|
671
659
|
return _swan_io_boxed.Future.allFromDict({
|
|
672
660
|
payload: parsePayload,
|
|
673
661
|
headers: parseHeaders
|
|
@@ -679,27 +667,36 @@ var TypedAmqpWorker = class TypedAmqpWorker {
|
|
|
679
667
|
* with `routingKey = msg.properties.replyTo`, which works for both
|
|
680
668
|
* `amq.rabbitmq.reply-to` and any anonymous queue declared by the caller.
|
|
681
669
|
*
|
|
682
|
-
*
|
|
683
|
-
*
|
|
684
|
-
*
|
|
670
|
+
* Failure semantics:
|
|
671
|
+
* - **Missing replyTo / correlationId**: NonRetryableError. The caller is
|
|
672
|
+
* already lost; retrying the original message cannot recover the reply
|
|
673
|
+
* path. The poison message lands in DLQ for inspection rather than being
|
|
674
|
+
* silently ack'd (which would mask a contract violation).
|
|
675
|
+
* - **Schema validation failure**: NonRetryableError — the handler returned
|
|
676
|
+
* the wrong shape; retrying the same input will not fix it.
|
|
677
|
+
* - **Publish failure**: NonRetryableError. The caller has already timed out
|
|
678
|
+
* (or will shortly), so retrying the message wastes the queue's retry
|
|
679
|
+
* budget on a reply that no one is waiting for. The message is logged and
|
|
680
|
+
* DLQ'd; the original work is treated as completed for the purpose of the
|
|
681
|
+
* inbox.
|
|
685
682
|
*/
|
|
686
683
|
publishRpcResponse(msg, queueName, rpcName, responseSchema, response) {
|
|
687
684
|
const replyTo = msg.properties.replyTo;
|
|
688
685
|
const correlationId = msg.properties.correlationId;
|
|
689
686
|
if (typeof replyTo !== "string" || replyTo.length === 0) {
|
|
690
|
-
this.logger?.
|
|
687
|
+
this.logger?.error("RPC handler returned a response but the incoming message has no replyTo", {
|
|
691
688
|
rpcName: String(rpcName),
|
|
692
689
|
queueName
|
|
693
690
|
});
|
|
694
|
-
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.
|
|
691
|
+
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.Error(new NonRetryableError(`RPC "${String(rpcName)}" received a message without replyTo; cannot deliver response`)));
|
|
695
692
|
}
|
|
696
693
|
if (typeof correlationId !== "string" || correlationId.length === 0) {
|
|
697
|
-
this.logger?.
|
|
694
|
+
this.logger?.error("RPC handler returned a response but the incoming message has no correlationId", {
|
|
698
695
|
rpcName: String(rpcName),
|
|
699
696
|
queueName,
|
|
700
697
|
replyTo
|
|
701
698
|
});
|
|
702
|
-
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.
|
|
699
|
+
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.Error(new NonRetryableError(`RPC "${String(rpcName)}" received a message without correlationId; cannot deliver response`)));
|
|
703
700
|
}
|
|
704
701
|
let rawValidation;
|
|
705
702
|
try {
|
|
@@ -714,7 +711,7 @@ var TypedAmqpWorker = class TypedAmqpWorker {
|
|
|
714
711
|
}).flatMapOk((validatedResponse) => this.amqpClient.publish("", replyTo, validatedResponse, {
|
|
715
712
|
correlationId,
|
|
716
713
|
contentType: "application/json"
|
|
717
|
-
}).mapErrorToResult((error) => _swan_io_boxed.Result.Error(new
|
|
714
|
+
}).mapErrorToResult((error) => _swan_io_boxed.Result.Error(new NonRetryableError("Failed to publish RPC response", error))).mapOkToResult((published) => published ? _swan_io_boxed.Result.Ok(void 0) : _swan_io_boxed.Result.Error(new NonRetryableError("Failed to publish RPC response: channel buffer full"))));
|
|
718
715
|
}
|
|
719
716
|
/**
|
|
720
717
|
* Process a single consumed message: validate, invoke handler, optionally
|
|
@@ -727,8 +724,17 @@ var TypedAmqpWorker = class TypedAmqpWorker {
|
|
|
727
724
|
const span = (0, _amqp_contract_core.startConsumeSpan)(this.telemetry, queueName, String(name), { "messaging.rabbitmq.message.delivery_tag": msg.fields.deliveryTag });
|
|
728
725
|
let messageHandled = false;
|
|
729
726
|
let firstError;
|
|
730
|
-
return this.parseAndValidateMessage(msg, consumer, name).
|
|
731
|
-
|
|
727
|
+
return this.parseAndValidateMessage(msg, consumer, name).flatMap((parseResult) => parseResult.match({
|
|
728
|
+
Ok: (validatedMessage) => handler(validatedMessage, msg).flatMapOk((handlerResponse) => {
|
|
729
|
+
if (isRpc && responseSchema) return this.publishRpcResponse(msg, queueName, name, responseSchema, handlerResponse).flatMapOk(() => {
|
|
730
|
+
this.logger?.info("Message consumed successfully", {
|
|
731
|
+
consumerName: String(name),
|
|
732
|
+
queueName
|
|
733
|
+
});
|
|
734
|
+
this.amqpClient.ack(msg);
|
|
735
|
+
messageHandled = true;
|
|
736
|
+
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.Ok(void 0));
|
|
737
|
+
});
|
|
732
738
|
this.logger?.info("Message consumed successfully", {
|
|
733
739
|
consumerName: String(name),
|
|
734
740
|
queueName
|
|
@@ -736,26 +742,29 @@ var TypedAmqpWorker = class TypedAmqpWorker {
|
|
|
736
742
|
this.amqpClient.ack(msg);
|
|
737
743
|
messageHandled = true;
|
|
738
744
|
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.Ok(void 0));
|
|
739
|
-
})
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
745
|
+
}).flatMapError((handlerError) => {
|
|
746
|
+
this.logger?.error("Error processing message", {
|
|
747
|
+
consumerName: String(name),
|
|
748
|
+
queueName,
|
|
749
|
+
errorType: handlerError.name,
|
|
750
|
+
error: handlerError.message
|
|
751
|
+
});
|
|
752
|
+
firstError = handlerError;
|
|
753
|
+
return handleError({
|
|
754
|
+
amqpClient: this.amqpClient,
|
|
755
|
+
logger: this.logger
|
|
756
|
+
}, handlerError, msg, String(name), consumer);
|
|
757
|
+
}),
|
|
758
|
+
Error: (parseError) => {
|
|
759
|
+
firstError = parseError;
|
|
760
|
+
this.logger?.error("Failed to parse/validate message; sending to DLQ", {
|
|
761
|
+
consumerName: String(name),
|
|
762
|
+
queueName,
|
|
763
|
+
error: parseError
|
|
764
|
+
});
|
|
765
|
+
this.amqpClient.nack(msg, false, false);
|
|
766
|
+
return _swan_io_boxed.Future.value(_swan_io_boxed.Result.Error(parseError));
|
|
767
|
+
}
|
|
759
768
|
})).map((result) => {
|
|
760
769
|
const durationMs = Date.now() - startTime;
|
|
761
770
|
if (messageHandled) {
|
|
@@ -781,7 +790,16 @@ var TypedAmqpWorker = class TypedAmqpWorker {
|
|
|
781
790
|
});
|
|
782
791
|
return;
|
|
783
792
|
}
|
|
784
|
-
|
|
793
|
+
try {
|
|
794
|
+
await this.processMessage(msg, view, name, handler).toPromise();
|
|
795
|
+
} catch (error) {
|
|
796
|
+
this.logger?.error("Uncaught error in consume callback; nacking message", {
|
|
797
|
+
consumerName: String(name),
|
|
798
|
+
queueName,
|
|
799
|
+
error
|
|
800
|
+
});
|
|
801
|
+
this.amqpClient.nack(msg, false, false);
|
|
802
|
+
}
|
|
785
803
|
}, this.consumerOptions[name]).tapOk((consumerTag) => {
|
|
786
804
|
this.consumerTags.add(consumerTag);
|
|
787
805
|
}).mapError((error) => new _amqp_contract_core.TechnicalError(`Failed to start consuming for "${String(name)}"`, error)).mapOk(() => void 0);
|
package/dist/index.d.cts
CHANGED
|
@@ -7,7 +7,7 @@ import { TcpSocketConnectOpts } from "net";
|
|
|
7
7
|
import { ConnectionOptions } from "tls";
|
|
8
8
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
9
9
|
|
|
10
|
-
//#region ../../node_modules/.pnpm/amqp-connection-manager@5.0.0_amqplib@
|
|
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
11
|
type ConnectionUrl = string | amqp.Options.Connect | {
|
|
12
12
|
url: string;
|
|
13
13
|
connectionOptions?: AmqpConnectionOptions;
|
|
@@ -388,11 +388,11 @@ type CreateWorkerOptions<TContract extends ContractDefinition> = {
|
|
|
388
388
|
defaultConsumerOptions?: ConsumerOptions | undefined;
|
|
389
389
|
/**
|
|
390
390
|
* Maximum time in ms to wait for the AMQP connection to become ready before
|
|
391
|
-
* `create()` resolves to `Result.Error<TechnicalError>`.
|
|
392
|
-
*
|
|
393
|
-
* indefinitely.
|
|
391
|
+
* `create()` resolves to `Result.Error<TechnicalError>`. Defaults to 30s
|
|
392
|
+
* (the {@link AmqpClient}'s `DEFAULT_CONNECT_TIMEOUT_MS`). Pass `null` to
|
|
393
|
+
* disable the timeout and let amqp-connection-manager retry indefinitely.
|
|
394
394
|
*/
|
|
395
|
-
connectTimeoutMs?: number | undefined;
|
|
395
|
+
connectTimeoutMs?: number | null | undefined;
|
|
396
396
|
};
|
|
397
397
|
/**
|
|
398
398
|
* Type-safe AMQP worker for consuming messages from RabbitMQ.
|
|
@@ -522,12 +522,16 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
|
|
|
522
522
|
*/
|
|
523
523
|
private consume;
|
|
524
524
|
/**
|
|
525
|
-
* Validate data against a Standard Schema
|
|
525
|
+
* Validate data against a Standard Schema. No side effects; the caller is
|
|
526
|
+
* responsible for ack/nack based on the Result.
|
|
526
527
|
*/
|
|
527
528
|
private validateSchema;
|
|
528
529
|
/**
|
|
529
|
-
* Parse and validate a message from AMQP.
|
|
530
|
-
*
|
|
530
|
+
* Parse and validate a message from AMQP. Pure: returns the validated payload
|
|
531
|
+
* and headers, or an error. The dispatch path in {@link processMessage} routes
|
|
532
|
+
* validation/parse errors directly to the DLQ (single nack) — they never enter
|
|
533
|
+
* the retry pipeline because retrying an unparseable or schema-violating
|
|
534
|
+
* payload cannot succeed.
|
|
531
535
|
*/
|
|
532
536
|
private parseAndValidateMessage;
|
|
533
537
|
/**
|
|
@@ -536,9 +540,18 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
|
|
|
536
540
|
* with `routingKey = msg.properties.replyTo`, which works for both
|
|
537
541
|
* `amq.rabbitmq.reply-to` and any anonymous queue declared by the caller.
|
|
538
542
|
*
|
|
539
|
-
*
|
|
540
|
-
*
|
|
541
|
-
*
|
|
543
|
+
* Failure semantics:
|
|
544
|
+
* - **Missing replyTo / correlationId**: NonRetryableError. The caller is
|
|
545
|
+
* already lost; retrying the original message cannot recover the reply
|
|
546
|
+
* path. The poison message lands in DLQ for inspection rather than being
|
|
547
|
+
* silently ack'd (which would mask a contract violation).
|
|
548
|
+
* - **Schema validation failure**: NonRetryableError — the handler returned
|
|
549
|
+
* the wrong shape; retrying the same input will not fix it.
|
|
550
|
+
* - **Publish failure**: NonRetryableError. The caller has already timed out
|
|
551
|
+
* (or will shortly), so retrying the message wastes the queue's retry
|
|
552
|
+
* budget on a reply that no one is waiting for. The message is logged and
|
|
553
|
+
* DLQ'd; the original work is treated as completed for the purpose of the
|
|
554
|
+
* inbox.
|
|
542
555
|
*/
|
|
543
556
|
private publishRpcResponse;
|
|
544
557
|
/**
|
package/dist/index.d.cts.map
CHANGED
|
@@ -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@
|
|
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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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -7,7 +7,7 @@ import { TcpSocketConnectOpts } from "net";
|
|
|
7
7
|
import { ConnectionOptions } from "tls";
|
|
8
8
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
9
9
|
|
|
10
|
-
//#region ../../node_modules/.pnpm/amqp-connection-manager@5.0.0_amqplib@
|
|
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
11
|
type ConnectionUrl = string | amqp.Options.Connect | {
|
|
12
12
|
url: string;
|
|
13
13
|
connectionOptions?: AmqpConnectionOptions;
|
|
@@ -388,11 +388,11 @@ type CreateWorkerOptions<TContract extends ContractDefinition> = {
|
|
|
388
388
|
defaultConsumerOptions?: ConsumerOptions | undefined;
|
|
389
389
|
/**
|
|
390
390
|
* Maximum time in ms to wait for the AMQP connection to become ready before
|
|
391
|
-
* `create()` resolves to `Result.Error<TechnicalError>`.
|
|
392
|
-
*
|
|
393
|
-
* indefinitely.
|
|
391
|
+
* `create()` resolves to `Result.Error<TechnicalError>`. Defaults to 30s
|
|
392
|
+
* (the {@link AmqpClient}'s `DEFAULT_CONNECT_TIMEOUT_MS`). Pass `null` to
|
|
393
|
+
* disable the timeout and let amqp-connection-manager retry indefinitely.
|
|
394
394
|
*/
|
|
395
|
-
connectTimeoutMs?: number | undefined;
|
|
395
|
+
connectTimeoutMs?: number | null | undefined;
|
|
396
396
|
};
|
|
397
397
|
/**
|
|
398
398
|
* Type-safe AMQP worker for consuming messages from RabbitMQ.
|
|
@@ -522,12 +522,16 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
|
|
|
522
522
|
*/
|
|
523
523
|
private consume;
|
|
524
524
|
/**
|
|
525
|
-
* Validate data against a Standard Schema
|
|
525
|
+
* Validate data against a Standard Schema. No side effects; the caller is
|
|
526
|
+
* responsible for ack/nack based on the Result.
|
|
526
527
|
*/
|
|
527
528
|
private validateSchema;
|
|
528
529
|
/**
|
|
529
|
-
* Parse and validate a message from AMQP.
|
|
530
|
-
*
|
|
530
|
+
* Parse and validate a message from AMQP. Pure: returns the validated payload
|
|
531
|
+
* and headers, or an error. The dispatch path in {@link processMessage} routes
|
|
532
|
+
* validation/parse errors directly to the DLQ (single nack) — they never enter
|
|
533
|
+
* the retry pipeline because retrying an unparseable or schema-violating
|
|
534
|
+
* payload cannot succeed.
|
|
531
535
|
*/
|
|
532
536
|
private parseAndValidateMessage;
|
|
533
537
|
/**
|
|
@@ -536,9 +540,18 @@ declare class TypedAmqpWorker<TContract extends ContractDefinition> {
|
|
|
536
540
|
* with `routingKey = msg.properties.replyTo`, which works for both
|
|
537
541
|
* `amq.rabbitmq.reply-to` and any anonymous queue declared by the caller.
|
|
538
542
|
*
|
|
539
|
-
*
|
|
540
|
-
*
|
|
541
|
-
*
|
|
543
|
+
* Failure semantics:
|
|
544
|
+
* - **Missing replyTo / correlationId**: NonRetryableError. The caller is
|
|
545
|
+
* already lost; retrying the original message cannot recover the reply
|
|
546
|
+
* path. The poison message lands in DLQ for inspection rather than being
|
|
547
|
+
* silently ack'd (which would mask a contract violation).
|
|
548
|
+
* - **Schema validation failure**: NonRetryableError — the handler returned
|
|
549
|
+
* the wrong shape; retrying the same input will not fix it.
|
|
550
|
+
* - **Publish failure**: NonRetryableError. The caller has already timed out
|
|
551
|
+
* (or will shortly), so retrying the message wastes the queue's retry
|
|
552
|
+
* budget on a reply that no one is waiting for. The message is logged and
|
|
553
|
+
* DLQ'd; the original work is treated as completed for the purpose of the
|
|
554
|
+
* inbox.
|
|
542
555
|
*/
|
|
543
556
|
private publishRpcResponse;
|
|
544
557
|
/**
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","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@
|
|
1
|
+
{"version":3,"file":"index.d.mts","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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"}
|