Ir al contenido

Cómo funciona

tabus-js tiene una arquitectura pequeña y deliberadamente simple: una única clase pública que delega el envío/recepción de mensajes en un transporte intercambiable.

Tabus<Events>
└── ITransport
├── BroadcastTransport — envuelve BroadcastChannel nativo
└── MemoryTransport — Map de listeners a nivel de módulo

Tabus es el punto de entrada y la única clase que expone la librería. Sus responsabilidades:

  • Elige el transporte al construirse: si typeof BroadcastChannel !== "undefined" usa BroadcastTransport; si no, usa MemoryTransport. Ver Transportes.
  • Deduplica mensajes: compara msg.tabId contra su propio tabId para que la pestaña que emite un evento nunca se lo entregue a sí misma.
  • Difiere tab:join con setTimeout(0), para que quien construye la instancia pueda registrar handlers de forma síncrona antes de que se emita el aviso a los peers. Ver Eventos de ciclo de vida.
  • Protege destroy() con una bandera interna: si la instancia se destruye antes de que dispare el timer de tab:join, ni ese evento ni tab:leave se envían.
  • Throttlea emit() con una estrategia leading + trailing edge. Ver Throttling.

Para el detalle completo de cada miembro público (on, off, emit, destroy, tabId), consulta la referencia de la clase Tabus.

Todo el envío/recepción de mensajes pasa por una interfaz común:

interface ITransport {
send(msg: TabusMessage): void;
onMessage(listener: (msg: TabusMessage) => void): void;
destroy(): void;
}

tabus-js incluye dos implementaciones listas para usar:

  • BroadcastTransport: un envoltorio delgado sobre la API nativa BroadcastChannel. Comunica pestañas, ventanas y workers reales del mismo origen.
  • MemoryTransport: fallback en memoria que se activa cuando BroadcastChannel no existe (Node, SSR, navegadores muy antiguos). Solo funciona dentro del mismo proceso.

Ambos se explican en detalle, con sus diferencias y limitaciones, en Transportes.