@cargolift-cdi/util-rabbitmq 0.2.4 → 0.2.7
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { RabbitMQChannel, RabbitMQMessage } from
|
|
2
|
-
import { LoggerContextService } from
|
|
1
|
+
import type { RabbitMQChannel, RabbitMQMessage } from "@cargolift-cdi/types";
|
|
2
|
+
import { LoggerContextService } from "@cargolift-cdi/common";
|
|
3
3
|
/**
|
|
4
4
|
* Publica mensagens com erro na Dead Letter Queue (DLQ) do RabbitMQ e faz ack da mensagem original.
|
|
5
5
|
* @param channel Canal do RabbitMQ
|
|
@@ -8,5 +8,7 @@ import { LoggerContextService } from '@cargolift-cdi/common';
|
|
|
8
8
|
* @param dlqExchange Exchange da DLQ (opcional)
|
|
9
9
|
* @param dlqRoutingKey Routing key da DLQ (opcional)
|
|
10
10
|
*/
|
|
11
|
-
export declare function publishToDlqAndAck(channel: RabbitMQChannel, originalMsg: RabbitMQMessage, logger: LoggerContextService, error: unknown, dlqExchange?: string, dlqRoutingKey?: string
|
|
11
|
+
export declare function publishToDlqAndAck(channel: RabbitMQChannel, originalMsg: RabbitMQMessage, logger: LoggerContextService, error: unknown, dlqExchange?: string, dlqRoutingKey?: string, options?: {
|
|
12
|
+
noLoggerError: boolean;
|
|
13
|
+
}): void;
|
|
12
14
|
//# sourceMappingURL=rabbitmq-publisher-dlq.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-publisher-dlq.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-publisher-dlq.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAiB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE5E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,OAAO,EACd,WAAW,SAAc,EACzB,aAAa,SAAmB,
|
|
1
|
+
{"version":3,"file":"rabbitmq-publisher-dlq.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-publisher-dlq.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAiB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE5E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,OAAO,EACd,WAAW,SAAc,EACzB,aAAa,SAAmB,EAChC,OAAO,CAAC,EAAE;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,QAqFrC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BusinessError } from
|
|
1
|
+
import { BusinessError } from "@cargolift-cdi/common";
|
|
2
2
|
/**
|
|
3
3
|
* Publica mensagens com erro na Dead Letter Queue (DLQ) do RabbitMQ e faz ack da mensagem original.
|
|
4
4
|
* @param channel Canal do RabbitMQ
|
|
@@ -7,36 +7,59 @@ import { BusinessError } from '@cargolift-cdi/common';
|
|
|
7
7
|
* @param dlqExchange Exchange da DLQ (opcional)
|
|
8
8
|
* @param dlqRoutingKey Routing key da DLQ (opcional)
|
|
9
9
|
*/
|
|
10
|
-
export function publishToDlqAndAck(channel, originalMsg, logger, error, dlqExchange =
|
|
11
|
-
let normalized = {
|
|
10
|
+
export function publishToDlqAndAck(channel, originalMsg, logger, error, dlqExchange = "email.dlx", dlqRoutingKey = "email.send.dlq", options) {
|
|
11
|
+
let normalized = {
|
|
12
|
+
name: "Error",
|
|
13
|
+
message: "Erro desconhecido",
|
|
14
|
+
};
|
|
12
15
|
if (error instanceof Error) {
|
|
13
|
-
normalized = {
|
|
16
|
+
normalized = {
|
|
17
|
+
name: error.name,
|
|
18
|
+
message: error.message,
|
|
19
|
+
stack: error.stack,
|
|
20
|
+
};
|
|
14
21
|
}
|
|
15
|
-
else if (typeof error ===
|
|
16
|
-
normalized = { name:
|
|
22
|
+
else if (typeof error === "string") {
|
|
23
|
+
normalized = { name: "Error", message: error };
|
|
17
24
|
}
|
|
18
|
-
else if (error && typeof error ===
|
|
25
|
+
else if (error && typeof error === "object") {
|
|
19
26
|
try {
|
|
20
27
|
const anyErr = error;
|
|
21
|
-
normalized = {
|
|
28
|
+
normalized = {
|
|
29
|
+
name: anyErr.name || "Error",
|
|
30
|
+
message: anyErr.message || JSON.stringify(anyErr),
|
|
31
|
+
stack: anyErr.stack,
|
|
32
|
+
};
|
|
22
33
|
}
|
|
23
34
|
catch { }
|
|
24
35
|
}
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
if (options?.noLoggerError === false) {
|
|
37
|
+
if (error instanceof BusinessError) {
|
|
38
|
+
logger.businessError(normalized.message, {
|
|
39
|
+
error: normalized.message,
|
|
40
|
+
name: normalized.name,
|
|
41
|
+
stack: normalized.stack,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
logger.error(normalized.message, {
|
|
46
|
+
error: normalized.message,
|
|
47
|
+
name: normalized.name,
|
|
48
|
+
stack: normalized.stack,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
30
51
|
}
|
|
31
52
|
const originalHeaders = originalMsg.properties.headers || {};
|
|
32
53
|
const headers = {
|
|
33
54
|
...originalHeaders,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
55
|
+
"x-trace": logger.getContext().trace ||
|
|
56
|
+
originalHeaders["x-trace"] ||
|
|
57
|
+
`trace-missing:${process.env.npm_package_name}`,
|
|
58
|
+
"x-error-reason": normalized.message,
|
|
59
|
+
"x-exception-name": normalized.name,
|
|
37
60
|
};
|
|
38
61
|
if (normalized.stack) {
|
|
39
|
-
headers[
|
|
62
|
+
headers["x-error-stacktrace"] = normalized.stack.substring(0, 4000); // limita tamanho
|
|
40
63
|
}
|
|
41
64
|
// Payload enriquecido mantendo compatibilidade (fallback para conteúdo original)
|
|
42
65
|
let buffer = originalMsg.content;
|
|
@@ -49,26 +72,31 @@ export function publishToDlqAndAck(channel, originalMsg, logger, error, dlqExcha
|
|
|
49
72
|
originalPayload: safeParse(originalMsg.content),
|
|
50
73
|
};
|
|
51
74
|
buffer = Buffer.from(JSON.stringify(enriched));
|
|
52
|
-
headers[
|
|
75
|
+
headers["x-dlq-enriched"] = "1";
|
|
53
76
|
}
|
|
54
77
|
catch (e) {
|
|
55
|
-
headers[
|
|
78
|
+
headers["x-dlq-enriched"] = "0";
|
|
56
79
|
}
|
|
57
80
|
try {
|
|
58
81
|
channel.publish(dlqExchange, dlqRoutingKey, buffer, { headers });
|
|
59
82
|
channel.ack(originalMsg);
|
|
60
83
|
}
|
|
61
84
|
catch (pubErr) {
|
|
62
|
-
logger.error(
|
|
85
|
+
logger.error("[publishToDlqAndAck] Fatal Error: Falha ao publicar mensagem em DLQ", {
|
|
86
|
+
originalError: normalized,
|
|
87
|
+
publishError: pubErr,
|
|
88
|
+
});
|
|
63
89
|
try {
|
|
64
90
|
channel.ack(originalMsg);
|
|
65
91
|
}
|
|
66
|
-
catch {
|
|
92
|
+
catch {
|
|
93
|
+
/* evita loop */
|
|
94
|
+
}
|
|
67
95
|
}
|
|
68
96
|
}
|
|
69
97
|
function safeParse(buf) {
|
|
70
98
|
try {
|
|
71
|
-
return JSON.parse(buf.toString(
|
|
99
|
+
return JSON.parse(buf.toString("utf8"));
|
|
72
100
|
}
|
|
73
101
|
catch {
|
|
74
102
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-publisher-dlq.service.js","sourceRoot":"","sources":["../src/rabbitmq-publisher-dlq.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAwB,MAAM,uBAAuB,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAwB,EACxB,WAA4B,EAC5B,MAA4B,EAC5B,KAAc,EACd,WAAW,GAAG,WAAW,EACzB,aAAa,GAAG,gBAAgB;
|
|
1
|
+
{"version":3,"file":"rabbitmq-publisher-dlq.service.js","sourceRoot":"","sources":["../src/rabbitmq-publisher-dlq.service.ts"],"names":[],"mappings":"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"}
|