105 lines
3.7 KiB
JavaScript
105 lines
3.7 KiB
JavaScript
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);
|
|
}) |