@nest-omni/core 4.1.3-12 → 4.1.3-14
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.
- package/cache/dependencies/db.dependency.d.ts +55 -6
- package/cache/dependencies/db.dependency.js +64 -13
- package/common/boilerplate.polyfill.js +1 -1
- package/file-upload/decorators/column.decorator.d.ts +151 -0
- package/file-upload/decorators/column.decorator.js +273 -0
- package/file-upload/decorators/csv-data.decorator.d.ts +17 -31
- package/file-upload/decorators/csv-data.decorator.js +45 -91
- package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
- package/file-upload/decorators/csv-import.decorator.js +24 -0
- package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
- package/file-upload/decorators/examples/column-mapping.example.js +122 -0
- package/file-upload/decorators/excel-data.decorator.d.ts +15 -29
- package/file-upload/decorators/excel-data.decorator.js +42 -82
- package/file-upload/decorators/index.d.ts +3 -2
- package/file-upload/decorators/index.js +20 -2
- package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
- package/file-upload/decorators/validate-data.decorator.js +39 -0
- package/file-upload/dto/update-file.dto.d.ts +0 -1
- package/file-upload/dto/update-file.dto.js +0 -4
- package/file-upload/entities/file-metadata.entity.d.ts +6 -3
- package/file-upload/entities/file-metadata.entity.js +2 -10
- package/file-upload/entities/file.entity.d.ts +3 -18
- package/file-upload/entities/file.entity.js +0 -34
- package/file-upload/file-upload.module.d.ts +1 -1
- package/file-upload/file-upload.module.js +44 -16
- package/file-upload/index.d.ts +13 -2
- package/file-upload/index.js +21 -3
- package/file-upload/interceptors/file-upload.interceptor.d.ts +61 -8
- package/file-upload/interceptors/file-upload.interceptor.js +417 -257
- package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
- package/file-upload/interfaces/file-processor.interface.js +2 -0
- package/file-upload/interfaces/file-upload-options.interface.d.ts +3 -46
- package/file-upload/interfaces/file-upload-options.interface.js +3 -0
- package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
- package/file-upload/interfaces/processor-options.interface.js +2 -0
- package/file-upload/processors/csv.processor.d.ts +98 -0
- package/file-upload/processors/csv.processor.js +391 -0
- package/file-upload/processors/excel.processor.d.ts +130 -0
- package/file-upload/processors/excel.processor.js +547 -0
- package/file-upload/processors/image.processor.d.ts +199 -0
- package/file-upload/processors/image.processor.js +377 -0
- package/file-upload/services/file.service.d.ts +3 -0
- package/file-upload/services/file.service.js +39 -10
- package/file-upload/services/malicious-file-detector.service.d.ts +29 -3
- package/file-upload/services/malicious-file-detector.service.js +256 -57
- package/file-upload/utils/dynamic-import.util.d.ts +6 -2
- package/file-upload/utils/dynamic-import.util.js +17 -5
- package/http-client/decorators/http-client.decorators.d.ts +4 -2
- package/http-client/decorators/http-client.decorators.js +2 -1
- package/http-client/entities/http-log.entity.js +1 -9
- package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
- package/http-client/examples/proxy-from-environment.example.js +410 -0
- package/http-client/http-client.module.js +65 -6
- package/http-client/interfaces/http-client-config.interface.d.ts +6 -0
- package/http-client/services/http-client.service.d.ts +8 -0
- package/http-client/services/http-client.service.js +61 -17
- package/http-client/services/logging.service.d.ts +1 -1
- package/http-client/services/logging.service.js +74 -58
- package/http-client/utils/index.d.ts +1 -0
- package/http-client/utils/index.js +1 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +148 -0
- package/package.json +9 -5
- package/shared/service-registry.module.js +18 -0
- package/transaction/data-source.util.d.ts +142 -0
- package/transaction/data-source.util.js +330 -0
- package/transaction/index.d.ts +1 -0
- package/transaction/index.js +12 -1
- package/validators/is-exists.validator.d.ts +19 -2
- package/validators/is-exists.validator.js +27 -2
- package/validators/is-unique.validator.d.ts +12 -1
- package/validators/is-unique.validator.js +26 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProxyFromEnvironment 使用示例
|
|
3
|
+
*
|
|
4
|
+
* 本文件演示如何在 HTTP Client 中使用代理环境变量支持
|
|
5
|
+
*/
|
|
6
|
+
import { HttpClientService } from '@nest-omni/core';
|
|
7
|
+
/**
|
|
8
|
+
* 示例 1: 使用环境变量配置代理 (推荐方式)
|
|
9
|
+
*
|
|
10
|
+
* 设置环境变量:
|
|
11
|
+
* export HTTP_PROXY=http://proxy.example.com:8080
|
|
12
|
+
* export HTTPS_PROXY=https://secure-proxy.example.com:8443
|
|
13
|
+
* export NO_PROXY=localhost,127.0.0.1,.internal.com
|
|
14
|
+
*/
|
|
15
|
+
export declare class ProxyFromEnvironmentExample {
|
|
16
|
+
private readonly httpClient;
|
|
17
|
+
constructor(httpClient: HttpClientService);
|
|
18
|
+
/**
|
|
19
|
+
* 使用装饰器从环境变量读取代理配置
|
|
20
|
+
*/
|
|
21
|
+
fetchWithProxyFromEnv(): Promise<any>;
|
|
22
|
+
/**
|
|
23
|
+
* 直接配置请求时指定从环境变量读取代理
|
|
24
|
+
*/
|
|
25
|
+
fetchWithConfiguredProxy(): Promise<any>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 示例 2: 带认证的代理环境变量
|
|
29
|
+
*
|
|
30
|
+
* 设置环境变量:
|
|
31
|
+
* export HTTP_PROXY=http://username:password@proxy.example.com:8080
|
|
32
|
+
*/
|
|
33
|
+
export declare class ProxyWithAuthExample {
|
|
34
|
+
private readonly httpClient;
|
|
35
|
+
constructor(httpClient: HttpClientService);
|
|
36
|
+
fetchWithAuthenticatedProxy(): Promise<any>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 示例 3: NO_PROXY 使用示例
|
|
40
|
+
*
|
|
41
|
+
* 设置环境变量:
|
|
42
|
+
* export HTTP_PROXY=http://proxy.example.com:8080
|
|
43
|
+
* export NO_PROXY=localhost,127.0.0.1,.internal.com,.local
|
|
44
|
+
*/
|
|
45
|
+
export declare class NoProxyExample {
|
|
46
|
+
private readonly httpClient;
|
|
47
|
+
constructor(httpClient: HttpClientService);
|
|
48
|
+
fetchExternalApi(): Promise<any>;
|
|
49
|
+
fetchInternalApi(): Promise<any>;
|
|
50
|
+
fetchLocalhost(): Promise<any>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 示例 4: 混合使用 - 部分请求使用代理,部分不使用
|
|
54
|
+
*/
|
|
55
|
+
export declare class MixedProxyExample {
|
|
56
|
+
private readonly httpClient;
|
|
57
|
+
constructor(httpClient: HttpClientService);
|
|
58
|
+
fetchWithProxy(): Promise<any>;
|
|
59
|
+
fetchWithoutProxy(): Promise<any>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 示例 5: 企业环境中的实际使用场景
|
|
63
|
+
*
|
|
64
|
+
* 在 docker-compose.yml 或 Kubernetes 配置中设置:
|
|
65
|
+
* environment:
|
|
66
|
+
* - HTTP_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
|
|
67
|
+
* - HTTPS_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
|
|
68
|
+
* - NO_PROXY=localhost,127.0.0.1,.company.com,.svc.cluster.local
|
|
69
|
+
*/
|
|
70
|
+
export declare class EnterpriseProxyExample {
|
|
71
|
+
private readonly httpClient;
|
|
72
|
+
constructor(httpClient: HttpClientService);
|
|
73
|
+
/**
|
|
74
|
+
* 访问外部 API(使用企业代理)
|
|
75
|
+
*/
|
|
76
|
+
fetchFromExternalApi(): Promise<any>;
|
|
77
|
+
/**
|
|
78
|
+
* 访问内部服务(不使用代理)
|
|
79
|
+
*/
|
|
80
|
+
fetchFromInternalService(): Promise<any>;
|
|
81
|
+
/**
|
|
82
|
+
* 访问 Kubernetes 集群内服务(不使用代理)
|
|
83
|
+
*/
|
|
84
|
+
fetchFromK8sService(): Promise<any>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 示例 6: 开发环境调试代理
|
|
88
|
+
*
|
|
89
|
+
* 本地开发时使用 Charles、Fiddler 等代理工具调试:
|
|
90
|
+
* export HTTP_PROXY=http://localhost:8888
|
|
91
|
+
* export HTTPS_PROXY=http://localhost:8888
|
|
92
|
+
*/
|
|
93
|
+
export declare class DevelopmentProxyExample {
|
|
94
|
+
private readonly httpClient;
|
|
95
|
+
constructor(httpClient: HttpClientService);
|
|
96
|
+
debugRequest(): Promise<any>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 示例 7: 程序化检查代理配置
|
|
100
|
+
*/
|
|
101
|
+
export declare class ProxyUtilityExample {
|
|
102
|
+
checkProxyConfiguration(): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 模块配置示例
|
|
106
|
+
*/
|
|
107
|
+
export declare const httpClientModuleConfig: {
|
|
108
|
+
globalProxyFromEnv: {
|
|
109
|
+
imports: {
|
|
110
|
+
proxy: {
|
|
111
|
+
enabled: boolean;
|
|
112
|
+
fromEnvironment: boolean;
|
|
113
|
+
};
|
|
114
|
+
}[];
|
|
115
|
+
};
|
|
116
|
+
selectiveProxy: {
|
|
117
|
+
imports: {
|
|
118
|
+
proxy: {
|
|
119
|
+
enabled: boolean;
|
|
120
|
+
};
|
|
121
|
+
}[];
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* 环境变量配置示例
|
|
126
|
+
*/
|
|
127
|
+
export declare const environmentVariablesExamples: {
|
|
128
|
+
basic: string;
|
|
129
|
+
withAuth: string;
|
|
130
|
+
specialChars: string;
|
|
131
|
+
enterprise: string;
|
|
132
|
+
development: string;
|
|
133
|
+
};
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ProxyFromEnvironment 使用示例
|
|
4
|
+
*
|
|
5
|
+
* 本文件演示如何在 HTTP Client 中使用代理环境变量支持
|
|
6
|
+
*/
|
|
7
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
8
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
10
|
+
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;
|
|
11
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
12
|
+
};
|
|
13
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
var _a, _b, _c, _d, _e, _f;
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.environmentVariablesExamples = exports.httpClientModuleConfig = exports.ProxyUtilityExample = exports.DevelopmentProxyExample = exports.EnterpriseProxyExample = exports.MixedProxyExample = exports.NoProxyExample = exports.ProxyWithAuthExample = exports.ProxyFromEnvironmentExample = void 0;
|
|
28
|
+
const common_1 = require("@nestjs/common");
|
|
29
|
+
const core_1 = require("@nest-omni/core");
|
|
30
|
+
/**
|
|
31
|
+
* 示例 1: 使用环境变量配置代理 (推荐方式)
|
|
32
|
+
*
|
|
33
|
+
* 设置环境变量:
|
|
34
|
+
* export HTTP_PROXY=http://proxy.example.com:8080
|
|
35
|
+
* export HTTPS_PROXY=https://secure-proxy.example.com:8443
|
|
36
|
+
* export NO_PROXY=localhost,127.0.0.1,.internal.com
|
|
37
|
+
*/
|
|
38
|
+
let ProxyFromEnvironmentExample = class ProxyFromEnvironmentExample {
|
|
39
|
+
constructor(httpClient) {
|
|
40
|
+
this.httpClient = httpClient;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 使用装饰器从环境变量读取代理配置
|
|
44
|
+
*/
|
|
45
|
+
fetchWithProxyFromEnv() {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
// 此请求将根据环境变量使用代理
|
|
48
|
+
// - HTTP 请求使用 HTTP_PROXY
|
|
49
|
+
// - HTTPS 请求使用 HTTPS_PROXY(如果未设置则使用 HTTP_PROXY)
|
|
50
|
+
// - 匹配 NO_PROXY 的域名不使用代理
|
|
51
|
+
return this.httpClient.get('https://api.example.com/data');
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 直接配置请求时指定从环境变量读取代理
|
|
56
|
+
*/
|
|
57
|
+
fetchWithConfiguredProxy() {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
return this.httpClient.request({
|
|
60
|
+
url: 'https://api.example.com/data',
|
|
61
|
+
method: 'GET',
|
|
62
|
+
// 代理配置会在模块级别或请求级别应用
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
exports.ProxyFromEnvironmentExample = ProxyFromEnvironmentExample;
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, core_1.HttpUseProxy)({
|
|
70
|
+
enabled: true,
|
|
71
|
+
fromEnvironment: true,
|
|
72
|
+
}),
|
|
73
|
+
__metadata("design:type", Function),
|
|
74
|
+
__metadata("design:paramtypes", []),
|
|
75
|
+
__metadata("design:returntype", Promise)
|
|
76
|
+
], ProxyFromEnvironmentExample.prototype, "fetchWithProxyFromEnv", null);
|
|
77
|
+
exports.ProxyFromEnvironmentExample = ProxyFromEnvironmentExample = __decorate([
|
|
78
|
+
(0, common_1.Injectable)(),
|
|
79
|
+
__metadata("design:paramtypes", [typeof (_a = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _a : Object])
|
|
80
|
+
], ProxyFromEnvironmentExample);
|
|
81
|
+
/**
|
|
82
|
+
* 示例 2: 带认证的代理环境变量
|
|
83
|
+
*
|
|
84
|
+
* 设置环境变量:
|
|
85
|
+
* export HTTP_PROXY=http://username:password@proxy.example.com:8080
|
|
86
|
+
*/
|
|
87
|
+
let ProxyWithAuthExample = class ProxyWithAuthExample {
|
|
88
|
+
constructor(httpClient) {
|
|
89
|
+
this.httpClient = httpClient;
|
|
90
|
+
}
|
|
91
|
+
fetchWithAuthenticatedProxy() {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
// 自动从环境变量解析认证信息
|
|
94
|
+
return this.httpClient.get('https://api.example.com/data');
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
exports.ProxyWithAuthExample = ProxyWithAuthExample;
|
|
99
|
+
__decorate([
|
|
100
|
+
(0, core_1.HttpUseProxy)({
|
|
101
|
+
enabled: true,
|
|
102
|
+
fromEnvironment: true,
|
|
103
|
+
}),
|
|
104
|
+
__metadata("design:type", Function),
|
|
105
|
+
__metadata("design:paramtypes", []),
|
|
106
|
+
__metadata("design:returntype", Promise)
|
|
107
|
+
], ProxyWithAuthExample.prototype, "fetchWithAuthenticatedProxy", null);
|
|
108
|
+
exports.ProxyWithAuthExample = ProxyWithAuthExample = __decorate([
|
|
109
|
+
(0, common_1.Injectable)(),
|
|
110
|
+
__metadata("design:paramtypes", [typeof (_b = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _b : Object])
|
|
111
|
+
], ProxyWithAuthExample);
|
|
112
|
+
/**
|
|
113
|
+
* 示例 3: NO_PROXY 使用示例
|
|
114
|
+
*
|
|
115
|
+
* 设置环境变量:
|
|
116
|
+
* export HTTP_PROXY=http://proxy.example.com:8080
|
|
117
|
+
* export NO_PROXY=localhost,127.0.0.1,.internal.com,.local
|
|
118
|
+
*/
|
|
119
|
+
let NoProxyExample = class NoProxyExample {
|
|
120
|
+
constructor(httpClient) {
|
|
121
|
+
this.httpClient = httpClient;
|
|
122
|
+
}
|
|
123
|
+
fetchExternalApi() {
|
|
124
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
// 此请求会使用代理
|
|
126
|
+
return this.httpClient.get('https://api.external.com/data');
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
fetchInternalApi() {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
// 此请求不会使用代理(匹配 NO_PROXY 中的 .internal.com)
|
|
132
|
+
return this.httpClient.get('https://api.internal.com/data');
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
fetchLocalhost() {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
// 此请求不会使用代理(匹配 NO_PROXY 中的 localhost)
|
|
138
|
+
return this.httpClient.get('http://localhost:3000/api');
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
exports.NoProxyExample = NoProxyExample;
|
|
143
|
+
__decorate([
|
|
144
|
+
(0, core_1.HttpUseProxy)({
|
|
145
|
+
enabled: true,
|
|
146
|
+
fromEnvironment: true,
|
|
147
|
+
}),
|
|
148
|
+
__metadata("design:type", Function),
|
|
149
|
+
__metadata("design:paramtypes", []),
|
|
150
|
+
__metadata("design:returntype", Promise)
|
|
151
|
+
], NoProxyExample.prototype, "fetchExternalApi", null);
|
|
152
|
+
__decorate([
|
|
153
|
+
(0, core_1.HttpUseProxy)({
|
|
154
|
+
enabled: true,
|
|
155
|
+
fromEnvironment: true,
|
|
156
|
+
}),
|
|
157
|
+
__metadata("design:type", Function),
|
|
158
|
+
__metadata("design:paramtypes", []),
|
|
159
|
+
__metadata("design:returntype", Promise)
|
|
160
|
+
], NoProxyExample.prototype, "fetchInternalApi", null);
|
|
161
|
+
__decorate([
|
|
162
|
+
(0, core_1.HttpUseProxy)({
|
|
163
|
+
enabled: true,
|
|
164
|
+
fromEnvironment: true,
|
|
165
|
+
}),
|
|
166
|
+
__metadata("design:type", Function),
|
|
167
|
+
__metadata("design:paramtypes", []),
|
|
168
|
+
__metadata("design:returntype", Promise)
|
|
169
|
+
], NoProxyExample.prototype, "fetchLocalhost", null);
|
|
170
|
+
exports.NoProxyExample = NoProxyExample = __decorate([
|
|
171
|
+
(0, common_1.Injectable)(),
|
|
172
|
+
__metadata("design:paramtypes", [typeof (_c = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _c : Object])
|
|
173
|
+
], NoProxyExample);
|
|
174
|
+
/**
|
|
175
|
+
* 示例 4: 混合使用 - 部分请求使用代理,部分不使用
|
|
176
|
+
*/
|
|
177
|
+
let MixedProxyExample = class MixedProxyExample {
|
|
178
|
+
constructor(httpClient) {
|
|
179
|
+
this.httpClient = httpClient;
|
|
180
|
+
}
|
|
181
|
+
// 使用代理
|
|
182
|
+
fetchWithProxy() {
|
|
183
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
+
return this.httpClient.get('https://api.external.com/data');
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// 不使用代理
|
|
188
|
+
fetchWithoutProxy() {
|
|
189
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
190
|
+
return this.httpClient.get('https://api.direct.com/data');
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
exports.MixedProxyExample = MixedProxyExample;
|
|
195
|
+
__decorate([
|
|
196
|
+
(0, core_1.HttpUseProxy)({
|
|
197
|
+
enabled: true,
|
|
198
|
+
fromEnvironment: true,
|
|
199
|
+
}),
|
|
200
|
+
__metadata("design:type", Function),
|
|
201
|
+
__metadata("design:paramtypes", []),
|
|
202
|
+
__metadata("design:returntype", Promise)
|
|
203
|
+
], MixedProxyExample.prototype, "fetchWithProxy", null);
|
|
204
|
+
exports.MixedProxyExample = MixedProxyExample = __decorate([
|
|
205
|
+
(0, common_1.Injectable)(),
|
|
206
|
+
__metadata("design:paramtypes", [typeof (_d = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _d : Object])
|
|
207
|
+
], MixedProxyExample);
|
|
208
|
+
/**
|
|
209
|
+
* 示例 5: 企业环境中的实际使用场景
|
|
210
|
+
*
|
|
211
|
+
* 在 docker-compose.yml 或 Kubernetes 配置中设置:
|
|
212
|
+
* environment:
|
|
213
|
+
* - HTTP_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
|
|
214
|
+
* - HTTPS_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
|
|
215
|
+
* - NO_PROXY=localhost,127.0.0.1,.company.com,.svc.cluster.local
|
|
216
|
+
*/
|
|
217
|
+
let EnterpriseProxyExample = class EnterpriseProxyExample {
|
|
218
|
+
constructor(httpClient) {
|
|
219
|
+
this.httpClient = httpClient;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* 访问外部 API(使用企业代理)
|
|
223
|
+
*/
|
|
224
|
+
fetchFromExternalApi() {
|
|
225
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
226
|
+
// 通过企业代理访问外部 API
|
|
227
|
+
return this.httpClient.get('https://api.github.com/repos/microsoft/TypeScript');
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 访问内部服务(不使用代理)
|
|
232
|
+
*/
|
|
233
|
+
fetchFromInternalService() {
|
|
234
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
235
|
+
// 直接访问内部服务(匹配 NO_PROXY: .company.com)
|
|
236
|
+
return this.httpClient.get('https://api.company.com/internal/users');
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 访问 Kubernetes 集群内服务(不使用代理)
|
|
241
|
+
*/
|
|
242
|
+
fetchFromK8sService() {
|
|
243
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
244
|
+
// 直接访问 K8s 服务(匹配 NO_PROXY: .svc.cluster.local)
|
|
245
|
+
return this.httpClient.get('http://user-service.default.svc.cluster.local/api/users');
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
exports.EnterpriseProxyExample = EnterpriseProxyExample;
|
|
250
|
+
__decorate([
|
|
251
|
+
(0, core_1.HttpUseProxy)({
|
|
252
|
+
enabled: true,
|
|
253
|
+
fromEnvironment: true,
|
|
254
|
+
}),
|
|
255
|
+
__metadata("design:type", Function),
|
|
256
|
+
__metadata("design:paramtypes", []),
|
|
257
|
+
__metadata("design:returntype", Promise)
|
|
258
|
+
], EnterpriseProxyExample.prototype, "fetchFromExternalApi", null);
|
|
259
|
+
__decorate([
|
|
260
|
+
(0, core_1.HttpUseProxy)({
|
|
261
|
+
enabled: true,
|
|
262
|
+
fromEnvironment: true,
|
|
263
|
+
}),
|
|
264
|
+
__metadata("design:type", Function),
|
|
265
|
+
__metadata("design:paramtypes", []),
|
|
266
|
+
__metadata("design:returntype", Promise)
|
|
267
|
+
], EnterpriseProxyExample.prototype, "fetchFromInternalService", null);
|
|
268
|
+
__decorate([
|
|
269
|
+
(0, core_1.HttpUseProxy)({
|
|
270
|
+
enabled: true,
|
|
271
|
+
fromEnvironment: true,
|
|
272
|
+
}),
|
|
273
|
+
__metadata("design:type", Function),
|
|
274
|
+
__metadata("design:paramtypes", []),
|
|
275
|
+
__metadata("design:returntype", Promise)
|
|
276
|
+
], EnterpriseProxyExample.prototype, "fetchFromK8sService", null);
|
|
277
|
+
exports.EnterpriseProxyExample = EnterpriseProxyExample = __decorate([
|
|
278
|
+
(0, common_1.Injectable)(),
|
|
279
|
+
__metadata("design:paramtypes", [typeof (_e = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _e : Object])
|
|
280
|
+
], EnterpriseProxyExample);
|
|
281
|
+
/**
|
|
282
|
+
* 示例 6: 开发环境调试代理
|
|
283
|
+
*
|
|
284
|
+
* 本地开发时使用 Charles、Fiddler 等代理工具调试:
|
|
285
|
+
* export HTTP_PROXY=http://localhost:8888
|
|
286
|
+
* export HTTPS_PROXY=http://localhost:8888
|
|
287
|
+
*/
|
|
288
|
+
let DevelopmentProxyExample = class DevelopmentProxyExample {
|
|
289
|
+
constructor(httpClient) {
|
|
290
|
+
this.httpClient = httpClient;
|
|
291
|
+
}
|
|
292
|
+
debugRequest() {
|
|
293
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
294
|
+
// 开发环境下会通过本地代理工具
|
|
295
|
+
// 可以查看详细的请求和响应内容
|
|
296
|
+
return this.httpClient.post('https://api.example.com/debug', {
|
|
297
|
+
test: 'data',
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
exports.DevelopmentProxyExample = DevelopmentProxyExample;
|
|
303
|
+
__decorate([
|
|
304
|
+
(0, core_1.HttpUseProxy)({
|
|
305
|
+
enabled: process.env.NODE_ENV === 'development',
|
|
306
|
+
fromEnvironment: true,
|
|
307
|
+
}),
|
|
308
|
+
__metadata("design:type", Function),
|
|
309
|
+
__metadata("design:paramtypes", []),
|
|
310
|
+
__metadata("design:returntype", Promise)
|
|
311
|
+
], DevelopmentProxyExample.prototype, "debugRequest", null);
|
|
312
|
+
exports.DevelopmentProxyExample = DevelopmentProxyExample = __decorate([
|
|
313
|
+
(0, common_1.Injectable)(),
|
|
314
|
+
__metadata("design:paramtypes", [typeof (_f = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _f : Object])
|
|
315
|
+
], DevelopmentProxyExample);
|
|
316
|
+
/**
|
|
317
|
+
* 示例 7: 程序化检查代理配置
|
|
318
|
+
*/
|
|
319
|
+
let ProxyUtilityExample = class ProxyUtilityExample {
|
|
320
|
+
checkProxyConfiguration() {
|
|
321
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
322
|
+
const { ProxyEnvironmentParser } = yield Promise.resolve().then(() => require('@nest-omni/core'));
|
|
323
|
+
// 检查是否设置了代理环境变量
|
|
324
|
+
const hasProxy = ProxyEnvironmentParser.hasProxyEnvironment();
|
|
325
|
+
console.log('Has proxy environment:', hasProxy);
|
|
326
|
+
// 获取所有代理环境变量
|
|
327
|
+
const vars = ProxyEnvironmentParser.getProxyEnvironmentVariables();
|
|
328
|
+
console.log('Proxy environment variables:', vars);
|
|
329
|
+
// 解析特定 URL 的代理配置
|
|
330
|
+
const proxyConfig = ProxyEnvironmentParser.parseFromEnvironment('https', 'https://api.example.com/data');
|
|
331
|
+
console.log('Parsed proxy config:', proxyConfig);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
exports.ProxyUtilityExample = ProxyUtilityExample;
|
|
336
|
+
exports.ProxyUtilityExample = ProxyUtilityExample = __decorate([
|
|
337
|
+
(0, common_1.Injectable)()
|
|
338
|
+
], ProxyUtilityExample);
|
|
339
|
+
/**
|
|
340
|
+
* 模块配置示例
|
|
341
|
+
*/
|
|
342
|
+
exports.httpClientModuleConfig = {
|
|
343
|
+
// 方式 1: 全局启用环境变量代理
|
|
344
|
+
globalProxyFromEnv: {
|
|
345
|
+
imports: [
|
|
346
|
+
{
|
|
347
|
+
// HttpClientModule.forRoot({
|
|
348
|
+
proxy: {
|
|
349
|
+
enabled: true,
|
|
350
|
+
fromEnvironment: true, // 所有请求默认使用环境变量代理
|
|
351
|
+
},
|
|
352
|
+
// })
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
},
|
|
356
|
+
// 方式 2: 全局禁用,按需启用
|
|
357
|
+
selectiveProxy: {
|
|
358
|
+
imports: [
|
|
359
|
+
{
|
|
360
|
+
// HttpClientModule.forRoot({
|
|
361
|
+
proxy: {
|
|
362
|
+
enabled: false, // 全局禁用,使用装饰器按需启用
|
|
363
|
+
},
|
|
364
|
+
// })
|
|
365
|
+
},
|
|
366
|
+
],
|
|
367
|
+
},
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* 环境变量配置示例
|
|
371
|
+
*/
|
|
372
|
+
exports.environmentVariablesExamples = {
|
|
373
|
+
// 基本配置
|
|
374
|
+
basic: `
|
|
375
|
+
# 基本 HTTP 代理
|
|
376
|
+
HTTP_PROXY=http://proxy.example.com:8080
|
|
377
|
+
|
|
378
|
+
# HTTPS 代理
|
|
379
|
+
HTTPS_PROXY=https://proxy.example.com:8443
|
|
380
|
+
|
|
381
|
+
# 不使用代理的域名
|
|
382
|
+
NO_PROXY=localhost,127.0.0.1
|
|
383
|
+
`,
|
|
384
|
+
// 带认证
|
|
385
|
+
withAuth: `
|
|
386
|
+
# 带认证的代理
|
|
387
|
+
HTTP_PROXY=http://username:password@proxy.example.com:8080
|
|
388
|
+
HTTPS_PROXY=http://username:password@proxy.example.com:8080
|
|
389
|
+
`,
|
|
390
|
+
// 特殊字符认证(URL 编码)
|
|
391
|
+
specialChars: `
|
|
392
|
+
# 用户名: user@domain.com
|
|
393
|
+
# 密码: p@ssw0rd
|
|
394
|
+
HTTP_PROXY=http://user%40domain.com:p%40ssw0rd@proxy.example.com:8080
|
|
395
|
+
`,
|
|
396
|
+
// 企业环境
|
|
397
|
+
enterprise: `
|
|
398
|
+
# 企业代理配置
|
|
399
|
+
HTTP_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
|
|
400
|
+
HTTPS_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
|
|
401
|
+
NO_PROXY=localhost,127.0.0.1,.company.com,.internal.com,.svc.cluster.local,10.0.0.0/8
|
|
402
|
+
`,
|
|
403
|
+
// 开发环境
|
|
404
|
+
development: `
|
|
405
|
+
# 本地代理工具(Charles, Fiddler 等)
|
|
406
|
+
HTTP_PROXY=http://localhost:8888
|
|
407
|
+
HTTPS_PROXY=http://localhost:8888
|
|
408
|
+
NO_PROXY=localhost,127.0.0.1
|
|
409
|
+
`,
|
|
410
|
+
};
|
|
@@ -20,6 +20,7 @@ exports.HttpClientModule = void 0;
|
|
|
20
20
|
const common_1 = require("@nestjs/common");
|
|
21
21
|
const config_1 = require("@nestjs/config");
|
|
22
22
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
23
|
+
const typeorm_2 = require("typeorm");
|
|
23
24
|
const cache_service_1 = require("../cache/cache.service");
|
|
24
25
|
const http_client_service_1 = require("./services/http-client.service");
|
|
25
26
|
const circuit_breaker_service_1 = require("./services/circuit-breaker.service");
|
|
@@ -52,11 +53,38 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
|
|
|
52
53
|
inject: [config_1.ConfigService, cache_service_1.CacheService],
|
|
53
54
|
},
|
|
54
55
|
circuit_breaker_service_1.HttpCircuitBreakerService,
|
|
55
|
-
|
|
56
|
+
{
|
|
57
|
+
provide: logging_service_1.HttpLoggingService,
|
|
58
|
+
useFactory: (httpConfig, dataSource) => {
|
|
59
|
+
var _a, _b;
|
|
60
|
+
// Check if database logging is enabled in the config
|
|
61
|
+
const databaseLoggingEnabled = (_b = (_a = httpConfig === null || httpConfig === void 0 ? void 0 : httpConfig.logging) === null || _a === void 0 ? void 0 : _a.databaseLogging) === null || _b === void 0 ? void 0 : _b.enabled;
|
|
62
|
+
return new logging_service_1.HttpLoggingService(databaseLoggingEnabled ? dataSource : undefined);
|
|
63
|
+
},
|
|
64
|
+
inject: ['HTTP_CLIENT_CONFIG', typeorm_2.DataSource],
|
|
65
|
+
},
|
|
56
66
|
cache_service_2.HttpCacheService,
|
|
57
67
|
http_log_query_service_1.HttpLogQueryService,
|
|
58
|
-
|
|
59
|
-
|
|
68
|
+
{
|
|
69
|
+
provide: log_cleanup_service_1.HttpLogCleanupService,
|
|
70
|
+
useFactory: (logQueryService, httpConfig) => {
|
|
71
|
+
return new log_cleanup_service_1.HttpLogCleanupService(logQueryService, httpConfig.logCleanup || {});
|
|
72
|
+
},
|
|
73
|
+
inject: [http_log_query_service_1.HttpLogQueryService, 'HTTP_CLIENT_CONFIG'],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
provide: api_client_registry_service_1.ApiClientRegistryService,
|
|
77
|
+
useFactory: (httpClientService, circuitBreakerService, loggingService, cacheService, httpConfig) => {
|
|
78
|
+
return new api_client_registry_service_1.ApiClientRegistryService(httpClientService, circuitBreakerService, loggingService, cacheService, {});
|
|
79
|
+
},
|
|
80
|
+
inject: [
|
|
81
|
+
http_client_service_1.HttpClientService,
|
|
82
|
+
circuit_breaker_service_1.HttpCircuitBreakerService,
|
|
83
|
+
logging_service_1.HttpLoggingService,
|
|
84
|
+
cache_service_2.HttpCacheService,
|
|
85
|
+
'HTTP_CLIENT_CONFIG',
|
|
86
|
+
],
|
|
87
|
+
},
|
|
60
88
|
{
|
|
61
89
|
provide: http_client_service_1.HttpClientService,
|
|
62
90
|
useFactory: (circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig) => {
|
|
@@ -97,6 +125,10 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
|
|
|
97
125
|
* 异步注册HTTP客户端模块
|
|
98
126
|
*/
|
|
99
127
|
static forRootAsync(config) {
|
|
128
|
+
// Determine if database logging will be enabled
|
|
129
|
+
// We need to check if the config will enable database logging
|
|
130
|
+
// This is a bit tricky since the config is async, so we'll inject DataSource conditionally later
|
|
131
|
+
const httpConfig = config.useFactory ? {} : {};
|
|
100
132
|
// 基础服务提供者
|
|
101
133
|
const baseProviders = [
|
|
102
134
|
{
|
|
@@ -109,11 +141,38 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
|
|
|
109
141
|
inject: config.inject || [config_1.ConfigService],
|
|
110
142
|
},
|
|
111
143
|
circuit_breaker_service_1.HttpCircuitBreakerService,
|
|
112
|
-
|
|
144
|
+
{
|
|
145
|
+
provide: logging_service_1.HttpLoggingService,
|
|
146
|
+
useFactory: (httpConfig, dataSource) => {
|
|
147
|
+
var _a, _b;
|
|
148
|
+
// Check if database logging is enabled in the config
|
|
149
|
+
const databaseLoggingEnabled = (_b = (_a = httpConfig === null || httpConfig === void 0 ? void 0 : httpConfig.logging) === null || _a === void 0 ? void 0 : _a.databaseLogging) === null || _b === void 0 ? void 0 : _b.enabled;
|
|
150
|
+
return new logging_service_1.HttpLoggingService(databaseLoggingEnabled ? dataSource : undefined);
|
|
151
|
+
},
|
|
152
|
+
inject: ['HTTP_CLIENT_CONFIG', typeorm_2.DataSource],
|
|
153
|
+
},
|
|
113
154
|
cache_service_2.HttpCacheService,
|
|
114
155
|
http_log_query_service_1.HttpLogQueryService,
|
|
115
|
-
|
|
116
|
-
|
|
156
|
+
{
|
|
157
|
+
provide: log_cleanup_service_1.HttpLogCleanupService,
|
|
158
|
+
useFactory: (logQueryService, httpConfig) => {
|
|
159
|
+
return new log_cleanup_service_1.HttpLogCleanupService(logQueryService, httpConfig.logCleanup || {});
|
|
160
|
+
},
|
|
161
|
+
inject: [http_log_query_service_1.HttpLogQueryService, 'HTTP_CLIENT_CONFIG'],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
provide: api_client_registry_service_1.ApiClientRegistryService,
|
|
165
|
+
useFactory: (httpClientService, circuitBreakerService, loggingService, cacheService, httpConfig) => {
|
|
166
|
+
return new api_client_registry_service_1.ApiClientRegistryService(httpClientService, circuitBreakerService, loggingService, cacheService, {});
|
|
167
|
+
},
|
|
168
|
+
inject: [
|
|
169
|
+
http_client_service_1.HttpClientService,
|
|
170
|
+
circuit_breaker_service_1.HttpCircuitBreakerService,
|
|
171
|
+
logging_service_1.HttpLoggingService,
|
|
172
|
+
cache_service_2.HttpCacheService,
|
|
173
|
+
'HTTP_CLIENT_CONFIG',
|
|
174
|
+
],
|
|
175
|
+
},
|
|
117
176
|
{
|
|
118
177
|
provide: http_client_service_1.HttpClientService,
|
|
119
178
|
useFactory: (circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig) => {
|
|
@@ -72,9 +72,15 @@ export interface HttpCacheConfig {
|
|
|
72
72
|
*/
|
|
73
73
|
export interface ProxyConfig {
|
|
74
74
|
enabled: boolean;
|
|
75
|
+
/** 是否从环境变量读取代理配置 (HTTP_PROXY, HTTPS_PROXY, NO_PROXY) */
|
|
76
|
+
fromEnvironment?: boolean;
|
|
77
|
+
/** 手动指定的代理主机 (当 fromEnvironment 为 false 时使用) */
|
|
75
78
|
host?: string;
|
|
79
|
+
/** 手动指定的代理端口 (当 fromEnvironment 为 false 时使用) */
|
|
76
80
|
port?: number;
|
|
81
|
+
/** 代理协议 */
|
|
77
82
|
protocol?: 'http' | 'https';
|
|
83
|
+
/** 代理认证信息 */
|
|
78
84
|
auth?: {
|
|
79
85
|
username: string;
|
|
80
86
|
password: string;
|
|
@@ -123,5 +123,13 @@ export declare class HttpClientService {
|
|
|
123
123
|
* 深度合并对象
|
|
124
124
|
*/
|
|
125
125
|
private deepMerge;
|
|
126
|
+
/**
|
|
127
|
+
* 解析代理配置
|
|
128
|
+
* 支持从环境变量或手动配置中读取
|
|
129
|
+
* @param proxyConfig 代理配置
|
|
130
|
+
* @param targetUrl 目标 URL(用于 NO_PROXY 检查)
|
|
131
|
+
* @returns 解析后的代理配置,如果不应使用代理则返回 false 或 undefined
|
|
132
|
+
*/
|
|
133
|
+
private resolveProxyConfig;
|
|
126
134
|
}
|
|
127
135
|
export {};
|