mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-23 09:23:26 +00:00
Frontend performance: - Debounce DataGrid search (150ms) and replace O(n) row wrapping with index array - Replace QueryStore deep watcher with targeted field-level persistence snapshot - Extract shared nodeConfig computed in TreeItem (eliminates 15x redundant getConfig calls) - Clear tab result data on close to free memory - Add LRU eviction for completion caches (50 entry cap) - Replace savedSql version string join with numeric counter Memory leak fixes: - Store Tauri event unlisten handles and clean up on unmount - Clean up DataGrid search timer on unmount Backend security & resource management: - Add 50MB request body size limit - Reject file uploads >100MB and SQL files >200MB - Clean up SSE channels after transfer/import completes - Recover from poisoned mutex instead of panicking - Delete temporary upload files after preview - Validate SQL file paths to prevent directory traversal
26 lines
698 B
Rust
26 lines
698 B
Rust
use dbx_core::connection::AppState;
|
|
use std::collections::{HashMap, HashSet};
|
|
use std::path::PathBuf;
|
|
use std::sync::Arc;
|
|
use tokio::sync::{broadcast, Mutex, RwLock};
|
|
|
|
pub struct LoginRateLimit {
|
|
pub fail_count: u32,
|
|
pub locked_until: Option<std::time::Instant>,
|
|
}
|
|
|
|
pub struct WebState {
|
|
pub app: Arc<AppState>,
|
|
pub data_dir: PathBuf,
|
|
pub password_hash: RwLock<Option<String>>,
|
|
pub sessions: RwLock<HashSet<String>>,
|
|
pub sse_channels: RwLock<HashMap<String, broadcast::Sender<String>>>,
|
|
pub login_rate_limit: Mutex<LoginRateLimit>,
|
|
}
|
|
|
|
impl WebState {
|
|
pub async fn remove_sse_channel(&self, id: &str) {
|
|
self.sse_channels.write().await.remove(id);
|
|
}
|
|
}
|