99 lines
5.6 KiB
JavaScript
99 lines
5.6 KiB
JavaScript
// bc.js - Главный файл сервера Battle Club
|
||
|
||
const express = require('express');
|
||
const http = require('http'); // Используем HTTP, так как SSL терминируется Apache
|
||
const { Server } = require('socket.io');
|
||
const path = require('path');
|
||
|
||
// Импорт ваших серверных модулей (предполагаем, что они есть и работают)
|
||
// const auth = require('./server_modules/auth');
|
||
// const GameManager = require('./server_modules/gameManager');
|
||
// const db = require('./server_modules/db');
|
||
// const GAME_CONFIG = require('./server_modules/config');
|
||
|
||
const app = express();
|
||
const server = http.createServer(app);
|
||
|
||
const BC_APP_INTERNAL_PORT = 3200; // Внутренний порт, на котором слушает bc.js
|
||
const BC_APP_INTERNAL_HOST = '127.0.0.1'; // Слушать только на localhost
|
||
const PUBLIC_PATH_PREFIX = '/battleclub'; // Публичный префикс пути, по которому приложение доступно через Apache
|
||
|
||
// Настройка Socket.IO
|
||
// Клиент будет подключаться к /battleclub/socket.io/
|
||
const io = new Server(server, {
|
||
path: `${PUBLIC_PATH_PREFIX}/socket.io`,
|
||
cors: {
|
||
origin: "https://pavel-chagovsky.com", // Укажите ваш домен для безопасности
|
||
// origin: "*", // Для разработки можно оставить, но для продакшена лучше конкретный домен
|
||
methods: ["GET", "POST"]
|
||
}
|
||
});
|
||
|
||
// Middleware для логирования каждого запроса (полезно для отладки)
|
||
app.use((req, res, next) => {
|
||
console.log(`[BC App] Request: ${req.method} ${req.originalUrl}`);
|
||
next();
|
||
});
|
||
|
||
// Раздача статических файлов из папки 'public'
|
||
// Так как Apache проксирует /battleclub/ на корень этого Express-приложения,
|
||
// Express должен отдавать статику от своего корня.
|
||
// В HTML ссылки на статику должны быть относительными или начинаться с /battleclub/
|
||
// Например, если в public/js/client.js, то в HTML: <script src="/battleclub/js/client.js"></script>
|
||
// Или, если index.html отдается с /battleclub/, то <script src="js/client.js"></script>
|
||
app.use(express.static(path.join(__dirname, 'public')));
|
||
|
||
|
||
// Пример простого маршрута API, если он нужен (доступен по /battleclub/api/test)
|
||
app.get('/api/test', (req, res) => {
|
||
res.json({ message: 'Battle Club API is working!' });
|
||
});
|
||
|
||
// Если ваше основное приложение - это SPA (Single Page Application),
|
||
// вам может понадобиться отдавать index.html для всех не-API и не-статических путей,
|
||
// начинающихся с префикса /battleclub/. Но так как Apache проксирует /battleclub/ на /,
|
||
// то Express будет видеть пути без /battleclub/.
|
||
// Поэтому, если index.html должен отдаваться для /battleclub/ или /battleclub/some/path,
|
||
// то здесь нужен роут для '*' или специфичные роуты.
|
||
// Пока для простоты, предположим, что Apache проксирует /battleclub/ на корень bc.js,
|
||
// и index.html находится в public/ и запрашивается как /battleclub/index.html (или просто /battleclub/)
|
||
app.get('/', (req, res) => {
|
||
// Этот роут будет срабатывать, если Apache проксировал /battleclub/ на / этого приложения
|
||
res.sendFile(path.join(__dirname, 'public', 'index.html'));
|
||
});
|
||
|
||
|
||
// --- Обработчики событий Socket.IO ---
|
||
io.on('connection', (socket) => {
|
||
console.log(`[BC App Socket.IO] User connected: ${socket.id} to path ${socket.nsp.name}`);
|
||
|
||
socket.on('messageFromClient', (data) => {
|
||
console.log(`[BC App Socket.IO] Message from client ${socket.id}:`, data);
|
||
socket.emit('messageFromServer', { text: `Server received: ${data.text}` });
|
||
});
|
||
|
||
socket.on('disconnect', (reason) => {
|
||
console.log(`[BC App Socket.IO] User disconnected: ${socket.id} (Reason: ${reason})`);
|
||
});
|
||
|
||
// ... ваши обработчики auth, GameManager и т.д. ...
|
||
// Убедитесь, что они не полагаются на префикс пути /battleclub/ во внутренних данных,
|
||
// так как Express его "не видит" после проксирования Apache.
|
||
});
|
||
|
||
|
||
// Запуск HTTP сервера
|
||
server.listen(BC_APP_INTERNAL_PORT, BC_APP_INTERNAL_HOST, () => {
|
||
console.log(`Battle Club HTTP Application Server running at http://${BC_APP_INTERNAL_HOST}:${BC_APP_INTERNAL_PORT}`);
|
||
console.log(`Socket.IO will be available via proxy at path: ${PUBLIC_PATH_PREFIX}/socket.io`);
|
||
console.log(`Serving static files from: ${path.join(__dirname, 'public')}`);
|
||
});
|
||
|
||
// Обработчики глобальных ошибок
|
||
process.on('unhandledRejection', (reason, promise) => {
|
||
console.error('[BC App UNHANDLED REJECTION] At:', promise, 'reason:', reason);
|
||
});
|
||
process.on('uncaughtException', (err) => {
|
||
console.error('[BC App UNCAUGHT EXCEPTION] Caught exception:', err);
|
||
// process.exit(1); // В продакшене может быть оправдано
|
||
}); |