pub struct ServerHandle { /* private fields */ }Expand description
A clone-able handle that changes a server while it serves.
What a Server hands out from
Server::handle. It is cheap to clone and Send + Sync, so it can be stored in a server’s own state and reached from inside a
tool: a tool that installs another tool is the shape a plugin loader takes.
Every change publishes the registry and then tells each session whose
negotiated profile includes the matching listChanged capability. A session
that never negotiated it hears nothing, so a change is never a message the
peer has no contract for.
§Examples
use std::sync::Arc;
use protocol_droid::application::server::Server;
use protocol_droid::domain::ir::JsonObject;
use protocol_droid::domain::registry::Tool;
let server = Server::builder("plugins").build();
let handle = server.handle();
let fanout = handle
.add_tool(
Tool::new("late", r#"{"type":"object"}"#)?,
Arc::new(|_ctx, _args| Box::pin(async { JsonObject::default() })),
)
.await;
assert!(fanout.is_silent(), "nobody is connected yet");
assert_eq!(server.tool_count(), 1);Implementations§
Source§impl ServerHandle
impl ServerHandle
Sourcepub async fn add_tool(&self, tool: Tool, handler: ToolHandler) -> Fanout
pub async fn add_tool(&self, tool: Tool, handler: ToolHandler) -> Fanout
Adds or replaces a tool, and announces it.
Sourcepub async fn add_restricted_tool(
&self,
registered: Registered,
handler: ToolHandler,
) -> Fanout
pub async fn add_restricted_tool( &self, registered: Registered, handler: ToolHandler, ) -> Fanout
Adds or replaces a tool carrying its own visibility requirements.
A Registered that is not a tool is listed and given no handler, which
is the builder’s rule for the same input.
Sourcepub async fn remove_tool(&self, name: &str) -> Fanout
pub async fn remove_tool(&self, name: &str) -> Fanout
Removes a tool, and announces it if there was one.
Sourcepub async fn add_resource(
&self,
resource: Resource,
reader: ResourceHandler,
) -> Fanout
pub async fn add_resource( &self, resource: Resource, reader: ResourceHandler, ) -> Fanout
Adds or replaces a resource with its reader, and announces it.
Sourcepub async fn remove_resource(&self, uri: &str) -> Fanout
pub async fn remove_resource(&self, uri: &str) -> Fanout
Removes a resource, and announces it if there was one.
Sourcepub async fn add_resource_template(&self, template: ResourceTemplate) -> Fanout
pub async fn add_resource_template(&self, template: ResourceTemplate) -> Fanout
Adds or replaces a resource template, and announces it.
Sourcepub async fn remove_resource_template(&self, uri_template: &str) -> Fanout
pub async fn remove_resource_template(&self, uri_template: &str) -> Fanout
Removes a resource template by its URI template, and announces it.
Sourcepub async fn add_prompt(&self, prompt: Prompt, getter: PromptHandler) -> Fanout
pub async fn add_prompt(&self, prompt: Prompt, getter: PromptHandler) -> Fanout
Adds or replaces a prompt with its getter, and announces it.
Sourcepub async fn remove_prompt(&self, name: &str) -> Fanout
pub async fn remove_prompt(&self, name: &str) -> Fanout
Removes a prompt, and announces it if there was one.
Sourcepub fn subscribe(
&self,
sink: &Arc<dyn DynFrameSink>,
profile: FeatureProfile,
kinds: &[ListKind],
meta: Option<&Value>,
) -> ListSubscription
pub fn subscribe( &self, sink: &Arc<dyn DynFrameSink>, profile: FeatureProfile, kinds: &[ListKind], meta: Option<&Value>, ) -> ListSubscription
Subscribes sink to the list notifications in kinds.
For a transport, once per session: the session’s negotiated profile
gates each notification, and meta — when present — is carried as the
notification’s params._meta. The subscription lasts until the
returned guard is dropped.
Sourcepub async fn notify_resource_updated(&self, uri: &str) -> Fanout
pub async fn notify_resource_updated(&self, uri: &str) -> Fanout
Tells every session subscribed to uri that the resource changed.
notifications/resources/updated, sent to each session that asked for
uri — through resources/subscribe before 2026-07-28, or through
resourceSubscriptions on a listen stream from it on. A resource nobody
subscribed to tells nobody.
Sourcepub fn watch_resource(
&self,
sink: &Arc<dyn DynFrameSink>,
uri: &str,
meta: Option<&Value>,
)
pub fn watch_resource( &self, sink: &Arc<dyn DynFrameSink>, uri: &str, meta: Option<&Value>, )
Adds uri to what sink’s session is told about.
The watch ends with the session’s ListSubscription, or with
Self::unwatch_resource.
Sourcepub fn unwatch_resource(&self, sink: &Arc<dyn DynFrameSink>, uri: &str)
pub fn unwatch_resource(&self, sink: &Arc<dyn DynFrameSink>, uri: &str)
Stops telling sink’s session about uri.
Sourcepub fn watcher_count(&self) -> usize
pub fn watcher_count(&self) -> usize
How many sessions watch at least one resource.
Sourcepub fn is_listed(&self, kind: PrimitiveKind, id: &str) -> bool
pub fn is_listed(&self, kind: PrimitiveKind, id: &str) -> bool
Whether a primitive of kind is listed under id right now.
A read of the live snapshot, so it can be stale the moment it returns if another handle is changing the server concurrently — fine for a toggle, wrong for anything that needs the answer to still hold.
Sourcepub fn subscriber_count(&self) -> usize
pub fn subscriber_count(&self) -> usize
How many sessions are currently subscribed, counting one per kind.