fix: close module access lifecycle gaps

This commit is contained in:
2026-08-17 09:15:37 +08:00
parent d16922f18c
commit ebe55ba17a
8 changed files with 289 additions and 19 deletions

View File

@@ -236,7 +236,8 @@ async function readCurrentModuleAccess(fallback: ModuleAccess): Promise<ModuleAc
const response = await hostApiFetch<ModuleAccessResponse>('/api/auth/me');
if (!response.success) return fallback;
return normalizeModuleAccess(response.moduleAccess);
} catch {
} catch (error) {
if (isTerminalAuthError(error)) throw error;
return fallback;
}
}
@@ -347,9 +348,25 @@ export const useAuthStore = create<AuthState>()(
return;
}
const moduleAccess = await readCurrentModuleAccess(
normalizeModuleAccess(state.moduleAccess),
);
let moduleAccess: ModuleAccess;
try {
moduleAccess = await readCurrentModuleAccess(
normalizeModuleAccess(state.moduleAccess),
);
} catch (error) {
if (!isCurrentAuthSessionEpoch(operationEpoch)) return;
if (isTerminalAuthError(error)) {
advanceAuthSessionEpoch();
set({
initialized: true,
loading: false,
error: '登录已过期,请重新授权。',
...getClearedSession(),
});
return;
}
moduleAccess = normalizeModuleAccess(state.moduleAccess);
}
if (!isCurrentAuthSessionEpoch(operationEpoch)) return;
set({ initialized: true, loading: false, error: null, moduleAccess });
},
@@ -383,7 +400,10 @@ export const useAuthStore = create<AuthState>()(
});
} catch (error) {
if (!isCurrentAuthSessionEpoch(operationEpoch)) return;
const message = error instanceof Error ? error.message : String(error);
const terminal = isTerminalAuthError(error);
const message = terminal
? '登录已过期,请重新授权。'
: (error instanceof Error ? error.message : String(error));
advanceAuthSessionEpoch();
set({ loading: false, error: message, ...getClearedSession() });
throw new Error(message, { cause: error });
@@ -431,8 +451,10 @@ export const useAuthStore = create<AuthState>()(
return session.accessToken;
} catch (error) {
if (!isCurrentAuthSessionEpoch(operationEpoch)) return null;
const message = error instanceof Error ? error.message : String(error);
const terminal = isTerminalAuthError(error);
const message = terminal
? '登录已过期,请重新授权。'
: (error instanceof Error ? error.message : String(error));
if (terminal) advanceAuthSessionEpoch();
set({
initialized: true,