const { v4: uuidv4 } = require('uuid'); const fs = require('fs'); const path = require('path'); // 持久化文件路径 const STORAGE_FILE = path.join(__dirname, '../../data/rooms.json'); // 确保数据目录存在 const ensureDataDir = () => { const dir = path.dirname(STORAGE_FILE); if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } }; // 从文件加载房间数据 const loadRooms = () => { try { ensureDataDir(); if (fs.existsSync(STORAGE_FILE)) { const data = fs.readFileSync(STORAGE_FILE, 'utf8'); const roomsArray = JSON.parse(data); return new Map(roomsArray.map(room => [room.id, room])); } } catch (e) { console.warn('[RoomStore] Failed to load rooms from file:', e.message); } return new Map(); }; // 保存房间数据到文件 const saveRooms = (rooms) => { try { ensureDataDir(); const roomsArray = Array.from(rooms.values()); fs.writeFileSync(STORAGE_FILE, JSON.stringify(roomsArray, null, 2), 'utf8'); } catch (e) { console.error('[RoomStore] Failed to save rooms to file:', e.message); } }; // 内存存储(从文件加载) const rooms = loadRooms(); console.log(`[RoomStore] Loaded ${rooms.size} rooms from storage`); const roomStore = { // 创建房间 create(data) { const id = uuidv4(); const room = { id, title: data.title, streamerName: data.streamerName, streamKey: id, isLive: false, viewerCount: 0, createdAt: new Date().toISOString(), startedAt: null }; rooms.set(id, room); saveRooms(rooms); return room; }, // 获取所有房间 getAll() { return Array.from(rooms.values()); }, // 根据 ID 获取房间 getById(id) { return rooms.get(id) || null; }, // 根据 streamKey 获取房间 getByStreamKey(streamKey) { return rooms.get(streamKey) || null; }, // 更新房间 update(id, data) { const room = rooms.get(id); if (!room) return null; const updated = { ...room, ...data }; rooms.set(id, updated); saveRooms(rooms); return updated; }, // 设置直播状态 setLiveStatus(streamKey, isLive) { const room = rooms.get(streamKey); if (!room) return null; room.isLive = isLive; room.startedAt = isLive ? new Date().toISOString() : null; rooms.set(streamKey, room); saveRooms(rooms); return room; }, // 删除房间 delete(id) { const result = rooms.delete(id); if (result) saveRooms(rooms); return result; }, // 清空所有房间 (测试用) clear() { rooms.clear(); } }; module.exports = roomStore;