Skip to main content

DynamicHub

Struct DynamicHub 

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

DynamicHub - an activation that routes to dynamically registered child activations

Unlike hub activations with hardcoded children (like Solar), DynamicHub allows registering activations at runtime via .register().

§Direct Hosting

For a single activation, host it directly:

let solar = Arc::new(Solar::new());
TransportServer::builder(solar, converter).serve().await?;

§Composition

For multiple top-level activations, use DynamicHub:

let hub = DynamicHub::with_namespace("myapp")
    .register(Solar::new())
    .register(Echo::new());

Implementations§

Source§

impl DynamicHub

Source

pub fn new(namespace: impl Into<String>) -> DynamicHub

Create a new DynamicHub with explicit namespace

Unlike single activations which have fixed namespaces, DynamicHub is a composition tool that can be named based on your application. Common choices:

  • “hub” - generic default
  • “substrate” - for substrate server
  • “myapp” - for your application name

The namespace appears in method calls: {namespace}.call, {namespace}.schema

Source

pub fn with_namespace(namespace: impl Into<String>) -> DynamicHub

👎Deprecated since 0.3.0: Use DynamicHub::new(namespace) instead

Deprecated: Use new() with explicit namespace instead

Source

pub fn runtime_namespace(&self) -> &str

Get the runtime namespace for this DynamicHub instance

Source

pub fn registry(&self) -> RwLockReadGuard<'_, PluginRegistry>

Get access to the activation registry

Source

pub fn register<A>(self, activation: A) -> DynamicHub
where A: Activation + Clone,

Register an activation

Source

pub fn register_hub<A>(self, activation: A) -> DynamicHub
where A: Activation + ChildRouter + Clone + 'static,

Register a hub activation that supports nested routing

Hub activations implement ChildRouter, enabling direct nested method calls like hub.solar.mercury.info at the RPC layer (no hub.call indirection).

Source

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

List all methods across all activations

Source

pub fn list_activations_info(&self) -> Vec<ActivationInfo>

List all activations (including this hub itself)

Source

pub fn compute_hash(&self) -> String

Compute hash for cache invalidation

Returns the hash from the recursive plugin schema. This hash changes whenever any method definition or child plugin changes.

Source

pub async fn route( &self, method: &str, params: Value, ) -> Result<Pin<Box<dyn Stream<Item = PlexusStreamItem> + Send>>, PlexusError>

Route a call to the appropriate activation

Source

pub async fn do_resolve_handle( &self, handle: &Handle, ) -> Result<Pin<Box<dyn Stream<Item = PlexusStreamItem> + Send>>, PlexusError>

Resolve a handle using the activation registry

Looks up the activation by its UUID in the registry.

Source

pub fn get_activation_schema(&self, namespace: &str) -> Option<Schema>

Get activation schema

Source

pub fn registry_snapshot(&self) -> PluginRegistrySnapshot

Get a snapshot of the activation registry (safe to use outside locks)

Source

pub fn lookup_plugin(&self, id: Uuid) -> Option<String>

Look up an activation path by its UUID

Source

pub fn lookup_plugin_by_path(&self, path: &str) -> Option<Uuid>

Look up an activation UUID by its path

Source

pub fn list_plugin_schemas(&self) -> Vec<PluginSchema>

Get activation schemas for all activations (including this hub itself)

Source

pub fn list_full_schemas(&self) -> Vec<PluginSchema>

👎Deprecated: Use list_plugin_schemas instead

Deprecated: use list_plugin_schemas instead

Source

pub fn get_method_help(&self, method: &str) -> Option<String>

Get help for a method

Source

pub fn plugin_children(&self) -> Vec<ChildSummary>

Get child activation summaries (for hub functionality) Called by hub-macro when hub flag is set

Source

pub fn into_rpc_module(self) -> Result<RpcModule<()>, RegisterMethodError>

Convert to RPC module

Source

pub fn arc_into_rpc_module( hub: Arc<DynamicHub>, ) -> Result<RpcModule<()>, RegisterMethodError>

Convert Arc to RPC module while keeping the Arc alive

Unlike into_rpc_module, this keeps the Arc reference alive, which is necessary when activations hold Weak references that need to remain upgradeable.

Source§

impl DynamicHub

Source

pub const NAMESPACE: &'static str = "plexus"

Source

pub const PLUGIN_ID: Uuid

Stable plugin instance ID for handle routing

Source

pub fn plugin_id(&self) -> Uuid

Get the plugin’s stable instance ID

Trait Implementations§

Source§

impl Activation for DynamicHub

Source§

type Methods = DynamicHubMethod

Source§

fn namespace(&self) -> &str

Source§

fn version(&self) -> &str

Source§

fn description(&self) -> &str

Short description (max 15 words)
Source§

fn long_description(&self) -> Option<&str>

Long description (optional, for detailed documentation)
Source§

fn methods(&self) -> Vec<&str>

Source§

fn method_help(&self, method: &str) -> Option<String>

Source§

fn call<'life0, 'life1, 'async_trait>( &'life0 self, method: &'life1 str, params: Value, ) -> Pin<Box<dyn Future<Output = Result<Pin<Box<dyn Stream<Item = PlexusStreamItem> + Send>>, PlexusError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, DynamicHub: 'async_trait,

Source§

fn into_rpc_methods(self) -> Methods

Source§

fn plugin_schema(&self) -> PluginSchema

Return this activation’s schema (methods + optional children)
Source§

fn plugin_id(&self) -> Uuid

Stable activation instance ID for handle routing By default generates a deterministic UUID from namespace+major_version Using major version only ensures handles survive minor/patch upgrades (semver)
Source§

fn resolve_handle<'life0, 'life1, 'async_trait>( &'life0 self, _handle: &'life1 Handle, ) -> Pin<Box<dyn Future<Output = Result<Pin<Box<dyn Stream<Item = PlexusStreamItem> + Send>>, PlexusError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Source§

impl ChildRouter for DynamicHub

ChildRouter implementation for DynamicHub

This enables nested routing through registered activations. e.g., hub.call(“solar.mercury.info”) routes to solar → mercury → info

Source§

fn router_namespace(&self) -> &str

Get the namespace of this router (for error messages)
Source§

fn router_call<'life0, 'life1, 'async_trait>( &'life0 self, method: &'life1 str, params: Value, ) -> Pin<Box<dyn Future<Output = Result<Pin<Box<dyn Stream<Item = PlexusStreamItem> + Send>>, PlexusError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, DynamicHub: 'async_trait,

Call a method on this router
Source§

fn get_child<'life0, 'life1, 'async_trait>( &'life0 self, name: &'life1 str, ) -> Pin<Box<dyn Future<Output = Option<Box<dyn ChildRouter>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, DynamicHub: 'async_trait,

Get a child activation instance by name for nested routing
Source§

impl Clone for DynamicHub

Source§

fn clone(&self) -> DynamicHub

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DynamicHubRpcServer for DynamicHub

Source§

fn call<'life0, 'async_trait>( &'life0 self, pending: PendingSubscriptionSink, method: String, params: Option<Value>, ) -> Pin<Box<dyn Future<Output = Result<(), SubscriptionError>> + Send + 'async_trait>>
where 'life0: 'async_trait, DynamicHub: 'async_trait,

Route a call to a registered activation
Source§

fn hash<'life0, 'async_trait>( &'life0 self, pending: PendingSubscriptionSink, ) -> Pin<Box<dyn Future<Output = Result<(), SubscriptionError>> + Send + 'async_trait>>
where 'life0: 'async_trait, DynamicHub: 'async_trait,

Get Plexus RPC server configuration hash (from the recursive schema) This hash changes whenever any method or child activation changes. It’s computed from the method hashes rolled up through the schema tree.
Source§

fn hashes<'life0, 'async_trait>( &'life0 self, pending: PendingSubscriptionSink, ) -> Pin<Box<dyn Future<Output = Result<(), SubscriptionError>> + Send + 'async_trait>>
where 'life0: 'async_trait, DynamicHub: 'async_trait,

Get plugin hashes for cache validation (lightweight alternative to full schema)
Source§

fn into_rpc(self) -> RpcModule<Self>

Collects all the methods and subscriptions defined in the trait and adds them into a single RpcModule.

Auto Trait Implementations§

Blanket Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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
Source§

impl<T> MaybeSend for T
where T: Send,