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 room
name, optionally narrowed bymetadata.
Rooms flagged private or unlisted never appear in the lobby listing. (locked rooms remain listed, marked as locked.)
The source-code for LobbyRoom is available here. You can extend it for custom listing behavior.
Server
Expose the lobby room
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().
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.
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
Filter the listing by providing the filter option when joining the lobby. A filter must include name. The name check runs unconditionally, so a metadata-only filter matches nothing. Use metadata to narrow within a room name:
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",
}
});