@nest-omni/core 4.1.3-15 → 4.1.3-17

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.
Files changed (55) hide show
  1. package/audit/audit.module.js +7 -0
  2. package/audit/services/entity-audit.service.js +2 -1
  3. package/audit/services/manual-audit-log.service.js +2 -2
  4. package/audit/services/multi-database.service.d.ts +0 -5
  5. package/audit/services/multi-database.service.js +0 -24
  6. package/audit/services/transaction-audit.service.js +3 -2
  7. package/cache/dependencies/db.dependency.d.ts +2 -2
  8. package/cache/dependencies/db.dependency.js +4 -4
  9. package/http-client/examples/proxy-from-environment.example.d.ts +1 -1
  10. package/http-client/examples/proxy-from-environment.example.js +18 -19
  11. package/http-client/services/logging.service.js +2 -3
  12. package/index.d.ts +1 -1
  13. package/index.js +1 -1
  14. package/package.json +3 -2
  15. package/setup/bootstrap.setup.d.ts +1 -1
  16. package/shared/service-registry.module.js +2 -15
  17. package/shared/services/api-config.service.js +1 -0
  18. package/validators/is-exists.validator.d.ts +2 -7
  19. package/validators/is-exists.validator.js +2 -24
  20. package/validators/is-unique.validator.d.ts +2 -7
  21. package/validators/is-unique.validator.js +2 -24
  22. package/transaction/__tests__/mocks.d.ts +0 -9
  23. package/transaction/__tests__/mocks.js +0 -33
  24. package/transaction/base-service-transaction.d.ts +0 -106
  25. package/transaction/base-service-transaction.js +0 -317
  26. package/transaction/cls-compatibility.service.d.ts +0 -55
  27. package/transaction/cls-compatibility.service.js +0 -127
  28. package/transaction/data-source-registry.d.ts +0 -91
  29. package/transaction/data-source-registry.js +0 -349
  30. package/transaction/data-source.util.d.ts +0 -142
  31. package/transaction/data-source.util.js +0 -330
  32. package/transaction/database-adapter.d.ts +0 -44
  33. package/transaction/database-adapter.js +0 -240
  34. package/transaction/decorators/entity-datasource.decorator.d.ts +0 -62
  35. package/transaction/decorators/entity-datasource.decorator.js +0 -105
  36. package/transaction/index.d.ts +0 -16
  37. package/transaction/index.js +0 -71
  38. package/transaction/logging-transactional.interceptor.d.ts +0 -18
  39. package/transaction/logging-transactional.interceptor.js +0 -163
  40. package/transaction/transaction-context.service.d.ts +0 -137
  41. package/transaction/transaction-context.service.js +0 -411
  42. package/transaction/transaction-manager.d.ts +0 -230
  43. package/transaction/transaction-manager.holder.d.ts +0 -31
  44. package/transaction/transaction-manager.holder.js +0 -42
  45. package/transaction/transaction-manager.js +0 -1001
  46. package/transaction/transaction-synchronization.d.ts +0 -171
  47. package/transaction/transaction-synchronization.js +0 -380
  48. package/transaction/transaction.errors.d.ts +0 -91
  49. package/transaction/transaction.errors.js +0 -206
  50. package/transaction/transaction.module.d.ts +0 -30
  51. package/transaction/transaction.module.js +0 -126
  52. package/transaction/transactional.decorator.d.ts +0 -82
  53. package/transaction/transactional.decorator.js +0 -320
  54. package/transaction/typeorm-module-wrapper.d.ts +0 -96
  55. package/transaction/typeorm-module-wrapper.js +0 -197
@@ -1,91 +0,0 @@
1
- import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
- import { DataSource, DataSourceOptions } from 'typeorm';
3
- /**
4
- * 数据源注册表配置
5
- */
6
- export interface DataSourceRegistryConfig {
7
- enableHealthCheck?: boolean;
8
- healthCheckInterval?: number;
9
- connectionTimeout?: number;
10
- maxReconnectAttempts?: number;
11
- logLifecycleEvents?: boolean;
12
- autoCleanup?: boolean;
13
- }
14
- /**
15
- * 数据源健康状态
16
- */
17
- export interface DataSourceHealthStatus {
18
- name: string;
19
- isConnected: boolean;
20
- lastChecked: Date;
21
- error?: string;
22
- responseTime?: number;
23
- }
24
- /**
25
- * 数据源注册表管理器
26
- * 负责管理所有动态注册的数据源
27
- */
28
- export declare class DataSourceRegistryService implements OnModuleInit, OnModuleDestroy {
29
- private readonly logger;
30
- private healthCheckInterval;
31
- private healthStatuses;
32
- private config;
33
- constructor(config?: DataSourceRegistryConfig);
34
- onModuleInit(): Promise<void>;
35
- onModuleDestroy(): Promise<void>;
36
- /**
37
- * 注册新的数据源
38
- */
39
- registerDataSource(name: string, options: DataSourceOptions, metadata?: Record<string, any>): Promise<DataSource>;
40
- /**
41
- * 注册已存在的数据源
42
- */
43
- registerExistingDataSource(name: string, dataSource: DataSource, metadata?: Record<string, any>): Promise<void>;
44
- /**
45
- * 注销数据源
46
- */
47
- unregisterDataSource(name: string): Promise<void>;
48
- /**
49
- * 获取数据源
50
- */
51
- getDataSource(name: string): DataSource | null;
52
- /**
53
- * 获取所有已注册的数据源名称
54
- */
55
- getRegisteredDataSources(): string[];
56
- /**
57
- * 批量注册数据源
58
- */
59
- registerDataSources(configs: Array<{
60
- name: string;
61
- options: DataSourceOptions;
62
- metadata?: Record<string, any>;
63
- }>, options?: {
64
- continueOnError?: boolean;
65
- parallel?: boolean;
66
- }): Promise<DataSource[]>;
67
- /**
68
- * 测试数据源连接
69
- */
70
- testConnection(name: string): Promise<boolean>;
71
- /**
72
- * 获取所有数据源的健康状态
73
- */
74
- getHealthStatuses(): Map<string, DataSourceHealthStatus>;
75
- /**
76
- * 重新连接数据源
77
- */
78
- reconnectDataSource(name: string): Promise<boolean>;
79
- /**
80
- * 开始健康检查
81
- */
82
- private startHealthCheck;
83
- /**
84
- * 清理指定数据源
85
- */
86
- private cleanupDataSources;
87
- /**
88
- * 清理所有动态数据源
89
- */
90
- private cleanupAllDataSources;
91
- }
@@ -1,349 +0,0 @@
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
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
- return new (P || (P = Promise))(function (resolve, reject) {
17
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
- step((generator = generator.apply(thisArg, _arguments || [])).next());
21
- });
22
- };
23
- var DataSourceRegistryService_1;
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.DataSourceRegistryService = void 0;
26
- const common_1 = require("@nestjs/common");
27
- const typeorm_1 = require("typeorm");
28
- const transaction_context_service_1 = require("./transaction-context.service");
29
- const database_adapter_1 = require("./database-adapter");
30
- /**
31
- * 数据源注册表管理器
32
- * 负责管理所有动态注册的数据源
33
- */
34
- let DataSourceRegistryService = DataSourceRegistryService_1 = class DataSourceRegistryService {
35
- constructor(config) {
36
- this.logger = new common_1.Logger(DataSourceRegistryService_1.name);
37
- this.healthCheckInterval = null;
38
- this.healthStatuses = new Map();
39
- this.config = {
40
- enableHealthCheck: false,
41
- healthCheckInterval: 30000, // 30秒
42
- connectionTimeout: 5000, // 5秒
43
- maxReconnectAttempts: 3,
44
- logLifecycleEvents: true,
45
- autoCleanup: true,
46
- };
47
- if (config) {
48
- this.config = Object.assign(Object.assign({}, this.config), config);
49
- }
50
- }
51
- onModuleInit() {
52
- return __awaiter(this, void 0, void 0, function* () {
53
- if (this.config.enableHealthCheck) {
54
- this.startHealthCheck();
55
- }
56
- if (this.config.logLifecycleEvents) {
57
- this.logger.log(`Initialized with config: ${JSON.stringify(this.config)}`);
58
- }
59
- });
60
- }
61
- onModuleDestroy() {
62
- return __awaiter(this, void 0, void 0, function* () {
63
- if (this.healthCheckInterval) {
64
- clearInterval(this.healthCheckInterval);
65
- this.healthCheckInterval = null;
66
- }
67
- // 清理所有动态注册的数据源
68
- yield this.cleanupAllDataSources();
69
- });
70
- }
71
- /**
72
- * 注册新的数据源
73
- */
74
- registerDataSource(name, options, metadata) {
75
- return __awaiter(this, void 0, void 0, function* () {
76
- try {
77
- // 创建数据源
78
- const dataSource = new typeorm_1.DataSource(options);
79
- // 初始化连接
80
- if (!dataSource.isInitialized) {
81
- yield dataSource.initialize();
82
- }
83
- // 注册到事务上下文服务
84
- yield transaction_context_service_1.TransactionContextService.addDataSource(name, dataSource, {
85
- options,
86
- metadata,
87
- });
88
- // 初始化健康状态
89
- if (this.config.enableHealthCheck) {
90
- this.healthStatuses.set(name, {
91
- name,
92
- isConnected: true,
93
- lastChecked: new Date(),
94
- });
95
- }
96
- if (this.config.logLifecycleEvents) {
97
- this.logger.log(`Registered DataSource: ${name}`);
98
- }
99
- return dataSource;
100
- }
101
- catch (error) {
102
- this.logger.error(`Failed to register DataSource ${name}:`, error.stack);
103
- throw error;
104
- }
105
- });
106
- }
107
- /**
108
- * 注册已存在的数据源
109
- */
110
- registerExistingDataSource(name, dataSource, metadata) {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- yield transaction_context_service_1.TransactionContextService.addDataSource(name, dataSource, {
113
- metadata,
114
- });
115
- if (this.config.enableHealthCheck) {
116
- this.healthStatuses.set(name, {
117
- name,
118
- isConnected: dataSource.isInitialized,
119
- lastChecked: new Date(),
120
- });
121
- }
122
- });
123
- }
124
- /**
125
- * 注销数据源
126
- */
127
- unregisterDataSource(name) {
128
- return __awaiter(this, void 0, void 0, function* () {
129
- const config = transaction_context_service_1.TransactionContextService.getDataSourceConfig(name);
130
- if (config) {
131
- // 关闭数据源连接
132
- if (config.dataSource.isInitialized) {
133
- yield config.dataSource.destroy();
134
- }
135
- // 从注册表中移除
136
- yield transaction_context_service_1.TransactionContextService.removeDataSource(name);
137
- this.healthStatuses.delete(name);
138
- if (this.config.logLifecycleEvents) {
139
- this.logger.log(`Unregistered DataSource: ${name}`);
140
- }
141
- }
142
- });
143
- }
144
- /**
145
- * 获取数据源
146
- */
147
- getDataSource(name) {
148
- const config = transaction_context_service_1.TransactionContextService.getDataSourceConfig(name);
149
- return (config === null || config === void 0 ? void 0 : config.dataSource) || null;
150
- }
151
- /**
152
- * 获取所有已注册的数据源名称
153
- */
154
- getRegisteredDataSources() {
155
- return transaction_context_service_1.TransactionContextService.getRegisteredDataSources();
156
- }
157
- /**
158
- * 批量注册数据源
159
- */
160
- registerDataSources(configs, options) {
161
- return __awaiter(this, void 0, void 0, function* () {
162
- const dataSources = [];
163
- if (options === null || options === void 0 ? void 0 : options.parallel) {
164
- // 并行注册
165
- const promises = configs.map((config) => __awaiter(this, void 0, void 0, function* () {
166
- const ds = yield this.registerDataSource(config.name, config.options, config.metadata);
167
- return ds;
168
- }));
169
- try {
170
- const results = yield Promise.all(promises);
171
- dataSources.push(...results);
172
- }
173
- catch (error) {
174
- if (!(options === null || options === void 0 ? void 0 : options.continueOnError)) {
175
- // 清理已注册的数据源
176
- yield this.cleanupDataSources(dataSources.map((ds) => ds.options));
177
- throw error;
178
- }
179
- }
180
- }
181
- else {
182
- // 串行注册
183
- for (const config of configs) {
184
- try {
185
- const ds = yield this.registerDataSource(config.name, config.options, config.metadata);
186
- dataSources.push(ds);
187
- }
188
- catch (error) {
189
- if (!(options === null || options === void 0 ? void 0 : options.continueOnError)) {
190
- // 清理已注册的数据源
191
- yield this.cleanupDataSources(dataSources.map((ds) => ds.options));
192
- throw error;
193
- }
194
- }
195
- }
196
- }
197
- return dataSources;
198
- });
199
- }
200
- /**
201
- * 测试数据源连接
202
- */
203
- testConnection(name) {
204
- return __awaiter(this, void 0, void 0, function* () {
205
- const config = transaction_context_service_1.TransactionContextService.getDataSourceConfig(name);
206
- if (!config) {
207
- return false;
208
- }
209
- const startTime = Date.now();
210
- try {
211
- // 使用数据库适配器执行健康检查
212
- const isHealthy = yield database_adapter_1.DatabaseAdapter.healthCheck(config.dataSource);
213
- const responseTime = Date.now() - startTime;
214
- if (!isHealthy) {
215
- throw new Error('Health check query failed');
216
- }
217
- // 更新健康状态
218
- if (this.config.enableHealthCheck) {
219
- this.healthStatuses.set(name, {
220
- name,
221
- isConnected: true,
222
- lastChecked: new Date(),
223
- responseTime,
224
- });
225
- }
226
- return true;
227
- }
228
- catch (error) {
229
- // 更新健康状态
230
- if (this.config.enableHealthCheck) {
231
- this.healthStatuses.set(name, {
232
- name,
233
- isConnected: false,
234
- lastChecked: new Date(),
235
- error: error.message,
236
- responseTime: Date.now() - startTime,
237
- });
238
- }
239
- return false;
240
- }
241
- });
242
- }
243
- /**
244
- * 获取所有数据源的健康状态
245
- */
246
- getHealthStatuses() {
247
- return new Map(this.healthStatuses);
248
- }
249
- /**
250
- * 重新连接数据源
251
- */
252
- reconnectDataSource(name) {
253
- return __awaiter(this, void 0, void 0, function* () {
254
- const config = transaction_context_service_1.TransactionContextService.getDataSourceConfig(name);
255
- if (!config || !config.options) {
256
- throw new Error(`Cannot reconnect: DataSource '${name}' has no connection options`);
257
- }
258
- try {
259
- // 关闭现有连接
260
- if (config.dataSource.isInitialized) {
261
- yield config.dataSource.destroy();
262
- }
263
- // 重新初始化
264
- yield config.dataSource.initialize();
265
- // 测试连接
266
- const isConnected = yield this.testConnection(name);
267
- if (this.config.logLifecycleEvents) {
268
- this.logger.log(`Reconnected DataSource: ${name}, Success: ${isConnected}`);
269
- }
270
- return isConnected;
271
- }
272
- catch (error) {
273
- this.logger.error(`Failed to reconnect DataSource ${name}:`, error.stack);
274
- return false;
275
- }
276
- });
277
- }
278
- /**
279
- * 开始健康检查
280
- */
281
- startHealthCheck() {
282
- this.healthCheckInterval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
283
- var _a;
284
- const dataSources = this.getRegisteredDataSources();
285
- for (const name of dataSources) {
286
- yield this.testConnection(name);
287
- // 自动重连
288
- const status = this.healthStatuses.get(name);
289
- if (!(status === null || status === void 0 ? void 0 : status.isConnected) && this.config.autoCleanup) {
290
- this.logger.warn(`DataSource ${name} is unhealthy, attempting reconnect...`);
291
- let attempts = 0;
292
- const maxAttempts = this.config.maxReconnectAttempts || 3;
293
- while (attempts < maxAttempts) {
294
- const reconnected = yield this.reconnectDataSource(name);
295
- if (reconnected) {
296
- break;
297
- }
298
- attempts++;
299
- }
300
- if (!((_a = this.healthStatuses.get(name)) === null || _a === void 0 ? void 0 : _a.isConnected)) {
301
- this.logger.error(`Failed to reconnect DataSource ${name} after ${maxAttempts} attempts`);
302
- }
303
- }
304
- }
305
- }), this.config.healthCheckInterval);
306
- this.logger.log('Health check started');
307
- }
308
- /**
309
- * 清理指定数据源
310
- */
311
- cleanupDataSources(options) {
312
- return __awaiter(this, void 0, void 0, function* () {
313
- // 找到对应的数据源并清理
314
- for (const opt of options) {
315
- // 这里需要从配置反向查找数据源名称
316
- // 简化实现:遍历所有已注册的数据源
317
- const names = this.getRegisteredDataSources();
318
- for (const name of names) {
319
- const config = transaction_context_service_1.TransactionContextService.getDataSourceConfig(name);
320
- if ((config === null || config === void 0 ? void 0 : config.dataSource.options) === opt) {
321
- yield this.unregisterDataSource(name);
322
- break;
323
- }
324
- }
325
- }
326
- });
327
- }
328
- /**
329
- * 清理所有动态数据源
330
- */
331
- cleanupAllDataSources() {
332
- return __awaiter(this, void 0, void 0, function* () {
333
- const names = this.getRegisteredDataSources();
334
- for (const name of names) {
335
- yield this.unregisterDataSource(name);
336
- }
337
- if (this.config.logLifecycleEvents) {
338
- this.logger.log('All dynamic DataSources cleaned up');
339
- }
340
- });
341
- }
342
- };
343
- exports.DataSourceRegistryService = DataSourceRegistryService;
344
- exports.DataSourceRegistryService = DataSourceRegistryService = DataSourceRegistryService_1 = __decorate([
345
- (0, common_1.Injectable)(),
346
- __param(0, (0, common_1.Optional)()),
347
- __param(0, (0, common_1.Inject)('DATA_SOURCE_REGISTRY_CONFIG')),
348
- __metadata("design:paramtypes", [Object])
349
- ], DataSourceRegistryService);
@@ -1,142 +0,0 @@
1
- import { DataSource } from 'typeorm';
2
- /**
3
- * 数据源工具类
4
- * 提供静态方法在任意位置获取数据源
5
- */
6
- export declare class DataSourceUtil {
7
- /**
8
- * 获取数据源
9
- * 按优先级从以下位置查找:
10
- * 1. 当前请求上下文 (TransactionContextService)
11
- * 2. 全局数据源存储 (GlobalDataSourceStorage)
12
- *
13
- * @param name 数据源名称,默认为 'default'
14
- * @returns DataSource 实例
15
- * @throws Error 如果数据源不存在
16
- */
17
- static getDataSource(name?: string): DataSource;
18
- /**
19
- * 安全获取数据源,不存在时返回 null
20
- *
21
- * @param name 数据源名称
22
- * @returns DataSource 实例或 null
23
- */
24
- static getDataSourceSafe(name?: string): DataSource | null;
25
- /**
26
- * 获取默认数据源
27
- */
28
- static getDefaultDataSource(): DataSource;
29
- /**
30
- * 安全获取默认数据源
31
- */
32
- static getDefaultDataSourceSafe(): DataSource | null;
33
- /**
34
- * 检查数据源是否可用
35
- *
36
- * @param name 数据源名称
37
- * @returns 是否可用
38
- */
39
- static isAvailable(name?: string): boolean;
40
- /**
41
- * 获取所有可用数据源名称
42
- */
43
- static getAvailableDataSourceNames(): string[];
44
- /**
45
- * 批量获取数据源
46
- *
47
- * @param names 数据源名称数组
48
- * @returns 数据源 Map
49
- */
50
- static getDataSources(names: string[]): Map<string, DataSource>;
51
- /**
52
- * 获取所有已注册的数据源
53
- */
54
- static getAllDataSources(): Map<string, DataSource>;
55
- /**
56
- * 手动注册数据源(用于非模块场景)
57
- *
58
- * @param name 数据源名称
59
- * @param dataSource DataSource 实例
60
- * @param isDefault 是否设为默认数据源
61
- */
62
- static registerDataSource(name: string, dataSource: DataSource, isDefault?: boolean): void;
63
- /**
64
- * 批量注册数据源
65
- *
66
- * @param dataSources 数据源 Map
67
- * @param defaultName 默认数据源名称
68
- */
69
- static registerDataSources(dataSources: Map<string, DataSource>, defaultName?: string): void;
70
- /**
71
- * 使用数据源执行操作
72
- *
73
- * @param name 数据源名称
74
- * @param operation 要执行的操作
75
- * @returns 操作结果
76
- */
77
- static withDataSource<T>(name: string, operation: (dataSource: DataSource) => Promise<T> | T): Promise<T>;
78
- /**
79
- * 使用默认数据源执行操作
80
- *
81
- * @param operation 要执行的操作
82
- * @returns 操作结果
83
- */
84
- static withDefaultDataSource<T>(operation: (dataSource: DataSource) => Promise<T> | T): Promise<T>;
85
- /**
86
- * 在事务中执行操作
87
- *
88
- * @param name 数据源名称
89
- * @param operation 要执行的操作
90
- * @returns 操作结果
91
- */
92
- static withTransaction<T>(name: string, operation: (dataSource: DataSource) => Promise<T>): Promise<T>;
93
- /**
94
- * 在默认数据源的事务中执行操作
95
- */
96
- static withDefaultTransaction<T>(operation: (dataSource: DataSource) => Promise<T>): Promise<T>;
97
- /**
98
- * 测试数据源连接
99
- *
100
- * @param name 数据源名称
101
- * @returns 连接是否正常
102
- */
103
- static testConnection(name?: string): Promise<boolean>;
104
- }
105
- /**
106
- * 便捷的别名
107
- */
108
- export declare const getDataSource: any;
109
- export declare const getDataSourceSafe: any;
110
- export declare const getDefaultDataSource: any;
111
- export declare const isDataSourceAvailable: any;
112
- export declare const withDataSource: any;
113
- export declare const withTransaction: any;
114
- /**
115
- * 添加数据源到全局注册表
116
- * 用于在 TypeOrmModule.forRootAsync 的 useFactory 中手动注册数据源
117
- *
118
- * @param name 数据源名称
119
- * @param dataSource DataSource 实例
120
- * @param isDefault 是否设为默认数据源
121
- *
122
- * @example
123
- * ```typescript
124
- * TypeOrmModule.forRootAsync({
125
- * inject: [ApiConfigService],
126
- * useFactory: (config: ApiConfigService) => {
127
- * const dsConfig = config.typeormConfig;
128
- * // 在这里注册,确保数据源初始化后立即可用
129
- * addDataSource('default', dataSource, true);
130
- * return dsConfig;
131
- * },
132
- * }),
133
- * ```
134
- */
135
- export declare const addDataSource: any;
136
- /**
137
- * 批量添加数据源
138
- *
139
- * @param dataSources 数据源 Map
140
- * @param defaultName 默认数据源名称
141
- */
142
- export declare const addDataSources: any;