@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/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
- return response.data;
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
- throw new Error("Refresh token not found");
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("refreshToken", JSON.stringify(newToken.refreshToken));
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
- async function handleResponseInterceptor(response, store, refreshConfig) {
2658
- var _a, _b;
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 (!response.request.responseURL.endsWith("login") && !response.request.responseURL.endsWith("register") && !response.request.responseURL.endsWith("register/tenants")) {
2663
- window.parent.postMessage({
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
- window.parent.postMessage({
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 = (_a = responseData == null ? void 0 : responseData.data) == null ? void 0 : _a.accessToken;
2691
- const refreshToken = (_b = responseData == null ? void 0 : responseData.data) == null ? void 0 : _b.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
- if (newAccessToken) {
2700
- const headerName = (refreshConfig == null ? void 0 : refreshConfig.name) || "Authorization";
2701
- originalRequest.headers[headerName] = `Bearer ${newAccessToken}`;
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 axios(originalRequest);
2731
+ return axiosInstance.request(originalRequest);
2704
2732
  };
2705
2733
  try {
2706
- return await handleTokenRefresh(refreshConfig, store, refreshToken, retryFn);
2734
+ return await handleTokenRefresh(
2735
+ refreshConfig,
2736
+ store,
2737
+ refreshToken,
2738
+ retryFn
2739
+ );
2707
2740
  } catch (refreshError) {
2708
- throw refreshError;
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.23",
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.8",
33
+ "@clownlee/http": "^1.0.10",
34
34
  "pinia": "^2.1.7",
35
35
  "vue": "^3.5.25",
36
36
  "cropper": "^4.1.0",