@cargolift-cdi/util-rabbitmq 0.1.7 → 0.1.8
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-publisher.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,qBACa,wBAAwB;
|
|
1
|
+
{"version":3,"file":"rabbitmq-publisher.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,qBACa,wBAAwB;IAEO,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEvF;;;;;;OAMG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,GAAG,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,GACA,OAAO,CAAC,IAAI,CAAC;CA6GjB"}
|
|
@@ -15,39 +15,11 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
var _, done = false;
|
|
24
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
25
|
-
var context = {};
|
|
26
|
-
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
27
|
-
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
28
|
-
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
29
|
-
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
30
|
-
if (kind === "accessor") {
|
|
31
|
-
if (result === void 0) continue;
|
|
32
|
-
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
33
|
-
if (_ = accept(result.get)) descriptor.get = _;
|
|
34
|
-
if (_ = accept(result.set)) descriptor.set = _;
|
|
35
|
-
if (_ = accept(result.init)) initializers.unshift(_);
|
|
36
|
-
}
|
|
37
|
-
else if (_ = accept(result)) {
|
|
38
|
-
if (kind === "field") initializers.unshift(_);
|
|
39
|
-
else descriptor[key] = _;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
43
|
-
done = true;
|
|
44
|
-
};
|
|
45
|
-
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
46
|
-
var useValue = arguments.length > 2;
|
|
47
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
48
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
49
|
-
}
|
|
50
|
-
return useValue ? value : void 0;
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
51
23
|
};
|
|
52
24
|
var __importStar = (this && this.__importStar) || (function () {
|
|
53
25
|
var ownKeys = function(o) {
|
|
@@ -66,145 +38,139 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
66
38
|
return result;
|
|
67
39
|
};
|
|
68
40
|
})();
|
|
69
|
-
var
|
|
70
|
-
if (typeof
|
|
71
|
-
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
45
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
72
46
|
};
|
|
73
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
74
48
|
exports.RabbitMQPublisherService = void 0;
|
|
75
49
|
const common_1 = require("@nestjs/common");
|
|
76
50
|
const amqp = __importStar(require("amqplib"));
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
51
|
+
const util_logger_1 = require("@cargolift-cdi/util-logger");
|
|
52
|
+
let RabbitMQPublisherService = class RabbitMQPublisherService {
|
|
53
|
+
//constructor(private readonly logger: LoggerContextService) { }
|
|
54
|
+
constructor(logger) {
|
|
55
|
+
this.logger = logger;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Emite mensagem diretamente com amqplib para garantir que headers virem nas Properties.
|
|
59
|
+
* - pattern: nome da fila/routingKey (ex: 'notifications')
|
|
60
|
+
* - payload: corpo da mensagem
|
|
61
|
+
* - client: ClientProxy (mantido para compatibilidade, mas não usado para publicar)
|
|
62
|
+
* - opts: opções opcionais: { exchange, exchangeType, routingKey, headers }
|
|
63
|
+
*/
|
|
64
|
+
async emit(pattern, payload, client, opts) {
|
|
65
|
+
const ctx = this.logger.getContext();
|
|
66
|
+
const headers = { ...(opts?.headers || {}) };
|
|
67
|
+
if (ctx?.correlation_id)
|
|
68
|
+
headers['x-correlation-id'] = ctx.correlation_id;
|
|
69
|
+
if (ctx?.trace)
|
|
70
|
+
headers['x-trace'] = ctx.trace;
|
|
71
|
+
headers['pattern'] = pattern;
|
|
72
|
+
const messageBody = { pattern, data: payload };
|
|
73
|
+
// URL do RabbitMQ (use a mesma que está no ClientsModule)
|
|
74
|
+
const url = process.env.RABBITMQ_URL;
|
|
75
|
+
if (!url)
|
|
76
|
+
throw new Error('RABBITMQ_URL não definido');
|
|
77
|
+
const connection = await amqp.connect(url);
|
|
78
|
+
// Evita crash por "Unhandled 'error' event" e garante log com contexto atual
|
|
79
|
+
connection.on('error', (err) => {
|
|
80
|
+
try {
|
|
81
|
+
this.logger?.error('AMQP connection error', err, { context: { rabbitmq: { url, queue: pattern } } });
|
|
82
|
+
}
|
|
83
|
+
catch { }
|
|
84
|
+
});
|
|
85
|
+
connection.on('close', () => {
|
|
86
|
+
/* intentionally left blank */
|
|
87
|
+
});
|
|
88
|
+
let channel = null;
|
|
89
|
+
try {
|
|
90
|
+
channel = await connection.createChannel();
|
|
91
|
+
channel.on('error', (err) => {
|
|
92
|
+
/* intentionally left blank */
|
|
113
93
|
});
|
|
114
|
-
|
|
94
|
+
channel.on('close', () => {
|
|
115
95
|
/* intentionally left blank */
|
|
116
96
|
});
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
97
|
+
// Alinhar arguments da fila com o que já foi criado (ex.: x-dead-letter-exchange)
|
|
98
|
+
const queueArgs = {};
|
|
99
|
+
if (process.env.RABBITMQ_DLX) {
|
|
100
|
+
queueArgs['x-dead-letter-exchange'] = process.env.RABBITMQ_DLX;
|
|
101
|
+
}
|
|
102
|
+
// Declare a fila com os mesmos argumentos (se houver) para evitar PRECONDITION_FAILED
|
|
103
|
+
const queueOptions = Object.keys(queueArgs).length
|
|
104
|
+
? { durable: true, arguments: queueArgs }
|
|
105
|
+
: { durable: true };
|
|
106
|
+
const content = Buffer.from(JSON.stringify(messageBody));
|
|
107
|
+
// Prioridade: opts.exchange > variável de ambiente RABBITMQ_EXCHANGE > enviar direto para fila
|
|
108
|
+
const exchangeToUse = opts?.exchange ?? process.env.RABBITMQ_EXCHANGE;
|
|
109
|
+
const exchangeType = opts?.exchangeType ?? process.env.RABBITMQ_EXCHANGE_TYPE ?? 'direct';
|
|
110
|
+
const routingKey = opts?.routingKey ?? pattern;
|
|
111
|
+
if (exchangeToUse) {
|
|
112
|
+
await channel.assertExchange(exchangeToUse, exchangeType, { durable: true });
|
|
113
|
+
const published = channel.publish(exchangeToUse, routingKey, content, {
|
|
114
|
+
persistent: true,
|
|
115
|
+
headers,
|
|
125
116
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
queueArgs['x-dead-letter-exchange'] = process.env.RABBITMQ_DLX;
|
|
130
|
-
}
|
|
131
|
-
// Declare a fila com os mesmos argumentos (se houver) para evitar PRECONDITION_FAILED
|
|
132
|
-
const queueOptions = Object.keys(queueArgs).length
|
|
133
|
-
? { durable: true, arguments: queueArgs }
|
|
134
|
-
: { durable: true };
|
|
135
|
-
const content = Buffer.from(JSON.stringify(messageBody));
|
|
136
|
-
// Prioridade: opts.exchange > variável de ambiente RABBITMQ_EXCHANGE > enviar direto para fila
|
|
137
|
-
const exchangeToUse = opts?.exchange ?? process.env.RABBITMQ_EXCHANGE;
|
|
138
|
-
const exchangeType = opts?.exchangeType ?? process.env.RABBITMQ_EXCHANGE_TYPE ?? 'direct';
|
|
139
|
-
const routingKey = opts?.routingKey ?? pattern;
|
|
140
|
-
if (exchangeToUse) {
|
|
141
|
-
await channel.assertExchange(exchangeToUse, exchangeType, { durable: true });
|
|
142
|
-
const published = channel.publish(exchangeToUse, routingKey, content, {
|
|
143
|
-
persistent: true,
|
|
144
|
-
headers,
|
|
145
|
-
});
|
|
146
|
-
if (!published) {
|
|
147
|
-
// backpressure: aguardar 'drain' se necessário (simplificado)
|
|
148
|
-
await new Promise((res) => channel.once('drain', () => res()));
|
|
149
|
-
}
|
|
150
|
-
this.logger.info(`Mensagem publicada no exchange "${exchangeToUse}" com routingKey "${routingKey}"`, {
|
|
151
|
-
context: { rabbitmq: { exchange: exchangeToUse, routingKey } },
|
|
152
|
-
});
|
|
117
|
+
if (!published) {
|
|
118
|
+
// backpressure: aguardar 'drain' se necessário (simplificado)
|
|
119
|
+
await new Promise((res) => channel.once('drain', () => res()));
|
|
153
120
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
await channel.assertQueue(pattern, queueOptions);
|
|
158
|
-
channel.sendToQueue(pattern, content, {
|
|
159
|
-
persistent: true,
|
|
160
|
-
headers,
|
|
161
|
-
});
|
|
162
|
-
*/
|
|
163
|
-
channel.sendToQueue(pattern, content, {
|
|
164
|
-
persistent: true,
|
|
165
|
-
headers,
|
|
166
|
-
});
|
|
167
|
-
this.logger.info(`Mensagem publicada na fila do RabbitMQ "${pattern}"`, {
|
|
168
|
-
context: { rabbitmq: { queue: pattern } },
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
await channel.close();
|
|
121
|
+
this.logger.info(`Mensagem publicada no exchange "${exchangeToUse}" com routingKey "${routingKey}"`, {
|
|
122
|
+
context: { rabbitmq: { exchange: exchangeToUse, routingKey } },
|
|
123
|
+
});
|
|
172
124
|
}
|
|
173
|
-
|
|
174
|
-
//
|
|
175
|
-
|
|
125
|
+
else {
|
|
126
|
+
// certifica que a fila existe antes de enviar diretamente
|
|
127
|
+
/*
|
|
128
|
+
await channel.assertQueue(pattern, queueOptions);
|
|
129
|
+
channel.sendToQueue(pattern, content, {
|
|
130
|
+
persistent: true,
|
|
131
|
+
headers,
|
|
132
|
+
});
|
|
133
|
+
*/
|
|
134
|
+
channel.sendToQueue(pattern, content, {
|
|
135
|
+
persistent: true,
|
|
136
|
+
headers,
|
|
137
|
+
});
|
|
138
|
+
this.logger.info(`Mensagem publicada na fila do RabbitMQ "${pattern}"`, {
|
|
176
139
|
context: { rabbitmq: { queue: pattern } },
|
|
177
140
|
});
|
|
178
|
-
throw err;
|
|
179
141
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
142
|
+
await channel.close();
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
// Loga com contexto e relança para que o controller/filtro capture
|
|
146
|
+
this.logger.error(`Erro ao publicar mensagem no RabbitMQ "${pattern}"`, err, {
|
|
147
|
+
context: { rabbitmq: { queue: pattern } },
|
|
148
|
+
});
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
try {
|
|
153
|
+
if (channel) {
|
|
154
|
+
try {
|
|
155
|
+
await channel.close();
|
|
187
156
|
}
|
|
157
|
+
catch { }
|
|
188
158
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
159
|
+
}
|
|
160
|
+
catch { }
|
|
161
|
+
try {
|
|
162
|
+
await connection.close();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// ignora erros ao fechar conexão
|
|
196
166
|
}
|
|
197
167
|
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
(() => {
|
|
201
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
202
|
-
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
203
|
-
RabbitMQPublisherService = _classThis = _classDescriptor.value;
|
|
204
|
-
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
205
|
-
__runInitializers(_classThis, _classExtraInitializers);
|
|
206
|
-
})();
|
|
207
|
-
return RabbitMQPublisherService = _classThis;
|
|
208
|
-
})();
|
|
168
|
+
}
|
|
169
|
+
};
|
|
209
170
|
exports.RabbitMQPublisherService = RabbitMQPublisherService;
|
|
171
|
+
exports.RabbitMQPublisherService = RabbitMQPublisherService = __decorate([
|
|
172
|
+
(0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
|
|
173
|
+
__param(0, (0, common_1.Inject)(util_logger_1.LoggerContextService)),
|
|
174
|
+
__metadata("design:paramtypes", [util_logger_1.LoggerContextService])
|
|
175
|
+
], RabbitMQPublisherService);
|
|
210
176
|
//# sourceMappingURL=rabbitmq-publisher.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-publisher.service.js","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rabbitmq-publisher.service.js","sourceRoot":"","sources":["../src/rabbitmq-publisher.service.ts"],"names":[],"mappings":"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"}
|