refactor: split package.rs, mod.rs, listener.rs, and lnd.rs into focused submodules

- R35: Split package.rs (1794 lines) into package/{mod,config,validation,lifecycle}.rs
- R36: Split mesh/listener.rs (1799 lines) into listener/{mod,session,frames,decode,dispatch,bitcoin}.rs
- R37: Split rpc/mod.rs into mod.rs + dispatcher.rs, middleware.rs, response.rs (54% reduction)
- R38: Split lnd.rs (1064 lines) into lnd/{mod,info,channels,wallet,payments}.rs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-21 02:26:28 +00:00
co-authored by Claude Opus 4.6
parent d8b753e1e4
commit 618244eab0
21 changed files with 4780 additions and 4374 deletions
+50
View File
@@ -0,0 +1,50 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub(super) struct RpcRequest {
pub method: String,
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Serialize)]
pub(super) struct RpcResponse {
pub result: Option<serde_json::Value>,
pub error: Option<RpcError>,
}
#[derive(Debug, Serialize)]
pub(super) struct RpcError {
pub code: i32,
pub message: String,
pub data: Option<serde_json::Value>,
}
/// Simple TTL cache for read-only RPC responses.
pub(super) struct ResponseCache {
entries: tokio::sync::RwLock<std::collections::HashMap<String, (std::time::Instant, serde_json::Value)>>,
ttl: std::time::Duration,
}
impl ResponseCache {
pub fn new(ttl_secs: u64) -> Self {
Self {
entries: tokio::sync::RwLock::new(std::collections::HashMap::new()),
ttl: std::time::Duration::from_secs(ttl_secs),
}
}
pub async fn get(&self, key: &str) -> Option<serde_json::Value> {
let entries = self.entries.read().await;
if let Some((ts, value)) = entries.get(key) {
if ts.elapsed() < self.ttl {
return Some(value.clone());
}
}
None
}
pub async fn set(&self, key: String, value: serde_json::Value) {
let mut entries = self.entries.write().await;
entries.insert(key, (std::time::Instant::now(), value));
}
}