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 name and metadata.

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",
  }
});