Compare commits

...

1 Commits

Author SHA1 Message Date
Peter Steinberger
be4435e7cf fix: track connection time for watchdog (fixes #99) 2026-01-03 19:55:45 +00:00

View File

@ -921,6 +921,7 @@ export async function monitorWebProvider(
let heartbeat: NodeJS.Timeout | null = null; let heartbeat: NodeJS.Timeout | null = null;
let watchdogTimer: NodeJS.Timeout | null = null; let watchdogTimer: NodeJS.Timeout | null = null;
let lastMessageAt: number | null = null; let lastMessageAt: number | null = null;
let connectionEstablishedAt: number | null = null;
let handledMessages = 0; let handledMessages = 0;
let _lastInboundMsg: WebInboundMsg | null = null; let _lastInboundMsg: WebInboundMsg | null = null;
@ -1388,7 +1389,8 @@ export async function monitorWebProvider(
}); });
status.connected = true; status.connected = true;
status.lastConnectedAt = Date.now(); connectionEstablishedAt = Date.now();
status.lastConnectedAt = connectionEstablishedAt;
status.lastEventAt = status.lastConnectedAt; status.lastEventAt = status.lastConnectedAt;
status.lastError = null; status.lastError = null;
emitStatus(); emitStatus();
@ -1448,33 +1450,39 @@ export async function monitorWebProvider(
// Watchdog: Auto-restart if no messages received for MESSAGE_TIMEOUT_MS // Watchdog: Auto-restart if no messages received for MESSAGE_TIMEOUT_MS
watchdogTimer = setInterval(() => { watchdogTimer = setInterval(() => {
if (lastMessageAt) { const lastActivityAt = Math.max(
const timeSinceLastMessage = Date.now() - lastMessageAt; connectionEstablishedAt ?? 0,
if (timeSinceLastMessage > MESSAGE_TIMEOUT_MS) { lastMessageAt ?? 0,
const minutesSinceLastMessage = Math.floor( );
timeSinceLastMessage / 60000, if (!lastActivityAt) return;
); const timeSinceLastActivity = Date.now() - lastActivityAt;
heartbeatLogger.warn( if (timeSinceLastActivity > MESSAGE_TIMEOUT_MS) {
{ const minutesSinceLastActivity = Math.floor(
connectionId, timeSinceLastActivity / 60000,
minutesSinceLastMessage, );
lastMessageAt: new Date(lastMessageAt), heartbeatLogger.warn(
messagesHandled: handledMessages, {
}, connectionId,
"Message timeout detected - forcing reconnect", minutesSinceLastActivity,
); connectionEstablishedAt: connectionEstablishedAt
whatsappHeartbeatLog.warn( ? new Date(connectionEstablishedAt)
`No messages received in ${minutesSinceLastMessage}m - restarting connection`, : null,
); lastMessageAt: lastMessageAt ? new Date(lastMessageAt) : null,
void closeListener().catch((err) => { messagesHandled: handledMessages,
logVerbose(`Close listener failed: ${formatError(err)}`); },
}); // Trigger reconnect "Message timeout detected - forcing reconnect",
listener.signalClose?.({ );
status: 499, whatsappHeartbeatLog.warn(
isLoggedOut: false, `No messages received in ${minutesSinceLastActivity}m - restarting connection`,
error: "watchdog-timeout", );
}); void closeListener().catch((err) => {
} logVerbose(`Close listener failed: ${formatError(err)}`);
}); // Trigger reconnect
listener.signalClose?.({
status: 499,
isLoggedOut: false,
error: "watchdog-timeout",
});
} }
}, WATCHDOG_CHECK_MS); }, WATCHDOG_CHECK_MS);
} }