const express = require('express'); const dotenv = require('dotenv'); const { Server } = require('socket.io'); const ChatSocketHandler = require('./socket/ChatSocketHandler'); const ChannelSocketHandler = require('./socket/ChannelSocketHandler'); const PlaylistSocketHandler = require('./socket/PlaylistSocketHandler'); const socketAuthMiddleware = require('./socket/middleware/jwt'); const proxyController = require('./controllers/ProxyController'); const centralChannelController = require('./controllers/CentralChannelController'); const channelController = require('./controllers/ChannelController'); const authController = require('./controllers/AuthController'); const streamController = require('./services/restream/StreamController'); const ChannelService = require('./services/ChannelService'); const PlaylistUpdater = require('./services/PlaylistUpdater'); dotenv.config(); const app = express(); app.use(express.json()); // CORS middleware app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); if (req.method === 'OPTIONS') { return res.sendStatus(200); } next(); }); // Auth routes const authRouter = express.Router(); authRouter.post('/admin-login', authController.adminLogin); authRouter.get('/admin-status', authController.checkAdminStatus); app.use('/api/auth', authRouter); // Channel routes const apiRouter = express.Router(); apiRouter.get('/', channelController.getChannels); apiRouter.get('/current', channelController.getCurrentChannel); apiRouter.delete('/clear', authController.verifyToken, channelController.clearChannels); apiRouter.get('/playlist', centralChannelController.playlist); apiRouter.get('/:channelId', channelController.getChannel); // Protected routes apiRouter.delete('/:channelId', authController.verifyToken, channelController.deleteChannel); apiRouter.put('/:channelId', authController.verifyToken, channelController.updateChannel); apiRouter.post('/', authController.verifyToken, channelController.addChannel); app.use('/api/channels', apiRouter); const proxyRouter = express.Router(); proxyRouter.get('/channel', proxyController.channel); proxyRouter.get('/segment', proxyController.segment); proxyRouter.get('/key', proxyController.key); proxyRouter.get('/current', centralChannelController.currentChannel); app.use('/proxy', proxyRouter); const PORT = 5000; const server = app.listen(PORT, async () => { console.log(`Server listening on Port ${PORT}`); const currentChannel = ChannelService.getCurrentChannel(); if (currentChannel && currentChannel.restream()) { await streamController.start(currentChannel); } PlaylistUpdater.startScheduler(); PlaylistUpdater.registerChannelsPlaylist(ChannelService.getChannels()); }); // Web Sockets with explicit CORS configuration const io = new Server(server, { cors: { origin: "*", // Allow any origin in development methods: ["GET", "POST", "OPTIONS"], allowedHeaders: ["Authorization", "Content-Type"], credentials: true, }, }); // Add JWT authentication middleware to socket.io io.use(socketAuthMiddleware); const connectedUsers = {}; io.on('connection', socket => { console.log('New client connected'); socket.on('new-user', userId => { connectedUsers[socket.id] = userId; socket.broadcast.emit('user-connected', userId); }) socket.on('disconnect', () => { socket.broadcast.emit('user-disconnected', connectedUsers[socket.id]); delete connectedUsers[socket.id]; }) ChannelSocketHandler(io, socket); PlaylistSocketHandler(io, socket); ChatSocketHandler(io, socket); })