zhibo/live-streaming/server/routes/rooms.js

82 lines
2.3 KiB
JavaScript
Raw Normal View History

2025-12-15 11:21:21 +08:00
const express = require('express');
const router = express.Router();
const roomStore = require('../store/roomStore');
const { validateRoom } = require('../middleware/validate');
const { generateStreamUrls } = require('../utils/streamUrl');
const { getActiveStreamKeys } = require('../utils/srsHttpApi');
2025-12-15 11:21:21 +08:00
2025-12-16 15:47:36 +08:00
const getRequestHost = (req) => {
const hostHeader = req && req.get ? req.get('host') : null;
const fromHeader = hostHeader ? String(hostHeader).split(':')[0] : null;
return req && req.hostname ? req.hostname : fromHeader;
};
2025-12-15 11:21:21 +08:00
// GET /api/rooms - 获取所有房间
router.get('/', async (req, res) => {
2025-12-15 11:21:21 +08:00
const rooms = roomStore.getAll();
const activeStreamKeys = await getActiveStreamKeys({ app: 'live' });
2025-12-16 15:47:36 +08:00
const requestHost = getRequestHost(req);
2025-12-15 11:21:21 +08:00
res.json({
success: true,
data: rooms.map(room => ({
...room,
isLive: activeStreamKeys.size ? activeStreamKeys.has(room.streamKey) : room.isLive,
2025-12-16 15:47:36 +08:00
streamUrls: generateStreamUrls(room.streamKey, requestHost)
2025-12-15 11:21:21 +08:00
}))
});
});
// POST /api/rooms - 创建房间
router.post('/', validateRoom, (req, res) => {
const { title, streamerName } = req.body;
const room = roomStore.create({ title, streamerName });
2025-12-16 15:47:36 +08:00
const requestHost = getRequestHost(req);
2025-12-15 11:21:21 +08:00
res.status(201).json({
success: true,
data: {
...room,
2025-12-16 15:47:36 +08:00
streamUrls: generateStreamUrls(room.streamKey, requestHost)
2025-12-15 11:21:21 +08:00
}
});
});
// GET /api/rooms/:id - 获取单个房间
router.get('/:id', async (req, res) => {
2025-12-15 11:21:21 +08:00
const room = roomStore.getById(req.params.id);
2025-12-16 15:47:36 +08:00
const requestHost = getRequestHost(req);
2025-12-15 11:21:21 +08:00
if (!room) {
return res.status(404).json({
success: false,
error: { code: 'ROOM_NOT_FOUND', message: '房间不存在' }
});
}
res.json({
success: true,
data: {
...room,
isLive: (await getActiveStreamKeys({ app: 'live' })).has(room.streamKey) || room.isLive,
2025-12-16 15:47:36 +08:00
streamUrls: generateStreamUrls(room.streamKey, requestHost)
2025-12-15 11:21:21 +08:00
}
});
});
// DELETE /api/rooms/:id - 删除房间
router.delete('/:id', (req, res) => {
const deleted = roomStore.delete(req.params.id);
if (!deleted) {
return res.status(404).json({
success: false,
error: { code: 'ROOM_NOT_FOUND', message: '房间不存在' }
});
}
res.json({ success: true });
});
module.exports = router;