use serde::{Deserialize, Serialize};
use super::peer_types::Address;
use crate::entry::{Entry, ID};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct HandshakeRequest {
pub device_id: String,
pub public_key: String,
pub display_name: Option<String>,
pub protocol_version: u32,
pub challenge: Vec<u8>,
pub listen_addresses: Vec<Address>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct TreeInfo {
pub tree_id: ID,
pub name: Option<String>,
pub entry_count: usize,
pub last_modified: u64,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct HandshakeResponse {
pub device_id: String,
pub public_key: String,
pub display_name: Option<String>,
pub protocol_version: u32,
pub challenge_response: Vec<u8>,
pub new_challenge: Vec<u8>,
pub available_trees: Vec<TreeInfo>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct SyncTreeRequest {
pub tree_id: ID,
pub our_tips: Vec<ID>,
pub peer_pubkey: Option<String>,
pub requesting_key: Option<String>,
pub requesting_key_name: Option<String>,
pub requested_permission: Option<crate::auth::Permission>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct BootstrapResponse {
pub tree_id: ID,
pub root_entry: Entry,
pub all_entries: Vec<Entry>,
pub key_approved: bool,
pub granted_permission: Option<crate::auth::Permission>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct IncrementalResponse {
pub tree_id: ID,
pub their_tips: Vec<ID>,
pub missing_entries: Vec<Entry>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub enum SyncRequest {
Handshake(HandshakeRequest),
SyncTree(SyncTreeRequest),
SendEntries(Vec<Entry>),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub enum SyncResponse {
Handshake(HandshakeResponse),
Bootstrap(BootstrapResponse),
Incremental(IncrementalResponse),
BootstrapPending {
request_id: String,
message: String,
},
Ack,
Count(usize),
Error(String),
}
pub const PROTOCOL_VERSION: u32 = 0;
#[derive(Debug, Clone, Default)]
pub struct RequestContext {
pub remote_address: Option<Address>,
pub peer_pubkey: Option<String>,
}