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óduloTabus, la única clase pública
Sección titulada «Tabus, la única clase pública»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"usaBroadcastTransport; si no, usaMemoryTransport. Ver Transportes. - Deduplica mensajes: compara
msg.tabIdcontra su propiotabIdpara que la pestaña que emite un evento nunca se lo entregue a sí misma. - Difiere
tab:joinconsetTimeout(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 detab:join, ni ese evento nitab:leavese 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.
ITransport, el contrato de transporte
Sección titulada «ITransport, el contrato de transporte»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 nativaBroadcastChannel. Comunica pestañas, ventanas y workers reales del mismo origen.MemoryTransport: fallback en memoria que se activa cuandoBroadcastChannelno existe (Node, SSR, navegadores muy antiguos). Solo funciona dentro del mismo proceso.
Ambos se explican en detalle, con sus diferencias y limitaciones, en Transportes.
Siguiente paso
Sección titulada «Siguiente paso»- Transportes: cuándo se usa cada uno y qué implica el fallback.
- Eventos de ciclo de vida:
tab:join,tab:leavey por qué están diferidos. - Throttling: cómo limitar la frecuencia de
emit().
