117 lines
2.6 KiB
JavaScript
117 lines
2.6 KiB
JavaScript
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;
|