fix(timeline): resync after sse reconnect
This commit is contained in:
@@ -3,7 +3,11 @@
|
||||
import { SSE_EVENT_TYPES } from "@capakraken/shared";
|
||||
import { useQueryClient } from "@tanstack/react-query";
|
||||
import { useEffect, useRef } from "react";
|
||||
import { getTimelineSseInvalidationKeys, parseTimelineSseEvent } from "./timelineSsePolicy.js";
|
||||
import {
|
||||
getTimelineSseInvalidationKeys,
|
||||
getTimelineSseResyncKeys,
|
||||
parseTimelineSseEvent,
|
||||
} from "./timelineSsePolicy.js";
|
||||
|
||||
/**
|
||||
* Connects to the SSE timeline endpoint and invalidates React Query caches
|
||||
@@ -17,6 +21,7 @@ export function useTimelineSSE() {
|
||||
let es: EventSource | null = null;
|
||||
let reconnectAttempts = 0;
|
||||
let isDisposed = false;
|
||||
let shouldResyncOnOpen = false;
|
||||
|
||||
function scheduleReconnect() {
|
||||
if (isDisposed || reconnectTimeout.current) return;
|
||||
@@ -35,6 +40,14 @@ export function useTimelineSSE() {
|
||||
|
||||
es.onopen = () => {
|
||||
reconnectAttempts = 0;
|
||||
if (!shouldResyncOnOpen) {
|
||||
return;
|
||||
}
|
||||
|
||||
shouldResyncOnOpen = false;
|
||||
for (const queryKey of getTimelineSseResyncKeys()) {
|
||||
void queryClient.invalidateQueries({ queryKey });
|
||||
}
|
||||
};
|
||||
|
||||
es.onmessage = (event) => {
|
||||
@@ -54,6 +67,7 @@ export function useTimelineSSE() {
|
||||
};
|
||||
|
||||
es.onerror = () => {
|
||||
shouldResyncOnOpen = true;
|
||||
es?.close();
|
||||
scheduleReconnect();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user