Skip to main content

sidedns_core/ipc/
message.rs

1use std::net::SocketAddr;
2
3use crate::DnsRule;
4use serde::{Deserialize, Serialize};
5
6/// Commands sent from CLI or GUI to the daemon over IPC.
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(tag = "cmd", content = "payload")]
9pub enum IpcRequest {
10    /// Add or replace a DNS routing rule.
11    Add {
12        domain: String,
13        target: SocketAddr,
14        https: bool,
15    },
16    /// Add an ephemeral rule (not persisted, takes priority over permanent rules).
17    AddEphemeral {
18        domain: String,
19        target: SocketAddr,
20        https: bool,
21    },
22    /// Remove the permanent rule for the given domain.
23    Remove { domain: String },
24    /// Remove the ephemeral rule for the given domain.
25    RemoveEphemeral { domain: String },
26    /// List all active rules.
27    List,
28    /// Resolve a domain to its configured target.
29    Resolve { domain: String },
30    /// Query daemon status.
31    Status,
32    /// Request a graceful shutdown of the daemon.
33    Stop,
34    /// Open a persistent event stream connection.
35    Subscribe,
36}
37
38/// Responses sent from the daemon to a client.
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
40#[serde(tag = "type", content = "data")]
41pub enum IpcResponse {
42    Ok,
43    Error(String),
44    Rules(Vec<DnsRule>),
45    Resolved(Option<DnsRule>),
46    Status { running: bool, rule_count: usize },
47    Event(DnsEvent),
48}
49
50/// Events emitted by the daemon and pushed to subscribed clients.
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52#[serde(tag = "kind")]
53pub enum DnsEvent {
54    /// A rule was added or replaced.
55    RuleAdded(DnsRule),
56    /// A rule was removed.
57    RuleRemoved(DnsRule),
58    /// An ephemeral rule was added.
59    EphemeralAdded(DnsRule),
60    /// An ephemeral rule was removed.
61    EphemeralRemoved(DnsRule),
62    DaemonStopped,
63}