Skip to main content

pushkin_daemon/
protocol.rs

1//! The UDS wire protocol (spec §4.3): newline-delimited JSON, one request
2//! and one response per line. The check response carries the SAME uniform
3//! result JSON as the cold path (§8.3) — the daemon is a transport, never
4//! a second brain. `deny_unknown_fields` on ingest (charter N2); versioned
5//! so a stale daemon and a newer shim fail loudly, not weirdly.
6
7use pushkin_core::envelope::CheckResult;
8use serde::{Deserialize, Serialize};
9
10pub const PROTOCOL_VERSION: u32 = 1;
11
12#[derive(Debug, Serialize, Deserialize)]
13#[serde(deny_unknown_fields, rename_all = "camelCase", tag = "kind")]
14pub enum Request {
15    #[serde(rename_all = "camelCase")]
16    Check {
17        v: u32,
18        file_path: String,
19        content: String,
20    },
21    Ping {
22        v: u32,
23    },
24    Shutdown {
25        v: u32,
26    },
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(deny_unknown_fields, rename_all = "camelCase")]
31pub struct DaemonInfo {
32    pub pid: u32,
33    pub version: String,
34    /// True on private-socket daemons spawned for non-canonical binaries
35    /// (spec §8.4): they answer checks but refuse wire mutations.
36    pub read_only: bool,
37}
38
39#[derive(Debug, Serialize, Deserialize)]
40#[serde(deny_unknown_fields, rename_all = "camelCase", tag = "kind")]
41pub enum Response {
42    #[serde(rename_all = "camelCase")]
43    Check {
44        result: CheckResult,
45    },
46    #[serde(rename_all = "camelCase")]
47    Pong {
48        info: DaemonInfo,
49    },
50    ShuttingDown,
51    #[serde(rename_all = "camelCase")]
52    Error {
53        message: String,
54    },
55}