1use anyhow::Result;
2use irpc::{channel::oneshot, rpc_requests};
3use rcan::Rcan;
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7use crate::{caps::Caps, net_diagnostics::DiagnosticsReport};
8
9pub const ALPN: &[u8] = b"/iroh/n0des/1";
11
12pub type IrohServicesClient = irpc::Client<IrohServicesProtocol>;
13
14#[rpc_requests(message = ServicesMessage)]
15#[derive(Debug, Serialize, Deserialize)]
16#[allow(clippy::large_enum_variant)]
17pub enum IrohServicesProtocol {
18 #[rpc(tx=oneshot::Sender<()>)]
19 Auth(Auth),
20 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
21 PutMetrics(PutMetrics),
22 #[rpc(tx=oneshot::Sender<Pong>)]
23 Ping(Ping),
24
25 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
26 PutNetworkDiagnostics(PutNetworkDiagnostics),
27
28 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
29 GrantCap(GrantCap),
30
31 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
32 NameEndpoint(NameEndpoint),
33
34 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
35 PutLogs(PutLogs),
36}
37
38#[rpc_requests(message = ClientHostMessage)]
41#[derive(Debug, Serialize, Deserialize)]
42#[allow(clippy::large_enum_variant)]
43pub enum ClientHostProtocol {
44 #[rpc(tx=oneshot::Sender<()>)]
45 Auth(Auth),
46 #[rpc(tx=oneshot::Sender<RemoteResult<DiagnosticsReport>>)]
47 RunNetworkDiagnostics(RunNetworkDiagnostics),
48 #[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
49 SetLogLevel(SetLogLevel),
50}
51
52pub type RemoteResult<T> = Result<T, RemoteError>;
53
54#[derive(Clone, Serialize, Deserialize, thiserror::Error, Debug)]
55pub enum RemoteError {
56 #[error("Missing capability: {}", _0.to_strings().join(", "))]
57 MissingCapability(Caps),
58 #[error("Unauthorized: {}", _0)]
59 AuthError(String),
60 #[error("Internal server error")]
61 InternalServerError,
62}
63
64#[derive(Debug, Serialize, Deserialize)]
66pub struct Auth {
67 pub caps: Rcan<Caps>,
68}
69
70#[derive(Debug, Serialize, Deserialize)]
72pub struct PutMetrics {
73 pub session_id: Uuid,
74 pub update: iroh_metrics::encoding::Update,
75}
76
77#[derive(Debug, Serialize, Deserialize)]
79pub struct Ping {
80 pub req_id: [u8; 16],
81}
82
83#[derive(Debug, Serialize, Deserialize)]
85pub struct Pong {
86 pub req_id: [u8; 16],
87}
88
89#[derive(Debug, Serialize, Deserialize)]
91pub struct PutNetworkDiagnostics {
92 pub report: crate::net_diagnostics::DiagnosticsReport,
93}
94
95#[derive(Debug, Serialize, Deserialize)]
99pub struct RunNetworkDiagnostics;
100
101#[derive(Debug, Serialize, Deserialize)]
104pub struct GrantCap {
105 pub cap: Rcan<Caps>,
106}
107
108#[derive(Debug, Serialize, Deserialize)]
110pub struct NameEndpoint {
111 pub name: String,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
123pub struct LogLine {
124 pub timestamp: String,
126 pub level: String,
128 pub target: String,
130 pub fields: Vec<(String, FieldValue)>,
133 pub spans: Vec<SpanInfo>,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
139pub struct SpanInfo {
140 pub name: String,
141 pub fields: Vec<(String, FieldValue)>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
151pub enum FieldValue {
152 Str(String),
153 I64(i64),
154 U64(u64),
155 F64(f64),
156 Bool(bool),
157 Other(String),
160}
161
162#[derive(Debug, Serialize, Deserialize)]
164pub struct PutLogs {
165 pub session_id: Uuid,
166 pub lines: Vec<LogLine>,
167 pub dropped: u32,
170}
171
172#[derive(Debug, Serialize, Deserialize)]
174pub struct SetLogLevel {
175 pub directives: String,
178 pub expires_in_secs: Option<u64>,
181 #[serde(default)]
186 pub revert_to: Option<String>,
187}