libgrite_ipc/lib.rs
1//! IPC types and client for grite daemon communication
2//!
3//! This crate provides:
4//! - Message types for daemon communication (IpcRequest, IpcResponse, IpcCommand)
5//! - Notification types for pub/sub (EventApplied, WalSynced, etc.)
6//! - Daemon lock management (DaemonLock)
7//! - IPC client for connecting to the daemon
8
9pub mod client;
10pub mod error;
11pub mod framing;
12pub mod lock;
13pub mod messages;
14pub mod notifications;
15
16pub use client::IpcClient;
17pub use error::IpcError;
18pub use lock::DaemonLock;
19pub use messages::{IpcCommand, IpcErrorPayload, IpcRequest, IpcResponse};
20pub use notifications::Notification;
21
22/// Current IPC schema version
23pub const IPC_SCHEMA_VERSION: u32 = 1;
24
25/// Default request timeout in milliseconds
26pub const DEFAULT_TIMEOUT_MS: u64 = 10_000;
27
28/// Default lease duration for daemon locks in milliseconds
29pub const DEFAULT_LEASE_MS: u64 = 30_000;
30
31/// Issue action types returned in daemon responses
32pub mod issue_action {
33 pub const CREATED: &str = "created";
34 pub const CLOSED: &str = "closed";
35 pub const REOPENED: &str = "reopened";
36}
37
38/// Get the default Unix socket path for the daemon.
39///
40/// Uses user-specific path for security isolation:
41/// - `XDG_RUNTIME_DIR` if available (Linux with systemd)
42/// - `/tmp/grite-daemon-<uid>.sock` as fallback on Unix
43/// - `/tmp/grite-daemon.sock` on non-Unix platforms
44pub fn default_socket_path() -> String {
45 // Prefer XDG_RUNTIME_DIR which is properly secured by systemd
46 if let Ok(runtime_dir) = std::env::var("XDG_RUNTIME_DIR") {
47 return format!("{}/grite-daemon.sock", runtime_dir);
48 }
49
50 // Fallback: user-specific path in /tmp
51 #[cfg(unix)]
52 {
53 let uid = unsafe { libc::getuid() };
54 format!("/tmp/grite-daemon-{}.sock", uid)
55 }
56
57 #[cfg(not(unix))]
58 {
59 "/tmp/grite-daemon.sock".to_string()
60 }
61}