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,23 +1450,30 @@ 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;
if (timeSinceLastActivity > MESSAGE_TIMEOUT_MS) {
const minutesSinceLastActivity = Math.floor(
timeSinceLastActivity / 60000,
); );
heartbeatLogger.warn( heartbeatLogger.warn(
{ {
connectionId, connectionId,
minutesSinceLastMessage, minutesSinceLastActivity,
lastMessageAt: new Date(lastMessageAt), connectionEstablishedAt: connectionEstablishedAt
? new Date(connectionEstablishedAt)
: null,
lastMessageAt: lastMessageAt ? new Date(lastMessageAt) : null,
messagesHandled: handledMessages, messagesHandled: handledMessages,
}, },
"Message timeout detected - forcing reconnect", "Message timeout detected - forcing reconnect",
); );
whatsappHeartbeatLog.warn( whatsappHeartbeatLog.warn(
`No messages received in ${minutesSinceLastMessage}m - restarting connection`, `No messages received in ${minutesSinceLastActivity}m - restarting connection`,
); );
void closeListener().catch((err) => { void closeListener().catch((err) => {
logVerbose(`Close listener failed: ${formatError(err)}`); logVerbose(`Close listener failed: ${formatError(err)}`);
@ -1475,7 +1484,6 @@ export async function monitorWebProvider(
error: "watchdog-timeout", error: "watchdog-timeout",
}); });
} }
}
}, WATCHDOG_CHECK_MS); }, WATCHDOG_CHECK_MS);
} }