@nest-omni/core 4.1.3-11 → 4.1.3-12

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 (175) hide show
  1. package/audit/audit.module.js +17 -0
  2. package/audit/controllers/audit.controller.d.ts +64 -0
  3. package/audit/controllers/audit.controller.js +50 -0
  4. package/audit/decorators/audit-action.decorator.d.ts +74 -0
  5. package/audit/decorators/audit-action.decorator.js +42 -0
  6. package/audit/decorators/entity-audit.decorator.d.ts +10 -1
  7. package/audit/decorators/entity-audit.decorator.js +34 -16
  8. package/audit/decorators/index.d.ts +1 -0
  9. package/audit/decorators/index.js +1 -0
  10. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  11. package/audit/entities/audit-action-summary.entity.js +101 -0
  12. package/audit/entities/entity-audit-log.entity.d.ts +3 -0
  13. package/audit/entities/entity-audit-log.entity.js +25 -2
  14. package/audit/entities/entity-transaction.entity.d.ts +3 -4
  15. package/audit/entities/entity-transaction.entity.js +10 -3
  16. package/audit/entities/index.d.ts +1 -0
  17. package/audit/entities/index.js +1 -0
  18. package/audit/entities/manual-operation-log.entity.js +8 -1
  19. package/audit/enums/audit.enums.d.ts +1 -10
  20. package/audit/enums/audit.enums.js +7 -17
  21. package/audit/index.d.ts +2 -1
  22. package/audit/index.js +5 -1
  23. package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
  24. package/audit/interceptors/audit-action.interceptor.js +215 -0
  25. package/audit/interceptors/index.d.ts +1 -0
  26. package/audit/interceptors/index.js +1 -0
  27. package/audit/interfaces/audit.interfaces.d.ts +10 -5
  28. package/audit/services/audit-action.service.d.ts +141 -0
  29. package/audit/services/audit-action.service.js +244 -0
  30. package/audit/services/audit-context.service.d.ts +82 -0
  31. package/audit/services/audit-context.service.js +170 -0
  32. package/audit/services/entity-audit.service.d.ts +104 -3
  33. package/audit/services/entity-audit.service.js +306 -9
  34. package/audit/services/index.d.ts +1 -0
  35. package/audit/services/index.js +1 -0
  36. package/audit/services/manual-audit-log.service.d.ts +24 -23
  37. package/audit/services/manual-audit-log.service.js +32 -53
  38. package/audit/services/operation-description.service.d.ts +13 -3
  39. package/audit/services/operation-description.service.js +161 -24
  40. package/audit/services/transaction-audit.service.js +3 -3
  41. package/audit/subscribers/entity-audit.subscriber.d.ts +4 -0
  42. package/audit/subscribers/entity-audit.subscriber.js +47 -0
  43. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  44. package/file-upload/controllers/file-access.controller.js +128 -0
  45. package/file-upload/decorators/csv-data.decorator.d.ts +44 -0
  46. package/file-upload/decorators/csv-data.decorator.js +131 -0
  47. package/file-upload/decorators/excel-data.decorator.d.ts +44 -0
  48. package/file-upload/decorators/excel-data.decorator.js +125 -0
  49. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  50. package/file-upload/decorators/file-upload.decorator.js +172 -0
  51. package/file-upload/decorators/index.d.ts +4 -0
  52. package/file-upload/decorators/index.js +20 -0
  53. package/file-upload/decorators/process.decorator.d.ts +40 -0
  54. package/file-upload/decorators/process.decorator.js +52 -0
  55. package/file-upload/dto/create-file.dto.d.ts +24 -0
  56. package/file-upload/dto/create-file.dto.js +112 -0
  57. package/file-upload/dto/find-files.dto.d.ts +15 -0
  58. package/file-upload/dto/find-files.dto.js +76 -0
  59. package/file-upload/dto/index.d.ts +4 -0
  60. package/file-upload/dto/index.js +20 -0
  61. package/file-upload/dto/pagination.dto.d.ts +7 -0
  62. package/file-upload/dto/pagination.dto.js +39 -0
  63. package/file-upload/dto/update-file.dto.d.ts +16 -0
  64. package/file-upload/dto/update-file.dto.js +71 -0
  65. package/file-upload/entities/file-metadata.entity.d.ts +22 -0
  66. package/file-upload/entities/file-metadata.entity.js +84 -0
  67. package/file-upload/entities/file.entity.d.ts +129 -0
  68. package/file-upload/entities/file.entity.js +384 -0
  69. package/file-upload/entities/index.d.ts +2 -0
  70. package/file-upload/entities/index.js +18 -0
  71. package/file-upload/enums/file-type.enum.d.ts +72 -0
  72. package/file-upload/enums/file-type.enum.js +212 -0
  73. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  74. package/file-upload/exceptions/file-upload.exception.js +120 -0
  75. package/file-upload/exceptions/index.d.ts +1 -0
  76. package/file-upload/exceptions/index.js +17 -0
  77. package/file-upload/file-upload.module.d.ts +89 -0
  78. package/file-upload/file-upload.module.js +264 -0
  79. package/file-upload/index.d.ts +26 -0
  80. package/file-upload/index.js +59 -0
  81. package/file-upload/interceptors/file-upload.interceptor.d.ts +48 -0
  82. package/file-upload/interceptors/file-upload.interceptor.js +434 -0
  83. package/file-upload/interceptors/index.d.ts +1 -0
  84. package/file-upload/interceptors/index.js +17 -0
  85. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  86. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  87. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  88. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  89. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  90. package/file-upload/interfaces/file-entity.interface.js +28 -0
  91. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  92. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  93. package/file-upload/interfaces/file-upload-options.interface.d.ts +117 -0
  94. package/file-upload/interfaces/file-upload-options.interface.js +2 -0
  95. package/file-upload/interfaces/index.d.ts +7 -0
  96. package/file-upload/interfaces/index.js +24 -0
  97. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  98. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  99. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  100. package/file-upload/interfaces/upload-options.interface.js +2 -0
  101. package/file-upload/providers/index.d.ts +2 -0
  102. package/file-upload/providers/index.js +18 -0
  103. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  104. package/file-upload/providers/local-storage.provider.js +484 -0
  105. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  106. package/file-upload/providers/s3-storage.provider.js +455 -0
  107. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  108. package/file-upload/services/file-signature-validator.service.js +376 -0
  109. package/file-upload/services/file.service.d.ts +190 -0
  110. package/file-upload/services/file.service.js +609 -0
  111. package/file-upload/services/index.d.ts +4 -0
  112. package/file-upload/services/index.js +20 -0
  113. package/file-upload/services/malicious-file-detector.service.d.ts +274 -0
  114. package/file-upload/services/malicious-file-detector.service.js +1035 -0
  115. package/file-upload/services/mime-registry.service.d.ts +47 -0
  116. package/file-upload/services/mime-registry.service.js +167 -0
  117. package/file-upload/utils/checksum.util.d.ts +28 -0
  118. package/file-upload/utils/checksum.util.js +65 -0
  119. package/file-upload/utils/dynamic-import.util.d.ts +50 -0
  120. package/file-upload/utils/dynamic-import.util.js +144 -0
  121. package/file-upload/utils/filename.util.d.ts +59 -0
  122. package/file-upload/utils/filename.util.js +184 -0
  123. package/file-upload/utils/filepath.util.d.ts +70 -0
  124. package/file-upload/utils/filepath.util.js +152 -0
  125. package/file-upload/utils/index.d.ts +4 -0
  126. package/file-upload/utils/index.js +20 -0
  127. package/index.d.ts +3 -1
  128. package/index.js +4 -1
  129. package/package.json +4 -5
  130. package/setup/bootstrap.setup.d.ts +1 -0
  131. package/setup/bootstrap.setup.js +1 -0
  132. package/shared/index.d.ts +1 -1
  133. package/shared/index.js +1 -1
  134. package/shared/{serviceRegistryModule.js → service-registry.module.js} +0 -12
  135. package/shared/services/index.d.ts +0 -1
  136. package/shared/services/index.js +0 -1
  137. package/transaction/__tests__/mocks.d.ts +9 -0
  138. package/transaction/__tests__/mocks.js +33 -0
  139. package/transaction/base-service-transaction.d.ts +99 -0
  140. package/transaction/base-service-transaction.js +286 -0
  141. package/transaction/cls-compatibility.service.d.ts +55 -0
  142. package/transaction/cls-compatibility.service.js +127 -0
  143. package/transaction/data-source-registry.d.ts +91 -0
  144. package/transaction/data-source-registry.js +349 -0
  145. package/transaction/database-adapter.d.ts +44 -0
  146. package/transaction/database-adapter.js +240 -0
  147. package/transaction/decorators/entity-datasource.decorator.d.ts +62 -0
  148. package/transaction/decorators/entity-datasource.decorator.js +105 -0
  149. package/transaction/index.d.ts +14 -0
  150. package/transaction/index.js +57 -0
  151. package/transaction/logging-transactional.interceptor.d.ts +18 -0
  152. package/transaction/logging-transactional.interceptor.js +163 -0
  153. package/transaction/transaction-context.service.d.ts +137 -0
  154. package/transaction/transaction-context.service.js +411 -0
  155. package/transaction/transaction-manager.d.ts +230 -0
  156. package/transaction/transaction-manager.js +1001 -0
  157. package/transaction/transaction-synchronization.d.ts +171 -0
  158. package/transaction/transaction-synchronization.js +380 -0
  159. package/transaction/transaction.errors.d.ts +91 -0
  160. package/transaction/transaction.errors.js +206 -0
  161. package/transaction/transaction.module.d.ts +30 -0
  162. package/transaction/transaction.module.js +98 -0
  163. package/transaction/transactional.decorator.d.ts +82 -0
  164. package/transaction/transactional.decorator.js +319 -0
  165. package/transaction/typeorm-module-wrapper.d.ts +96 -0
  166. package/transaction/typeorm-module-wrapper.js +197 -0
  167. package/validators/file-mimetype.validator.d.ts +0 -2
  168. package/validators/file-mimetype.validator.js +4 -6
  169. package/validators/is-exists.validator.d.ts +2 -5
  170. package/validators/is-exists.validator.js +4 -6
  171. package/validators/is-unique.validator.d.ts +2 -5
  172. package/validators/is-unique.validator.js +6 -11
  173. package/shared/services/validator.service.d.ts +0 -3
  174. package/shared/services/validator.service.js +0 -20
  175. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * 事务同步管理器
3
+ * 对标 Spring TransactionSynchronizationManager
4
+ *
5
+ * 提供事务资源绑定、同步回调和事务状态管理
6
+ */
7
+ /**
8
+ * 事务同步状态
9
+ */
10
+ export declare enum TransactionSynchronizationStatus {
11
+ STATUS_COMMITTED = 0,
12
+ STATUS_ROLLED_BACK = 1,
13
+ STATUS_UNKNOWN = 2
14
+ }
15
+ /**
16
+ * 事务同步回调接口
17
+ * 对标 Spring TransactionSynchronization
18
+ */
19
+ export interface TransactionSynchronization {
20
+ /**
21
+ * 事务挂起前调用
22
+ */
23
+ suspend?(): void;
24
+ /**
25
+ * 事务恢复时调用
26
+ */
27
+ resume?(): void;
28
+ /**
29
+ * 事务提交前调用(刷新前)
30
+ */
31
+ beforeCommit?(readOnly: boolean): Promise<void> | void;
32
+ /**
33
+ * 事务完成前调用(提交或回滚前)
34
+ */
35
+ beforeCompletion?(): Promise<void> | void;
36
+ /**
37
+ * 事务提交后调用
38
+ */
39
+ afterCommit?(): Promise<void> | void;
40
+ /**
41
+ * 事务完成后调用(提交或回滚后)
42
+ * @param status 事务完成状态
43
+ */
44
+ afterCompletion?(status: TransactionSynchronizationStatus): Promise<void> | void;
45
+ /**
46
+ * 获取同步顺序(值越小,优先级越高)
47
+ */
48
+ getOrder?(): number;
49
+ }
50
+ /**
51
+ * 事务同步管理器
52
+ * 对标 Spring TransactionSynchronizationManager
53
+ *
54
+ * 使用 AsyncLocalStorage 实现请求隔离,避免跨请求状态污染和内存泄漏
55
+ */
56
+ export declare class TransactionSynchronizationManager {
57
+ private static readonly logger;
58
+ /**
59
+ * 获取当前请求的同步上下文
60
+ */
61
+ private static getContext;
62
+ /**
63
+ * 在 AsyncLocalStorage 上下文中运行代码
64
+ * 用于确保每个请求有独立的同步状态
65
+ */
66
+ static runInContext<T>(fn: () => T): T;
67
+ /**
68
+ * 初始化请求上下文(用于中间件)
69
+ */
70
+ static initRequestContext(): void;
71
+ /**
72
+ * 检查是否在上下文中
73
+ */
74
+ static hasContext(): boolean;
75
+ /**
76
+ * 获取当前事务的唯一标识
77
+ */
78
+ private static getCurrentTransactionKey;
79
+ /**
80
+ * 注册事务同步回调
81
+ */
82
+ static registerSynchronization(synchronization: TransactionSynchronization, dataSourceName?: string): void;
83
+ /**
84
+ * 检查事务同步是否活跃
85
+ */
86
+ static isSynchronizationActive(dataSourceName?: string): boolean;
87
+ /**
88
+ * 初始化事务同步
89
+ */
90
+ static initSynchronization(dataSourceName?: string): void;
91
+ /**
92
+ * 清理事务同步
93
+ */
94
+ static clearSynchronization(dataSourceName?: string): void;
95
+ /**
96
+ * 获取所有同步回调(按优先级排序)
97
+ */
98
+ static getSynchronizations(dataSourceName?: string): TransactionSynchronization[];
99
+ /**
100
+ * 触发 beforeCommit 回调
101
+ */
102
+ static triggerBeforeCommit(readOnly: boolean, dataSourceName?: string): Promise<void>;
103
+ /**
104
+ * 触发 beforeCompletion 回调
105
+ */
106
+ static triggerBeforeCompletion(dataSourceName?: string): Promise<void>;
107
+ /**
108
+ * 触发 afterCommit 回调
109
+ */
110
+ static triggerAfterCommit(dataSourceName?: string): Promise<void>;
111
+ /**
112
+ * 触发 afterCompletion 回调
113
+ */
114
+ static triggerAfterCompletion(status: TransactionSynchronizationStatus, dataSourceName?: string): Promise<void>;
115
+ /**
116
+ * 绑定资源到当前事务
117
+ */
118
+ static bindResource(key: string, value: any, dataSourceName?: string): void;
119
+ /**
120
+ * 解绑资源
121
+ */
122
+ static unbindResource(key: string, dataSourceName?: string): any;
123
+ /**
124
+ * 获取绑定的资源
125
+ */
126
+ static getResource(key: string, dataSourceName?: string): any;
127
+ /**
128
+ * 检查资源是否已绑定
129
+ */
130
+ static hasResource(key: string, dataSourceName?: string): boolean;
131
+ /**
132
+ * 设置当前事务是否活跃
133
+ */
134
+ static setActualTransactionActive(active: boolean, dataSourceName?: string): void;
135
+ /**
136
+ * 检查是否有实际的事务
137
+ */
138
+ static isActualTransactionActive(dataSourceName?: string): boolean;
139
+ /**
140
+ * 设置当前事务名称
141
+ */
142
+ static setCurrentTransactionName(name: string | null, dataSourceName?: string): void;
143
+ /**
144
+ * 获取当前事务名称
145
+ */
146
+ static getCurrentTransactionName(dataSourceName?: string): string | null;
147
+ /**
148
+ * 设置当前事务是否只读
149
+ */
150
+ static setCurrentTransactionReadOnly(readOnly: boolean, dataSourceName?: string): void;
151
+ /**
152
+ * 检查当前事务是否只读
153
+ */
154
+ static isCurrentTransactionReadOnly(dataSourceName?: string): boolean;
155
+ /**
156
+ * 设置当前事务隔离级别
157
+ */
158
+ static setCurrentTransactionIsolationLevel(level: number | null, dataSourceName?: string): void;
159
+ /**
160
+ * 获取当前事务隔离级别
161
+ */
162
+ static getCurrentTransactionIsolationLevel(dataSourceName?: string): number | null;
163
+ /**
164
+ * 清理所有事务同步状态
165
+ */
166
+ static clear(dataSourceName?: string): void;
167
+ /**
168
+ * 获取所有资源
169
+ */
170
+ static getAllResources(dataSourceName?: string): Map<string, any>;
171
+ }
@@ -0,0 +1,380 @@
1
+ "use strict";
2
+ /**
3
+ * 事务同步管理器
4
+ * 对标 Spring TransactionSynchronizationManager
5
+ *
6
+ * 提供事务资源绑定、同步回调和事务状态管理
7
+ */
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.TransactionSynchronizationManager = exports.TransactionSynchronizationStatus = void 0;
19
+ const common_1 = require("@nestjs/common");
20
+ const async_hooks_1 = require("async_hooks");
21
+ /**
22
+ * 事务同步状态
23
+ */
24
+ var TransactionSynchronizationStatus;
25
+ (function (TransactionSynchronizationStatus) {
26
+ TransactionSynchronizationStatus[TransactionSynchronizationStatus["STATUS_COMMITTED"] = 0] = "STATUS_COMMITTED";
27
+ TransactionSynchronizationStatus[TransactionSynchronizationStatus["STATUS_ROLLED_BACK"] = 1] = "STATUS_ROLLED_BACK";
28
+ TransactionSynchronizationStatus[TransactionSynchronizationStatus["STATUS_UNKNOWN"] = 2] = "STATUS_UNKNOWN";
29
+ })(TransactionSynchronizationStatus || (exports.TransactionSynchronizationStatus = TransactionSynchronizationStatus = {}));
30
+ /**
31
+ * 创建新的同步上下文
32
+ */
33
+ function createSyncContext() {
34
+ return {
35
+ synchronizations: new Map(),
36
+ resources: new Map(),
37
+ actualTransactionActive: new Map(),
38
+ currentTransactionName: new Map(),
39
+ currentTransactionReadOnly: new Map(),
40
+ currentTransactionIsolationLevel: new Map(),
41
+ };
42
+ }
43
+ // AsyncLocalStorage for request-scoped synchronization state
44
+ const syncContextStorage = new async_hooks_1.AsyncLocalStorage();
45
+ // Fallback context for non-HTTP scenarios (e.g., unit tests, CLI)
46
+ let fallbackContext = null;
47
+ /**
48
+ * 事务同步管理器
49
+ * 对标 Spring TransactionSynchronizationManager
50
+ *
51
+ * 使用 AsyncLocalStorage 实现请求隔离,避免跨请求状态污染和内存泄漏
52
+ */
53
+ class TransactionSynchronizationManager {
54
+ /**
55
+ * 获取当前请求的同步上下文
56
+ */
57
+ static getContext() {
58
+ let context = syncContextStorage.getStore();
59
+ if (!context) {
60
+ // 如果在 AsyncLocalStorage 上下文外调用,使用 fallback 上下文
61
+ // 主要用于单元测试和非 HTTP 请求场景
62
+ if (!fallbackContext) {
63
+ fallbackContext = createSyncContext();
64
+ }
65
+ context = fallbackContext;
66
+ }
67
+ return context;
68
+ }
69
+ /**
70
+ * 在 AsyncLocalStorage 上下文中运行代码
71
+ * 用于确保每个请求有独立的同步状态
72
+ */
73
+ static runInContext(fn) {
74
+ const context = createSyncContext();
75
+ return syncContextStorage.run(context, fn);
76
+ }
77
+ /**
78
+ * 初始化请求上下文(用于中间件)
79
+ */
80
+ static initRequestContext() {
81
+ const context = createSyncContext();
82
+ syncContextStorage.enterWith(context);
83
+ // 同时设置 fallback,用于单元测试
84
+ fallbackContext = context;
85
+ }
86
+ /**
87
+ * 检查是否在上下文中
88
+ */
89
+ static hasContext() {
90
+ return syncContextStorage.getStore() !== undefined;
91
+ }
92
+ /**
93
+ * 获取当前事务的唯一标识
94
+ */
95
+ static getCurrentTransactionKey(dataSourceName = 'default') {
96
+ return `tx_${dataSourceName}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
97
+ }
98
+ /**
99
+ * 注册事务同步回调
100
+ */
101
+ static registerSynchronization(synchronization, dataSourceName = 'default') {
102
+ if (!this.isSynchronizationActive(dataSourceName)) {
103
+ throw new Error('Transaction synchronization is not active');
104
+ }
105
+ const context = this.getContext();
106
+ if (!context.synchronizations.has(dataSourceName)) {
107
+ context.synchronizations.set(dataSourceName, []);
108
+ }
109
+ context.synchronizations.get(dataSourceName).push(synchronization);
110
+ }
111
+ /**
112
+ * 检查事务同步是否活跃
113
+ */
114
+ static isSynchronizationActive(dataSourceName = 'default') {
115
+ const context = this.getContext();
116
+ return context.synchronizations.has(dataSourceName);
117
+ }
118
+ /**
119
+ * 初始化事务同步
120
+ */
121
+ static initSynchronization(dataSourceName = 'default') {
122
+ if (this.isSynchronizationActive(dataSourceName)) {
123
+ throw new Error('Transaction synchronization already active');
124
+ }
125
+ const context = this.getContext();
126
+ context.synchronizations.set(dataSourceName, []);
127
+ }
128
+ /**
129
+ * 清理事务同步
130
+ */
131
+ static clearSynchronization(dataSourceName = 'default') {
132
+ const context = this.getContext();
133
+ context.synchronizations.delete(dataSourceName);
134
+ }
135
+ /**
136
+ * 获取所有同步回调(按优先级排序)
137
+ */
138
+ static getSynchronizations(dataSourceName = 'default') {
139
+ const context = this.getContext();
140
+ const syncs = context.synchronizations.get(dataSourceName) || [];
141
+ return syncs.sort((a, b) => {
142
+ var _a, _b, _c, _d;
143
+ const orderA = (_b = (_a = a.getOrder) === null || _a === void 0 ? void 0 : _a.call(a)) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER;
144
+ const orderB = (_d = (_c = b.getOrder) === null || _c === void 0 ? void 0 : _c.call(b)) !== null && _d !== void 0 ? _d : Number.MAX_SAFE_INTEGER;
145
+ return orderA - orderB;
146
+ });
147
+ }
148
+ /**
149
+ * 触发 beforeCommit 回调
150
+ */
151
+ static triggerBeforeCommit(readOnly_1) {
152
+ return __awaiter(this, arguments, void 0, function* (readOnly, dataSourceName = 'default') {
153
+ const syncs = this.getSynchronizations(dataSourceName);
154
+ for (const sync of syncs) {
155
+ if (sync.beforeCommit) {
156
+ try {
157
+ yield sync.beforeCommit(readOnly);
158
+ }
159
+ catch (error) {
160
+ this.logger.error(`Error in beforeCommit callback:`, error);
161
+ throw error;
162
+ }
163
+ }
164
+ }
165
+ });
166
+ }
167
+ /**
168
+ * 触发 beforeCompletion 回调
169
+ */
170
+ static triggerBeforeCompletion() {
171
+ return __awaiter(this, arguments, void 0, function* (dataSourceName = 'default') {
172
+ const syncs = this.getSynchronizations(dataSourceName);
173
+ for (const sync of syncs) {
174
+ if (sync.beforeCompletion) {
175
+ try {
176
+ yield sync.beforeCompletion();
177
+ }
178
+ catch (error) {
179
+ this.logger.error(`Error in beforeCompletion callback:`, error);
180
+ // 不抛出错误,继续执行其他回调
181
+ }
182
+ }
183
+ }
184
+ });
185
+ }
186
+ /**
187
+ * 触发 afterCommit 回调
188
+ */
189
+ static triggerAfterCommit() {
190
+ return __awaiter(this, arguments, void 0, function* (dataSourceName = 'default') {
191
+ const syncs = this.getSynchronizations(dataSourceName);
192
+ for (const sync of syncs) {
193
+ if (sync.afterCommit) {
194
+ try {
195
+ yield sync.afterCommit();
196
+ }
197
+ catch (error) {
198
+ this.logger.error(`Error in afterCommit callback:`, error);
199
+ // 不抛出错误,继续执行其他回调
200
+ }
201
+ }
202
+ }
203
+ });
204
+ }
205
+ /**
206
+ * 触发 afterCompletion 回调
207
+ */
208
+ static triggerAfterCompletion(status_1) {
209
+ return __awaiter(this, arguments, void 0, function* (status, dataSourceName = 'default') {
210
+ const syncs = this.getSynchronizations(dataSourceName);
211
+ for (const sync of syncs) {
212
+ if (sync.afterCompletion) {
213
+ try {
214
+ yield sync.afterCompletion(status);
215
+ }
216
+ catch (error) {
217
+ this.logger.error(`Error in afterCompletion callback:`, error);
218
+ // 不抛出错误,继续执行其他回调
219
+ }
220
+ }
221
+ }
222
+ });
223
+ }
224
+ /**
225
+ * 绑定资源到当前事务
226
+ */
227
+ static bindResource(key, value, dataSourceName = 'default') {
228
+ const context = this.getContext();
229
+ if (!context.resources.has(dataSourceName)) {
230
+ context.resources.set(dataSourceName, new Map());
231
+ }
232
+ const resourceMap = context.resources.get(dataSourceName);
233
+ if (resourceMap.has(key)) {
234
+ throw new Error(`Resource with key '${key}' already bound to transaction`);
235
+ }
236
+ resourceMap.set(key, { key, value });
237
+ }
238
+ /**
239
+ * 解绑资源
240
+ */
241
+ static unbindResource(key, dataSourceName = 'default') {
242
+ const context = this.getContext();
243
+ const resourceMap = context.resources.get(dataSourceName);
244
+ if (!resourceMap) {
245
+ return null;
246
+ }
247
+ const resource = resourceMap.get(key);
248
+ if (resource) {
249
+ resourceMap.delete(key);
250
+ return resource.value;
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * 获取绑定的资源
256
+ */
257
+ static getResource(key, dataSourceName = 'default') {
258
+ var _a;
259
+ const context = this.getContext();
260
+ const resourceMap = context.resources.get(dataSourceName);
261
+ return ((_a = resourceMap === null || resourceMap === void 0 ? void 0 : resourceMap.get(key)) === null || _a === void 0 ? void 0 : _a.value) || null;
262
+ }
263
+ /**
264
+ * 检查资源是否已绑定
265
+ */
266
+ static hasResource(key, dataSourceName = 'default') {
267
+ const context = this.getContext();
268
+ const resourceMap = context.resources.get(dataSourceName);
269
+ return (resourceMap === null || resourceMap === void 0 ? void 0 : resourceMap.has(key)) || false;
270
+ }
271
+ /**
272
+ * 设置当前事务是否活跃
273
+ */
274
+ static setActualTransactionActive(active, dataSourceName = 'default') {
275
+ const context = this.getContext();
276
+ context.actualTransactionActive.set(dataSourceName, active);
277
+ }
278
+ /**
279
+ * 检查是否有实际的事务
280
+ */
281
+ static isActualTransactionActive(dataSourceName = 'default') {
282
+ const context = this.getContext();
283
+ return context.actualTransactionActive.get(dataSourceName) || false;
284
+ }
285
+ /**
286
+ * 设置当前事务名称
287
+ */
288
+ static setCurrentTransactionName(name, dataSourceName = 'default') {
289
+ const context = this.getContext();
290
+ if (name) {
291
+ context.currentTransactionName.set(dataSourceName, name);
292
+ }
293
+ else {
294
+ context.currentTransactionName.delete(dataSourceName);
295
+ }
296
+ }
297
+ /**
298
+ * 获取当前事务名称
299
+ */
300
+ static getCurrentTransactionName(dataSourceName = 'default') {
301
+ const context = this.getContext();
302
+ return context.currentTransactionName.get(dataSourceName) || null;
303
+ }
304
+ /**
305
+ * 设置当前事务是否只读
306
+ */
307
+ static setCurrentTransactionReadOnly(readOnly, dataSourceName = 'default') {
308
+ const context = this.getContext();
309
+ context.currentTransactionReadOnly.set(dataSourceName, readOnly);
310
+ }
311
+ /**
312
+ * 检查当前事务是否只读
313
+ */
314
+ static isCurrentTransactionReadOnly(dataSourceName = 'default') {
315
+ const context = this.getContext();
316
+ return context.currentTransactionReadOnly.get(dataSourceName) || false;
317
+ }
318
+ /**
319
+ * 设置当前事务隔离级别
320
+ */
321
+ static setCurrentTransactionIsolationLevel(level, dataSourceName = 'default') {
322
+ const context = this.getContext();
323
+ if (level !== null) {
324
+ context.currentTransactionIsolationLevel.set(dataSourceName, level);
325
+ }
326
+ else {
327
+ context.currentTransactionIsolationLevel.delete(dataSourceName);
328
+ }
329
+ }
330
+ /**
331
+ * 获取当前事务隔离级别
332
+ */
333
+ static getCurrentTransactionIsolationLevel(dataSourceName = 'default') {
334
+ const context = this.getContext();
335
+ return context.currentTransactionIsolationLevel.get(dataSourceName) || null;
336
+ }
337
+ /**
338
+ * 清理所有事务同步状态
339
+ */
340
+ static clear(dataSourceName) {
341
+ const context = this.getContext();
342
+ if (dataSourceName) {
343
+ context.synchronizations.delete(dataSourceName);
344
+ context.resources.delete(dataSourceName);
345
+ context.actualTransactionActive.delete(dataSourceName);
346
+ context.currentTransactionName.delete(dataSourceName);
347
+ context.currentTransactionReadOnly.delete(dataSourceName);
348
+ context.currentTransactionIsolationLevel.delete(dataSourceName);
349
+ }
350
+ else {
351
+ // 清理所有
352
+ context.synchronizations.clear();
353
+ context.resources.clear();
354
+ context.actualTransactionActive.clear();
355
+ context.currentTransactionName.clear();
356
+ context.currentTransactionReadOnly.clear();
357
+ context.currentTransactionIsolationLevel.clear();
358
+ // 重置 fallback 上下文
359
+ if (fallbackContext === context) {
360
+ fallbackContext = null;
361
+ }
362
+ }
363
+ }
364
+ /**
365
+ * 获取所有资源
366
+ */
367
+ static getAllResources(dataSourceName = 'default') {
368
+ const context = this.getContext();
369
+ const resourceMap = context.resources.get(dataSourceName);
370
+ const result = new Map();
371
+ if (resourceMap) {
372
+ resourceMap.forEach((resource, key) => {
373
+ result.set(key, resource.value);
374
+ });
375
+ }
376
+ return result;
377
+ }
378
+ }
379
+ exports.TransactionSynchronizationManager = TransactionSynchronizationManager;
380
+ TransactionSynchronizationManager.logger = new common_1.Logger(TransactionSynchronizationManager.name);
@@ -0,0 +1,91 @@
1
+ /**
2
+ * 事务相关错误类
3
+ * 提供统一的错误处理机制
4
+ */
5
+ export declare class TransactionError extends Error {
6
+ readonly code: string;
7
+ readonly dataSource?: string;
8
+ readonly transactionId?: string;
9
+ readonly cause?: Error;
10
+ constructor(message: string, code: string, dataSource?: string, transactionId?: string, cause?: Error);
11
+ /**
12
+ * 创建事务开始失败错误
13
+ */
14
+ static beginFailed(message: string, dataSource?: string, cause?: Error): TransactionError;
15
+ /**
16
+ * 创建事务提交失败错误
17
+ */
18
+ static commitFailed(message: string, dataSource?: string, transactionId?: string, cause?: Error): TransactionError;
19
+ /**
20
+ * 创建事务回滚失败错误
21
+ */
22
+ static rollbackFailed(message: string, dataSource?: string, transactionId?: string, cause?: Error): TransactionError;
23
+ /**
24
+ * 创建事务超时错误
25
+ */
26
+ static timeout(message: string, dataSource?: string, transactionId?: string): TransactionError;
27
+ /**
28
+ * 创建事务状态无效错误
29
+ */
30
+ static invalidState(message: string, dataSource?: string, transactionId?: string): TransactionError;
31
+ /**
32
+ * 创建数据源连接错误
33
+ */
34
+ static dataSourceNotFound(dataSource: string): TransactionError;
35
+ /**
36
+ * 创建传播行为不支持错误
37
+ */
38
+ static unsupportedPropagation(propagation: number): TransactionError;
39
+ /**
40
+ * 创建嵌套事务错误
41
+ */
42
+ static nestedTransactionFailed(message: string, dataSource?: string, cause?: Error): TransactionError;
43
+ /**
44
+ * 转换为JSON
45
+ */
46
+ toJSON(): Record<string, any>;
47
+ /**
48
+ * 检查是否为特定错误代码
49
+ */
50
+ isErrorCode(code: string): boolean;
51
+ /**
52
+ * 检查是否为连接相关错误
53
+ */
54
+ isConnectionError(): boolean;
55
+ /**
56
+ * 检查是否为可重试错误
57
+ */
58
+ isRetryable(): boolean;
59
+ }
60
+ /**
61
+ * 事务错误处理工具类
62
+ */
63
+ export declare class TransactionErrorHandler {
64
+ private static logger;
65
+ /**
66
+ * 设置日志记录器
67
+ */
68
+ static setLogger(logger: Console | {
69
+ error: (message?: any, ...optionalParams: any[]) => void;
70
+ }): void;
71
+ /**
72
+ * 安全地执行操作,捕获并转换错误
73
+ */
74
+ static safeExecute<T>(operation: () => Promise<T>, errorFactory: (error: Error) => TransactionError, context?: string): Promise<T>;
75
+ /**
76
+ * 处理事务超时
77
+ */
78
+ static handleTimeout(timeoutMs: number, dataSource?: string, transactionId?: string): TransactionError;
79
+ /**
80
+ * 处理回滚失败
81
+ */
82
+ static safeRollback(rollbackFn: () => Promise<void>, dataSource?: string, transactionId?: string): Promise<void>;
83
+ /**
84
+ * 格式化错误消息
85
+ */
86
+ static formatMessage(error: TransactionError): string;
87
+ /**
88
+ * 判断是否应该重试
89
+ */
90
+ static shouldRetry(error: Error, attempt: number, maxAttempts?: number): boolean;
91
+ }