Skip to content

Presence

PresenceChannel tracks members (users) in a named room. It’s built for “who’s online” features without polling.

import { Hub } from "@mountsqli/realtime";
const hub = new Hub();
const room = hub.presence("project-7");
room.join({ id: "u1", meta: { name: "Ada" } });
room.join({ id: "u2", meta: { name: "Lin" } });
room.members(); // [{ id: "u1", ... }, { id: "u2", ... }]
room.onChange((members) => {
console.log("now online:", members.map((m) => m.id));
});
room.leave("u1"); // fires onChange
type Presence = { id: string; meta?: Record<string, unknown> };

Wire it to SSE in the dev server so a browser sees live presence:

// client subscribes to /live/project-7 (SSE); server publishes presence diffs
  • Key members by a stable user id, not a connection id.
  • Always leave on disconnect to avoid ghost members.
  • Store lightweight meta (name, avatar) — not secrets.
  • Never calling leave — members linger after disconnect.
  • Putting sensitive data in meta.