@clownlee/cores 1.0.23 → 1.0.25
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/assets/demo.css +539 -539
- package/dist/assets/iconfont.css +2191 -2191
- package/dist/index.js +67 -33
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2531,9 +2531,34 @@ function handleRequestInterceptor(config, store, refreshConfig) {
|
|
|
2531
2531
|
}
|
|
2532
2532
|
return config;
|
|
2533
2533
|
}
|
|
2534
|
+
const REDIRECT_TO_LOGIN_CODES = [2006, 2007, 2003, 2004, 2e3];
|
|
2535
|
+
let hasNotifiedToLogin = false;
|
|
2536
|
+
function notifyToLogin(code, message) {
|
|
2537
|
+
if (hasNotifiedToLogin) {
|
|
2538
|
+
return;
|
|
2539
|
+
}
|
|
2540
|
+
hasNotifiedToLogin = true;
|
|
2541
|
+
window.parent.postMessage(
|
|
2542
|
+
{
|
|
2543
|
+
type: "error",
|
|
2544
|
+
data: JSON.stringify({
|
|
2545
|
+
code,
|
|
2546
|
+
message,
|
|
2547
|
+
action: "toLogin"
|
|
2548
|
+
})
|
|
2549
|
+
},
|
|
2550
|
+
"*"
|
|
2551
|
+
);
|
|
2552
|
+
}
|
|
2534
2553
|
let isRefreshing = false;
|
|
2535
2554
|
let refreshPromise = null;
|
|
2536
2555
|
let failedQueue = [];
|
|
2556
|
+
function getRefreshErrorMessage(error) {
|
|
2557
|
+
if (error instanceof Error) {
|
|
2558
|
+
return error.message;
|
|
2559
|
+
}
|
|
2560
|
+
return "刷新 Token 失败";
|
|
2561
|
+
}
|
|
2537
2562
|
function getRefreshTokenFromStore(store, refreshConfig, name = "refreshToken") {
|
|
2538
2563
|
const state = store.$state;
|
|
2539
2564
|
if (state && typeof state[name] === "string") {
|
|
@@ -2586,7 +2611,12 @@ async function refreshTokenApi(refreshConfig, prefix, refreshToken) {
|
|
|
2586
2611
|
}
|
|
2587
2612
|
}
|
|
2588
2613
|
);
|
|
2589
|
-
|
|
2614
|
+
const { code, message, data } = response.data;
|
|
2615
|
+
if (code !== 0 || !(data == null ? void 0 : data.accessToken)) {
|
|
2616
|
+
notifyToLogin(code, message || "刷新 Token 失败");
|
|
2617
|
+
throw new Error(message || "刷新 Token 失败");
|
|
2618
|
+
}
|
|
2619
|
+
return data;
|
|
2590
2620
|
}
|
|
2591
2621
|
async function handleTokenRefresh(refreshConfig, store, refreshTokenFromResponse, retryFn) {
|
|
2592
2622
|
let refreshToken = refreshTokenFromResponse;
|
|
@@ -2596,7 +2626,9 @@ async function handleTokenRefresh(refreshConfig, store, refreshTokenFromResponse
|
|
|
2596
2626
|
}
|
|
2597
2627
|
let prefix = getRefreshTokenFromStore(store, refreshConfig, "prefix") || "Bearer";
|
|
2598
2628
|
if (!refreshToken) {
|
|
2599
|
-
|
|
2629
|
+
const message = "Refresh token not found";
|
|
2630
|
+
notifyToLogin(void 0, message);
|
|
2631
|
+
throw new Error(message);
|
|
2600
2632
|
}
|
|
2601
2633
|
if (isRefreshing && refreshPromise) {
|
|
2602
2634
|
try {
|
|
@@ -2630,7 +2662,10 @@ async function handleTokenRefresh(refreshConfig, store, refreshTokenFromResponse
|
|
|
2630
2662
|
state.refreshToken = newToken.refreshToken;
|
|
2631
2663
|
}
|
|
2632
2664
|
try {
|
|
2633
|
-
localStorage.setItem(
|
|
2665
|
+
localStorage.setItem(
|
|
2666
|
+
"refreshToken",
|
|
2667
|
+
JSON.stringify(newToken.refreshToken)
|
|
2668
|
+
);
|
|
2634
2669
|
} catch {
|
|
2635
2670
|
}
|
|
2636
2671
|
}
|
|
@@ -2642,6 +2677,7 @@ async function handleTokenRefresh(refreshConfig, store, refreshTokenFromResponse
|
|
|
2642
2677
|
failedQueue = [];
|
|
2643
2678
|
return await retryFn();
|
|
2644
2679
|
} catch (refreshError) {
|
|
2680
|
+
notifyToLogin(void 0, getRefreshErrorMessage(refreshError));
|
|
2645
2681
|
isRefreshing = false;
|
|
2646
2682
|
refreshPromise = null;
|
|
2647
2683
|
failedQueue.forEach(({ reject }) => {
|
|
@@ -2651,44 +2687,35 @@ async function handleTokenRefresh(refreshConfig, store, refreshTokenFromResponse
|
|
|
2651
2687
|
throw refreshError;
|
|
2652
2688
|
}
|
|
2653
2689
|
}
|
|
2654
|
-
const REDIRECT_TO_LOGIN_CODES = [2006, 2007, 2003, 2004, 2e3];
|
|
2655
2690
|
const TOKEN_REFRESH_CODE = 2001;
|
|
2656
2691
|
const TENANT_SUPER_ADMIN_FIRST_LOGIN_CODE = 2008;
|
|
2657
|
-
|
|
2658
|
-
|
|
2692
|
+
function shouldNotifyToLogin(responseURL) {
|
|
2693
|
+
if (!responseURL) {
|
|
2694
|
+
return true;
|
|
2695
|
+
}
|
|
2696
|
+
return !responseURL.endsWith("login") && !responseURL.endsWith("register") && !responseURL.endsWith("register/tenants");
|
|
2697
|
+
}
|
|
2698
|
+
async function handleResponseInterceptor(response, store, refreshConfig, axiosInstance) {
|
|
2699
|
+
var _a, _b, _c;
|
|
2659
2700
|
const responseData = response == null ? void 0 : response.data;
|
|
2660
2701
|
const code = responseData == null ? void 0 : responseData.code;
|
|
2661
2702
|
if (REDIRECT_TO_LOGIN_CODES.includes(code)) {
|
|
2662
|
-
if (
|
|
2663
|
-
|
|
2664
|
-
type: "error",
|
|
2665
|
-
data: JSON.stringify({
|
|
2666
|
-
code: responseData == null ? void 0 : responseData.code,
|
|
2667
|
-
message: responseData == null ? void 0 : responseData.message,
|
|
2668
|
-
action: "toLogin"
|
|
2669
|
-
})
|
|
2670
|
-
}, "*");
|
|
2703
|
+
if (shouldNotifyToLogin((_a = response.request) == null ? void 0 : _a.responseURL)) {
|
|
2704
|
+
notifyToLogin(responseData == null ? void 0 : responseData.code, responseData == null ? void 0 : responseData.message);
|
|
2671
2705
|
}
|
|
2672
2706
|
throw new Error(responseData == null ? void 0 : responseData.message);
|
|
2673
2707
|
} else if (code === TOKEN_REFRESH_CODE) {
|
|
2674
2708
|
const config = response.config;
|
|
2675
2709
|
if (config._retry) {
|
|
2676
|
-
|
|
2677
|
-
type: "error",
|
|
2678
|
-
data: JSON.stringify({
|
|
2679
|
-
code: responseData == null ? void 0 : responseData.code,
|
|
2680
|
-
message: responseData == null ? void 0 : responseData.message,
|
|
2681
|
-
action: "toLogin"
|
|
2682
|
-
})
|
|
2683
|
-
}, "*");
|
|
2710
|
+
notifyToLogin(responseData == null ? void 0 : responseData.code, responseData == null ? void 0 : responseData.message);
|
|
2684
2711
|
throw new Error(responseData == null ? void 0 : responseData.message);
|
|
2685
2712
|
}
|
|
2686
2713
|
if (!refreshConfig || !store) {
|
|
2687
2714
|
return response;
|
|
2688
2715
|
}
|
|
2689
2716
|
config._retry = true;
|
|
2690
|
-
const newAccessToken = (
|
|
2691
|
-
const refreshToken = (
|
|
2717
|
+
const newAccessToken = (_b = responseData == null ? void 0 : responseData.data) == null ? void 0 : _b.accessToken;
|
|
2718
|
+
const refreshToken = (_c = responseData == null ? void 0 : responseData.data) == null ? void 0 : _c.refreshToken;
|
|
2692
2719
|
const retryFn = async () => {
|
|
2693
2720
|
const originalRequest = {
|
|
2694
2721
|
...config,
|
|
@@ -2696,16 +2723,23 @@ async function handleResponseInterceptor(response, store, refreshConfig) {
|
|
|
2696
2723
|
...config.headers
|
|
2697
2724
|
}
|
|
2698
2725
|
};
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2726
|
+
const headerName = (refreshConfig == null ? void 0 : refreshConfig.name) || "Authorization";
|
|
2727
|
+
const accessToken = getAccessTokenFromStore(store) || newAccessToken;
|
|
2728
|
+
if (accessToken) {
|
|
2729
|
+
originalRequest.headers[headerName] = `Bearer ${accessToken}`;
|
|
2702
2730
|
}
|
|
2703
|
-
return
|
|
2731
|
+
return axiosInstance.request(originalRequest);
|
|
2704
2732
|
};
|
|
2705
2733
|
try {
|
|
2706
|
-
return await handleTokenRefresh(
|
|
2734
|
+
return await handleTokenRefresh(
|
|
2735
|
+
refreshConfig,
|
|
2736
|
+
store,
|
|
2737
|
+
refreshToken,
|
|
2738
|
+
retryFn
|
|
2739
|
+
);
|
|
2707
2740
|
} catch (refreshError) {
|
|
2708
|
-
|
|
2741
|
+
return new Promise(() => {
|
|
2742
|
+
});
|
|
2709
2743
|
}
|
|
2710
2744
|
} else if (code > 0 && code !== TENANT_SUPER_ADMIN_FIRST_LOGIN_CODE) {
|
|
2711
2745
|
throw new Error((responseData == null ? void 0 : responseData.message) ?? "请求失败");
|
|
@@ -2742,7 +2776,7 @@ class RequestServiceClass {
|
|
|
2742
2776
|
this.instance.interceptors.response.use(
|
|
2743
2777
|
async (response) => {
|
|
2744
2778
|
try {
|
|
2745
|
-
return await handleResponseInterceptor(response, this.config.store, this.config.refresh);
|
|
2779
|
+
return await handleResponseInterceptor(response, this.config.store, this.config.refresh, this.getInstance());
|
|
2746
2780
|
} catch (error) {
|
|
2747
2781
|
return handleResponseError(error);
|
|
2748
2782
|
}
|
|
@@ -2773,7 +2807,7 @@ class RequestServiceClass {
|
|
|
2773
2807
|
);
|
|
2774
2808
|
this.instance.interceptors.response.use(
|
|
2775
2809
|
async (response) => {
|
|
2776
|
-
return handleResponseInterceptor(response, this.config.store, this.config.refresh);
|
|
2810
|
+
return handleResponseInterceptor(response, this.config.store, this.config.refresh, this.getInstance());
|
|
2777
2811
|
},
|
|
2778
2812
|
async (error) => {
|
|
2779
2813
|
return handleResponseError(error);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clownlee/cores",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.25",
|
|
4
4
|
"description": "公共核心库,提供统一的 HTTP 请求能力和自动 token 刷新功能",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"author": "",
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@clownlee/http": "^1.0.
|
|
33
|
+
"@clownlee/http": "^1.0.10",
|
|
34
34
|
"pinia": "^2.1.7",
|
|
35
35
|
"vue": "^3.5.25",
|
|
36
36
|
"cropper": "^4.1.0",
|