hifun-tools 1.4.20 → 1.4.22
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/dist/init/index.d.ts +4 -0
- package/dist/init/index.js +74 -34
- package/dist/init/utils.js +30 -12
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/init/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ declare class InitCls {
|
|
|
14
14
|
private initialized;
|
|
15
15
|
isRefreshNow: boolean;
|
|
16
16
|
private localPath;
|
|
17
|
+
private onlyBackUp;
|
|
17
18
|
private OriginBaseUrl;
|
|
18
19
|
private tenant;
|
|
19
20
|
private tenantConfig;
|
|
@@ -29,6 +30,8 @@ declare class InitCls {
|
|
|
29
30
|
appGateway?: string;
|
|
30
31
|
backupAddress?: string[];
|
|
31
32
|
}): Promise<(string | null)[]>;
|
|
33
|
+
getOnlyBackup(): boolean;
|
|
34
|
+
setOnlyBackup(value: boolean): void;
|
|
32
35
|
/** 是否 App 环境 */
|
|
33
36
|
getIsApp(): boolean;
|
|
34
37
|
/** 获取租户名 */
|
|
@@ -49,6 +52,7 @@ declare class InitCls {
|
|
|
49
52
|
private _getTenantInfoStrictSync;
|
|
50
53
|
/** 匹配默认租户 */
|
|
51
54
|
private _matchDefaultTenant;
|
|
55
|
+
retryHttp(): Promise<void>;
|
|
52
56
|
refreshHttp(): Promise<void>;
|
|
53
57
|
/** 获取 lineDict.txt 内容 */
|
|
54
58
|
private _fetchLineDict;
|
package/dist/init/index.js
CHANGED
|
@@ -19,6 +19,7 @@ class InitCls {
|
|
|
19
19
|
initialized = false;
|
|
20
20
|
isRefreshNow = false;
|
|
21
21
|
localPath = "";
|
|
22
|
+
onlyBackUp = false;
|
|
22
23
|
OriginBaseUrl = [];
|
|
23
24
|
tenant = "";
|
|
24
25
|
tenantConfig = null;
|
|
@@ -52,6 +53,12 @@ class InitCls {
|
|
|
52
53
|
console.info("✅ 所有初始化完成:", results);
|
|
53
54
|
return results;
|
|
54
55
|
}
|
|
56
|
+
getOnlyBackup() {
|
|
57
|
+
return this.onlyBackUp;
|
|
58
|
+
}
|
|
59
|
+
setOnlyBackup(value) {
|
|
60
|
+
this.onlyBackUp = value;
|
|
61
|
+
}
|
|
55
62
|
/** 是否 App 环境 */
|
|
56
63
|
getIsApp() {
|
|
57
64
|
return !!this.appTenant && !!this.appLine;
|
|
@@ -158,6 +165,18 @@ class InitCls {
|
|
|
158
165
|
}
|
|
159
166
|
throw new Error("无法获取有效的租户信息");
|
|
160
167
|
}
|
|
168
|
+
async retryHttp() {
|
|
169
|
+
try {
|
|
170
|
+
if (this.onlyBackUp)
|
|
171
|
+
return;
|
|
172
|
+
await getOptimalDecodedString([this.getBaseUrl()]);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (this.onlyBackUp)
|
|
176
|
+
return;
|
|
177
|
+
await this._loadGatewayConfig(true);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
161
180
|
async refreshHttp() {
|
|
162
181
|
const startTime = Date.now();
|
|
163
182
|
const log = (msg) => {
|
|
@@ -193,7 +212,7 @@ class InitCls {
|
|
|
193
212
|
return true;
|
|
194
213
|
}
|
|
195
214
|
catch (err) {
|
|
196
|
-
loadingText("
|
|
215
|
+
loadingText("正在为您检测最优线路,请稍等...");
|
|
197
216
|
log(`${label}:请求失败 ❌`);
|
|
198
217
|
return false;
|
|
199
218
|
}
|
|
@@ -222,6 +241,7 @@ class InitCls {
|
|
|
222
241
|
const nowLineGroup = this.tenantDictList.find((a) => toStandardUrl(a.line) == toStandardUrl(this.domainBaseUrl))?.lineGroup;
|
|
223
242
|
if (!!nowLineGroup)
|
|
224
243
|
Cache("ErrorDomainUrl", uniq([...this.ErrorDomainUrl, nowLineGroup]));
|
|
244
|
+
closeLoadingText();
|
|
225
245
|
rewardMsg({
|
|
226
246
|
title: "提示",
|
|
227
247
|
text: "优选线路超时,刷新页面以重置" + (nowLineGroup ? "" : "..."),
|
|
@@ -271,56 +291,76 @@ class InitCls {
|
|
|
271
291
|
return "";
|
|
272
292
|
}
|
|
273
293
|
/** 获取并处理 lineAddress.txt */
|
|
274
|
-
async _loadGatewayConfig() {
|
|
275
|
-
if (this.domainBaseUrl)
|
|
294
|
+
async _loadGatewayConfig(retry = false) {
|
|
295
|
+
if (this.domainBaseUrl && !retry)
|
|
276
296
|
return this.domainBaseUrl;
|
|
297
|
+
/** 设置 domainBaseUrl 并返回 */
|
|
298
|
+
const setBaseUrl = async (list) => {
|
|
299
|
+
this.domainBaseUrl = toStandardUrl(await getOptimalDecodedString(list));
|
|
300
|
+
return this.domainBaseUrl;
|
|
301
|
+
};
|
|
302
|
+
/** 备用 Address 策略 */
|
|
303
|
+
const loadBackupAddress = async () => {
|
|
304
|
+
const backupList = JSON.parse(AesDecrypt(await this.fetchTxtFile(this.backupAddress)));
|
|
305
|
+
this.backupAddressList = backupList || [];
|
|
306
|
+
await setBaseUrl(this.backupAddressList);
|
|
307
|
+
console.info("✅ 备用远程Address配置成功:", this.domainBaseUrl);
|
|
308
|
+
};
|
|
309
|
+
this.onlyBackUp = false;
|
|
277
310
|
try {
|
|
311
|
+
/** 1️⃣ 读取主配置 */
|
|
278
312
|
const response = await fetch(`/lineAddress.txt?t=${Date.now()}`);
|
|
279
313
|
const configText = await response.text();
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
const
|
|
284
|
-
const
|
|
285
|
-
let
|
|
314
|
+
const originBaseUrl = JSON.parse(AesDecrypt(configText));
|
|
315
|
+
this.OriginBaseUrl = originBaseUrl;
|
|
316
|
+
/** 2️⃣ 计算智能线路 */
|
|
317
|
+
const tenantDictList = this.getTenantDictList().filter((a) => !this.ErrorDomainUrl.includes(a.lineGroup));
|
|
318
|
+
const currentLineGroup = this.getTenantDict()?.lineGroup;
|
|
319
|
+
let baseUrlList = filterSmartLines(tenantDictList, originBaseUrl, this.ErrorDomainUrl?.length === 0 ? currentLineGroup : "");
|
|
320
|
+
/** 3️⃣ 主线路测速 */
|
|
286
321
|
try {
|
|
287
|
-
|
|
322
|
+
await setBaseUrl(baseUrlList);
|
|
288
323
|
console.info("✅ 成功加载生产环境配置:", this.domainBaseUrl);
|
|
289
324
|
}
|
|
290
|
-
catch
|
|
291
|
-
|
|
292
|
-
this.backupAddressList = backUrl || [];
|
|
293
|
-
// 备用策略
|
|
325
|
+
catch {
|
|
326
|
+
/** 4️⃣ 降级策略 */
|
|
294
327
|
try {
|
|
295
|
-
this.
|
|
296
|
-
|
|
328
|
+
if (this.ErrorDomainUrl?.length == 0) {
|
|
329
|
+
const fallbackList = filterSmartLines(tenantDictList.filter((a) => a.lineGroup !== currentLineGroup), originBaseUrl);
|
|
330
|
+
await setBaseUrl(fallbackList);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
await loadBackupAddress();
|
|
334
|
+
}
|
|
297
335
|
}
|
|
298
|
-
catch
|
|
299
|
-
|
|
300
|
-
|
|
336
|
+
catch {
|
|
337
|
+
try {
|
|
338
|
+
await loadBackupAddress();
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
this.domainBaseUrl = toStandardUrl(originBaseUrl[0]);
|
|
342
|
+
console.warn("⚠️ 备选测速失败,使用备用配置:", this.domainBaseUrl);
|
|
343
|
+
this.onlyBackUp = true;
|
|
344
|
+
}
|
|
301
345
|
}
|
|
302
346
|
}
|
|
303
347
|
return this.domainBaseUrl;
|
|
304
348
|
}
|
|
305
349
|
catch (err) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
return this.domainBaseUrl;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
this.domainBaseUrl =
|
|
315
|
-
this.defaultBaseUrl ||
|
|
316
|
-
toStandardUrl(this.backupAddressList?.length > 0
|
|
317
|
-
? this.backupAddressList[0]
|
|
318
|
-
: this.OriginBaseUrl[0]);
|
|
319
|
-
console.info("🏠 使用默认 BaseUrl1:", this.domainBaseUrl);
|
|
350
|
+
/** 5️⃣ 最终兜底 */
|
|
351
|
+
if (this.getIsApp() && this.appGateway) {
|
|
352
|
+
this.domainBaseUrl = toStandardUrl(this.appGateway);
|
|
353
|
+
console.info("🏠 使用app传入网关:", this.domainBaseUrl);
|
|
320
354
|
return this.domainBaseUrl;
|
|
321
355
|
}
|
|
356
|
+
this.domainBaseUrl =
|
|
357
|
+
this.defaultBaseUrl ||
|
|
358
|
+
toStandardUrl(this.backupAddressList?.length > 0
|
|
359
|
+
? this.backupAddressList[0]
|
|
360
|
+
: this.OriginBaseUrl[0]);
|
|
361
|
+
console.info("🏠 使用默认 BaseUrl:", this.domainBaseUrl);
|
|
322
362
|
console.error("⚠️ 加载 lineAddress.txt 失败:", err);
|
|
323
|
-
return null;
|
|
363
|
+
return this.domainBaseUrl ?? null;
|
|
324
364
|
}
|
|
325
365
|
}
|
|
326
366
|
}
|
package/dist/init/utils.js
CHANGED
|
@@ -138,41 +138,59 @@ export async function getOptimalDecodedString(arr, options) {
|
|
|
138
138
|
? targetArr.filter(isIPv4)
|
|
139
139
|
: targetArr.filter((v) => !isIPv4(v));
|
|
140
140
|
}
|
|
141
|
+
if (!targetArr.length) {
|
|
142
|
+
throw new Error("过滤后数组为空");
|
|
143
|
+
}
|
|
141
144
|
const failedUrls = [];
|
|
142
145
|
const controllerMap = {};
|
|
143
146
|
return new Promise((resolve, reject) => {
|
|
144
147
|
let resolved = false;
|
|
148
|
+
let pendingCount = targetArr.length;
|
|
149
|
+
const checkAllFailed = () => {
|
|
150
|
+
if (!resolved && pendingCount === 0) {
|
|
151
|
+
// 所有请求都完成了,但没有一个成功
|
|
152
|
+
if (error) {
|
|
153
|
+
error(failedUrls);
|
|
154
|
+
}
|
|
155
|
+
reject({ message: "测速全部失败", failedUrls });
|
|
156
|
+
}
|
|
157
|
+
};
|
|
145
158
|
targetArr.forEach((url) => {
|
|
146
159
|
const controller = new AbortController();
|
|
147
160
|
controllerMap[url] = controller;
|
|
148
161
|
const timeoutId = setTimeout(() => {
|
|
149
162
|
controller.abort();
|
|
150
163
|
failedUrls.push(url);
|
|
164
|
+
pendingCount--;
|
|
165
|
+
checkAllFailed();
|
|
151
166
|
}, 3000);
|
|
152
167
|
fetch(`${toStandardUrl(url)}/actuator-security/health?t=${Date.now()}`, {
|
|
153
168
|
signal: controller.signal,
|
|
154
169
|
})
|
|
155
|
-
.then(() => {
|
|
170
|
+
.then((response) => {
|
|
156
171
|
clearTimeout(timeoutId);
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
throw new Error(`HTTP ${response.status}`);
|
|
174
|
+
}
|
|
157
175
|
if (!resolved) {
|
|
158
176
|
resolved = true;
|
|
177
|
+
// 成功时中止所有其他请求
|
|
178
|
+
Object.values(controllerMap).forEach((c) => {
|
|
179
|
+
if (c !== controller)
|
|
180
|
+
c.abort();
|
|
181
|
+
});
|
|
159
182
|
resolve(url);
|
|
160
183
|
}
|
|
161
184
|
})
|
|
162
|
-
.catch(() => {
|
|
185
|
+
.catch((err) => {
|
|
163
186
|
clearTimeout(timeoutId);
|
|
164
|
-
failedUrls.
|
|
187
|
+
if (!failedUrls.includes(url)) {
|
|
188
|
+
failedUrls.push(url);
|
|
189
|
+
}
|
|
190
|
+
pendingCount--;
|
|
191
|
+
checkAllFailed();
|
|
165
192
|
});
|
|
166
193
|
});
|
|
167
|
-
// 等待所有请求完成
|
|
168
|
-
setTimeout(() => {
|
|
169
|
-
if (failedUrls.length && error) {
|
|
170
|
-
error(failedUrls);
|
|
171
|
-
}
|
|
172
|
-
if (!resolved) {
|
|
173
|
-
reject({ message: "测速全部失败", failedUrls });
|
|
174
|
-
}
|
|
175
|
-
}, 3500);
|
|
176
194
|
});
|
|
177
195
|
}
|
|
178
196
|
/**
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "1.4.
|
|
1
|
+
export declare const VERSION = "1.4.21";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "1.4.
|
|
1
|
+
export const VERSION = "1.4.21";
|