@cargolift-cdi/util-rabbitmq 0.1.46 → 0.1.48
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/integration-publisher.service.d.ts.map +1 -1
- package/dist/integration-publisher.service.js +2 -0
- package/dist/integration-publisher.service.js.map +1 -1
- package/dist/rabbitmq-envelope-message.d.ts +2 -1
- package/dist/rabbitmq-envelope-message.d.ts.map +1 -1
- package/dist/rabbitmq-envelope-message.js.map +1 -1
- package/dist/rabbitmq-publisher.service.d.ts +0 -6
- package/dist/rabbitmq-publisher.service.d.ts.map +1 -1
- package/dist/rabbitmq-publisher.service.js +124 -106
- package/dist/rabbitmq-publisher.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-publisher.service.d.ts","sourceRoot":"","sources":["../src/integration-publisher.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qBAAqB,CAAC,EAAE,GAAG,CAAC;QAC5B,cAAc,CAAC,EAAE,GAAG,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBACa,2BAA2B;IAMpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IACI,OAAO,CAAC,QAAQ,CAAC,MAAM;IANvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0D;IAC1F,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAuE;gBAG7F,SAAS,EAAE,wBAAwB,EACL,MAAM,EAAE,oBAAoB;IAE7E;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"integration-publisher.service.d.ts","sourceRoot":"","sources":["../src/integration-publisher.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qBAAqB,CAAC,EAAE,GAAG,CAAC;QAC5B,cAAc,CAAC,EAAE,GAAG,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBACa,2BAA2B;IAMpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IACI,OAAO,CAAC,QAAQ,CAAC,MAAM;IANvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0D;IAC1F,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAuE;gBAG7F,SAAS,EAAE,wBAAwB,EACL,MAAM,EAAE,oBAAoB;IAE7E;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CA4CxD"}
|
|
@@ -35,6 +35,7 @@ let IntegrationPublisherService = class IntegrationPublisherService {
|
|
|
35
35
|
correlationId: opts.envelope?.correlationId || ctx?.correlation_id,
|
|
36
36
|
eventType: opts.envelope?.eventType || routingKey,
|
|
37
37
|
source: opts.envelope?.source || ctx?.source || undefined,
|
|
38
|
+
application: opts.envelope?.application || ctx?.application || undefined,
|
|
38
39
|
timestamp: opts.envelope?.timestamp, // será preenchido pelo publisher se faltar
|
|
39
40
|
...opts.envelope,
|
|
40
41
|
};
|
|
@@ -42,6 +43,7 @@ let IntegrationPublisherService = class IntegrationPublisherService {
|
|
|
42
43
|
'x-correlation-id': envelope.correlationId,
|
|
43
44
|
'x-trace': envelope?.trace || ctx?.trace,
|
|
44
45
|
'x-source': envelope?.source || ctx?.source,
|
|
46
|
+
'x-application': envelope?.application || ctx?.application,
|
|
45
47
|
...(opts.headers || {}),
|
|
46
48
|
};
|
|
47
49
|
await this.publisher.publish(exchange, routingKey, envelope, opts.payload, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-publisher.service.js","sourceRoot":"","sources":["../src/integration-publisher.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAuBpE,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAKtC,YACmB,SAAmC,EACtB,MAA6C;QAD1D,cAAS,GAAT,SAAS,CAA0B;QACL,WAAM,GAAN,MAAM,CAAsB;QAN5D,oBAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,qBAAqB,CAAC;QACzE,wBAAmB,GAAG,OAAO,CAAC;QAC9B,6BAAwB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,wBAAwB,CAAC;IAK5G,CAAC;IACL;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,IAAyB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,oEAAoE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAE5G,MAAM,QAAQ,GAAoB;YAChC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,GAAG,EAAE,cAAc;YAClE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,UAAU;YACjD,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,IAAI,SAAS;YACzD,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,2CAA2C;YAChF,GAAG,IAAI,CAAC,QAAQ;SACjB,CAAC;QAEF,MAAM,OAAO,GAAwB;YACnC,kBAAkB,EAAE,QAAQ,CAAC,aAAa;YAC1C,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK;YACxC,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM;YAC3C,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ;YACE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,IAAI,IAAI,CAAC,mBAAmB;YAChE,qBAAqB,EAAE;gBACrB,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,IAAI,CAAC,wBAAwB;gBAChD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,IAAI,EAAE,CAAC;aAC3C;YACD,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI;YACxC,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,cAAc;YACxC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS;SAC/B,CACF,CAAC;IACJ,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"integration-publisher.service.js","sourceRoot":"","sources":["../src/integration-publisher.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAuBpE,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAKtC,YACmB,SAAmC,EACtB,MAA6C;QAD1D,cAAS,GAAT,SAAS,CAA0B;QACL,WAAM,GAAN,MAAM,CAAsB;QAN5D,oBAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,qBAAqB,CAAC;QACzE,wBAAmB,GAAG,OAAO,CAAC;QAC9B,6BAAwB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,wBAAwB,CAAC;IAK5G,CAAC;IACL;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,IAAyB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,oEAAoE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAE5G,MAAM,QAAQ,GAAoB;YAChC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,GAAG,EAAE,cAAc;YAClE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,UAAU;YACjD,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,IAAI,SAAS;YACzD,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,SAAS;YACxE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,2CAA2C;YAChF,GAAG,IAAI,CAAC,QAAQ;SACjB,CAAC;QAEF,MAAM,OAAO,GAAwB;YACnC,kBAAkB,EAAE,QAAQ,CAAC,aAAa;YAC1C,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK;YACxC,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM;YAC3C,eAAe,EAAE,QAAQ,EAAE,WAAW,IAAI,GAAG,EAAE,WAAW;YAC1D,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ;YACE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,IAAI,IAAI,CAAC,mBAAmB;YAChE,qBAAqB,EAAE;gBACrB,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,IAAI,CAAC,wBAAwB;gBAChD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,IAAI,EAAE,CAAC;aAC3C;YACD,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI;YACxC,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,cAAc;YACxC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS;SAC/B,CACF,CAAC;IACJ,CAAC;CACF,CAAA;AA1DY,2BAA2B;IADvC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAQhC,WAAA,MAAM,CAAC,oBAAoB,CAAC,CAAA;qCADD,wBAAwB;QACG,oBAAoB;GAPlE,2BAA2B,CA0DvC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogSource } from "@cargolift-cdi/common";
|
|
1
|
+
import { ApplicationInfo, LogSource } from "@cargolift-cdi/common";
|
|
2
2
|
/**
|
|
3
3
|
* Envelope (metadados) da mensagem publicada.
|
|
4
4
|
*/
|
|
@@ -6,6 +6,7 @@ export interface EnvelopeMessage {
|
|
|
6
6
|
correlationId?: string;
|
|
7
7
|
eventType?: string;
|
|
8
8
|
source?: LogSource;
|
|
9
|
+
application?: ApplicationInfo;
|
|
9
10
|
method?: string;
|
|
10
11
|
timestamp?: string;
|
|
11
12
|
[key: string]: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-envelope-message.d.ts","sourceRoot":"","sources":["../src/rabbitmq-envelope-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"rabbitmq-envelope-message.d.ts","sourceRoot":"","sources":["../src/rabbitmq-envelope-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-envelope-message.js","sourceRoot":"","sources":["../src/rabbitmq-envelope-message.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"rabbitmq-envelope-message.js","sourceRoot":"","sources":["../src/rabbitmq-envelope-message.ts"],"names":[],"mappings":";AAgBA,oCAAoC;AACpC,gBAAgB;AAChB,uBAAuB;AACvB,iBAAiB;AAGjB,oCAAoC;AACpC,mBAAmB;AACnB,yBAAyB;AACzB,iBAAiB"}
|
|
@@ -10,12 +10,6 @@ export declare class RabbitMQPublisherService {
|
|
|
10
10
|
* - payload: corpo da mensagem
|
|
11
11
|
* - opts: opções opcionais: { exchange, exchangeType, routingKey, headers }
|
|
12
12
|
*/
|
|
13
|
-
emit(pattern: string, payload: any, opts?: {
|
|
14
|
-
exchange?: string;
|
|
15
|
-
exchangeType?: string;
|
|
16
|
-
routingKey?: string;
|
|
17
|
-
headers?: Record<string, any>;
|
|
18
|
-
}): Promise<void>;
|
|
19
13
|
/**
|
|
20
14
|
* Publica mensagem em exchange usando ConfirmChannel para garantir confirmação (publisher confirms).
|
|
21
15
|
* Boas práticas amqplib aplicadas:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-publisher.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKjE,qBACa,wBAAwB;IAEO,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEvF;;;;;OAKG;
|
|
1
|
+
{"version":3,"file":"rabbitmq-publisher.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKjE,qBACa,wBAAwB;IAEO,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEvF;;;;;OAKG;IAkIH;;;;;;;;;;;;;;OAcG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,GAAG,EACZ,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qBAAqB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QACpD,cAAc,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC;KACnC,GACA,OAAO,CAAC,IAAI,CAAC;CAwHjB"}
|
|
@@ -25,119 +25,133 @@ let RabbitMQPublisherService = class RabbitMQPublisherService {
|
|
|
25
25
|
* - payload: corpo da mensagem
|
|
26
26
|
* - opts: opções opcionais: { exchange, exchangeType, routingKey, headers }
|
|
27
27
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
let channel = null;
|
|
28
|
+
/*
|
|
29
|
+
async emit(
|
|
30
|
+
pattern: string,
|
|
31
|
+
payload: any,
|
|
32
|
+
opts?: {
|
|
33
|
+
exchange?: string;
|
|
34
|
+
exchangeType?: string;
|
|
35
|
+
routingKey?: string;
|
|
36
|
+
headers?: Record<string, any>;
|
|
37
|
+
},
|
|
38
|
+
): Promise<void> {
|
|
39
|
+
const ctx = this.logger.getContext();
|
|
40
|
+
const headers: Record<string, any> = { ...(opts?.headers || {}) };
|
|
41
|
+
|
|
42
|
+
if (ctx?.correlation_id) headers['x-correlation-id'] = ctx.correlation_id;
|
|
43
|
+
if (ctx?.trace) headers['x-trace'] = ctx.trace;
|
|
44
|
+
if (ctx?.source) headers['x-source'] = ctx.source;
|
|
45
|
+
|
|
46
|
+
headers['pattern'] = pattern;
|
|
47
|
+
const messageBody = { pattern, data: payload };
|
|
48
|
+
|
|
49
|
+
// URL do RabbitMQ (use a mesma que está no ClientsModule)
|
|
50
|
+
const url = process.env.RABBITMQ_URL;
|
|
51
|
+
if (!url) throw new Error('RABBITMQ_URL não definido');
|
|
52
|
+
|
|
53
|
+
const connection = await amqp.connect(url);
|
|
54
|
+
|
|
55
|
+
// Evita crash por "Unhandled 'error' event" e garante log com contexto atual
|
|
56
|
+
connection.on('error', (err) => {
|
|
58
57
|
try {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
channel.on('close', () => {
|
|
64
|
-
/* intentionally left blank */
|
|
58
|
+
this.logger?.error('AMQP connection error', err as any,
|
|
59
|
+
{
|
|
60
|
+
application: { name: "util-rabbitmq", function: "RabbitMQPublisherService", action: "emit" },
|
|
61
|
+
data: { rabbitmq: { url, queue: pattern } }
|
|
65
62
|
});
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
await new Promise((res) => channel.once('drain', () => res()));
|
|
89
|
-
}
|
|
90
|
-
this.logger.info(`Mensagem publicada no exchange "${exchangeToUse}" com routingKey "${routingKey}"`, {
|
|
91
|
-
application: { name: "util-rabbitmq", function: "RabbitMQPublisherService", action: "emit" },
|
|
92
|
-
data: { rabbitmq: { queue: pattern, exchange: exchangeToUse, routingKey } },
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
// certifica que a fila existe antes de enviar diretamente
|
|
97
|
-
/*
|
|
98
|
-
await channel.assertQueue(pattern, queueOptions);
|
|
99
|
-
channel.sendToQueue(pattern, content, {
|
|
100
|
-
persistent: true,
|
|
101
|
-
headers,
|
|
102
|
-
});
|
|
103
|
-
*/
|
|
104
|
-
channel.sendToQueue(pattern, content, {
|
|
105
|
-
persistent: true,
|
|
106
|
-
headers,
|
|
107
|
-
});
|
|
108
|
-
this.logger.info(`Mensagem publicada na fila do RabbitMQ "${pattern}"`, {
|
|
109
|
-
application: { name: "util-rabbitmq", function: "RabbitMQPublisherService", action: "emit" },
|
|
110
|
-
data: { rabbitmq: { queue: pattern } },
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
await channel.close();
|
|
63
|
+
} catch { }
|
|
64
|
+
});
|
|
65
|
+
connection.on('close', () => {
|
|
66
|
+
// intentionally left blank
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
let channel: amqp.Channel | null = null;
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
channel = await connection.createChannel();
|
|
73
|
+
|
|
74
|
+
channel.on('error', (err) => {
|
|
75
|
+
// intentionally left blank
|
|
76
|
+
});
|
|
77
|
+
channel.on('close', () => {
|
|
78
|
+
// intentionally left blank
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Alinhar arguments da fila com o que já foi criado (ex.: x-dead-letter-exchange)
|
|
82
|
+
const queueArgs: Record<string, any> = {};
|
|
83
|
+
if (process.env.RABBITMQ_DLX) {
|
|
84
|
+
queueArgs['x-dead-letter-exchange'] = process.env.RABBITMQ_DLX;
|
|
114
85
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
86
|
+
|
|
87
|
+
// Declare a fila com os mesmos argumentos (se houver) para evitar PRECONDITION_FAILED
|
|
88
|
+
const queueOptions = Object.keys(queueArgs).length
|
|
89
|
+
? { durable: true, arguments: queueArgs }
|
|
90
|
+
: { durable: true };
|
|
91
|
+
|
|
92
|
+
const content = Buffer.from(JSON.stringify(messageBody));
|
|
93
|
+
|
|
94
|
+
// Prioridade: opts.exchange > variável de ambiente RABBITMQ_EXCHANGE > enviar direto para fila
|
|
95
|
+
const exchangeToUse = opts?.exchange ?? process.env.RABBITMQ_EXCHANGE;
|
|
96
|
+
const exchangeType = opts?.exchangeType ?? (process.env.RABBITMQ_EXCHANGE_TYPE as any) ?? 'direct';
|
|
97
|
+
const routingKey = opts?.routingKey ?? pattern;
|
|
98
|
+
|
|
99
|
+
if (exchangeToUse) {
|
|
100
|
+
await channel.assertExchange(exchangeToUse, exchangeType, { durable: true });
|
|
101
|
+
const published = channel.publish(exchangeToUse, routingKey, content, {
|
|
102
|
+
persistent: true,
|
|
103
|
+
headers,
|
|
104
|
+
});
|
|
105
|
+
if (!published) {
|
|
106
|
+
// backpressure: aguardar 'drain' se necessário (simplificado)
|
|
107
|
+
await new Promise<void>((res) => channel!.once('drain', () => res()));
|
|
108
|
+
}
|
|
109
|
+
this.logger.info(`Mensagem publicada no exchange "${exchangeToUse}" com routingKey "${routingKey}"`, {
|
|
110
|
+
application: { name: "util-rabbitmq", function: "RabbitMQPublisherService", action: "emit" },
|
|
111
|
+
data: { rabbitmq: { queue: pattern, exchange: exchangeToUse, routingKey } },
|
|
112
|
+
});
|
|
113
|
+
} else {
|
|
114
|
+
// certifica que a fila existe antes de enviar diretamente
|
|
115
|
+
|
|
116
|
+
// await channel.assertQueue(pattern, queueOptions);
|
|
117
|
+
// channel.sendToQueue(pattern, content, {
|
|
118
|
+
// persistent: true,
|
|
119
|
+
// headers,
|
|
120
|
+
// });
|
|
121
|
+
channel.sendToQueue(pattern, content, {
|
|
122
|
+
persistent: true,
|
|
123
|
+
headers,
|
|
124
|
+
});
|
|
125
|
+
this.logger.info(`Mensagem publicada na fila do RabbitMQ "${pattern}"`, {
|
|
126
|
+
application: { name: "util-rabbitmq", function: "RabbitMQPublisherService", action: "emit" },
|
|
127
|
+
data: { rabbitmq: { queue: pattern } },
|
|
128
|
+
});
|
|
122
129
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
|
|
131
|
+
await channel.close();
|
|
132
|
+
} catch (err) {
|
|
133
|
+
// Loga com contexto e relança para que o controller/filtro capture
|
|
134
|
+
this.logger.error(`Erro ao publicar mensagem no RabbitMQ "${pattern}"`, err as any, {
|
|
135
|
+
application: { name: "util-rabbitmq", function: "RabbitMQPublisherService", action: "emit" },
|
|
136
|
+
data: { rabbitmq: { queue: pattern } },
|
|
137
|
+
});
|
|
138
|
+
throw err;
|
|
139
|
+
} finally {
|
|
140
|
+
try {
|
|
141
|
+
if (channel) {
|
|
133
142
|
try {
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
143
|
+
await channel.close();
|
|
144
|
+
} catch { }
|
|
145
|
+
}
|
|
146
|
+
} catch { }
|
|
147
|
+
try {
|
|
148
|
+
await connection.close();
|
|
149
|
+
} catch {
|
|
150
|
+
// ignora erros ao fechar conexão
|
|
139
151
|
}
|
|
152
|
+
}
|
|
140
153
|
}
|
|
154
|
+
*/
|
|
141
155
|
/**
|
|
142
156
|
* Publica mensagem em exchange usando ConfirmChannel para garantir confirmação (publisher confirms).
|
|
143
157
|
* Boas práticas amqplib aplicadas:
|
|
@@ -164,6 +178,8 @@ let RabbitMQPublisherService = class RabbitMQPublisherService {
|
|
|
164
178
|
headers['x-trace'] = ctx.trace;
|
|
165
179
|
if (ctx?.source)
|
|
166
180
|
headers['x-source'] = ctx.source;
|
|
181
|
+
if (ctx?.application)
|
|
182
|
+
headers['x-application'] = ctx.application;
|
|
167
183
|
console.log('Headers before pattern assignment:', headers);
|
|
168
184
|
console.log('this.logger.getContext():', this.logger.getContext());
|
|
169
185
|
const pattern = opts?.pattern || routingKey;
|
|
@@ -171,6 +187,7 @@ let RabbitMQPublisherService = class RabbitMQPublisherService {
|
|
|
171
187
|
// envelope.correlationId = envelope.correlationId || ctx?.correlation_id || 'unknown';
|
|
172
188
|
const headerCorrelation = headers['x-correlation-id'];
|
|
173
189
|
const sourceHeader = headers['x-source'];
|
|
190
|
+
const applicationHeader = headers['x-application'];
|
|
174
191
|
envelope.correlationId = envelope.correlationId || headerCorrelation || ctx?.correlation_id;
|
|
175
192
|
if (!envelope.correlationId) {
|
|
176
193
|
this.logger.warn('CorrelationId ausente; gerando novo (verifique serviço de origem)');
|
|
@@ -178,6 +195,7 @@ let RabbitMQPublisherService = class RabbitMQPublisherService {
|
|
|
178
195
|
}
|
|
179
196
|
envelope.eventType = envelope.eventType || routingKey;
|
|
180
197
|
envelope.source = envelope.source || sourceHeader || 'unknown';
|
|
198
|
+
envelope.application = envelope.application || applicationHeader || undefined;
|
|
181
199
|
if (!envelope.timestamp)
|
|
182
200
|
envelope.timestamp = new Date().toISOString();
|
|
183
201
|
const messageBody = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-publisher.service.js","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAK7B,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,gEAAgE;IAChE,YAA2D,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;IAAI,CAAC;IAE5F;;;;;OAKG;IAEH
|
|
1
|
+
{"version":3,"file":"rabbitmq-publisher.service.js","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"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"}
|