Skip to main content

SubscriptionRegistry

Struct SubscriptionRegistry 

Source
pub struct SubscriptionRegistry { /* private fields */ }
Expand description

Per-URI registry of subscribed peers with broadcast helpers.

Cheap to clone (all state is behind an Arc<Mutex<...>> externally — typically Arc<SubscriptionRegistry> on the server). Methods take &self because the internal Mutex provides interior mutability.

Implementations§

Source§

impl SubscriptionRegistry

Source

pub fn new() -> Self

Build an empty registry.

Source

pub fn subscribe(&self, uri: &str, peer: Peer<RoleServer>)

Record a new subscription. See the module-level docs for the duplicate-subscribe behaviour: two calls with the same peer land two entries in the list.

Source

pub fn unsubscribe(&self, uri: &str, _peer: &Peer<RoleServer>) -> usize

Remove all subscriptions for uri. Returns the number of entries that were removed.

_peer is accepted for API symmetry with the MCP protocol (the incoming unsubscribe request carries no peer identity beyond “the session issuing the call”), but isn’t used for matching.

Source

pub fn subscribers_for(&self, uri: &str) -> Vec<Peer<RoleServer>>

Return a snapshot of all peers subscribed to uri. Useful for tests and for the notify helpers below, which want to release the mutex before doing any async work.

Source

pub fn subscribed_uris(&self) -> Vec<String>

Return the set of URIs that currently have at least one subscriber.

Source

pub fn clear(&self)

Drop all subscriptions for every URI. Invoked when the server is shutting down or a full workspace reset has happened.

Source

pub fn notify_updated(&self, uri: &str)

Fire a notifications/resources/updated for uri to every current subscriber. Sends happen in detached tokio tasks so the caller doesn’t wait on the channel.

If a send fails (typically because the peer disconnected) we log the error at debug level but do not prune the dead peer — see the module-level “Tradeoffs” note for why. Over very long-lived servers this can accumulate stale entries in the registry.

No-op when the caller is outside a tokio runtime or the registry has no subscribers for uri.

Source

pub fn notify_list_changed(&self)

Fire a notifications/resources/list_changed broadcast to every subscribed peer (across all URIs). Called when tables are added or dropped, or saved queries created / deleted.

Deduplicates peers across URIs so a client subscribed to three URIs only receives one list-changed notification.

Trait Implementations§

Source§

impl Debug for SubscriptionRegistry

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SubscriptionRegistry

Source§

fn default() -> SubscriptionRegistry

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more