import http from 'node:http'; import fs from 'node:fs/promises'; import path from 'node:path'; export async function crearOverlay(config) { if(!config.overlay.enabled)return {publish(){},close:async()=>{}}; const html=await fs.readFile(path.resolve('overlay/index.html'),'utf8'); const clients=new Set();let closed=false; const server=http.createServer((req,res)=>{ const url=new URL(req.url||'/',`http://${config.overlay.host}`); if(url.pathname==='/'){ res.writeHead(200,{'Content-Type':'text/html; charset=utf-8','Cache-Control':'no-store','X-Content-Type-Options':'nosniff'});res.end(html); } else if(url.pathname==='/events'){ res.writeHead(200,{'Content-Type':'text/event-stream; charset=utf-8','Cache-Control':'no-cache, no-transform','Connection':'keep-alive'}); res.write('retry: 2500\n\n');res.write(`data: ${JSON.stringify({type:'app',text:`Aplicaciones en Google Play: ${config.apps.developerName} ยท ${config.apps.developerProfileUrl}`})}\n\n`);clients.add(res); req.on('close',()=>clients.delete(res)); } else if(url.pathname==='/health'){ res.writeHead(200,{'Content-Type':'application/json'});res.end(JSON.stringify({ok:true,clients:clients.size})); } else {res.writeHead(404);res.end('No existe');} }); await new Promise((resolve,reject)=>{server.once('error',reject);server.listen(config.overlay.port,config.overlay.host,resolve)}); const timer=setInterval(()=>{for(const client of clients)try{client.write(': ping\n\n')}catch{clients.delete(client)}},20000); console.log(`[OVERLAY] Abre http://${config.overlay.host}:${server.address().port}/ en OBS como fuente Navegador (720x1280).`); return { port:server.address().port, publish(type,data={}){if(closed)return;const line=`data: ${JSON.stringify({type,...data})}\n\n`;for(const client of clients)try{client.write(line)}catch{clients.delete(client)}}, async close(){closed=true;clearInterval(timer);for(const client of clients)client.end();await new Promise(resolve=>server.close(resolve));} }; }