]> git.cworth.org Git - empires-server/commitdiff
Fix game-state object to include players judging and answering
authorCarl Worth <cworth@cworth.org>
Sun, 14 Jun 2020 21:55:12 +0000 (14:55 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 25 Jun 2020 16:16:04 +0000 (09:16 -0700)
Previously, these were always appearing as empty objects in the JSON
results that we streamed from the server in the game-state object
because JSON.stringify doesn't natively know how to serialize a Set
object.

Here, we provide a replacer function that serializes a Set object as
an array.

game.js

diff --git a/game.js b/game.js
index 86a0e70b96f311dc2133898e679c1afa619406a7..5a49b6bdd52b5aaf753ca3469e14618cd1548c9a 100644 (file)
--- a/game.js
+++ b/game.js
@@ -42,6 +42,16 @@ class Player {
   }
 }
 
+/* This replacer function allows for JSON.stringify to give results
+ * for objects of various types that are used in game state.
+ */
+function stringify_replacer(key, value) {
+  if (typeof value === 'object' && value instanceof Set) {
+    return [...value];
+  }
+  return value;
+}
+
 /* Base class providing common code for game engine implementations. */
 class Game {
   constructor(id) {
@@ -264,7 +274,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);
+      const state_json = JSON.stringify(this.state, stringify_replacer);
       response.write(`event: game-state\ndata: ${state_json}\n\n`);
     }
   }