iroh_services/
protocol.rs1use anyhow::Result;
2use irpc::{
3 channel::{mpsc, oneshot},
4 rpc_requests,
5};
6use rcan::Rcan;
7use serde::{Deserialize, Serialize};
8use uuid::Uuid;
9
10use crate::{caps::Caps, net_diagnostics::DiagnosticsReport};
11
12pub const ALPN: &[u8] = b"/iroh/n0des/1";
14
15pub type IrohServicesClient = irpc::Client<IrohServicesProtocol>;
16
17#[rpc_requests(message = ServicesMessage)]
18#[derive(Debug, Serialize, Deserialize)]
19#[allow(clippy::large_enum_variant)]
20pub enum IrohServicesProtocol {
21 #[rpc(tx=oneshot::Sender<()>)]
22 Auth(Auth),
23 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
24 PutMetrics(PutMetrics),
25 #[rpc(tx=oneshot::Sender<Pong>)]
26 Ping(Ping),
27
28 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
29 PutNetworkDiagnostics(PutNetworkDiagnostics),
30
31 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
32 GrantCap(GrantCap),
33
34 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
35 NameEndpoint(NameEndpoint),
36 #[rpc(tx=oneshot::Sender<RemoteResult<Option<SetLogLevel>>>)]
37 GetLogLevel(GetLogLevel),
38}
39
40#[rpc_requests(message = ClientHostMessage)]
43#[derive(Debug, Serialize, Deserialize)]
44#[allow(clippy::large_enum_variant)]
45pub enum ClientHostProtocol {
46 #[rpc(tx=oneshot::Sender<()>)]
47 Auth(Auth),
48 #[rpc(tx=oneshot::Sender<RemoteResult<DiagnosticsReport>>)]
49 RunNetworkDiagnostics(RunNetworkDiagnostics),
50 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
51 SetLogLevel(SetLogLevel),
52 #[rpc(tx=mpsc::Sender<RemoteResult<Vec<u8>>>)]
53 FetchLogs(FetchLogs),
54}
55
56pub type RemoteResult<T> = Result<T, RemoteError>;
57
58#[derive(Clone, Serialize, Deserialize, thiserror::Error, Debug)]
59pub enum RemoteError {
60 #[error("Missing capability: {}", _0.to_strings().join(", "))]
61 MissingCapability(Caps),
62 #[error("Unauthorized: {}", _0)]
63 AuthError(String),
64 #[error("Internal server error")]
65 InternalServerError,
66}
67
68#[derive(Debug, Serialize, Deserialize)]
70pub struct Auth {
71 pub caps: Rcan<Caps>,
72}
73
74#[derive(Debug, Serialize, Deserialize)]
76pub struct PutMetrics {
77 pub session_id: Uuid,
78 pub update: iroh_metrics::encoding::Update,
79}
80
81#[derive(Debug, Serialize, Deserialize)]
83pub struct Ping {
84 pub req_id: [u8; 16],
85}
86
87#[derive(Debug, Serialize, Deserialize)]
89pub struct Pong {
90 pub req_id: [u8; 16],
91}
92
93#[derive(Debug, Serialize, Deserialize)]
95pub struct PutNetworkDiagnostics {
96 pub report: crate::net_diagnostics::DiagnosticsReport,
97}
98
99#[derive(Debug, Serialize, Deserialize)]
103pub struct RunNetworkDiagnostics;
104
105#[derive(Debug, Serialize, Deserialize)]
108pub struct GrantCap {
109 pub cap: Rcan<Caps>,
110}
111
112#[derive(Debug, Serialize, Deserialize)]
114pub struct NameEndpoint {
115 pub name: String,
116}
117
118#[derive(Debug, Serialize, Deserialize)]
122pub struct FetchLogs {
123 #[serde(default)]
127 pub max_bytes: Option<u64>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct SetLogLevel {
137 pub directives: String,
140 pub expires_in_secs: Option<u64>,
143 #[serde(default)]
148 pub revert_to: Option<String>,
149}
150
151#[derive(Debug, Serialize, Deserialize)]
155pub struct GetLogLevel;