perf upgrade
This commit is contained in:
@@ -14,6 +14,30 @@ type SSEEvent = {
|
||||
|
||||
type EventHandler = (event: SSEEvent, queryClient: ReturnType<typeof useQueryClient>, currentSessionId?: string) => void;
|
||||
|
||||
const INVALIDATE_DEBOUNCE_MS = 1500;
|
||||
const invalidateTimers = new Map<string, ReturnType<typeof setTimeout>>();
|
||||
|
||||
function debouncedInvalidate(
|
||||
queryClient: ReturnType<typeof useQueryClient>,
|
||||
filters: { queryKey: readonly unknown[] }
|
||||
) {
|
||||
const key = JSON.stringify(filters.queryKey);
|
||||
const existing = invalidateTimers.get(key);
|
||||
if (existing) clearTimeout(existing);
|
||||
|
||||
invalidateTimers.set(key, setTimeout(() => {
|
||||
invalidateTimers.delete(key);
|
||||
queryClient.invalidateQueries(filters);
|
||||
}, INVALIDATE_DEBOUNCE_MS));
|
||||
}
|
||||
|
||||
function clearPendingInvalidations() {
|
||||
for (const timer of invalidateTimers.values()) {
|
||||
clearTimeout(timer);
|
||||
}
|
||||
invalidateTimers.clear();
|
||||
}
|
||||
|
||||
const eventHandlers: Record<string, EventHandler> = {
|
||||
"connected": () => {
|
||||
logger.info("New Connection");
|
||||
@@ -21,8 +45,8 @@ const eventHandlers: Record<string, EventHandler> = {
|
||||
"ping": () => {},
|
||||
"heartbeat": () => {},
|
||||
"match": (event, queryClient) => {
|
||||
queryClient.invalidateQueries(tournamentQueries.details(event.tournamentId))
|
||||
queryClient.invalidateQueries(tournamentQueries.current())
|
||||
debouncedInvalidate(queryClient, tournamentQueries.details(event.tournamentId))
|
||||
debouncedInvalidate(queryClient, tournamentQueries.current())
|
||||
},
|
||||
"reaction": (event, queryClient) => {
|
||||
queryClient.invalidateQueries(reactionQueries.match(event.matchId));
|
||||
@@ -104,6 +128,8 @@ export function useServerEvents() {
|
||||
logger.info("Closing SSE connection");
|
||||
shouldConnectRef.current = false;
|
||||
|
||||
clearPendingInvalidations();
|
||||
|
||||
if (timeoutRef.current) {
|
||||
clearTimeout(timeoutRef.current);
|
||||
timeoutRef.current = null;
|
||||
|
||||
Reference in New Issue
Block a user