Skip to main content

wavs_types/
http.rs

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        /// The derivation index used to create this key from the mnemonic
16        hd_index: u32,
17        /// The evm-style address ("0x" prefixed hex string) derived from the key
18        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/// P2P network status for monitoring and readiness checks
127#[derive(Debug, Clone, Default, Serialize, Deserialize, utoipa::ToSchema)]
128pub struct P2pStatus {
129    /// Whether P2P networking is enabled
130    pub enabled: bool,
131    /// Local peer ID
132    pub local_peer_id: Option<String>,
133    /// Listen addresses (multiaddrs with peer ID appended, e.g. "/ip4/0.0.0.0/tcp/9000/p2p/12D3KooW...")
134    pub listen_addresses: Vec<String>,
135    /// External addresses discovered via AutoNAT/Identify (preferred for NAT traversal)
136    /// These are addresses that peers outside NAT can use to reach us.
137    pub external_addresses: Vec<String>,
138    /// Number of connected peers
139    pub connected_peers: usize,
140    /// List of connected peer IDs
141    pub peer_ids: Vec<String>,
142    /// Topics we're subscribed to
143    pub subscribed_topics: Vec<String>,
144    /// Number of peers subscribed to our topics (topic -> peer count)
145    pub topic_peer_counts: HashMap<String, usize>,
146}