Skip to content

Commit 74f6cd9

Browse files
committed
improve performance of auth invalidation
1 parent 0207335 commit 74f6cd9

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

plugins/backstage-plugin-coder/src/components/CoderProvider/CoderAuthProvider.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
import { coderClientApiRef } from '../../api/CoderClient';
2828
import { CoderLogo } from '../CoderLogo';
2929
import { CoderAuthFormDialog } from '../CoderAuthFormDialog';
30+
import { AxiosError } from 'axios';
3031

3132
const BACKSTAGE_APP_ROOT_ID = '#root';
3233
const FALLBACK_UI_OVERRIDE_CLASS_NAME = 'backstage-root-override';
@@ -143,30 +144,30 @@ function useAuthState(): CoderAuth {
143144
// outside React because we let the user connect their own queryClient
144145
const queryClient = useQueryClient();
145146
useEffect(() => {
146-
// Pseudo-mutex; makes sure that if we get a bunch of errors, only one
147-
// revalidation will be processed at a time
148-
let isRevalidating = false;
149-
150-
const revalidateTokenOnError = async (event: QueryCacheNotifyEvent) => {
151-
const queryError = event.query.state.error;
147+
if (!isAuthenticated) {
148+
return undefined;
149+
}
152150

153-
const shouldRevalidate =
154-
isAuthenticated &&
155-
!isRevalidating &&
156-
BackstageHttpError.isInstance(queryError) &&
157-
queryError.status === 401;
151+
const onCoderQueryError = (event: QueryCacheNotifyEvent) => {
152+
const queryKey = event.query.queryKey;
153+
const isCoderQuery =
154+
Array.isArray(queryKey) && queryKey[0] === CODER_QUERY_KEY_PREFIX;
158155

159-
if (!shouldRevalidate) {
156+
if (!isCoderQuery) {
160157
return;
161158
}
162159

163-
isRevalidating = true;
164-
await queryClient.refetchQueries({ queryKey: sharedAuthQueryKey });
165-
isRevalidating = false;
160+
const queryError = event.query.state.error;
161+
const failedBecauseOfInvalidAuth =
162+
queryError instanceof AxiosError && queryError.status === 401;
163+
164+
if (failedBecauseOfInvalidAuth) {
165+
queryClient.setQueryData(sharedAuthQueryKey, false);
166+
}
166167
};
167168

168169
const queryCache = queryClient.getQueryCache();
169-
const unsubscribe = queryCache.subscribe(revalidateTokenOnError);
170+
const unsubscribe = queryCache.subscribe(onCoderQueryError);
170171
return unsubscribe;
171172
}, [queryClient, isAuthenticated]);
172173

0 commit comments

Comments
 (0)