@dofe/infra-rabbitmq 0.1.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.
@@ -0,0 +1,11 @@
1
+ import * as Rabbitmq from 'amqplib';
2
+ export declare const RABBITMQ_CONNECTION: unique symbol;
3
+ export declare class AppRabbitConfig {
4
+ url: string;
5
+ }
6
+ export interface RabbitmqConnection {
7
+ connection: Rabbitmq.ChannelModel | null;
8
+ connect(): Promise<Rabbitmq.ChannelModel>;
9
+ close(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=rabbitmq.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.dto.d.ts","sourceRoot":"","sources":["../../src/dto/rabbitmq.dto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,eAAO,MAAM,mBAAmB,eAA0B,CAAC;AAE3D,qBAAa,eAAe;IAE1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AppRabbitConfig = exports.RABBITMQ_CONNECTION = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ exports.RABBITMQ_CONNECTION = Symbol('RABBITMQ:AUTH');
15
+ class AppRabbitConfig {
16
+ url;
17
+ }
18
+ exports.AppRabbitConfig = AppRabbitConfig;
19
+ __decorate([
20
+ (0, class_validator_1.IsNotEmpty)(),
21
+ __metadata("design:type", String)
22
+ ], AppRabbitConfig.prototype, "url", void 0);
23
+ //# sourceMappingURL=rabbitmq.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.dto.js","sourceRoot":"","sources":["../../src/dto/rabbitmq.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAA6C;AAEhC,QAAA,mBAAmB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3D,MAAa,eAAe;IAE1B,GAAG,CAAS;CACb;AAHD,0CAGC;AADC;IADC,IAAA,4BAAU,GAAE;;4CACD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * RabbitMQ 模块导出
3
+ */
4
+ export { RabbitmqModule } from './rabbitmq.module';
5
+ export * from './rabbitmq.service';
6
+ export * from './dto/rabbitmq.dto';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RabbitmqModule = void 0;
18
+ /**
19
+ * RabbitMQ 模块导出
20
+ */
21
+ var rabbitmq_module_1 = require("./rabbitmq.module");
22
+ Object.defineProperty(exports, "RabbitmqModule", { enumerable: true, get: function () { return rabbitmq_module_1.RabbitmqModule; } });
23
+ __exportStar(require("./rabbitmq.service"), exports);
24
+ __exportStar(require("./dto/rabbitmq.dto"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qDAAmC;AACnC,qDAAmC"}
@@ -0,0 +1,7 @@
1
+ import type * as Rabbitmq from 'amqplib';
2
+ export declare const RABBITMQ_EVENTS_CONNECTION = "RABBITMQ_EVENTS_CONNECTION";
3
+ export interface RabbitmqEventsConnection {
4
+ connection: Rabbitmq.Connection;
5
+ close: () => Promise<void>;
6
+ }
7
+ //# sourceMappingURL=rabbitmq-events.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-events.constants.d.ts","sourceRoot":"","sources":["../src/rabbitmq-events.constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAChC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RABBITMQ_EVENTS_CONNECTION = void 0;
4
+ exports.RABBITMQ_EVENTS_CONNECTION = 'RABBITMQ_EVENTS_CONNECTION';
5
+ //# sourceMappingURL=rabbitmq-events.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-events.constants.js","sourceRoot":"","sources":["../src/rabbitmq-events.constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,0BAA0B,GAAG,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { RABBITMQ_EVENTS_CONNECTION, type RabbitmqEventsConnection } from './rabbitmq-events.constants';
2
+ export { RABBITMQ_EVENTS_CONNECTION, RabbitmqEventsConnection };
3
+ export declare class RabbitmqEventsModule {
4
+ }
5
+ //# sourceMappingURL=rabbitmq-events.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-events.module.d.ts","sourceRoot":"","sources":["../src/rabbitmq-events.module.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,0BAA0B,EAC1B,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,CAAC;AAEhE,qBA4Ga,oBAAoB;CAAG"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
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;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.RabbitmqEventsModule = exports.RABBITMQ_EVENTS_CONNECTION = void 0;
46
+ /**
47
+ * RabbitMQ Events Module
48
+ *
49
+ * 独立的 RabbitMQ 连接用于事件驱动系统
50
+ * 使用独立的 vhost: nestjs_to_agentx_events
51
+ * 不影响其他任务队列
52
+ */
53
+ const common_1 = require("@nestjs/common");
54
+ const Rabbitmq = __importStar(require("amqplib"));
55
+ const config_1 = require("@nestjs/config");
56
+ const environment_util_1 = __importDefault(require("@dofe/infra-utils/environment.util"));
57
+ const rabbitmq_events_service_1 = require("./rabbitmq-events.service");
58
+ const rabbitmq_events_constants_1 = require("./rabbitmq-events.constants");
59
+ Object.defineProperty(exports, "RABBITMQ_EVENTS_CONNECTION", { enumerable: true, get: function () { return rabbitmq_events_constants_1.RABBITMQ_EVENTS_CONNECTION; } });
60
+ let RabbitmqEventsModule = class RabbitmqEventsModule {
61
+ };
62
+ exports.RabbitmqEventsModule = RabbitmqEventsModule;
63
+ exports.RabbitmqEventsModule = RabbitmqEventsModule = __decorate([
64
+ (0, common_1.Module)({
65
+ imports: [config_1.ConfigModule],
66
+ providers: [
67
+ rabbitmq_events_service_1.RabbitmqEventsService,
68
+ {
69
+ provide: rabbitmq_events_constants_1.RABBITMQ_EVENTS_CONNECTION,
70
+ useFactory: async () => {
71
+ const maxRetries = 5;
72
+ const retryDelay = 3000; // 3 seconds
73
+ let lastError = null;
74
+ // 使用独立的 RabbitMQ 连接 URL (独立 vhost)
75
+ const rabbitmqEventsUrl = process.env.RABBITMQ_EVENTS_URL;
76
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
77
+ try {
78
+ console.log(`[Events] Attempting to connect to RabbitMQ Events (attempt ${attempt}/${maxRetries})`);
79
+ const connection = await Rabbitmq.connect(rabbitmqEventsUrl, {
80
+ heartbeat: 60,
81
+ reconnect: true,
82
+ reconnectBackoffStrategy: 'linear',
83
+ reconnectBackoffTime: 1000,
84
+ });
85
+ if (environment_util_1.default.isProduction()) {
86
+ console.log('✅ [Events] RabbitMQ Events connection established successfully');
87
+ }
88
+ else {
89
+ console.log(`✅ [Events] RabbitMQ Events connection established: ${rabbitmqEventsUrl}`);
90
+ }
91
+ // 设置连接错误监听
92
+ connection.on('error', (error) => {
93
+ console.error('[Events] RabbitMQ Events connection error:', error);
94
+ });
95
+ connection.on('close', () => {
96
+ console.warn('⚠️ [Events] RabbitMQ Events connection closed');
97
+ });
98
+ return {
99
+ connection: connection,
100
+ close: async () => {
101
+ try {
102
+ await connection.close();
103
+ console.log('✅ [Events] RabbitMQ Events connection closed gracefully');
104
+ }
105
+ catch (error) {
106
+ // 忽略已关闭的连接错误
107
+ if (!(error instanceof Error) ||
108
+ (!error.message.includes('closed') &&
109
+ !error.message.includes('Connection closed') &&
110
+ !error.message.includes('IllegalOperationError'))) {
111
+ console.error('❌ [Events] Error closing RabbitMQ Events connection:', error);
112
+ }
113
+ }
114
+ },
115
+ };
116
+ }
117
+ catch (error) {
118
+ lastError = error;
119
+ console.error(`[Events] RabbitMQ Events connection attempt ${attempt}/${maxRetries} failed:`, error);
120
+ if (attempt < maxRetries) {
121
+ console.log(`[Events] Retrying in ${retryDelay}ms...`);
122
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
123
+ }
124
+ }
125
+ }
126
+ console.error('[Events] Failed to establish RabbitMQ Events connection after all retries');
127
+ // 如果连接失败,返回一个 fallback 对象而不是抛出错误
128
+ // 这样系统可以继续运行,只是事件功能不可用
129
+ console.warn('⚠️ [Events] RabbitMQ Events service is unavailable, events will not be published');
130
+ return {
131
+ connection: null,
132
+ close: async () => {
133
+ console.log('[Events] No RabbitMQ Events connection to close');
134
+ },
135
+ };
136
+ },
137
+ },
138
+ ],
139
+ exports: [rabbitmq_events_constants_1.RABBITMQ_EVENTS_CONNECTION, rabbitmq_events_service_1.RabbitmqEventsService],
140
+ })
141
+ ], RabbitmqEventsModule);
142
+ //# sourceMappingURL=rabbitmq-events.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-events.module.js","sourceRoot":"","sources":["../src/rabbitmq-events.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * RabbitMQ Events Service
3
+ *
4
+ * 使用独立的 RabbitMQ 连接发布事件
5
+ * 不影响其他任务队列
6
+ */
7
+ import { OnModuleDestroy } from '@nestjs/common';
8
+ import type { Logger } from 'winston';
9
+ import { type RabbitmqEventsConnection } from './rabbitmq-events.constants';
10
+ export declare class RabbitmqEventsService implements OnModuleDestroy {
11
+ private readonly rabbitmqConnection;
12
+ private readonly logger;
13
+ private channel;
14
+ private isInitialized;
15
+ constructor(rabbitmqConnection: RabbitmqEventsConnection, logger: Logger);
16
+ /**
17
+ * 初始化 Channel
18
+ */
19
+ private initializeChannel;
20
+ /**
21
+ * 确保 Channel 已初始化
22
+ */
23
+ private ensureChannel;
24
+ /**
25
+ * 发送消息到 RabbitMQ 队列
26
+ */
27
+ sendMessageToQueue<T = any>(queue: string, message: T): Promise<boolean>;
28
+ /**
29
+ * 发布消息到 Exchange
30
+ */
31
+ publishToExchange<T = any>(exchange: string, routingKey: string, message: T, exchangeType?: 'direct' | 'topic' | 'fanout' | 'headers'): Promise<boolean>;
32
+ /**
33
+ * 模块销毁时关闭连接
34
+ */
35
+ onModuleDestroy(): Promise<void>;
36
+ /**
37
+ * 获取连接状态
38
+ */
39
+ isConnected(): boolean;
40
+ }
41
+ //# sourceMappingURL=rabbitmq-events.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-events.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-events.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAsB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAErC,qBACa,qBAAsB,YAAW,eAAe;IAMzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM;IAN1D,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAAS;gBAIX,kBAAkB,EAAE,wBAAwB,EACX,MAAM,EAAE,MAAM;IAKlE;;OAEG;YACW,iBAAiB;IAkB/B;;OAEG;YACW,aAAa;IAO3B;;OAEG;IACG,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,OAAO,CAAC;IAgDnB;;OAEG;IACG,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,EACV,YAAY,GAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAmB,GAChE,OAAO,CAAC,OAAO,CAAC;IAoDnB;;OAEG;IACG,eAAe;IAgBrB;;OAEG;IACH,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RabbitmqEventsService = void 0;
16
+ /**
17
+ * RabbitMQ Events Service
18
+ *
19
+ * 使用独立的 RabbitMQ 连接发布事件
20
+ * 不影响其他任务队列
21
+ */
22
+ const common_1 = require("@nestjs/common");
23
+ const nest_winston_1 = require("nest-winston");
24
+ const rabbitmq_events_constants_1 = require("./rabbitmq-events.constants");
25
+ let RabbitmqEventsService = class RabbitmqEventsService {
26
+ rabbitmqConnection;
27
+ logger;
28
+ channel = null;
29
+ isInitialized = false;
30
+ constructor(rabbitmqConnection, logger) {
31
+ this.rabbitmqConnection = rabbitmqConnection;
32
+ this.logger = logger;
33
+ this.initializeChannel();
34
+ }
35
+ /**
36
+ * 初始化 Channel
37
+ */
38
+ async initializeChannel() {
39
+ if (this.isInitialized || !this.rabbitmqConnection.connection) {
40
+ return;
41
+ }
42
+ try {
43
+ this.channel = await this.rabbitmqConnection.connection.createChannel();
44
+ this.isInitialized = true;
45
+ this.logger.info('[Events] RabbitMQ Events channel initialized');
46
+ }
47
+ catch (error) {
48
+ this.logger.error('[Events] Failed to initialize RabbitMQ Events channel', { error });
49
+ }
50
+ }
51
+ /**
52
+ * 确保 Channel 已初始化
53
+ */
54
+ async ensureChannel() {
55
+ if (!this.channel && !this.isInitialized) {
56
+ await this.initializeChannel();
57
+ }
58
+ return this.channel;
59
+ }
60
+ /**
61
+ * 发送消息到 RabbitMQ 队列
62
+ */
63
+ async sendMessageToQueue(queue, message) {
64
+ const channel = await this.ensureChannel();
65
+ if (!channel) {
66
+ this.logger.warn('[Events] RabbitMQ Events channel not available, message not sent', { queue });
67
+ return false;
68
+ }
69
+ try {
70
+ // 确保队列存在
71
+ await channel.assertQueue(queue, {
72
+ durable: true, // 队列持久化
73
+ });
74
+ // 发送消息
75
+ const sent = channel.sendToQueue(queue, Buffer.from(JSON.stringify(message)), {
76
+ persistent: true, // 消息持久化
77
+ contentType: 'application/json',
78
+ });
79
+ if (sent) {
80
+ this.logger.debug('[Events] Message sent to queue', {
81
+ queue,
82
+ messageType: typeof message,
83
+ });
84
+ }
85
+ else {
86
+ this.logger.warn('[Events] Failed to send message to queue', {
87
+ queue,
88
+ });
89
+ }
90
+ return sent;
91
+ }
92
+ catch (error) {
93
+ this.logger.error('[Events] Error sending message to queue', {
94
+ error,
95
+ queue,
96
+ });
97
+ return false;
98
+ }
99
+ }
100
+ /**
101
+ * 发布消息到 Exchange
102
+ */
103
+ async publishToExchange(exchange, routingKey, message, exchangeType = 'topic') {
104
+ const channel = await this.ensureChannel();
105
+ if (!channel) {
106
+ this.logger.warn('[Events] RabbitMQ Events channel not available, message not published', { exchange, routingKey });
107
+ return false;
108
+ }
109
+ try {
110
+ // 确保 Exchange 存在
111
+ await channel.assertExchange(exchange, exchangeType, {
112
+ durable: true,
113
+ });
114
+ // 发布消息
115
+ const published = channel.publish(exchange, routingKey, Buffer.from(JSON.stringify(message)), {
116
+ persistent: true,
117
+ contentType: 'application/json',
118
+ });
119
+ if (published) {
120
+ this.logger.debug('[Events] Message published to exchange', {
121
+ exchange,
122
+ routingKey,
123
+ messageType: typeof message,
124
+ });
125
+ }
126
+ else {
127
+ this.logger.warn('[Events] Failed to publish message to exchange', {
128
+ exchange,
129
+ routingKey,
130
+ });
131
+ }
132
+ return published;
133
+ }
134
+ catch (error) {
135
+ this.logger.error('[Events] Error publishing message to exchange', {
136
+ error,
137
+ exchange,
138
+ routingKey,
139
+ });
140
+ return false;
141
+ }
142
+ }
143
+ /**
144
+ * 模块销毁时关闭连接
145
+ */
146
+ async onModuleDestroy() {
147
+ try {
148
+ if (this.channel) {
149
+ await this.channel.close();
150
+ this.logger.info('[Events] RabbitMQ Events channel closed');
151
+ }
152
+ await this.rabbitmqConnection.close();
153
+ this.logger.info('[Events] RabbitMQ Events connection closed');
154
+ }
155
+ catch (error) {
156
+ this.logger.error('[Events] Error closing RabbitMQ Events connection', {
157
+ error,
158
+ });
159
+ }
160
+ }
161
+ /**
162
+ * 获取连接状态
163
+ */
164
+ isConnected() {
165
+ return this.isInitialized && this.channel !== null;
166
+ }
167
+ };
168
+ exports.RabbitmqEventsService = RabbitmqEventsService;
169
+ exports.RabbitmqEventsService = RabbitmqEventsService = __decorate([
170
+ (0, common_1.Injectable)(),
171
+ __param(0, (0, common_1.Inject)(rabbitmq_events_constants_1.RABBITMQ_EVENTS_CONNECTION)),
172
+ __param(1, (0, common_1.Inject)(nest_winston_1.WINSTON_MODULE_PROVIDER)),
173
+ __metadata("design:paramtypes", [Object, Function])
174
+ ], RabbitmqEventsService);
175
+ //# sourceMappingURL=rabbitmq-events.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-events.service.js","sourceRoot":"","sources":["../src/rabbitmq-events.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class RabbitmqModule {
2
+ }
3
+ //# sourceMappingURL=rabbitmq.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.module.d.ts","sourceRoot":"","sources":["../src/rabbitmq.module.ts"],"names":[],"mappings":"AASA,qBAgGa,cAAc;CAAG"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
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;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.RabbitmqModule = void 0;
43
+ const common_1 = require("@nestjs/common");
44
+ const Rabbitmq = __importStar(require("amqplib"));
45
+ const rabbitmq_dto_1 = require("./dto/rabbitmq.dto");
46
+ const rabbitmq_service_1 = require("./rabbitmq.service");
47
+ const infra_utils_1 = require("@dofe/infra-utils");
48
+ const logger = (0, infra_utils_1.createContextLogger)('RabbitmqModule');
49
+ const CONNECT_TIMEOUT_MS = 5000;
50
+ let RabbitmqModule = class RabbitmqModule {
51
+ };
52
+ exports.RabbitmqModule = RabbitmqModule;
53
+ exports.RabbitmqModule = RabbitmqModule = __decorate([
54
+ (0, common_1.Module)({
55
+ providers: [
56
+ {
57
+ provide: rabbitmq_dto_1.RABBITMQ_CONNECTION,
58
+ useFactory: async () => {
59
+ const rabbitmqUrl = process.env.RABBITMQ_URL;
60
+ let connection = null;
61
+ let connectPromise = null;
62
+ logger.info(`init RabbitmqModule rabbitmqUrl=${rabbitmqUrl}`);
63
+ const connect = async () => {
64
+ logger.info(`connect RabbitmqModule rabbitmqUrl=${rabbitmqUrl}`);
65
+ if (!rabbitmqUrl) {
66
+ throw new Error('RABBITMQ_URL environment variable is not set');
67
+ }
68
+ if (connection && !connection.connection?.closed) {
69
+ return connection;
70
+ }
71
+ if (connectPromise) {
72
+ return connectPromise;
73
+ }
74
+ logger.info(`Attempting to connect to RabbitMQ host---${rabbitmqUrl}`);
75
+ connectPromise = Promise.race([
76
+ Rabbitmq.connect(rabbitmqUrl, {
77
+ heartbeat: 60,
78
+ }),
79
+ new Promise((_, reject) => {
80
+ setTimeout(() => {
81
+ reject(new Error(`RabbitMQ connect timeout after ${CONNECT_TIMEOUT_MS}ms`));
82
+ }, CONNECT_TIMEOUT_MS);
83
+ }),
84
+ ])
85
+ .then((conn) => {
86
+ connection = conn;
87
+ // logger.info('RabbitMQ connection established successfully');
88
+ return conn;
89
+ })
90
+ .catch((error) => {
91
+ connection = null;
92
+ logger.error('Failed to connect to RabbitMQ', {
93
+ error: error instanceof Error ? error.message : String(error),
94
+ });
95
+ throw error;
96
+ })
97
+ .finally(() => {
98
+ connectPromise = null;
99
+ });
100
+ return connectPromise;
101
+ };
102
+ return {
103
+ get connection() {
104
+ return connection;
105
+ },
106
+ connect,
107
+ close: async () => {
108
+ if (!connection) {
109
+ return;
110
+ }
111
+ try {
112
+ await connection.close();
113
+ logger.info('RabbitMQ connection closed gracefully');
114
+ }
115
+ catch (error) {
116
+ if (!(error instanceof Error) ||
117
+ (!error.message.includes('closed') &&
118
+ !error.message.includes('Connection closed') &&
119
+ !error.message.includes('IllegalOperationError'))) {
120
+ logger.error('Error closing RabbitMQ connection', {
121
+ error: error instanceof Error ? error.message : String(error),
122
+ });
123
+ }
124
+ }
125
+ finally {
126
+ connection = null;
127
+ }
128
+ },
129
+ };
130
+ },
131
+ },
132
+ rabbitmq_service_1.RabbitmqService,
133
+ ],
134
+ exports: [rabbitmq_dto_1.RABBITMQ_CONNECTION, rabbitmq_service_1.RabbitmqService],
135
+ })
136
+ ], RabbitmqModule);
137
+ //# sourceMappingURL=rabbitmq.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.module.js","sourceRoot":"","sources":["../src/rabbitmq.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { Logger } from 'winston';
3
+ import { RabbitmqConnection } from './dto/rabbitmq.dto';
4
+ interface MessageHandler {
5
+ (message: any): Promise<void>;
6
+ }
7
+ export declare class RabbitmqService implements OnModuleInit, OnModuleDestroy {
8
+ private readonly rabbitmqConnection;
9
+ private readonly logger;
10
+ private channel;
11
+ private consumers;
12
+ private isConnected;
13
+ private isConnecting;
14
+ private reconnectAttempts;
15
+ private readonly maxReconnectAttempts;
16
+ private readonly reconnectDelay;
17
+ private reconnectTimer;
18
+ private isShuttingDown;
19
+ private boundConnection;
20
+ constructor(rabbitmqConnection: RabbitmqConnection, logger: Logger);
21
+ onModuleInit(): Promise<void>;
22
+ get connection(): RabbitmqConnection;
23
+ private initializeConnection;
24
+ private setupConnectionEventListeners;
25
+ private handleConnectionClosed;
26
+ private createChannel;
27
+ private scheduleReconnect;
28
+ private reestablishConsumers;
29
+ private ensureChannel;
30
+ sendMessageToRabbitMQ(queue: string, message: any, bindKey?: string): Promise<void>;
31
+ consumeMessagesFromRabbitMQ(queue: string, handleMessage: MessageHandler): Promise<void>;
32
+ private handleIncomingMessage;
33
+ healthCheck(): Promise<{
34
+ isConnected: boolean;
35
+ channelReady: boolean;
36
+ }>;
37
+ getConsumersInfo(): Array<{
38
+ queue: string;
39
+ consumerTag: string;
40
+ }>;
41
+ onModuleDestroy(): Promise<void>;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=rabbitmq.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EACZ,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAuB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,UAAU,cAAc;IACtB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAqBD,qBACa,eAAgB,YAAW,YAAY,EAAE,eAAe;IAcjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM;IAd1D,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAqC;gBAIzC,kBAAkB,EAAE,kBAAkB,EACL,MAAM,EAAE,MAAM;IAG5D,YAAY;IA4BlB,IAAI,UAAU,uBAEb;YAEa,oBAAoB;IA+ClC,OAAO,CAAC,6BAA6B;IAoBrC,OAAO,CAAC,sBAAsB;YAWhB,aAAa;YAiDb,iBAAiB;YA2BjB,oBAAoB;YAcpB,aAAa;IAsBrB,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAmDV,2BAA2B,CAC/B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,cAAc,GAC5B,OAAO,CAAC,IAAI,CAAC;YA8CF,qBAAqB;IAiD7B,WAAW,IAAI,OAAO,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;IAUF,gBAAgB,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAS3D,eAAe;CA2DtB"}
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RabbitmqService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const nest_winston_1 = require("nest-winston");
18
+ const winston_1 = require("winston");
19
+ const rabbitmq_dto_1 = require("./dto/rabbitmq.dto");
20
+ const isProductionEnv = () => {
21
+ const nodeEnv = process.env.NODE_ENV;
22
+ return (nodeEnv === 'prod' ||
23
+ nodeEnv === 'production' ||
24
+ nodeEnv === 'prodap' ||
25
+ nodeEnv === 'produs');
26
+ };
27
+ const isRabbitmqOptional = () => process.env.RABBITMQ_OPTIONAL === 'true';
28
+ let RabbitmqService = class RabbitmqService {
29
+ rabbitmqConnection;
30
+ logger;
31
+ channel;
32
+ consumers = new Map();
33
+ isConnected = false;
34
+ isConnecting = false;
35
+ reconnectAttempts = 0;
36
+ maxReconnectAttempts = 5;
37
+ reconnectDelay = 5000;
38
+ reconnectTimer = null;
39
+ isShuttingDown = false;
40
+ boundConnection = null;
41
+ constructor(rabbitmqConnection, logger) {
42
+ this.rabbitmqConnection = rabbitmqConnection;
43
+ this.logger = logger;
44
+ }
45
+ async onModuleInit() {
46
+ if (this.reconnectTimer) {
47
+ clearTimeout(this.reconnectTimer);
48
+ this.reconnectTimer = null;
49
+ }
50
+ this.isShuttingDown = false;
51
+ this.isConnected = false;
52
+ this.isConnecting = false;
53
+ this.reconnectAttempts = 0;
54
+ this.channel = undefined;
55
+ this.boundConnection = null;
56
+ // 统一改为后台连接,避免阻塞 Nest 启动(与 ConfigurationService、ReconciliationService 一致)
57
+ // 根因:ProxyApiModule 等接入后模块初始化顺序变化,RabbitmqService.onModuleInit 若 await 连接,
58
+ // 会在「最后日志:init RabbitmqModule」之后卡住,导致应用无法完成启动
59
+ if (isProductionEnv() && !isRabbitmqOptional()) {
60
+ this.logger.info('RabbitMQ connection will be established in background (non-blocking startup)');
61
+ }
62
+ else {
63
+ this.logger.warn('RabbitMQ startup is non-blocking because optional mode is enabled');
64
+ }
65
+ void this.initializeConnection();
66
+ }
67
+ get connection() {
68
+ return this.rabbitmqConnection;
69
+ }
70
+ async initializeConnection() {
71
+ if (this.isShuttingDown || this.isConnecting) {
72
+ return false;
73
+ }
74
+ this.isConnecting = true;
75
+ try {
76
+ const conn = await this.rabbitmqConnection.connect();
77
+ if (conn.connection?.closed) {
78
+ throw new Error('RabbitMQ connection is closed');
79
+ }
80
+ this.setupConnectionEventListeners(conn);
81
+ await this.createChannel(conn);
82
+ this.isConnected = true;
83
+ this.reconnectAttempts = 0;
84
+ // if (isProductionEnv()) {
85
+ // this.logger.info('RabbitMQ service initialized successfully');
86
+ // } else {
87
+ // this.logger.warn('RabbitMQ service connected in background');
88
+ // }
89
+ return true;
90
+ }
91
+ catch (error) {
92
+ this.isConnected = false;
93
+ this.channel = undefined;
94
+ if (isProductionEnv() && !isRabbitmqOptional()) {
95
+ this.logger.error('Failed to initialize RabbitMQ service', {
96
+ error,
97
+ });
98
+ }
99
+ else {
100
+ this.logger.warn('RabbitMQ is unavailable in current environment', {
101
+ error: error instanceof Error ? error.message : String(error),
102
+ });
103
+ }
104
+ await this.scheduleReconnect();
105
+ return false;
106
+ }
107
+ finally {
108
+ this.isConnecting = false;
109
+ }
110
+ }
111
+ setupConnectionEventListeners(conn) {
112
+ if (this.boundConnection === conn) {
113
+ return;
114
+ }
115
+ this.boundConnection = conn;
116
+ conn.on('error', (error) => {
117
+ this.logger.error('RabbitMQ connection error', {
118
+ error: error instanceof Error ? error.message : String(error),
119
+ });
120
+ this.handleConnectionClosed();
121
+ });
122
+ conn.on('close', () => {
123
+ this.logger.warn('RabbitMQ connection closed');
124
+ this.handleConnectionClosed();
125
+ });
126
+ }
127
+ handleConnectionClosed() {
128
+ this.isConnected = false;
129
+ this.isConnecting = false;
130
+ this.channel = undefined;
131
+ this.boundConnection = null;
132
+ if (!this.isShuttingDown) {
133
+ void this.scheduleReconnect();
134
+ }
135
+ }
136
+ async createChannel(conn) {
137
+ if (conn.connection?.closed) {
138
+ throw new Error('Cannot create channel: RabbitMQ connection is closed');
139
+ }
140
+ try {
141
+ if (this.channel) {
142
+ try {
143
+ await this.channel.close();
144
+ }
145
+ catch {
146
+ // ignore close errors for stale channel
147
+ }
148
+ this.channel = undefined;
149
+ }
150
+ this.channel = await conn.createChannel();
151
+ this.channel.on('error', (error) => {
152
+ this.logger.error('RabbitMQ channel error', {
153
+ error: error instanceof Error ? error.message : String(error),
154
+ });
155
+ this.channel = undefined;
156
+ this.isConnected = false;
157
+ if (!this.isShuttingDown) {
158
+ void this.scheduleReconnect();
159
+ }
160
+ });
161
+ this.channel.on('close', () => {
162
+ if (isProductionEnv()) {
163
+ this.logger.warn('RabbitMQ channel closed');
164
+ }
165
+ this.channel = undefined;
166
+ });
167
+ await this.channel.prefetch(1);
168
+ if (isProductionEnv()) {
169
+ this.logger.info('RabbitMQ channel created successfully');
170
+ }
171
+ }
172
+ catch (error) {
173
+ this.logger.error('Failed to create RabbitMQ channel', { error });
174
+ this.channel = undefined;
175
+ this.isConnected = false;
176
+ throw error;
177
+ }
178
+ }
179
+ async scheduleReconnect() {
180
+ if (this.isShuttingDown ||
181
+ this.isConnecting ||
182
+ this.reconnectTimer ||
183
+ this.reconnectAttempts >= this.maxReconnectAttempts) {
184
+ return;
185
+ }
186
+ this.reconnectAttempts++;
187
+ const delay = this.reconnectDelay * this.reconnectAttempts;
188
+ this.logger.info(`Scheduling RabbitMQ reconnection attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}ms`);
189
+ this.reconnectTimer = setTimeout(async () => {
190
+ this.reconnectTimer = null;
191
+ const connected = await this.initializeConnection();
192
+ if (connected) {
193
+ await this.reestablishConsumers();
194
+ }
195
+ }, delay);
196
+ }
197
+ async reestablishConsumers() {
198
+ for (const [queue, consumerInfo] of this.consumers) {
199
+ try {
200
+ await this.consumeMessagesFromRabbitMQ(queue, consumerInfo.handler);
201
+ this.logger.info(`Reestablished consumer for queue: ${queue}`);
202
+ }
203
+ catch (error) {
204
+ this.logger.error(`Failed to reestablish consumer for queue: ${queue}`, { error });
205
+ }
206
+ }
207
+ }
208
+ async ensureChannel() {
209
+ const conn = this.rabbitmqConnection.connection;
210
+ if (!this.isConnected ||
211
+ !this.channel ||
212
+ !conn ||
213
+ conn.connection?.closed) {
214
+ const connected = await this.initializeConnection();
215
+ if (!connected && !this.channel) {
216
+ throw new Error('RabbitMQ channel is not available');
217
+ }
218
+ }
219
+ if (!this.channel) {
220
+ throw new Error('RabbitMQ channel is not available');
221
+ }
222
+ return this.channel;
223
+ }
224
+ async sendMessageToRabbitMQ(queue, message, bindKey) {
225
+ try {
226
+ const channel = await this.ensureChannel();
227
+ await channel.assertQueue(queue, { durable: true });
228
+ const messageWithMetadata = {
229
+ ...message,
230
+ queue,
231
+ bindKey,
232
+ timestamp: new Date().toISOString(),
233
+ };
234
+ const result = channel.publish('', queue, Buffer.from(JSON.stringify(messageWithMetadata)), { persistent: true });
235
+ if (!result) {
236
+ throw new Error('Failed to publish message to queue');
237
+ }
238
+ this.logger.debug('Message sent to RabbitMQ', {
239
+ queue,
240
+ });
241
+ }
242
+ catch (error) {
243
+ if (!isProductionEnv() || isRabbitmqOptional()) {
244
+ this.logger.warn('Skipped RabbitMQ message publish because optional mode is enabled', {
245
+ queue,
246
+ error: error instanceof Error ? error.message : String(error),
247
+ message: typeof message === 'object' ? JSON.stringify(message) : message,
248
+ });
249
+ return;
250
+ }
251
+ this.logger.error('Error sending message to RabbitMQ', {
252
+ error,
253
+ queue,
254
+ message: typeof message === 'object' ? JSON.stringify(message) : message,
255
+ });
256
+ throw error;
257
+ }
258
+ }
259
+ async consumeMessagesFromRabbitMQ(queue, handleMessage) {
260
+ this.consumers.set(queue, {
261
+ queue,
262
+ consumerTag: this.consumers.get(queue)?.consumerTag ?? '',
263
+ handler: handleMessage,
264
+ });
265
+ try {
266
+ const channel = await this.ensureChannel();
267
+ await channel.assertQueue(queue, { durable: true });
268
+ const existingConsumer = this.consumers.get(queue);
269
+ if (existingConsumer?.consumerTag) {
270
+ try {
271
+ await channel.cancel(existingConsumer.consumerTag);
272
+ }
273
+ catch {
274
+ // ignore stale consumer cancellation errors
275
+ }
276
+ }
277
+ const { consumerTag } = await channel.consume(queue, (msg) => this.handleIncomingMessage(msg, handleMessage, channel), { noAck: false });
278
+ this.consumers.set(queue, {
279
+ queue,
280
+ consumerTag,
281
+ handler: handleMessage,
282
+ });
283
+ }
284
+ catch (error) {
285
+ if (!isProductionEnv() || isRabbitmqOptional()) {
286
+ this.logger.warn('Deferred RabbitMQ consumer registration', {
287
+ queue,
288
+ error: error instanceof Error ? error.message : String(error),
289
+ });
290
+ return;
291
+ }
292
+ this.logger.error('Error setting up consumer', { error, queue });
293
+ throw error;
294
+ }
295
+ }
296
+ async handleIncomingMessage(msg, handleMessage, channel) {
297
+ if (!msg) {
298
+ this.logger.warn('Received null message');
299
+ return;
300
+ }
301
+ let messageContent = null;
302
+ let rabbitQueueId;
303
+ try {
304
+ const messageString = msg.content.toString();
305
+ messageContent = JSON.parse(messageString);
306
+ rabbitQueueId = messageContent?.rabbitQueueId;
307
+ if (!messageContent) {
308
+ channel.ack(msg);
309
+ return;
310
+ }
311
+ await handleMessage(messageContent);
312
+ channel.ack(msg);
313
+ this.logger.debug('Message processed successfully', {
314
+ rabbitQueueId,
315
+ });
316
+ }
317
+ catch (error) {
318
+ this.logger.error('Error processing message', {
319
+ error,
320
+ rabbitQueueId,
321
+ messageContent: messageContent
322
+ ? JSON.stringify(messageContent)
323
+ : 'null',
324
+ });
325
+ try {
326
+ channel.nack(msg, false, false);
327
+ }
328
+ catch (updateError) {
329
+ this.logger.error('Error updating queue record or nacking message', {
330
+ updateError,
331
+ rabbitQueueId,
332
+ });
333
+ }
334
+ }
335
+ }
336
+ async healthCheck() {
337
+ const connection = this.rabbitmqConnection.connection;
338
+ return {
339
+ isConnected: !!connection && !connection.connection?.closed && this.isConnected,
340
+ channelReady: !!this.channel,
341
+ };
342
+ }
343
+ getConsumersInfo() {
344
+ return Array.from(this.consumers.values()).map(({ queue, consumerTag }) => ({
345
+ queue,
346
+ consumerTag,
347
+ }));
348
+ }
349
+ async onModuleDestroy() {
350
+ this.logger.debug('Destroying RabbitMQ service');
351
+ this.isShuttingDown = true;
352
+ this.isConnected = false;
353
+ this.isConnecting = false;
354
+ if (this.reconnectTimer) {
355
+ clearTimeout(this.reconnectTimer);
356
+ this.reconnectTimer = null;
357
+ }
358
+ if (this.channel) {
359
+ for (const [queue, consumerInfo] of this.consumers) {
360
+ if (!consumerInfo.consumerTag) {
361
+ continue;
362
+ }
363
+ try {
364
+ await this.channel.cancel(consumerInfo.consumerTag);
365
+ this.logger.debug('Cancelled consumer', {
366
+ queue,
367
+ consumerTag: consumerInfo.consumerTag,
368
+ });
369
+ }
370
+ catch (error) {
371
+ if (!(error instanceof Error) || !error.message.includes('closed')) {
372
+ this.logger.debug('Error cancelling consumer (ignored)', {
373
+ queue,
374
+ });
375
+ }
376
+ }
377
+ }
378
+ }
379
+ this.consumers.clear();
380
+ if (this.channel) {
381
+ try {
382
+ await this.channel.close();
383
+ this.logger.debug('RabbitMQ channel closed');
384
+ }
385
+ catch (error) {
386
+ if (!(error instanceof Error) ||
387
+ (!error.message.includes('closed') &&
388
+ !error.message.includes('Connection closed') &&
389
+ !error.message.includes('IllegalOperationError'))) {
390
+ this.logger.debug('Error closing RabbitMQ channel (ignored)');
391
+ }
392
+ }
393
+ finally {
394
+ this.channel = undefined;
395
+ }
396
+ }
397
+ await this.rabbitmqConnection.close();
398
+ this.boundConnection = null;
399
+ this.logger.debug('RabbitMQ service destroyed');
400
+ }
401
+ };
402
+ exports.RabbitmqService = RabbitmqService;
403
+ exports.RabbitmqService = RabbitmqService = __decorate([
404
+ (0, common_1.Injectable)(),
405
+ __param(0, (0, common_1.Inject)(rabbitmq_dto_1.RABBITMQ_CONNECTION)),
406
+ __param(1, (0, common_1.Inject)(nest_winston_1.WINSTON_MODULE_PROVIDER)),
407
+ __metadata("design:paramtypes", [Object, winston_1.Logger])
408
+ ], RabbitmqService);
409
+ //# sourceMappingURL=rabbitmq.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.js","sourceRoot":"","sources":["../src/rabbitmq.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rabbitmq.service.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.spec.d.ts","sourceRoot":"","sources":["../src/rabbitmq.service.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const testing_1 = require("@nestjs/testing");
4
+ const nest_winston_1 = require("nest-winston");
5
+ const rabbitmq_service_1 = require("./rabbitmq.service");
6
+ const rabbitmq_dto_1 = require("./dto/rabbitmq.dto");
7
+ describe('RabbitmqService', () => {
8
+ let service;
9
+ const mockChannel = {
10
+ on: jest.fn(),
11
+ prefetch: jest.fn().mockResolvedValue(undefined),
12
+ assertQueue: jest.fn().mockResolvedValue(undefined),
13
+ publish: jest.fn().mockReturnValue(true),
14
+ consume: jest.fn().mockResolvedValue({ consumerTag: 'tag-1' }),
15
+ cancel: jest.fn().mockResolvedValue(undefined),
16
+ ack: jest.fn(),
17
+ nack: jest.fn(),
18
+ close: jest.fn().mockResolvedValue(undefined),
19
+ };
20
+ const mockConnection = {
21
+ connection: { closed: false },
22
+ on: jest.fn(),
23
+ createChannel: jest.fn().mockResolvedValue(mockChannel),
24
+ close: jest.fn().mockResolvedValue(undefined),
25
+ };
26
+ const mockRabbitmqConnection = {
27
+ connection: mockConnection,
28
+ connect: jest.fn().mockResolvedValue(mockConnection),
29
+ close: jest.fn().mockResolvedValue(undefined),
30
+ };
31
+ const mockLogger = {
32
+ info: jest.fn(),
33
+ warn: jest.fn(),
34
+ error: jest.fn(),
35
+ debug: jest.fn(),
36
+ };
37
+ beforeEach(async () => {
38
+ jest.clearAllMocks();
39
+ const module = await testing_1.Test.createTestingModule({
40
+ providers: [
41
+ rabbitmq_service_1.RabbitmqService,
42
+ {
43
+ provide: rabbitmq_dto_1.RABBITMQ_CONNECTION,
44
+ useValue: mockRabbitmqConnection,
45
+ },
46
+ {
47
+ provide: nest_winston_1.WINSTON_MODULE_PROVIDER,
48
+ useValue: mockLogger,
49
+ },
50
+ ],
51
+ }).compile();
52
+ service = module.get(rabbitmq_service_1.RabbitmqService);
53
+ });
54
+ it('should be defined', () => {
55
+ expect(service).toBeDefined();
56
+ });
57
+ it('initializes connection and channel on module init', async () => {
58
+ await service.onModuleInit();
59
+ expect(mockRabbitmqConnection.connect).toHaveBeenCalled();
60
+ expect(mockConnection.createChannel).toHaveBeenCalled();
61
+ expect(mockChannel.prefetch).toHaveBeenCalledWith(1);
62
+ });
63
+ it('degrades send message when RabbitMQ is optional', async () => {
64
+ const originalOptional = process.env.RABBITMQ_OPTIONAL;
65
+ process.env.RABBITMQ_OPTIONAL = 'true';
66
+ mockRabbitmqConnection.connect.mockRejectedValueOnce(new Error('offline'));
67
+ try {
68
+ await expect(service.sendMessageToRabbitMQ('test-queue', { hello: 'world' })).resolves.toBeUndefined();
69
+ }
70
+ finally {
71
+ process.env.RABBITMQ_OPTIONAL = originalOptional;
72
+ }
73
+ });
74
+ });
75
+ //# sourceMappingURL=rabbitmq.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.spec.js","sourceRoot":"","sources":["../src/rabbitmq.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,+CAAuD;AACvD,yDAAqD;AACrD,qDAAyD;AAEzD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,OAAwB,CAAC;IAE7B,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;QACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAChD,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACnD,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QAC9D,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC9C,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC9C,CAAC;IAEF,MAAM,cAAc,GAAG;QACrB,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC7B,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;QACb,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;QACvD,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC9C,CAAC;IAEF,MAAM,sBAAsB,GAAG;QAC7B,UAAU,EAAE,cAAc;QAC1B,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC;QACpD,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC9C,CAAC;IAEF,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACjB,CAAC;IAEF,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE;gBACT,kCAAe;gBACf;oBACE,OAAO,EAAE,kCAAmB;oBAC5B,QAAQ,EAAE,sBAAsB;iBACjC;gBACD;oBACE,OAAO,EAAE,sCAAuB;oBAChC,QAAQ,EAAE,UAAU;iBACrB;aACF;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAkB,kCAAe,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAE7B,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACvC,sBAAsB,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,MAAM,CACV,OAAO,CAAC,qBAAqB,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAChE,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@dofe/infra-rabbitmq",
3
+ "version": "0.1.1",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "peerDependencies": {
7
+ "@dofe/infra-utils": "^0.1.1",
8
+ "@nestjs/common": "^11.0.0",
9
+ "@nestjs/config": "^4.0.0",
10
+ "@nestjs/core": "^11.0.0",
11
+ "amqp-connection-manager": "^5.0.0",
12
+ "amqplib": "^0.10.0",
13
+ "class-validator": "^0.14.1",
14
+ "nest-winston": "^1.9.7",
15
+ "reflect-metadata": "^0.2.0",
16
+ "rxjs": "^7.8.0",
17
+ "winston": "^3.13.0"
18
+ },
19
+ "dependencies": {
20
+ "@dofe/infra-common": "^0.1.1",
21
+ "@dofe/infra-prisma": "^0.1.1",
22
+ "@dofe/infra-redis": "^0.1.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/amqplib": "^0.10.8",
26
+ "rimraf": "^5.0.0",
27
+ "typescript": "^5.4.5"
28
+ },
29
+ "type": "commonjs",
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "license": "UNLICENSED",
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "typecheck": "tsc --noEmit",
40
+ "clean": "rimraf dist"
41
+ }
42
+ }