import {safeName,clean} from './seguridad.mjs'; // Node.js >=22.4: WebSocket incorporado. No requiere paquetes npm externos. export function normalizarEvento(message) { if (!message || typeof message!=='object') return null; const event=String(message.event ?? message.type ?? message.eventName ?? '').toLowerCase(); const data=message.data && typeof message.data==='object' ? message.data : message; const kind=event==='subscribe' || event==='subscription' ? 'subscription' : event==='chat' || event==='comment' ? 'chat' : event==='member' || event==='join' ? 'join' : event==='follow' || event==='gift' || event==='share' ? event : null; if(!kind) return null; const user=safeName(data.nickname ?? data.user?.nickname ?? data.uniqueId ?? data.user?.uniqueId ?? data.username); if(kind==='chat') { const comment=clean(data.comment ?? data.text ?? data.message ?? data.content,500); return comment?{kind,user,comment}:null; } if(kind==='gift') { if(data.repeatEnd===false || data.streakEnd===false) return null; return {kind,user,gift:clean(data.giftName ?? data.gift?.name ?? 'un regalo',60),repeat:Math.max(1,Math.min(999,Number(data.repeatCount)||1))}; } return {kind,user}; } export function conectarEventos({config,onEvent,log=console.log}) { let socket=null,stopped=false,retryTimer=null; function connect(){ if(stopped || !config.events.enabled)return; try{socket=new WebSocket(config.events.websocketUrl);}catch(err){log('[EVENTOS] No se pudo iniciar:',err.message);schedule();return;} socket.addEventListener('open',()=>log('[EVENTOS] WebSocket conectado: '+config.events.websocketUrl)); socket.addEventListener('message',e=>{ let message;try{message=JSON.parse(String(e.data));}catch{return;} if(config.events.logRawEvents)log('[EVENTO JSON]',JSON.stringify(message).slice(0,1200)); const normalized=normalizarEvento(message);if(normalized)onEvent(normalized); }); socket.addEventListener('error',()=>log('[EVENTOS] Fallo WebSocket; comprueba TikFinity Desktop.')); socket.addEventListener('close',()=>{log('[EVENTOS] Socket cerrado.');schedule();}); } function schedule(){if(!stopped){clearTimeout(retryTimer);retryTimer=setTimeout(connect,Math.max(1000,config.events.reconnectDelayMs));}} connect(); return ()=>{stopped=true;clearTimeout(retryTimer);if(socket && socket.readyState===WebSocket.OPEN)socket.close();}; }