1use std::collections::HashMap;
2
3use super::Service;
4use crate::{
5 AnyChainConfig, ByteArray, ChainKey, ComponentDigest, ServiceDigest, ServiceId, ServiceManager,
6 Trigger, TriggerData, WorkflowId,
7};
8use serde::{Deserialize, Serialize};
9use utoipa::ToSchema;
10
11#[derive(Serialize, Deserialize, Clone, Debug, ToSchema)]
12#[serde(rename_all = "snake_case")]
13pub enum SignerResponse {
14 Secp256k1 {
15 hd_index: u32,
17 evm_address: String,
19 },
20}
21
22#[derive(Serialize, Deserialize, Clone, Debug, ToSchema)]
23pub struct AddServiceRequest {
24 pub service_manager: ServiceManager,
25}
26
27#[derive(Serialize, Deserialize, Clone, Debug, ToSchema)]
28pub struct GetSignerRequest {
29 pub service_manager: ServiceManager,
30}
31
32#[derive(Serialize, Deserialize, Clone, Debug, ToSchema)]
33pub struct AddChainRequest {
34 pub chain: ChainKey,
35 pub config: AnyChainConfig,
36}
37
38#[derive(Serialize, Deserialize, ToSchema)]
39pub struct DeleteServicesRequest {
40 pub service_managers: Vec<ServiceManager>,
41}
42
43#[derive(Serialize, Deserialize, ToSchema)]
44pub struct ListServicesResponse {
45 pub services: Vec<Service>,
46 pub service_ids: Vec<ServiceId>,
47 pub component_digests: Vec<ComponentDigest>,
48}
49
50#[derive(Serialize, Deserialize, ToSchema)]
51pub struct UploadComponentResponse {
52 pub digest: ComponentDigest,
53}
54
55#[derive(Serialize, Deserialize, Clone, Debug, ToSchema)]
56pub struct SaveServiceResponse {
57 pub hash: ServiceDigest,
58}
59
60#[derive(Serialize, Deserialize, Debug, ToSchema)]
61pub struct SimulatedTriggerRequest {
62 pub service_id: ServiceId,
63 pub workflow_id: WorkflowId,
64 pub trigger: Trigger,
65 #[schema(value_type = Object)]
66 pub data: TriggerData,
67 #[serde(default = "default_simulated_trigger_count")]
68 pub count: usize,
69 pub wait_for_completion: bool,
70}
71
72fn default_simulated_trigger_count() -> usize {
73 1
74}
75
76#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
77pub struct DevTriggerStreamsInfo {
78 pub chains: HashMap<ChainKey, DevTriggerStreamInfo>,
79 #[serde(default)]
80 pub hypercore: HashMap<String, DevHypercoreStreamState>,
81}
82
83impl DevTriggerStreamsInfo {
84 pub fn finalized(&self) -> bool {
85 self.chains.values().all(|info| {
86 !info.any_active_rpcs_in_flight && info.is_connected && info.current_endpoint.is_some()
87 }) && self
88 .hypercore
89 .values()
90 .all(|info| matches!(info, DevHypercoreStreamState::Connected))
91 }
92
93 pub fn any_active_subscriptions(&self) -> bool {
94 self.chains
95 .values()
96 .any(|info| !info.active_subscriptions.is_empty())
97 }
98}
99
100#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema, Clone, PartialEq, Eq)]
101#[serde(rename_all = "snake_case")]
102pub enum DevHypercoreStreamState {
103 Waiting,
104 Connecting,
105 Connected,
106}
107
108#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
109pub struct DevTriggerStreamInfo {
110 pub current_endpoint: Option<String>,
111 pub is_connected: bool,
112 pub any_active_rpcs_in_flight: bool,
113 pub active_subscriptions: HashMap<String, DevTriggerStreamSubscriptionKind>,
114}
115
116#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
117pub enum DevTriggerStreamSubscriptionKind {
118 NewHeads,
119 Logs {
120 addresses: Vec<ByteArray<20>>,
121 topics: Vec<ByteArray<32>>,
122 },
123 NewPendingTransactions,
124}
125
126#[derive(Debug, Clone, Default, Serialize, Deserialize, utoipa::ToSchema)]
128pub struct P2pStatus {
129 pub enabled: bool,
131 pub local_peer_id: Option<String>,
133 pub listen_addresses: Vec<String>,
135 pub external_addresses: Vec<String>,
138 pub connected_peers: usize,
140 pub peer_ids: Vec<String>,
142 pub subscribed_topics: Vec<String>,
144 pub topic_peer_counts: HashMap<String, usize>,
146}