onLeave timeout

on server side, when player leave room, you can set a time out to avoid session destroying for few seconds if he wants to return?

Hi @rscata,

You can achieve this by turning autoDispose to false, and implementing this timeout by yourself. Like:

import { Room, Delayed } from "colyseus";

class MyRoom extends Room {
  autoDispose: boolean = false;

  onLeave () {
    if (this.clients.length === 0) {
      setTimeout(() => this._disposeIfEmpty(), 5000);
    }
  }
}

The _disposeIfEmpty method is not documented.

Let me know if you have any suggestions to make this more intuitive. Cheers!

Thanks @endel

Yes, this solution is good not to close the room, if there is no player in the room, but if in a room I have 5 players who play for example poker and by mistake one of them leave the room, how can I set an interval in which to return to the game room?
Should I set a timeout for each client?

I want to have 30 sec. to return to the room.

Or, for example, if refresh on the browser page.

In onLeave function, I implemented the destruction of the player instance, but I would like to give her some time to come back before destroying the instance.

onLeave () {
    if (this.clients.length === 0) {
      setTimeout(() => this._disposeIfEmpty(), 5000);
    } else {
          // TODO: the player can return to play

          // remove instance
          this.state.removePlayer(client);
    }
  }

thank you very much for your help

I have same question. How do you resolve it?
"Should I set a timeout for each client?"

I have read source code in here:

const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 5);
...
// seat reservation & reconnection
protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;
...
public setSeatReservationTime(seconds: number) {
	this.seatReservationTime = seconds;
	return this;
}

Variable "DEFAULT_SEAT_RESERVATION_TIME" for change time with this problem?

@DinhNguyen and @rscata I think you both are looking for rejoin the game. Below snippet will solve your problem. For more details: Rejoin Link.

async onLeave (client, consented: boolean) {
  // flag client as inactive for other users
  this.state.players[client.sessionId].connected = false;

  try {
    if (consented) {
        throw new Error("consented leave");
    }

    // allow disconnected client to rejoin into this room until 20 seconds
    await this.allowReconnection(client, 20);

    // client returned! let's re-activate it.
    this.state.players[client.sessionId].connected = true;

  } catch (e) {

    // 20 seconds expired. let's remove the client.
    delete this.state.players[client.sessionId];
  }
}