Fox Events Fox Events

Trail (Histórico)

Histórico de eventos por canal: publicados, recebidos e desinscrições. Limite opcional com maxHistory e toText() para debug.

Uso básico

ts
import { Fox } from "fox-events";

const channel = Fox.channel<{ userId: string }>("user:login");

channel.emit({ userId: "u-1" });
channel.on((payload) => console.log(payload.userId));

const snapshot = channel.trail();
console.log(snapshot.published);   // EventTrail<T>[]
console.log(snapshot.received);   // EventTrail<T>[]
console.log(snapshot.unsubscribed); // UnsubscribedHistory[]
console.log(snapshot.toText());   // string formatada para logs

maxHistory

Limita quantos itens são mantidos em cada lista. Itens antigos são removidos após cada registro.

ts
const channel = Fox.channel<{ id: string }>("user:action", {
  maxHistory: 100,
});

channel.emit({ id: "1" });
// ... após 100+ publicados, só os últimos 100 permanecem
const snap = channel.trail();
console.log(snap.published.length); // <= 100

clearTrail

Zera todo o histórico daquele canal.

ts
channel.clearTrail();
const snap = channel.trail();
console.log(snap.published.length); // 0

Trail global

Para observar todos os eventos da página em um único lugar (vários canais, uma lista), inscreva-se em cada canal e acumule as entradas em um estado único. Exemplo:

ts
const canais = [
  { nome: "app:login", channel: loginChannel },
  { nome: "app:cart", channel: cartChannel },
  { nome: "app:theme", channel: themeChannel },
];

const [entradas, setEntradas] = useState<Array<{ canal: string; payload: unknown; at: number }>>([]);
const MAX = 50;

const adicionar = (canal: string, payload: unknown) => {
  setEntradas((prev) => [...prev.slice(-(MAX - 1)), { canal, payload, at: Date.now() }]);
};

useEffect(() => {
  const unsubs = canais.map(({ nome, channel }) =>
    channel.on((payload: unknown) => adicionar(nome, payload))
  );
  return () => unsubs.forEach((u) => u());
}, []);

Assim você tem uma lista unificada (canal + payload + horário) para debug ou para exibir ao usuário. O limite (MAX) evita crescimento infinito.

Tipos

Exportados de fox-events:

  • EventTrail<T>{ name: string; payload: T; timestamp: number }
  • UnsubscribedHistory{ name: string; timestamp: number }
  • HistorySnapshot<T>{ published: EventTrail<T>[]; received: EventTrail<T>[]; unsubscribed: UnsubscribedHistory[]; toText(): string }
ts
import type { EventTrail, UnsubscribedHistory, HistorySnapshot } from "fox-events";