UNPKG

@colyseus/core

Version:

Multiplayer Framework for Node.js.

79 lines (78 loc) 3.13 kB
// packages/core/src/utils/DevMode.ts import debug from "debug"; import { logger } from "../Logger.mjs"; import { debugAndPrintError } from "../Debug.mjs"; import { getLocalRoomById, handleCreateRoom, presence, remoteRoomCall } from "../MatchMaker.mjs"; var debugDevMode = debug("colyseus:devmode"); var isDevMode = false; function setDevMode(bool) { isDevMode = bool; } async function reloadFromCache() { const roomHistoryList = Object.entries(await presence.hgetall(getRoomRestoreListKey())); debugDevMode("rooms to restore: %i", roomHistoryList.length); for (const [roomId, value] of roomHistoryList) { const roomHistory = JSON.parse(value); debugDevMode("restoring room %s (%s)", roomHistory.roomName, roomId); const recreatedRoomListing = await handleCreateRoom(roomHistory.roomName, roomHistory.clientOptions, roomId); const recreatedRoom = getLocalRoomById(recreatedRoomListing.roomId); logger.debug(`\u{1F504} room '${roomId}' has been restored.`); if (roomHistory.hasOwnProperty("state")) { recreatedRoom.state.decode(roomHistory.state); recreatedRoom.setState(recreatedRoom.state.clone()); logger.debug(`\u{1F4CB} room '${roomId}' state =>`, recreatedRoom.state.toJSON()); } recreatedRoom.onRestoreRoom?.(roomHistory["cache"]); if (roomHistory.clients) { for (const previousSessionId of roomHistory.clients) { await remoteRoomCall(recreatedRoomListing.roomId, "_reserveSeat", [previousSessionId, {}, 20, false, true]); } } } if (roomHistoryList.length > 0) { logger.debug("\u2705", roomHistoryList.length, "room(s) have been restored."); } } async function cacheRoomHistory(rooms) { for (const room of Object.values(rooms)) { const roomHistoryResult = await presence.hget(getRoomRestoreListKey(), room.roomId); if (roomHistoryResult) { try { const roomHistory = JSON.parse(roomHistoryResult); roomHistory["cache"] = room.onCacheRoom?.(); debugDevMode("caching room %s (%s)", room.roomName, room.roomId); if (room.state) { roomHistory["state"] = room.state.encodeAll(); } roomHistory["clients"] = room.clients.map((client) => client.sessionId); for (const sessionId in room["reservedSeats"]) { roomHistory["clients"].push(sessionId); } await presence.hset(getRoomRestoreListKey(), room.roomId, JSON.stringify(roomHistory)); logger.debug(`\u{1F4BE} caching room '${room.roomId}' (clients: ${room.clients.length}, state size: ${(roomHistory["state"] || []).length} bytes)`); } catch (e) { debugAndPrintError(`\u274C couldn't cache room '${room.roomId}', due to: ${e.stack}`); } } } } async function getPreviousProcessId(hostname) { return await presence.hget(getProcessRestoreKey(), hostname); } function getRoomRestoreListKey() { return "roomhistory"; } function getProcessRestoreKey() { return "processhistory"; } export { cacheRoomHistory, debugDevMode, getPreviousProcessId, getProcessRestoreKey, getRoomRestoreListKey, isDevMode, reloadFromCache, setDevMode };