Lobby Room
The built-in LobbyRoom provides a live listing of available rooms in your game server.
Features:
- Live listing for rooms with
enableRealtimeListing(). - Automatic updates when rooms are created, joined, left, or disposed.
- Filter support by
nameandmetadata.
The source-code for LobbyRoom is available here. You can extend it for custom listing behavior.
Server
Expose the lobby room
server.ts
import { defineServer, defineRoom, LobbyRoom } from "colyseus";
const server = defineServer({
rooms: {
lobby: defineRoom(LobbyRoom)
}
})Enable realtime listing on your game room
When realtime listing is enabled, the LobbyRoom is notified automatically during onCreate(), onJoin(), onLeave() and onDispose().
server.ts
import { defineServer, defineRoom, LobbyRoom } from "colyseus";
const server = defineServer({
rooms: {
lobby: defineRoom(LobbyRoom),
my_room: defineRoom(MyRoom).enableRealtimeListing()
}
})Client
The LobbyRoom will send messages to the client whenever a room is added, removed or updated.
client.ts
import { Client, RoomAvailable } from "@colyseus/sdk";
const client = new Client("http://localhost:2567");
const lobby = await client.joinOrCreate("lobby");
let allRooms: RoomAvailable[] = [];
lobby.onMessage("rooms", (rooms) => {
allRooms = rooms;
});
lobby.onMessage("+", ([roomId, room]) => {
const roomIndex = allRooms.findIndex((room) => room.roomId === roomId);
if (roomIndex !== -1) {
allRooms[roomIndex] = room;
} else {
allRooms.push(room);
}
});
lobby.onMessage("-", (roomId) => {
allRooms = allRooms.filter((room) => room.roomId !== roomId);
});Filtering rooms
Filtering rooms by name or metadata can be done by providing the filter option when joining the lobby:
client.ts
const lobby = await client.joinOrCreate("lobby", {
filter: {
name: "my_room",
metadata: {
gameMode: "deathmatch",
}
}
});Alternatively, you can also dynamically change the filter by sending a "filter" message to the lobby room:
lobby.send("filter", {
name: "my_room",
metadata: {
gameMode: "deathmatch",
}
});