client.reconnect
-
// Initialization in the constructor
constructor(props) { super(props); ... this.colyseus = new Colyseus.Client('wss://ws.matchscore.ru') this.GameBotRoom = this.colyseus.joinOrCreate("gamebot", { user_name: this.state.user_name, player_a: props.player_a, player_b: props.player_b, user_rank: this.state.user_rank, match_id: this.state.match_id, game_id: this.state.game_id, my_time: this.state.my_time, }) this.GameBotRoom.then(room => { room.onStateChange.once((state) => { // console.log("room.onStateChange.once! state", state); this.setState(state); }); }) ... }
// Next, listen to events from the client and to the client leaving the room
gameBotRoomRun = () => { this.GameBotRoom.then(room => { room.onStateChange((state) => { if (this.state.my_time_active === 0 && this.state.game_players[this.state.player_active] === this.state.user_name) { console.log("tttt off") room.send({ command: "time_off" }); } this.setState(state); }); room.onMessage((data) => { if (data.command === "redirect") { window.location.replace(data.link); } else if (data.command === "room_id") { //console.log("room_id - ", data.room_id); //console.log("session_id - ", data.session_id); this.setState({ room_id: data.room_id, session_id: data.session_id }); } }); room.onLeave((code) => { console.log("client left the room", code); this.test01(); }); }) }
// Catch the silk on the element and send it to the server
handleClick = (i) => { if (this.state.gameStatus) { if (this.state.squares_valid[i] === this.state.player_active && this.state.game_players[this.state.player_active] === this.state.user_name) { this.GameBotRoom.then(room => { room.send({ command: "test", sector: i, xIsNext: this.state.xIsNext }); }); } } }
// Everything works great! But I decided to add a response to reconnecting the client (loss of connection)
// Server
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 reconnect into this room until 20 seconds await this.allowReconnection(client, 30); // 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]; } }
// Client
serverReconnect = () => { //localhost //let client = new Colyseus.Client('ws://localhost:8014') //server let client = new Colyseus.Client('wss://ws.matchscore.ru') client.reconnect(this.state.room_id, this.state.session_id).then(room => { // console.log("joined successfully", room); //this.setState({ pingServerTime: 60 }); console.log("serverReconnect!!!") clearInterval(this.TimerId); //room.onClick += this.GameBotRoom.onClick //this.GameBotRoom += room.onClick.onClick //room.onMessage += this.GameBotRoom.onMessage //room.onLeave += this.GameBotRoom.onLeave //room.onMessageCallback room.onStateChange((state) => { console.log("onStateChange - serverReconnect"); this.setState(state); }); //room.send({ command: "message", message: "message!!!" }); }); }
// Reconnecting is working fine, client is being updated! But the previous one
this.GameBotRoom = this.colyseus.joinOrCreate("gamebot", {....
through which all the logic of the game passes, does not send messages to the server, it loses connection and the process goes to serverReconnect
If you add a click response on serverReconnect, then it reconnects (which is expected ... with an error)A room.onLeave from the initial
this.GameBotRoom.then(room => {
stops working when reconnecting, and in
client.reconnect(this.state.room_id, this.state.session_id).then(room => {
does not work...
Help with advice on how to redirect processing to its original state (I’ve been suffering for two days ...)
-
Solved! Everything is working!!! Did the button click processing through the state on the client