Detección de presencia de pestañas
El problema
Sección titulada «El problema»Quieres saber cuántas pestañas de tu app tiene abiertas el usuario ahora mismo — por ejemplo, para mostrar un aviso de “tu sesión también está abierta en otra pestaña” o para evitar tareas duplicadas entre pestañas.
La solución
Sección titulada «La solución»Los eventos internos tab:join y tab:leave avisan cuándo una pestaña se conecta o se desconecta del canal. Con eso alcanza para mantener un registro de pestañas activas.
import { Tabus } from "tabus-js";
const bus = new Tabus("presence");
// Empieza en 1: esta misma pestaña ya cuenta.const activeTabs = new Set<string>([bus.tabId]);
bus.on("tab:join", ({ tabId }) => { activeTabs.add(tabId); renderCount();});
bus.on("tab:leave", ({ tabId }) => { activeTabs.delete(tabId); renderCount();});
function renderCount() { console.log(`Pestañas activas: ${activeTabs.size}`);}
window.addEventListener("beforeunload", () => bus.destroy());Por qué funciona
Sección titulada «Por qué funciona»- Cada instancia de
Tabusemitetab:joinpoco después de crearse, avisando a los peers existentes que una nueva pestaña se unió — ver Eventos de ciclo de vida. - Al llamar
destroy()(por ejemplo, enbeforeunload), esa instancia emitetab:leave, y las demás pestañas descuentan sutabIddel registro. - Como el propio
tabIdse agrega manualmente al set al arrancar, cada pestaña siempre cuenta consigo misma sin depender de recibir su propiotab:join.
Siguiente paso
Sección titulada «Siguiente paso»Combina esto con Logout sincronizado para, por ejemplo, solo forzar un logout global cuando la última pestaña se cierra.
