pub struct Broker {
inner: Mutex<BrokerInner>,
}Expand description
The central pub/sub broker for WaveEvents.
Fields§
§inner: Mutex<BrokerInner>Implementations§
Source§impl Broker
impl Broker
pub fn new() -> Self
pub fn set_client(&self, client: Box<dyn WpsClient>)
Sourcepub fn subscribe(&self, route_id: &str, sub: SubscriptionRequest)
pub fn subscribe(&self, route_id: &str, sub: SubscriptionRequest)
Subscribe a route to an event, optionally scoped.
Replay-on-subscribe: after registering the route, immediately deliver any persisted events that match the subscription. Lets late subscribers catch up on the most recent state without waiting for the next publish — closes the race for live-log streaming where the frontend learns the tool_use_id only after the wrapper has already finished publishing.
Sourcefn replay_to_route(
inner: &mut BrokerInner,
route_id: &str,
sub: &SubscriptionRequest,
)
fn replay_to_route( inner: &mut BrokerInner, route_id: &str, sub: &SubscriptionRequest, )
Deliver any persisted events matching sub to route_id.
Called inside subscribe so replay happens atomically under
the broker lock — no live event published mid-replay can
interleave.
Once-per-(route, event, scope). The frontend
(frontend/app/store/wps.ts) flushes eventsub for the
shared ws-main route on every listener add/remove. Replaying
persisted history on each of those flushes would re-emit
completed bash logs every pane mount / tab switch / sibling
subscription. The replayed set tracks tuples that already
received their backfill and short-circuits subsequent
resubscribes. Cleared per-route in unsubscribe_all so a true
reconnect (route dropped + re-registered) gets a fresh replay.
Star-scope replay is intentionally not implemented (rare, requires scanning every persist key; can add later if needed).
Sourcepub fn unsubscribe(&self, route_id: &str, event_name: &str)
pub fn unsubscribe(&self, route_id: &str, event_name: &str)
Unsubscribe a route from a specific event.
Sourcepub fn unsubscribe_all(&self, route_id: &str)
pub fn unsubscribe_all(&self, route_id: &str)
Unsubscribe a route from all events.
Also clears the replayed tracker for this route so a future
reconnect (route registers again from scratch) gets a fresh
replay of persisted history. Without this, a transient
WebSocket drop would silently lose all subsequent replay.
fn unsubscribe_nolock(inner: &mut BrokerInner, route_id: &str, event_name: &str)
Sourcepub fn read_event_history(
&self,
event_type: &str,
scope: &str,
max_items: usize,
) -> Vec<WaveEvent>
pub fn read_event_history( &self, event_type: &str, scope: &str, max_items: usize, ) -> Vec<WaveEvent>
Read persisted event history.
fn persist_event(inner: &mut BrokerInner, event: &WaveEvent)
fn get_matching_routes(inner: &BrokerInner, event: &WaveEvent) -> Vec<String>
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Broker
impl RefUnwindSafe for Broker
impl Send for Broker
impl Sync for Broker
impl Unpin for Broker
impl UnwindSafe for Broker
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.