From 1c7cb04d2ec1dc04f718de3fdc0a23c420e67429 Mon Sep 17 00:00:00 2001 From: janpeter visser Date: Fri, 1 May 2026 14:54:02 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20startHeartbeat=20=E2=80=94=205s=20inter?= =?UTF-8?q?val=20update=20last=5Fseen=5Fat,=20stops=20on=20record-not-foun?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/presence/heartbeat.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/presence/heartbeat.ts diff --git a/src/presence/heartbeat.ts b/src/presence/heartbeat.ts new file mode 100644 index 0000000..a718a08 --- /dev/null +++ b/src/presence/heartbeat.ts @@ -0,0 +1,25 @@ +import { prisma } from '../prisma.js' + +export function startHeartbeat(opts: { + tokenId: string + intervalMs?: number +}): { stop: () => void } { + const ms = opts.intervalMs ?? 5_000 + + const timer = setInterval(async () => { + try { + const result = await prisma.claudeWorker.updateMany({ + where: { token_id: opts.tokenId }, + data: { last_seen_at: new Date() }, + }) + if (result.count === 0) { + console.warn('[scrum4me-mcp] heartbeat: worker record not found — token may be revoked, stopping heartbeat') + clearInterval(timer) + } + } catch (err) { + console.warn('[scrum4me-mcp] heartbeat error:', err) + } + }, ms) + + return { stop: () => clearInterval(timer) } +}