use anyhow::Result;
use irpc::{channel::oneshot, rpc_requests};
use rcan::Rcan;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::{caps::Caps, net_diagnostics::DiagnosticsReport};
pub const ALPN: &[u8] = b"/iroh/n0des/1";
pub type N0desClient = irpc::Client<N0desProtocol>;
#[rpc_requests(message = N0desMessage)]
#[derive(Debug, Serialize, Deserialize)]
#[allow(clippy::large_enum_variant)]
pub enum N0desProtocol {
#[rpc(tx=oneshot::Sender<()>)]
Auth(Auth),
#[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
PutMetrics(PutMetrics),
#[rpc(tx=oneshot::Sender<Pong>)]
Ping(Ping),
#[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
TicketPublish(PublishTicket),
#[rpc(tx=oneshot::Sender<RemoteResult<bool>>)]
TicketUnpublish(UnpublishTicket),
#[rpc(tx=oneshot::Sender<RemoteResult<Option<TicketData>>>)]
TicketGet(GetTicket),
#[rpc(tx=oneshot::Sender<RemoteResult<Vec<TicketData>>>)]
TicketList(ListTickets),
#[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
PutNetworkDiagnostics(PutNetworkDiagnostics),
#[rpc(tx=oneshot::Sender<RemoteResult<()>>)]
GrantCap(GrantCap),
}
#[rpc_requests(message = NetDiagnosticsMessage)]
#[derive(Debug, Serialize, Deserialize)]
#[allow(clippy::large_enum_variant)]
pub enum ClientHostProtocol {
#[rpc(tx=oneshot::Sender<()>)]
Auth(Auth),
#[rpc(tx=oneshot::Sender<RemoteResult<DiagnosticsReport>>)]
RunNetworkDiagnostics(RunNetworkDiagnostics),
}
pub type RemoteResult<T> = Result<T, RemoteError>;
#[derive(Clone, Serialize, Deserialize, thiserror::Error, Debug)]
pub enum RemoteError {
#[error("Missing capability: {}", _0.to_strings().join(", "))]
MissingCapability(Caps),
#[error("Unauthorized: {}", _0)]
AuthError(String),
#[error("Internal server error")]
InternalServerError,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Auth {
pub caps: Rcan<Caps>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PutMetrics {
pub session_id: Uuid,
pub update: iroh_metrics::encoding::Update,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Ping {
pub req_id: [u8; 16],
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Pong {
pub req_id: [u8; 16],
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PublishTicket {
pub req_id: [u8; 16],
pub name: String,
pub ticket_kind: String,
pub ticket: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UnpublishTicket {
pub req_id: [u8; 16],
pub name: String,
pub ticket_kind: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct GetTicket {
pub req_id: [u8; 16],
pub name: String,
pub ticket_kind: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ListTickets {
pub req_id: [u8; 16],
pub ticket_kind: String,
pub offset: u32,
pub limit: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TicketData {
pub name: String,
pub ticket_kind: String,
pub ticket_bytes: Vec<u8>,
}
impl From<PublishTicket> for TicketData {
fn from(msg: PublishTicket) -> Self {
TicketData {
name: msg.name,
ticket_kind: msg.ticket_kind,
ticket_bytes: msg.ticket,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PutNetworkDiagnostics {
pub report: crate::net_diagnostics::DiagnosticsReport,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RunNetworkDiagnostics;
#[derive(Debug, Serialize, Deserialize)]
pub struct GrantCap {
pub cap: Rcan<Caps>,
}