Fix stale task polling by keeping it always active alongside WebSocket
Polling was disabled when wsConnected was true, but if the WS connected while workers hadn't been redeployed (no pub/sub messages flowing), the UI received no updates at all. Polling now always runs at 5s as the baseline. WebSocket provides faster real-time updates on top when available — the two coexist, last writer wins.
This commit is contained in:
parent
f3cbeb3f5e
commit
8d52bdf99d
2 changed files with 5 additions and 6 deletions
|
|
@ -134,11 +134,8 @@ export function TaskIndicator({
|
||||||
}
|
}
|
||||||
}, [wsConnected, wsTasks, taskID]);
|
}, [wsConnected, wsTasks, taskID]);
|
||||||
|
|
||||||
// ----- Polling fallback (only when WS is not connected) -----
|
// ----- Polling (always active as baseline; WS provides faster updates on top) -----
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// If WS is connected, skip polling
|
|
||||||
if (wsConnected) return;
|
|
||||||
|
|
||||||
if (!user || !taskID) {
|
if (!user || !taskID) {
|
||||||
setTaskStatus(null);
|
setTaskStatus(null);
|
||||||
setTaskResult(null);
|
setTaskResult(null);
|
||||||
|
|
@ -153,6 +150,8 @@ export function TaskIndicator({
|
||||||
setTaskResult(null);
|
setTaskResult(null);
|
||||||
|
|
||||||
const pollTaskStatus = async () => {
|
const pollTaskStatus = async () => {
|
||||||
|
// Skip this poll cycle if cancelled locally
|
||||||
|
if (cancelledRef.current) return true;
|
||||||
try {
|
try {
|
||||||
const data = await fetchTaskStatus(user, taskID);
|
const data = await fetchTaskStatus(user, taskID);
|
||||||
const status = data.status as TaskStatus;
|
const status = data.status as TaskStatus;
|
||||||
|
|
@ -214,7 +213,7 @@ export function TaskIndicator({
|
||||||
}, POLLING_INTERVALS.TASK_STATUS_MS);
|
}, POLLING_INTERVALS.TASK_STATUS_MS);
|
||||||
|
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
}, [taskID, user, wsConnected]);
|
}, [taskID, user]);
|
||||||
|
|
||||||
const handleCancel = async () => {
|
const handleCancel = async () => {
|
||||||
if (!user || !taskID || isCancelling) return;
|
if (!user || !taskID || isCancelling) return;
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ export const DEFAULT_FORM_VALUES = {
|
||||||
|
|
||||||
// Polling intervals
|
// Polling intervals
|
||||||
export const POLLING_INTERVALS = {
|
export const POLLING_INTERVALS = {
|
||||||
TASK_STATUS_MS: 30000, // 30 seconds (fallback when WebSocket is unavailable)
|
TASK_STATUS_MS: 5000, // 5 seconds
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
// WebSocket paths
|
// WebSocket paths
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue