/
dayekb
/
vibecoding_perplexity_idea2
Обзор
Документация
Войти
/
dayekb
/
vibecoding_perplexity_idea2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server.js
127 строк
4 KB
Your Name
Initial commit: Генератор веб-баннера с вайб-кодом
20 авг 2025, 22:10
20 авг 2025, 22:10
0e13e5f
Код
Авторство
О чём код?
const express = require('express'); const http = require('http'); const WebSocket = require('ws'); const path = require('path'); const chokidar = require('chokidar'); const app = express(); const server = http.createServer(app); const wss = new WebSocket.Server({ server }); // Статические файлы app.use(express.static('public')); app.use(express.json()); // WebSocket соединения const clients = new Set(); // Протокол обмена сообщениями: // 1. 'banner_update' - обновление баннера (от клиента к серверу) // 2. 'banner_sync' - синхронизация баннера (от сервера ко всем клиентам) // 3. 'code_change' - изменение кода (от сервера ко всем клиентам) // 4. 'client_join' - подключение нового клиента // 5. 'client_count' - количество подключенных клиентов wss.on('connection', (ws) => { console.log('Новый клиент подключился'); clients.add(ws); // Отправляем количество клиентов всем broadcastClientCount(); // Отправляем приветственное сообщение ws.send(JSON.stringify({ type: 'client_join', message: 'Добро пожаловать в генератор баннеров!' })); ws.on('message', (message) => { try { const data = JSON.parse(message); switch (data.type) { case 'banner_update': // Пересылаем обновление баннера всем клиентам broadcastToOthers(ws, { type: 'banner_sync', bannerData: data.bannerData }); break; default: console.log('Неизвестный тип сообщения:', data.type); } } catch (error) { console.error('Ошибка обработки сообщения:', error); } }); ws.on('close', () => { console.log('Клиент отключился'); clients.delete(ws); broadcastClientCount(); }); }); // Функция отправки сообщения всем клиентам function broadcast(message) { clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify(message)); } }); } // Функция отправки сообщения всем, кроме указанного клиента function broadcastToOthers(excludeClient, message) { clients.forEach(client => { if (client !== excludeClient && client.readyState === WebSocket.OPEN) { client.send(JSON.stringify(message)); } }); } // Функция отправки количества клиентов function broadcastClientCount() { broadcast({ type: 'client_count', count: clients.size }); } // Отслеживание изменений в JS файлах для вайб-кода const jsWatcher = chokidar.watch('public/js/**/*.js', { ignored: /(^|[\/\\])\../, persistent: true }); jsWatcher.on('change', (filePath) => { console.log(`JS файл изменен: ${filePath}`); // Отправляем уведомление об изменении кода всем клиентам broadcast({ type: 'code_change', file: path.relative('public', filePath), timestamp: Date.now() }); }); // API маршруты app.get('/api/clients', (req, res) => { res.json({ count: clients.size }); }); app.get('/api/status', (req, res) => { res.json({ status: 'running', clients: clients.size, uptime: process.uptime() }); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`🚀 Сервер запущен на порту ${PORT}`); console.log(`📱 Откройте http://localhost:${PORT} в браузере`); console.log(`🔌 WebSocket доступен на ws://localhost:${PORT}`); });