]> git.cworth.org Git - empires-server/commitdiff
Fix JSON stringification of game-state at game reset
authorCarl Worth <cworth@cworth.org>
Sat, 27 Jun 2020 21:55:46 +0000 (14:55 -0700)
committerCarl Worth <cworth@cworth.org>
Sat, 27 Jun 2020 21:55:46 +0000 (14:55 -0700)
The initial stream of game state upon player connection was already
careful to use a subsitute function for correct stringification of
Set objects, but the streaming at game reset was not.

I didn't notice this for a while because the client always reset its
own state data before applying what was streamed from the server. The
application of the server-provided state would fail, (encountering an
empty object instead of an empty array), but since the client state
was already reset anyway, that wasn't noticed, (as long as the failure
only happened after the prompt data, for example).

I uncovered the bug with a recent client fix to not display the
category-input form until the game-state was received, (and the
Boolean to trigger that display happened only after the portions of
the game state that were failing due to the bug described above).

empathy.js
game.js

index 56ac53f9c32f95d5b6cbefdebb21d69ed68918e0..3e32a8bc294e31268c4fa3a0bbd9a802e308db5a 100644 (file)
@@ -97,7 +97,7 @@ class Empathy extends Game {
     this.judging_start_time_ms = 0;
     this.equivalencies = {};
 
-    this.broadcast_event_object('game-state', this.state);
+    this.broadcast_event('game-state', this.game_state_json());
   }
 
   add_prompt(items, prompt_string) {
diff --git a/game.js b/game.js
index f9e18cb760725eb9d05a993115bf286f5f0b2e85..55145bbaee018b89d37aff24c2c617f907fc1636 100644 (file)
--- a/game.js
+++ b/game.js
@@ -258,6 +258,10 @@ class Game {
     this.broadcast_event(type, JSON.stringify(obj));
   }
 
+  game_state_json() {
+    return JSON.stringify(this.state, stringify_replacer);
+  }
+
   handle_events(request, response) {
     /* These headers will keep the connection open so we can stream events. */
     const headers = {
@@ -293,8 +297,7 @@ class Game {
     /* Finally, if this game class has a "state" property, stream that
      * current state to the client. */
     if (this.state) {
-      const state_json = JSON.stringify(this.state, stringify_replacer);
-      response.write(`event: game-state\ndata: ${state_json}\n\n`);
+      response.write(`event: game-state\ndata: ${this.game_state_json()}\n\n`);
     }
   }