Files
openclaw/src/channels/typing-lifecycle.ts
2026-02-25 02:16:03 +00:00

56 lines
1009 B
TypeScript

type AsyncTick = () => Promise<void> | void;
export type TypingKeepaliveLoop = {
tick: () => Promise<void>;
start: () => void;
stop: () => void;
isRunning: () => boolean;
};
export function createTypingKeepaliveLoop(params: {
intervalMs: number;
onTick: AsyncTick;
}): TypingKeepaliveLoop {
let timer: ReturnType<typeof setInterval> | undefined;
let tickInFlight = false;
const tick = async () => {
if (tickInFlight) {
return;
}
tickInFlight = true;
try {
await params.onTick();
} finally {
tickInFlight = false;
}
};
const start = () => {
if (params.intervalMs <= 0 || timer) {
return;
}
timer = setInterval(() => {
void tick();
}, params.intervalMs);
};
const stop = () => {
if (!timer) {
return;
}
clearInterval(timer);
timer = undefined;
tickInFlight = false;
};
const isRunning = () => timer !== undefined;
return {
tick,
start,
stop,
isRunning,
};
}