runar_node 0.1.0

Runar Node implementation
Documentation
Runar Node
==========

The core runtime for the Runar framework. A Node manages service lifecycles,
routes requests, publishes/consumes events, and coordinates networking.

Core principles
---------------

- **Service-first design**: clear lifecycle (init → start → stop), strong service boundaries
- **Typed requests/events**: explicit schemas; predictable extraction and routing
- **Secure by default**: QUIC/TLS, X.509 (P-256), envelope encryption integrations
- **Distributed by design**: discovery, remote handlers, load balancing
- **Observability**: structured logging with component/context

Features
--------

- Service registry and lifecycle management
- Local and remote request routing with load balancing
- Event publish/subscribe with retained delivery options
- QUIC networking with strict certificate validation
- Peer discovery (multicast) and capability propagation
- Retained event store and wildcard subscriptions
- Pluggable label resolver and keystore integrations

Quick start
-----------

```rust
use runar_node::{Node, NodeConfig};

# async fn run() -> anyhow::Result<()> {
let config = NodeConfig::new("my-node", "default-network");
let mut node = Node::new(config).await?;

// Add your services here (see runar-macros for easy definitions)
// node.add_service(MyService::new()).await?;

node.start().await?;
node.wait_for_services_to_start().await?;

// Make a local request (service must register an action at this path)
// let resp = node.request::<()> ("my-service/ping", None).await?;

node.stop().await?;
Ok(())
# }
```

Defining services (with macros)
-------------------------------

Use `runar_macros` to declare services and actions succinctly. See that crate’s
README for a full example. Conceptually:

```rust
use anyhow::Result;
use runar_macros::{service, action};

#[service(name = "EchoService", path = "echo-service", description = "Echo", version = "1.0.0")]
struct EchoService;

#[service]
impl EchoService {
    #[action]
    async fn ping(&self) -> Result<String> { Ok("pong".to_string()) }
}
```

Networking
----------

- QUIC transport with TLS certificates issued by the mobile CA (P-256)
- Discovery providers (e.g., multicast) to find peers and exchange capabilities
- Remote services automatically registered via capabilities propagation

Security
--------

- Certificates generated/validated by `runar-keys` (X.509, P-256)
- Optional envelope encryption for payloads via `runar-serializer`
- Strict server-name verification and time-bounded cert validation

Logging
-------

Structured logging via `runar_common::logging` with component prefixes and
context (action/event paths). Use the provided macros in `runar_macros_common`.

MSRV
----

Rust 1.70.0

License
-------

MIT. See `LICENSE`.