trellis
Version:
Agentic State Engine — event-sourced causal graph with branching, decision traces, and realtime sync for AI-native applications
49 lines (47 loc) • 1.05 kB
JavaScript
// src/react/realtime.ts
import { useEffect, useState, useSyncExternalStore } from "react";
function useSignal(signal) {
return useSyncExternalStore(
(onStoreChange) => signal.subscribe(() => onStoreChange()),
() => signal.peek(),
() => signal.peek()
);
}
function useRoom(create, deps = []) {
const [room, setRoom] = useState(null);
const [presence, setPresence] = useState([]);
useEffect(() => {
const r = create();
setRoom(r);
const unsub = r.presenceSignal.subscribe(setPresence);
return () => {
unsub();
r.leave();
setRoom(null);
setPresence([]);
};
}, deps);
return {
room,
presence,
others: presence.filter((p) => !p.self)
};
}
function usePresence(room) {
const [presence, setPresence] = useState(
() => room?.getPresence() ?? []
);
useEffect(() => {
if (!room) {
setPresence([]);
return;
}
return room.presenceSignal.subscribe(setPresence);
}, [room]);
return presence;
}
export {
useSignal,
useRoom,
usePresence
};