1use bee_block::payload::milestone::option::dto::ReceiptMilestoneOptionDto;
5use bee_ledger_types::Receipt;
6#[cfg(feature = "peer")]
7use bee_protocol_types::peer::Peer;
8use serde::{Deserialize, Serialize};
9
10#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
12pub struct PeerDto {
13 pub id: String,
14 #[serde(rename = "multiAddresses")]
15 pub multi_addresses: Vec<String>,
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub alias: Option<String>,
18 pub relation: RelationDto,
19 pub connected: bool,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub gossip: Option<GossipDto>,
22}
23
24#[cfg(feature = "peer")]
25impl From<&Peer> for PeerDto {
26 fn from(peer: &Peer) -> Self {
27 PeerDto {
28 id: peer.id().to_string(),
29 alias: Some(peer.alias().to_string()),
30 multi_addresses: vec![peer.address().to_string()],
31 relation: {
32 if peer.relation().is_known() {
33 RelationDto::Known
34 } else if peer.relation().is_unknown() {
35 RelationDto::Unknown
36 } else {
37 RelationDto::Autopeered
38 }
39 },
40 connected: peer.is_connected(),
41 gossip: Some(GossipDto {
42 heartbeat: HeartbeatDto {
43 solid_milestone_index: *peer.solid_milestone_index(),
44 pruned_milestone_index: *peer.pruned_index(),
45 latest_milestone_index: *peer.latest_milestone_index(),
46 connected_peers: peer.connected_peers(),
47 synced_peers: peer.synced_peers(),
48 },
49 metrics: MetricsDto {
50 new_blocks: peer.metrics().new_blocks(),
51 received_blocks: peer.metrics().blocks_received(),
52 known_blocks: peer.metrics().known_blocks(),
53 received_block_requests: peer.metrics().block_requests_received(),
54 received_milestone_requests: peer.metrics().milestone_requests_received(),
55 received_heartbeats: peer.metrics().heartbeats_received(),
56 sent_blocks: peer.metrics().blocks_sent(),
57 sent_block_requests: peer.metrics().block_requests_sent(),
58 sent_milestone_requests: peer.metrics().milestone_requests_sent(),
59 sent_heartbeats: peer.metrics().heartbeats_sent(),
60 dropped_packets: 0,
61 },
62 }),
63 }
64 }
65}
66
67#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Default)]
69pub struct GossipDto {
70 pub heartbeat: HeartbeatDto,
71 pub metrics: MetricsDto,
72}
73
74#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
76pub enum RelationDto {
77 #[serde(rename = "known")]
78 Known,
79 #[serde(rename = "unknown")]
80 Unknown,
81 #[serde(rename = "autopeered")]
82 Autopeered,
83}
84
85#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
87pub struct HeartbeatDto {
88 #[serde(rename = "solidMilestoneIndex")]
89 pub solid_milestone_index: u32,
90 #[serde(rename = "prunedMilestoneIndex")]
91 pub pruned_milestone_index: u32,
92 #[serde(rename = "latestMilestoneIndex")]
93 pub latest_milestone_index: u32,
94 #[serde(rename = "connectedPeers")]
95 pub connected_peers: u8,
96 #[serde(rename = "syncedPeers")]
97 pub synced_peers: u8,
98}
99
100#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
102pub struct MetricsDto {
103 #[serde(rename = "newBlocks")]
104 pub new_blocks: u64,
105 #[serde(rename = "receivedBlocks")]
106 pub received_blocks: u64,
107 #[serde(rename = "knownBlocks")]
108 pub known_blocks: u64,
109 #[serde(rename = "receivedBlockRequests")]
110 pub received_block_requests: u64,
111 #[serde(rename = "receivedMilestoneRequests")]
112 pub received_milestone_requests: u64,
113 #[serde(rename = "receivedHeartbeats")]
114 pub received_heartbeats: u64,
115 #[serde(rename = "sentBlocks")]
116 pub sent_blocks: u64,
117 #[serde(rename = "sentBlockRequests")]
118 pub sent_block_requests: u64,
119 #[serde(rename = "sentMilestoneRequests")]
120 pub sent_milestone_requests: u64,
121 #[serde(rename = "sentHeartbeats")]
122 pub sent_heartbeats: u64,
123 #[serde(rename = "droppedPackets")]
124 pub dropped_packets: u64,
125}
126
127#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
129pub struct ReceiptDto {
130 pub receipt: ReceiptMilestoneOptionDto,
131 #[serde(rename = "milestoneIndex")]
132 pub milestone_index: u32,
133}
134
135impl From<Receipt> for ReceiptDto {
136 fn from(value: Receipt) -> Self {
137 ReceiptDto {
138 receipt: value.inner().into(),
139 milestone_index: **value.included_in(),
140 }
141 }
142}
143
144#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
146pub enum LedgerInclusionStateDto {
147 #[serde(rename = "conflicting")]
148 Conflicting,
149 #[serde(rename = "included")]
150 Included,
151 #[serde(rename = "noTransaction")]
152 NoTransaction,
153}