@nest-omni/core 3.1.2-8 → 4.1.2-9

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 (94) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +231 -0
  3. package/audit/controllers/audit.controller.d.ts +20 -0
  4. package/audit/controllers/audit.controller.js +142 -0
  5. package/audit/controllers/index.d.ts +1 -0
  6. package/audit/controllers/index.js +17 -0
  7. package/audit/decorators/audit-controller.decorator.d.ts +5 -0
  8. package/audit/decorators/audit-controller.decorator.js +17 -0
  9. package/audit/decorators/audit-operation.decorator.d.ts +5 -0
  10. package/audit/decorators/audit-operation.decorator.js +23 -0
  11. package/audit/decorators/entity-audit.decorator.d.ts +5 -0
  12. package/audit/decorators/entity-audit.decorator.js +19 -0
  13. package/audit/decorators/index.d.ts +2 -0
  14. package/audit/decorators/index.js +18 -0
  15. package/audit/dto/audit-log-query.dto.d.ts +14 -0
  16. package/audit/dto/audit-log-query.dto.js +95 -0
  17. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  18. package/audit/dto/begin-transaction.dto.js +22 -0
  19. package/audit/dto/compare-entities.dto.d.ts +6 -0
  20. package/audit/dto/compare-entities.dto.js +44 -0
  21. package/audit/dto/index.d.ts +5 -0
  22. package/audit/dto/index.js +21 -0
  23. package/audit/dto/pre-check-restore.dto.d.ts +5 -0
  24. package/audit/dto/pre-check-restore.dto.js +32 -0
  25. package/audit/dto/restore-entity.dto.d.ts +9 -0
  26. package/audit/dto/restore-entity.dto.js +53 -0
  27. package/audit/entities/entity-audit-log.entity.d.ts +18 -0
  28. package/audit/entities/entity-audit-log.entity.js +81 -0
  29. package/audit/entities/entity-transaction.entity.d.ts +14 -0
  30. package/audit/entities/entity-transaction.entity.js +51 -0
  31. package/audit/entities/index.d.ts +2 -0
  32. package/audit/entities/index.js +18 -0
  33. package/audit/entities/manual-operation-log.entity.d.ts +15 -0
  34. package/audit/entities/manual-operation-log.entity.js +82 -0
  35. package/audit/entities/operation-template.entity.d.ts +11 -0
  36. package/audit/entities/operation-template.entity.js +65 -0
  37. package/audit/enums/audit.enums.d.ts +27 -0
  38. package/audit/enums/audit.enums.js +35 -0
  39. package/audit/enums/index.d.ts +1 -0
  40. package/audit/enums/index.js +17 -0
  41. package/audit/index.d.ts +10 -0
  42. package/audit/index.js +26 -0
  43. package/audit/interceptors/audit.interceptor.d.ts +12 -0
  44. package/audit/interceptors/audit.interceptor.js +95 -0
  45. package/audit/interceptors/index.d.ts +1 -0
  46. package/audit/interceptors/index.js +17 -0
  47. package/audit/interfaces/audit.interfaces.d.ts +119 -0
  48. package/audit/interfaces/audit.interfaces.js +2 -0
  49. package/audit/interfaces/index.d.ts +1 -0
  50. package/audit/interfaces/index.js +17 -0
  51. package/audit/services/audit-context.service.d.ts +10 -0
  52. package/audit/services/audit-context.service.js +55 -0
  53. package/audit/services/audit-strategy.service.d.ts +19 -0
  54. package/audit/services/audit-strategy.service.js +89 -0
  55. package/audit/services/entity-audit.service.d.ts +37 -0
  56. package/audit/services/entity-audit.service.js +484 -0
  57. package/audit/services/index.d.ts +5 -0
  58. package/audit/services/index.js +21 -0
  59. package/audit/services/manual-audit-log.service.d.ts +29 -0
  60. package/audit/services/manual-audit-log.service.js +184 -0
  61. package/audit/services/multi-database.service.d.ts +10 -0
  62. package/audit/services/multi-database.service.js +59 -0
  63. package/audit/services/operation-description.service.d.ts +21 -0
  64. package/audit/services/operation-description.service.js +213 -0
  65. package/audit/services/transaction-audit.service.d.ts +22 -0
  66. package/audit/services/transaction-audit.service.js +201 -0
  67. package/audit/subscribers/entity-audit.subscriber.d.ts +14 -0
  68. package/audit/subscribers/entity-audit.subscriber.js +136 -0
  69. package/audit/subscribers/index.d.ts +1 -0
  70. package/audit/subscribers/index.js +17 -0
  71. package/common/abstract.entity.js +1 -1
  72. package/http-client/examples/advanced-usage.example.js +14 -1
  73. package/http-client/examples/auth-with-waiting-lock.example.d.ts +17 -0
  74. package/http-client/examples/auth-with-waiting-lock.example.js +336 -0
  75. package/http-client/examples/basic-usage.example.d.ts +1 -9
  76. package/http-client/examples/basic-usage.example.js +4 -14
  77. package/http-client/examples/multi-api-configuration.example.js +4 -4
  78. package/http-client/http-client.module.js +7 -4
  79. package/http-client/services/api-client-registry.service.d.ts +2 -1
  80. package/http-client/services/api-client-registry.service.js +2 -1
  81. package/http-client/services/http-client.service.d.ts +18 -1
  82. package/http-client/services/http-client.service.js +123 -3
  83. package/http-client/services/http-log-query.service.d.ts +20 -0
  84. package/http-client/services/http-log-query.service.js +176 -0
  85. package/http-client/services/http-replay.service.d.ts +58 -0
  86. package/http-client/services/http-replay.service.js +266 -0
  87. package/http-client/services/log-cleanup.service.js +2 -2
  88. package/http-client/services/logging.service.js +1 -1
  89. package/http-client/utils/request-id.util.d.ts +4 -0
  90. package/http-client/utils/request-id.util.js +34 -0
  91. package/index.d.ts +1 -0
  92. package/index.js +1 -0
  93. package/package.json +1 -1
  94. package/setup/bootstrap.setup.js +5 -1
@@ -0,0 +1,336 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
12
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
13
+ return new (P || (P = Promise))(function (resolve, reject) {
14
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
16
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
17
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
18
+ });
19
+ };
20
+ var AuthWithWaitingLockExample_1;
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.AuthWithWaitingLockExample = void 0;
23
+ const common_1 = require("@nestjs/common");
24
+ const http_client_service_1 = require("../services/http-client.service");
25
+ const http_log_query_service_1 = require("../services/http-log-query.service");
26
+ const http_replay_service_1 = require("../services/http-replay.service");
27
+ let AuthWithWaitingLockExample = AuthWithWaitingLockExample_1 = class AuthWithWaitingLockExample {
28
+ constructor(httpClient, logQueryService, replayService) {
29
+ this.httpClient = httpClient;
30
+ this.logQueryService = logQueryService;
31
+ this.replayService = replayService;
32
+ this.logger = new common_1.Logger(AuthWithWaitingLockExample_1.name);
33
+ }
34
+ basicAuthWithLock() {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ this.logger.log('=== 示例1: 基本带等待锁的认证请求 ===');
37
+ const requestConfig = {
38
+ method: 'GET',
39
+ url: 'https://api.github.com/user',
40
+ headers: {
41
+ Accept: 'application/vnd.github.v3+json',
42
+ },
43
+ };
44
+ const tokenProvider = () => __awaiter(this, void 0, void 0, function* () {
45
+ this.logger.log('开始获取GitHub访问令牌...');
46
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
47
+ const token = `ghp_${Math.random().toString(36).substring(2, 15)}${Date.now()}`;
48
+ this.logger.log(`成功获取令牌: ${token.substring(0, 20)}...`);
49
+ return token;
50
+ });
51
+ try {
52
+ const response = yield this.httpClient.authRequest(requestConfig, tokenProvider, {
53
+ lockKey: 'github-token-refresh',
54
+ lockTimeout: 30000,
55
+ waitTimeout: 60000,
56
+ enableRetry: true,
57
+ });
58
+ this.logger.log('认证请求成功完成');
59
+ return response;
60
+ }
61
+ catch (error) {
62
+ this.logger.error('认证请求失败', error);
63
+ throw error;
64
+ }
65
+ });
66
+ }
67
+ batchAuthWithLock() {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ this.logger.log('=== 示例2: 批量带等待锁的认证请求 ===');
70
+ const requests = [
71
+ {
72
+ config: {
73
+ method: 'GET',
74
+ url: 'https://api.github.com/user/repos',
75
+ },
76
+ key: 'user-repos',
77
+ },
78
+ {
79
+ config: {
80
+ method: 'GET',
81
+ url: 'https://api.github.com/user/starred',
82
+ },
83
+ key: 'user-starred',
84
+ },
85
+ {
86
+ config: {
87
+ method: 'GET',
88
+ url: 'https://api.github.com/user/followers',
89
+ },
90
+ key: 'user-followers',
91
+ },
92
+ ];
93
+ const tokenProvider = () => __awaiter(this, void 0, void 0, function* () {
94
+ this.logger.log('开始获取批量操作的GitHub访问令牌...');
95
+ yield new Promise((resolve) => setTimeout(resolve, 1500));
96
+ const token = `ghp_batch_${Math.random().toString(36).substring(2, 15)}${Date.now()}`;
97
+ this.logger.log(`成功获取批量令牌: ${token.substring(0, 20)}...`);
98
+ return token;
99
+ });
100
+ try {
101
+ const startTime = Date.now();
102
+ const results = yield this.httpClient.authBatchRequest(requests, tokenProvider, {
103
+ lockKey: 'github-batch-token-refresh',
104
+ lockTimeout: 60000,
105
+ waitTimeout: 120000,
106
+ maxConcurrency: 3,
107
+ });
108
+ const endTime = Date.now();
109
+ const duration = endTime - startTime;
110
+ const successful = results.filter((r) => r !== null).length;
111
+ this.logger.log(`
112
+ 批量认证请求完成:
113
+ ┌─────────────────┬──────────┐
114
+ │ 总请求数 │ ${requests.length.toString().padStart(8)} │
115
+ │ 成功请求 │ ${successful.toString().padStart(8)} │
116
+ │ 总耗时 │ ${duration.toString().padStart(8)}ms │
117
+ │ 平均耗时 │ ${(duration / requests.length).toFixed(1).padStart(7)}ms │
118
+ └─────────────────┴──────────┘
119
+ `);
120
+ return results.filter((r) => r !== null);
121
+ }
122
+ catch (error) {
123
+ this.logger.error('批量认证请求失败', error);
124
+ throw error;
125
+ }
126
+ });
127
+ }
128
+ generateCurlFromLogs() {
129
+ return __awaiter(this, void 0, void 0, function* () {
130
+ this.logger.log('=== 示例3: 从HTTP日志生成curl命令 ===');
131
+ try {
132
+ const recentLogs = yield this.logQueryService.findLogs({
133
+ limit: 5,
134
+ sortBy: 'createdAt',
135
+ sortOrder: 'DESC',
136
+ });
137
+ if (recentLogs.logs.length === 0) {
138
+ this.logger.log('没有找到最近的HTTP日志');
139
+ return;
140
+ }
141
+ this.logger.log(`找到 ${recentLogs.logs.length} 条最近的HTTP日志`);
142
+ for (const log of recentLogs.logs) {
143
+ const curlCommand = yield this.logQueryService.generateCurlFromLog(log.id);
144
+ if (curlCommand) {
145
+ this.logger.log(`
146
+ 日志 ${log.id.substring(0, 8)}... 的curl命令:
147
+ ${curlCommand}
148
+ `);
149
+ }
150
+ }
151
+ const batchCurlCommands = yield this.logQueryService.generateBatchCurlCommands({
152
+ limit: 3,
153
+ method: 'GET',
154
+ });
155
+ this.logger.log(`\n批量生成了 ${batchCurlCommands.length} 个curl命令`);
156
+ }
157
+ catch (error) {
158
+ this.logger.error('生成curl命令失败', error);
159
+ }
160
+ });
161
+ }
162
+ demonstrateRequestReplay() {
163
+ return __awaiter(this, void 0, void 0, function* () {
164
+ var _a, _b, _c;
165
+ this.logger.log('=== 示例4: 请求重放功能 ===');
166
+ try {
167
+ const successfulLogs = yield this.logQueryService.findLogs({
168
+ limit: 1,
169
+ success: true,
170
+ method: 'GET',
171
+ sortBy: 'createdAt',
172
+ sortOrder: 'DESC',
173
+ });
174
+ if (successfulLogs.logs.length === 0) {
175
+ this.logger.log('没有找到可重放的请求日志');
176
+ return;
177
+ }
178
+ const logToReplay = successfulLogs.logs[0];
179
+ this.logger.log(`准备重放请求: ${logToReplay.method} ${logToReplay.url}`);
180
+ const replayResult = yield this.replayService.replayByLogId(logToReplay.id, {
181
+ overrideHeaders: false,
182
+ additionalHeaders: {
183
+ 'X-Replay-By': 'http-client-example',
184
+ 'X-Replay-Timestamp': new Date().toISOString(),
185
+ },
186
+ logReplay: true,
187
+ timeout: 30000,
188
+ });
189
+ this.logger.log(`
190
+ 重放结果:
191
+ ┌─────────────────┬──────────┐
192
+ │ 重放ID │ ${replayResult.replayId.substring(0, 20).padStart(8)}... │
193
+ │ 原始状态码 │ ${((_a = logToReplay.statusCode) === null || _a === void 0 ? void 0 : _a.toString().padStart(8)) || 'N/A'} │
194
+ │ 重放状态码 │ ${((_c = (_b = replayResult.response) === null || _b === void 0 ? void 0 : _b.status) === null || _c === void 0 ? void 0 : _c.toString().padStart(8)) || 'N/A'} │
195
+ │ 原始响应时间 │ ${logToReplay.responseTime.toString().padStart(8)}ms │
196
+ │ 重放响应时间 │ ${replayResult.responseTime.toString().padStart(8)}ms │
197
+ │ 重放成功 │ ${replayResult.success ? 'YES'.padStart(8) : 'NO'.padStart(8)} │
198
+ └─────────────────┴──────────┘
199
+ `);
200
+ if (!replayResult.success) {
201
+ this.logger.error(`重放失败: ${replayResult.error}`);
202
+ }
203
+ }
204
+ catch (error) {
205
+ this.logger.error('请求重放失败', error);
206
+ }
207
+ });
208
+ }
209
+ batchReplayAndCompare() {
210
+ return __awaiter(this, void 0, void 0, function* () {
211
+ var _a, _b, _c;
212
+ this.logger.log('=== 示例5: 批量重放和比较 ===');
213
+ try {
214
+ const batchReplayResult = yield this.replayService.batchReplayByQuery({
215
+ method: 'GET',
216
+ limit: 3,
217
+ success: true,
218
+ sortBy: 'createdAt',
219
+ sortOrder: 'DESC',
220
+ }, {
221
+ additionalHeaders: {
222
+ 'X-Batch-Replay': 'true',
223
+ },
224
+ logReplay: true,
225
+ }, 2);
226
+ this.logger.log(`
227
+ 批量重放统计:
228
+ ┌─────────────────┬──────────┐
229
+ │ 总请求数 │ ${batchReplayResult.totalRequests.toString().padStart(8)} │
230
+ │ 成功请求 │ ${batchReplayResult.successfulRequests.toString().padStart(8)} │
231
+ │ 失败请求 │ ${batchReplayResult.failedRequests.toString().padStart(8)} │
232
+ │ 成功率 │ ${batchReplayResult.successRate.toFixed(1).toString().padStart(7)}% │
233
+ │ 总耗时 │ ${batchReplayResult.totalResponseTime.toString().padStart(8)}ms │
234
+ │ 平均响应时间 │ ${batchReplayResult.averageResponseTime.toFixed(1).toString().padStart(7)}ms │
235
+ └─────────────────┴──────────┘
236
+ `);
237
+ for (let i = 0; i < Math.min(batchReplayResult.results.length, 3); i++) {
238
+ const result = batchReplayResult.results[i];
239
+ if (result.originalLog.id) {
240
+ try {
241
+ const comparison = yield this.replayService.replayAndCompare(result.originalLog.id, { logReplay: false });
242
+ this.logger.log(`
243
+ 重放比较 ${i + 1}:
244
+ ┌─────────────────┬──────────┐
245
+ │ 原始状态码 │ ${((_a = comparison.original.statusCode) === null || _a === void 0 ? void 0 : _a.toString().padStart(8)) || 'N/A'} │
246
+ │ 重放状态码 │ ${((_c = (_b = comparison.replay.response) === null || _b === void 0 ? void 0 : _b.status) === null || _c === void 0 ? void 0 : _c.toString().padStart(8)) || 'N/A'} │
247
+ │ 状态匹配 │ ${comparison.comparison.statusMatch ? 'YES'.padStart(8) : 'NO'.padStart(8)} │
248
+ │ 响应时间差异 │ ${comparison.comparison.responseTimeDifference.toString().padStart(8)}ms │
249
+ │ 头部匹配 │ ${comparison.comparison.headersMatch ? 'YES'.padStart(8) : 'NO'.padStart(8)} │
250
+ │ 内容匹配 │ ${comparison.comparison.bodyMatch ? 'YES'.padStart(8) : 'NO'.padStart(8)} │
251
+ └─────────────────┴──────────┘
252
+ `);
253
+ }
254
+ catch (error) {
255
+ this.logger.warn(`无法比较重放结果 ${i + 1}: ${error.message}`);
256
+ }
257
+ }
258
+ }
259
+ }
260
+ catch (error) {
261
+ this.logger.error('批量重放和比较失败', error);
262
+ }
263
+ });
264
+ }
265
+ comprehensiveDemo() {
266
+ return __awaiter(this, void 0, void 0, function* () {
267
+ this.logger.log('=== 示例6: 综合演示 ===');
268
+ try {
269
+ this.logger.log('步骤1: 执行带等待锁的认证请求');
270
+ const authResponse = yield this.basicAuthWithLock();
271
+ this.logger.log('\n步骤2: 查询请求日志');
272
+ const recentLogs = yield this.logQueryService.findLogs({
273
+ limit: 1,
274
+ sortBy: 'createdAt',
275
+ sortOrder: 'DESC',
276
+ });
277
+ if (recentLogs.logs.length > 0) {
278
+ const log = recentLogs.logs[0];
279
+ this.logger.log('\n步骤3: 生成curl命令');
280
+ const curlCommand = yield this.logQueryService.generateCurlFromLog(log.id);
281
+ if (curlCommand) {
282
+ this.logger.log('生成的curl命令:');
283
+ this.logger.log(curlCommand);
284
+ }
285
+ this.logger.log('\n步骤4: 重放请求');
286
+ const replayResult = yield this.replayService.replayByLogId(log.id, {
287
+ additionalHeaders: {
288
+ 'X-Demo-Step': 'replay',
289
+ },
290
+ });
291
+ this.logger.log(`
292
+ 综合演示结果:
293
+ ┌─────────────────┬──────────┐
294
+ │ 原始请求成功 │ ${log.success ? 'YES'.padStart(8) : 'NO'.padStart(8)} │
295
+ │ 重放请求成功 │ ${replayResult.success ? 'YES'.padStart(8) : 'NO'.padStart(8)} │
296
+ │ 原始响应时间 │ ${log.responseTime.toString().padStart(8)}ms │
297
+ │ 重放响应时间 │ ${replayResult.responseTime.toString().padStart(8)}ms │
298
+ └─────────────────┴──────────┘
299
+ `);
300
+ }
301
+ }
302
+ catch (error) {
303
+ this.logger.error('综合演示失败', error);
304
+ }
305
+ });
306
+ }
307
+ runAllExamples() {
308
+ return __awaiter(this, void 0, void 0, function* () {
309
+ this.logger.log('开始运行HTTP客户端等待锁和请求重放示例...\n');
310
+ try {
311
+ yield this.basicAuthWithLock();
312
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
313
+ yield this.batchAuthWithLock();
314
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
315
+ yield this.generateCurlFromLogs();
316
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
317
+ yield this.demonstrateRequestReplay();
318
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
319
+ yield this.batchReplayAndCompare();
320
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
321
+ yield this.comprehensiveDemo();
322
+ this.logger.log('\n所有示例运行完成!');
323
+ }
324
+ catch (error) {
325
+ this.logger.error('示例运行过程中出现错误', error);
326
+ }
327
+ });
328
+ }
329
+ };
330
+ exports.AuthWithWaitingLockExample = AuthWithWaitingLockExample;
331
+ exports.AuthWithWaitingLockExample = AuthWithWaitingLockExample = AuthWithWaitingLockExample_1 = __decorate([
332
+ (0, common_1.Injectable)(),
333
+ __metadata("design:paramtypes", [http_client_service_1.HttpClientService,
334
+ http_log_query_service_1.HttpLogQueryService,
335
+ http_replay_service_1.HttpReplayService])
336
+ ], AuthWithWaitingLockExample);
@@ -33,14 +33,7 @@ export declare class BasicHttpExample {
33
33
  logs: import("../entities").HttpLogEntity[];
34
34
  total: number;
35
35
  }>;
36
- findLogsByServiceClass(serviceClass: string, limit?: number): Promise<{
37
- logs: import("../entities").HttpLogEntity[];
38
- total: number;
39
- page: number;
40
- limit: number;
41
- totalPages: number;
42
- }>;
43
- findLogsByMethodName(methodName: string, limit?: number): Promise<{
36
+ findLogsByServiceName(serviceName: string, limit?: number): Promise<{
44
37
  logs: import("../entities").HttpLogEntity[];
45
38
  total: number;
46
39
  page: number;
@@ -56,6 +49,5 @@ export declare class BasicHttpExample {
56
49
  }>;
57
50
  getHttpStats(startDate?: Date, endDate?: Date): Promise<import("../entities").HttpLogStats>;
58
51
  findLogByRequestId(requestId: string): Promise<import("../entities").HttpLogEntity>;
59
- findLogsByCorrelationId(correlationId: string): Promise<any>;
60
52
  cleanupOldLogs(daysToKeep?: number): Promise<number>;
61
53
  }
@@ -64,7 +64,7 @@ let BasicHttpExample = class BasicHttpExample {
64
64
  uploadFile(file, filename) {
65
65
  return __awaiter(this, void 0, void 0, function* () {
66
66
  const formData = new FormData();
67
- formData.append('file', new Blob([file]), filename);
67
+ formData.append('file', new Blob([new Uint8Array(file)], { type: 'application/octet-stream' }), filename);
68
68
  return this.httpClient.post('/upload', formData, {
69
69
  headers: {
70
70
  'Content-Type': 'multipart/form-data',
@@ -127,14 +127,9 @@ let BasicHttpExample = class BasicHttpExample {
127
127
  return this.logQueryService.findRetryLogs({ minRetries });
128
128
  });
129
129
  }
130
- findLogsByServiceClass(serviceClass_1) {
131
- return __awaiter(this, arguments, void 0, function* (serviceClass, limit = 20) {
132
- return this.logQueryService.findLogs({ serviceClass, limit });
133
- });
134
- }
135
- findLogsByMethodName(methodName_1) {
136
- return __awaiter(this, arguments, void 0, function* (methodName, limit = 20) {
137
- return this.logQueryService.findLogs({ methodName, limit });
130
+ findLogsByServiceName(serviceName_1) {
131
+ return __awaiter(this, arguments, void 0, function* (serviceName, limit = 20) {
132
+ return this.logQueryService.findLogs({ serviceName, limit });
138
133
  });
139
134
  }
140
135
  findLogsByOperationName(operationName_1) {
@@ -152,11 +147,6 @@ let BasicHttpExample = class BasicHttpExample {
152
147
  return this.logQueryService.findLogByRequestId(requestId);
153
148
  });
154
149
  }
155
- findLogsByCorrelationId(correlationId) {
156
- return __awaiter(this, void 0, void 0, function* () {
157
- return this.logQueryService.findLogsByCorrelationId(correlationId);
158
- });
159
- }
160
150
  cleanupOldLogs() {
161
151
  return __awaiter(this, arguments, void 0, function* (daysToKeep = 30) {
162
152
  return this.logQueryService.deleteOldLogs(daysToKeep);
@@ -283,13 +283,13 @@ let ExampleController = class ExampleController {
283
283
  }
284
284
  getGitHubUser(username) {
285
285
  return __awaiter(this, void 0, void 0, function* () {
286
- const github = this.githubApi.github();
286
+ const github = this.githubApi.github;
287
287
  return github.get(`/users/${username}`);
288
288
  });
289
289
  }
290
290
  createStripePayment(amount, currency) {
291
291
  return __awaiter(this, void 0, void 0, function* () {
292
- const stripe = this.stripeApi.stripe();
292
+ const stripe = this.stripeApi.stripe;
293
293
  return stripe.post('/charges', {
294
294
  amount,
295
295
  currency,
@@ -299,7 +299,7 @@ let ExampleController = class ExampleController {
299
299
  }
300
300
  sendWeChatMessage(openid, content) {
301
301
  return __awaiter(this, void 0, void 0, function* () {
302
- const wechat = this.wechatApi.wechat();
302
+ const wechat = this.wechatApi.wechat;
303
303
  return wechat.post('/cgi-bin/message/custom/send', {
304
304
  touser: openid,
305
305
  msgtype: 'text',
@@ -311,7 +311,7 @@ let ExampleController = class ExampleController {
311
311
  }
312
312
  getCustomData(id) {
313
313
  return __awaiter(this, void 0, void 0, function* () {
314
- const custom = this.customApi.customApi();
314
+ const custom = this.customApi.customApi;
315
315
  return custom.get(`/data/${id}`);
316
316
  });
317
317
  }
@@ -31,6 +31,7 @@ const log_cleanup_service_1 = require("./services/log-cleanup.service");
31
31
  const api_client_registry_service_1 = require("./services/api-client-registry.service");
32
32
  const entities_1 = require("./entities");
33
33
  const cache_options_interface_1 = require("../cache/interfaces/cache-options.interface");
34
+ const redis_lock_service_1 = require("../redis-lock/redis-lock.service");
34
35
  let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
35
36
  static forRoot(config = {}) {
36
37
  var _a, _b, _c;
@@ -51,13 +52,14 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
51
52
  api_client_registry_service_1.ApiClientRegistryService,
52
53
  {
53
54
  provide: http_client_service_1.HttpClientService,
54
- useFactory: (circuitBreakerService, loggingService, cacheService, httpConfig) => {
55
- return new http_client_service_1.HttpClientService(circuitBreakerService, loggingService, cacheService, httpConfig);
55
+ useFactory: (circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig) => {
56
+ return new http_client_service_1.HttpClientService(circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig);
56
57
  },
57
58
  inject: [
58
59
  circuit_breaker_service_1.HttpCircuitBreakerService,
59
60
  logging_service_1.HttpLoggingService,
60
61
  cache_service_2.HttpCacheService,
62
+ redis_lock_service_1.RedisLockService,
61
63
  'HTTP_CLIENT_CONFIG',
62
64
  ],
63
65
  },
@@ -104,13 +106,14 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
104
106
  api_client_registry_service_1.ApiClientRegistryService,
105
107
  {
106
108
  provide: http_client_service_1.HttpClientService,
107
- useFactory: (circuitBreakerService, loggingService, cacheService, httpConfig) => {
108
- return new http_client_service_1.HttpClientService(circuitBreakerService, loggingService, cacheService, httpConfig);
109
+ useFactory: (circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig) => {
110
+ return new http_client_service_1.HttpClientService(circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig);
109
111
  },
110
112
  inject: [
111
113
  circuit_breaker_service_1.HttpCircuitBreakerService,
112
114
  logging_service_1.HttpLoggingService,
113
115
  cache_service_2.HttpCacheService,
116
+ redis_lock_service_1.RedisLockService,
114
117
  'HTTP_CLIENT_CONFIG',
115
118
  ],
116
119
  },
@@ -1,8 +1,9 @@
1
- import { ApiClientConfig, ApiClientInstanceConfig, ApiClientRegistryConfig } from '../interfaces/api-client-config.interface';
1
+ import { ApiClientConfig, ApiClientInstanceConfig, ApiClientRegistryConfig, AuthType, OAuth2Config, ResponseTransformerConfig } from '../interfaces/api-client-config.interface';
2
2
  import { HttpClientService } from './http-client.service';
3
3
  import { HttpCircuitBreakerService } from './circuit-breaker.service';
4
4
  import { HttpLoggingService } from './logging.service';
5
5
  import { HttpCacheService } from './cache.service';
6
+ export { ApiClientInstanceConfig, AuthType, OAuth2Config, ResponseTransformerConfig, };
6
7
  export declare class ApiClientRegistryService {
7
8
  private readonly httpClientService;
8
9
  private readonly circuitBreakerService;
@@ -19,11 +19,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
19
19
  };
20
20
  var ApiClientRegistryService_1;
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.ApiClientRegistryService = void 0;
22
+ exports.ApiClientRegistryService = exports.AuthType = void 0;
23
23
  const common_1 = require("@nestjs/common");
24
24
  const axios_1 = require("axios");
25
25
  const axios_retry_1 = require("axios-retry");
26
26
  const api_client_config_interface_1 = require("../interfaces/api-client-config.interface");
27
+ Object.defineProperty(exports, "AuthType", { enumerable: true, get: function () { return api_client_config_interface_1.AuthType; } });
27
28
  const http_client_service_1 = require("./http-client.service");
28
29
  const circuit_breaker_service_1 = require("./circuit-breaker.service");
29
30
  const logging_service_1 = require("./logging.service");
@@ -3,6 +3,7 @@ import { HttpClientConfig } from '../interfaces/http-client-config.interface';
3
3
  import { HttpCircuitBreakerService } from './circuit-breaker.service';
4
4
  import { HttpLoggingService } from './logging.service';
5
5
  import { HttpCacheService } from './cache.service';
6
+ import { RedisLockService } from '../../redis-lock/redis-lock.service';
6
7
  interface ExtendedAxiosRequestConfig extends AxiosRequestConfig {
7
8
  metadata?: {
8
9
  requestId?: string;
@@ -14,11 +15,12 @@ export declare class HttpClientService {
14
15
  private readonly circuitBreakerService;
15
16
  private readonly loggingService;
16
17
  private readonly cacheService;
18
+ private readonly redisLockService?;
17
19
  private readonly logger;
18
20
  private readonly axiosInstance;
19
21
  private readonly defaultConfig;
20
22
  private requestStats;
21
- constructor(circuitBreakerService: HttpCircuitBreakerService, loggingService: HttpLoggingService, cacheService: HttpCacheService, config?: HttpClientConfig);
23
+ constructor(circuitBreakerService: HttpCircuitBreakerService, loggingService: HttpLoggingService, cacheService: HttpCacheService, redisLockService?: RedisLockService, config?: HttpClientConfig);
22
24
  request<T = any>(config: ExtendedAxiosRequestConfig, decoratorContext?: any): Promise<T>;
23
25
  generateCurlCommand(config: ExtendedAxiosRequestConfig): string;
24
26
  generateDebugCurlCommand(config: ExtendedAxiosRequestConfig, response?: AxiosResponse): string;
@@ -29,6 +31,21 @@ export declare class HttpClientService {
29
31
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
30
32
  patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
31
33
  delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
34
+ authRequest<T = any>(config: AxiosRequestConfig, tokenProvider: () => Promise<string>, options?: {
35
+ lockKey?: string;
36
+ lockTimeout?: number;
37
+ waitTimeout?: number;
38
+ enableRetry?: boolean;
39
+ }): Promise<T>;
40
+ authBatchRequest<T = any>(requests: Array<{
41
+ config: AxiosRequestConfig;
42
+ key: string;
43
+ }>, tokenProvider: () => Promise<string>, options?: {
44
+ lockKey?: string;
45
+ lockTimeout?: number;
46
+ waitTimeout?: number;
47
+ maxConcurrency?: number;
48
+ }): Promise<Array<T | null>>;
32
49
  private createAxiosInstance;
33
50
  private executeWithFeatures;
34
51
  private calculateRetryDelay;