hub-core
Core infrastructure for building Plexus RPC services with optional dynamic routing.
Overview
hub-core provides the foundation for building Plexus RPC services with hierarchical routing and schema introspection:
- Activation - Trait for implementing Plexus RPC services/plugins
- DynamicHub - Optional routing layer for hosting multiple activations under one namespace
- PlexusMcpBridge - MCP server integration via rmcp
- Handle - Typed references to plugin method results
- hub-macro - Procedural macro for generating activation boilerplate
Key Insight: Any activation can be hosted directly as a Plexus RPC server. DynamicHub is just an activation with
.register()- it's not required infrastructure.
Note:
Plexushas been renamed toDynamicHubto clarify that it's an activation with dynamic registration, not special infrastructure. ThePlexustype alias remains for backwards compatibility but is deprecated.
Quick Start
Single Activation (Direct Hosting)
For a single Plexus RPC service, host it directly without DynamicHub:
use Echo;
use Arc;
// Single activation - no DynamicHub needed
let echo = new;
// Use with hub-transport or your own Plexus RPC server
Multiple Activations (Composition)
For composing multiple Plexus RPC activations under one namespace, use DynamicHub:
use DynamicHub;
use ;
use Arc;
// Create a dynamic hub with explicit namespace and register your activations
let hub = new;
// Route calls to activations
let stream = hub.route.await?;
When to use DynamicHub: Only when you need to compose multiple top-level activations. For a single service, host the activation directly.
Migration Note:
DynamicHub::new()now requires an explicit namespace. Choose a namespace that identifies your application (e.g., "myapp", "substrate", "hub"). ThePlexustype alias still works but is deprecated.
Creating Activations
Use the hub-macro crate to generate activation implementations:
use hub_methods;
use stream;
;
MCP Bridge
hub-core includes an MCP server bridge that exposes Plexus RPC activations as MCP tools.
Single Activation
use ;
use Arc;
// Bridge a single activation directly
let echo = new;
let bridge = new;
// Use with rmcp server
Multiple Activations (via DynamicHub)
use ;
use Arc;
let hub = new;
let bridge = new;
// Use with rmcp server
Important: PlexusMcpBridge works with any activation. You can bridge a single activation directly, or use DynamicHub to expose multiple activations.
Architecture Patterns
Hub Activations
Any Plexus RPC activation can route to children by implementing ChildRouter. This enables nested method routing without DynamicHub:
- Solar - Routes to planets (hardcoded children)
- DynamicHub - Routes to registered activations (dynamic children via
.register()) - Your custom hub - Can route to any children you define
// Solar is a hub activation with hardcoded children
let solar = new;
// Supports: solar.mercury.info, solar.earth.luna.info
// DynamicHub is a hub activation with dynamic children
let hub = new;
// Supports: app.solar.mercury.info, app.echo.echo
When to Use DynamicHub
Use DynamicHub when:
- You need to compose multiple top-level Plexus RPC activations
- You want dynamic registration (add activations at runtime)
- You're building a multi-service Plexus RPC server (like substrate)
Don't use DynamicHub when:
- You have a single Plexus RPC service (host it directly)
- Your activation already routes to children (like Solar)
- You want a simpler deployment
Direct Activation Hosting
The recommended pattern for single Plexus RPC services is direct hosting:
// Good: Direct hosting for single Plexus RPC service
let my_service = new;
builder.serve.await?;
// Unnecessary: DynamicHub for single service
let hub = new;
builder.serve.await?;
Example Activations
hub-core includes two minimal example activations:
- health - Health check endpoint (manual Activation impl)
- echo - Echo messages back (hub-macro generated)
See src/activations/ for implementation examples.
License
AGPL-3.0-only