iroh_n0des/
protocol.rs

1use anyhow::Result;
2use irpc::{channel::oneshot, rpc_requests};
3use rcan::Rcan;
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7use crate::caps::Caps;
8
9pub const ALPN: &[u8] = b"/iroh/n0des/1";
10
11pub type N0desClient = irpc::Client<N0desProtocol>;
12
13#[rpc_requests(message = N0desMessage)]
14#[derive(Debug, Serialize, Deserialize)]
15#[allow(clippy::large_enum_variant)]
16pub enum N0desProtocol {
17    #[rpc(tx=oneshot::Sender<()>)]
18    Auth(Auth),
19    #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
20    PutMetrics(PutMetrics),
21    #[rpc(tx=oneshot::Sender<Pong>)]
22    Ping(Ping),
23}
24
25pub type RemoteResult<T> = Result<T, RemoteError>;
26
27#[derive(Serialize, Deserialize, thiserror::Error, Debug)]
28pub enum RemoteError {
29    #[error("Missing capability: {}", _0.to_strings().join(", "))]
30    MissingCapability(Caps),
31    #[error("Internal server error")]
32    InternalServerError,
33}
34
35/// Authentication on first request
36#[derive(Debug, Serialize, Deserialize)]
37pub struct Auth {
38    pub caps: Rcan<Caps>,
39}
40
41/// Request to store the given metrics data
42#[derive(Debug, Serialize, Deserialize)]
43pub struct PutMetrics {
44    pub session_id: Uuid,
45    pub update: iroh_metrics::encoding::Update,
46}
47
48/// Simple ping requests
49#[derive(Debug, Serialize, Deserialize)]
50pub struct Ping {
51    pub req: [u8; 32],
52}
53
54/// Simple ping response
55#[derive(Debug, Serialize, Deserialize)]
56pub struct Pong {
57    pub req: [u8; 32],
58}