import type { PresenceUpdate } from "../client/client"; type DedupedPresenceGroup = { representative: string; state: any | null; timestamp: number | null; members: Set; }; export interface CreateDedupedPresenceHandlerOptions { getGroupId: (connectionId: string) => Promise; onUpdate: (groups: Map) => void; } export function createDedupedPresenceHandler( options: CreateDedupedPresenceHandlerOptions ) { const { getGroupId, onUpdate } = options; const groupMap = new Map(); const connectionToGroup = new Map(); return async (update: PresenceUpdate) => { const { connectionId, type, timestamp = Date.now() } = update; let groupId = connectionToGroup.get(connectionId); if (!groupId) { groupId = (await getGroupId(connectionId)) ?? `conn:${connectionId}`; connectionToGroup.set(connectionId, groupId); } let group = groupMap.get(groupId); if (type === "join") { if (!group) { group = { representative: connectionId, state: null, timestamp: null, members: new Set(), }; groupMap.set(groupId, group); } group.members.add(connectionId); } if (type === "leave" && group) { group.members.delete(connectionId); if (group.members.size === 0) { groupMap.delete(groupId); } else if (group.representative === connectionId) { group.representative = group.members.values().next().value!; } } if (type === "state" && group) { const { state } = update; if (!group.timestamp || timestamp >= group.timestamp) { group.state = state; group.timestamp = timestamp; group.representative = connectionId; } } onUpdate(groupMap); }; }