Major Changes: - Moved legacy system to Legacy/ folder for archival - Built new modular architecture with strict separation of concerns - Created core system: Module, EventBus, ModuleLoader, Router - Added Application bootstrap with auto-start functionality - Implemented development server with ES6 modules support - Created comprehensive documentation and project context - Converted SBS-7-8 content to JSON format - Copied all legacy games and content to new structure New Architecture Features: - Sealed modules with WeakMap private data - Strict dependency injection system - Event-driven communication only - Inviolable responsibility patterns - Auto-initialization without commands - Component-based UI foundation ready Technical Stack: - Vanilla JS/HTML/CSS only - ES6 modules with proper imports/exports - HTTP development server (no file:// protocol) - Modular CSS with component scoping - Comprehensive error handling and debugging Ready for Phase 2: Converting legacy modules to new architecture 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
131 lines
4.7 KiB
JavaScript
131 lines
4.7 KiB
JavaScript
// === WEBSOCKET LOGGER ===
|
|
// Envoie les logs vers le serveur WebSocket de ton système
|
|
|
|
console.log('🔧 WebSocket Logger chargé');
|
|
|
|
// Variables globales
|
|
window.wsLogger = null;
|
|
window.logQueue = [];
|
|
window.isConnected = false;
|
|
|
|
// Fonction pour se connecter au serveur WebSocket
|
|
function connectToLogServer() {
|
|
// Désactiver WebSocket en mode file://
|
|
if (window.location.protocol === 'file:') {
|
|
console.log('📁 Mode file:// détecté - WebSocket désactivé');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
console.log('🔌 Tentative de connexion WebSocket sur ws://localhost:8082...');
|
|
window.wsLogger = new WebSocket('ws://localhost:8082');
|
|
|
|
window.wsLogger.onopen = function() {
|
|
console.log('✅ Connecté au serveur de logs WebSocket');
|
|
window.isConnected = true;
|
|
|
|
// Log de confirmation
|
|
window.logSh('🎉 WebSocket Logger connecté avec succès!', 'INFO');
|
|
window.logSh(`📊 ${window.logQueue.length} logs en attente dans la queue`, 'DEBUG');
|
|
|
|
// Vider la queue des logs en attente
|
|
let sentCount = 0;
|
|
while (window.logQueue.length > 0) {
|
|
const logData = window.logQueue.shift();
|
|
window.wsLogger.send(JSON.stringify(logData));
|
|
sentCount++;
|
|
}
|
|
|
|
if (sentCount > 0) {
|
|
window.logSh(`📤 ${sentCount} logs en attente envoyés au serveur`, 'INFO');
|
|
}
|
|
};
|
|
|
|
window.wsLogger.onclose = function() {
|
|
console.log('❌ Connexion WebSocket fermée');
|
|
window.isConnected = false;
|
|
|
|
// Tentative de reconnexion après 3 secondes
|
|
setTimeout(connectToLogServer, 3000);
|
|
};
|
|
|
|
window.wsLogger.onerror = function(error) {
|
|
console.log('❌ Erreur WebSocket:', error);
|
|
window.isConnected = false;
|
|
};
|
|
|
|
} catch (error) {
|
|
console.log('❌ Impossible de se connecter au serveur de logs:', error);
|
|
setTimeout(connectToLogServer, 5000);
|
|
}
|
|
}
|
|
|
|
// Fonction logSh qui envoie au WebSocket
|
|
window.logSh = function(message, level = 'INFO') {
|
|
// Sécuriser le level pour éviter les erreurs
|
|
if (typeof level !== 'string') {
|
|
level = 'INFO';
|
|
}
|
|
|
|
const timestamp = new Date().toISOString();
|
|
const logData = {
|
|
timestamp: timestamp,
|
|
level: level.toUpperCase(),
|
|
message: message
|
|
};
|
|
|
|
// Log aussi dans la console pour backup
|
|
const color = level === 'ERROR' ? 'color: red' :
|
|
level === 'WARN' ? 'color: orange' :
|
|
level === 'DEBUG' ? 'color: blue' : 'color: green';
|
|
console.log(`%c[${new Date().toLocaleTimeString()}] ${level}: ${message}`, color);
|
|
|
|
// Envoyer au WebSocket (seulement si pas en mode file://)
|
|
if (window.location.protocol !== 'file:') {
|
|
if (window.isConnected && window.wsLogger) {
|
|
try {
|
|
window.wsLogger.send(JSON.stringify(logData));
|
|
} catch (error) {
|
|
// Si erreur d'envoi, mettre en queue
|
|
window.logQueue.push(logData);
|
|
}
|
|
} else {
|
|
// Pas connecté, mettre en queue
|
|
window.logQueue.push(logData);
|
|
|
|
// Limiter la queue à 100 messages
|
|
if (window.logQueue.length > 100) {
|
|
window.logQueue.shift();
|
|
}
|
|
}
|
|
}
|
|
// En mode file://, on log seulement dans la console (pas de WebSocket)
|
|
};
|
|
|
|
// Fonctions de convenance
|
|
window.logTrace = function(message) { window.logSh(message, 'TRACE'); };
|
|
window.logDebug = function(message) { window.logSh(message, 'DEBUG'); };
|
|
window.logInfo = function(message) { window.logSh(message, 'INFO'); };
|
|
window.logWarn = function(message) { window.logSh(message, 'WARN'); };
|
|
window.logError = function(message) { window.logSh(message, 'ERROR'); };
|
|
|
|
// Bouton pour ouvrir l'interface de logs
|
|
window.openLogsInterface = function() {
|
|
// Utiliser un chemin relatif pour fonctionner avec file://
|
|
const currentPath = window.location.pathname;
|
|
const basePath = currentPath.substring(0, currentPath.lastIndexOf('/'));
|
|
const logsUrl = window.location.protocol + '//' + window.location.host + basePath + '/export_logger/logs-viewer.html';
|
|
window.open(logsUrl, 'LogsViewer', 'width=1200,height=800,scrollbars=yes,resizable=yes');
|
|
};
|
|
|
|
// Initialisation (seulement si pas en mode file://)
|
|
if (window.location.protocol !== 'file:') {
|
|
connectToLogServer();
|
|
} else {
|
|
console.log('📁 Mode file:// - WebSocket Logger désactivé');
|
|
}
|
|
|
|
// Test initial
|
|
window.logSh('🚀 WebSocket Logger initialisé', 'INFO');
|
|
|
|
console.log('✅ WebSocket Logger prêt - logs envoyés vers ws://localhost:8082'); |