Relay Room
The built-in RelayRoom provides a lightweight relay for simple multiplayer use cases where you only need to track connected clients.
Features:
- Broadcasts client messages to everyone else.
- Minimal backend state (no authoritative validation).
- Ideal for quick prototypes or frontend-driven validation.
The source-code for RelayRoom is available here. Consider implementing your own version with backend validations when needed.
Server
server.ts
import { defineServer, defineRoom, RelayRoom } from "colyseus";
//
// Expose your relayed room.
//
const server = defineServer({
rooms: {
your_relayed_room: defineRoom(RelayRoom, {
maxClients: 4,
allowReconnectionTime: 120
})
}
})Client
See how to register callbacks for players joining, leaving, sending and receiving messages from the relayed room.
Connecting into the room
client.ts
import { Client } from "@colyseus/sdk";
const client = new Client("http://localhost:2567");
//
// Join the relayed room.
//
const relay = await client.joinOrCreate("your_relayed_room", {
name: "This is my name!"
});Registering callbacks when players join and leave
client.ts
//
// Detect when a player joined the room.
//
relay.state.players.onAdd((player, sessionId) => {
if (relay.sessionId === sessionId) {
console.log("It's me!", player.name);
} else {
console.log("It's an opponent", player.name, sessionId);
}
})
//
// Detect when a player left the room.
//
relay.state.players.onRemove((player, sessionId) => {
console.log("Opponent left!", player, sessionId);
})
//
// Detect when the connectivity of a player has changed.
// (only available if you provided `allowReconnection: true` in the backend)
//
relay.state.players.onChange((player, sessionId) => {
if (player.connected) {
console.log("Opponent has reconnected!", player, sessionId);
} else {
console.log("Opponent has disconnected!", player, sessionId);
}
})Sending and receiving messages
client.ts
//
// By sending a message, all other clients will receive it under the same name.
// Messages are only sent to other connected clients, never the current one.
//
relay.send("fire", {
x: 100,
y: 200
});
//
// Register a callback for messages you're interested in from other clients.
//
relay.onMessage("fire", ([sessionId, message]) => {
//
// The `sessionId` from who sent the message
//
console.log(sessionId, "sent a message!");
//
// The actual message sent by the other client
//
console.log("fire at", message);
});