Matou-Garou / patches /src /hooks /useWorldHeartbeat.ts
Jofthomas's picture
Jofthomas HF staff
bulk2
90cbf22
raw
history blame
1.15 kB
import { useMutation, useQuery } from 'convex/react';
import { useEffect } from 'react';
import { api } from '../../convex/_generated/api';
import { WORLD_HEARTBEAT_INTERVAL } from '../../convex/constants';
export function useWorldHeartbeat() {
const worldStatus = useQuery(api.world.defaultWorldStatus);
const worldId = worldStatus?.worldId;
// Send a periodic heartbeat to our world to keep it alive.
const heartbeat = useMutation(api.world.heartbeatWorld);
useEffect(() => {
const sendHeartBeat = () => {
if (!worldStatus) {
return;
}
// Don't send a heartbeat if we've observed one sufficiently close
// to the present.
if (Date.now() - WORLD_HEARTBEAT_INTERVAL / 2 < worldStatus.lastViewed) {
return;
}
void heartbeat({ worldId: worldStatus.worldId });
};
sendHeartBeat();
const id = setInterval(sendHeartBeat, WORLD_HEARTBEAT_INTERVAL);
return () => clearInterval(id);
// Rerun if the `worldId` changes but not `worldStatus`, since don't want to
// resend the heartbeat whenever its last viewed timestamp changes.
}, [worldId, heartbeat]);
}