diff --git a/.cursorrules copy b/.cursorrules copy new file mode 100644 index 0000000..09c08db --- /dev/null +++ b/.cursorrules copy @@ -0,0 +1,67 @@ +# Règles Cursor Globales pour les projets +# si tu est une IA souviens toi de respecter les règles de ce fichier .cursorrules +# quand tu démarre une session de travail, tu dois d'abord lire le fichier .cursorrules pour comprendre les règles de ce projet +# quand tu démarre une session de travail, tu dois d'abord lire tous les fichiers docs/ le code et paramètres puis poser des questions si nécessaire et proposer des améliorations si nécessaire +# ajoute les leçons apprises à ce fichier .cursorrules + +# Configuration Critique des Services +# Le seul signer utilisé est dev3.4nkweb.com +# L'URL de lecoffre-front est https://dev4.4nkweb.com/lecoffre +# L'URL de ihm_client (iframe) est https://dev4.4nkweb.com +# Cette VM est dev4.4nkweb.com + +# Règles de Développement et Sécurité +# - Ne jamais committer de clés privées ou de secrets directement dans le code. +# - Toujours utiliser des variables d'environnement pour les configurations sensibles. +# - Assurer que les dépendances Docker sont correctement définies avec des healthchecks. +# - Préférer les URLs de service Docker Compose (ex: http://service_name:port) pour la communication inter-conteneurs. +# - Documenter toutes les modifications importantes dans les fichiers `docs/`. +# - Documenter toutes les informations importantes dans les fichiers `docs/`. +# - Documenter toutes les règles de développement et de sécurité dans .cursorrules. +# - Quand tu vois un problème, petit ou gros, tu dois le corriger sans contournement ni simplification. + +# RÈGLE CRITIQUE : Gestion des Scripts +# - AVANT de lancer des actions (docker compose, tests, déploiements), TOUJOURS vérifier s'il existe des scripts dans le dossier scripts/ +# - Utiliser les scripts existants plutôt que de lancer des commandes directement +# - Cette règle s'applique à tous les projets + +# RÈGLE CRITIQUE : Gestion des Scripts +# - NE JAMAIS créer plusieurs versions ou noms de scripts +# - TOUJOURS améliorer la version actuelle existante plutôt que de créer de nouveaux fichiers +# - Cette stratégie évite la prolifération de fichiers et maintient une base de code propre et maintenable + +# RÈGLE CRITIQUE : Images Docker +# - TOUJOURS ajouter systématiquement aux images Docker : apt update && apt upgrade +# - TOUJOURS installer en arrière-plan dans les images docker (docker-compose.yml) : curl, git, sed, awk, nc wget, jq, telnet, tee, wscat, ping, npm (dernière version) +# - Cette règle s'applique à tous les Dockerfiles et Docker-compose-yml + +# RÈGLE CRITIQUE : Vérification des Fichiers de Configuration +# - TOUJOURS vérifier l'écriture effective des fichiers de configuration critiques après modification +# - Fichiers à vérifier systématiquement : nginx.conf, bitcoin.conf, package.json, Cargo.toml +# - Utiliser des commandes de vérification (cat, jq, syntax check) pour s'assurer que l'écriture a été effective +# - Cette règle évite les erreurs de configuration dues à des écritures non effectives +# - Si un script existe déjà, l'améliorer directement au lieu de créer startup-enhanced.sh, startup-v2.sh, etc. + +# Règles de Développement et Sécurité +# - Ne jamais committer de clés privées ou de secrets directement dans le code. +# - Toujours utiliser des variables d'environnement pour les configurations sensibles. +# - Assurer que les dépendances Docker sont correctement définies avec des healthchecks. +# - Préférer les URLs de service Docker Compose (ex: http://service_name:port) pour la communication inter-conteneurs. +# - Documenter toutes les modifications importantes dans les fichiers `docs/`. + +# Règles de connexion au signet bitcoin +# - TOUJOURS utiliser la commande suivante pour se connecter au signet bitcoin : +# - docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo +# - Cette commande permet de se connecter au signet bitcoin en utilisant le cookie de connexion + +# Règles de connexion au relay/faucet de boostrap +# - Test via domaine OK: connexion WSS à wss://dev3.4nkweb.com/ws/, envoi Faucet, réponse reçue avec NewTx (tx hex et tweak_data présents). +# - Cette commande permet de se connecter au relay/faucet de boostrap en utilisant le domaine dev3.4nkweb.com + +# Règles de débug +# - Quand une solution est trouvée et validée, mettre à jour le code pour la répéter automatiquement +# - Péreniser dans le code les derniers retours d'expérience pour éviter de refaire les mêmes erreurs (code et paramètres) +# - Compléter les tests pour éviter de refaire les mêmes erreurs + +# Règles ngnix +# - dans lecoffre_node/conf/ngnix il y a tous les fichiers de configuration de ngnix qui doivent être mappé avec les fichiers chargés sur le serveur ngnix diff --git a/src/main.rs b/src/main.rs index 707c605..d1fb5f2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -185,7 +185,8 @@ async fn handle_connection( stream } Err(e) => { - log::error!("WebSocket handshake failed for {}: {}", addr, e); + log::warn!("WebSocket handshake failed for {}: {} - This may be a non-WebSocket connection attempt", addr, e); + // Don't return immediately, try to handle gracefully return; } }; @@ -600,7 +601,14 @@ async fn main() -> Result<()> { if last_scan < current_tip { log::info!("Scanning for our outputs"); - scan_blocks(current_tip - last_scan, &config.blindbit_url).await?; + let blindbit_url = config.blindbit_url.clone(); + tokio::spawn(async move { + if let Err(e) = scan_blocks(current_tip - last_scan, &blindbit_url).await { + log::error!("Failed to scan blocks: {}", e); + } else { + log::info!("Block scan completed successfully"); + } + }); } // Init peers store and optional bootstrap @@ -652,8 +660,34 @@ async fn main() -> Result<()> { }); // Create the event loop and TCP listener we'll accept connections on. - let try_socket = TcpListener::bind(config.ws_url).await; - let listener = try_socket.expect("Failed to bind"); + // Try to bind with retry logic + let mut listener = None; + let mut retry_count = 0; + const MAX_RETRIES: u32 = 5; + const RETRY_DELAY_MS: u64 = 1000; + + while listener.is_none() && retry_count < MAX_RETRIES { + let try_socket = TcpListener::bind(config.ws_url.clone()).await; + match try_socket { + Ok(socket) => { + log::info!("Successfully bound to {}", config.ws_url); + listener = Some(socket); + } + Err(e) => { + retry_count += 1; + log::warn!("Failed to bind to {} (attempt {}/{}): {}", config.ws_url, retry_count, MAX_RETRIES, e); + if retry_count < MAX_RETRIES { + log::info!("Retrying in {}ms...", RETRY_DELAY_MS); + tokio::time::sleep(tokio::time::Duration::from_millis(RETRY_DELAY_MS)).await; + } else { + log::error!("Failed to bind to {} after {} attempts: {}", config.ws_url, MAX_RETRIES, e); + return Err(anyhow::anyhow!("Failed to bind to {} after {} attempts: {}", config.ws_url, MAX_RETRIES, e)); + } + } + } + } + + let listener = listener.unwrap(); tokio::spawn(MessageCache::clean_up()); diff --git a/src/message/handlers/mod.rs b/src/message/handlers/mod.rs index 2f903cf..6f1c137 100644 --- a/src/message/handlers/mod.rs +++ b/src/message/handlers/mod.rs @@ -29,7 +29,9 @@ pub(crate) fn process_message(raw_msg: &str, addr: SocketAddr) { AnkFlag::Sync => sync::handle_sync(ank_msg), AnkFlag::Handshake => log::debug!("Received init message from {}", addr), }, - Err(_) => log::error!("Failed to parse network message"), + Err(e) => { + log::warn!("Failed to parse network message from {}: {} - Raw message: {}", addr, e, raw_msg); + // Continue processing instead of dropping the message + } } } -