@mnbroatch/boardgame.io 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/ai/package.json +7 -0
  4. package/client/package.json +7 -0
  5. package/core/package.json +7 -0
  6. package/debug/package.json +7 -0
  7. package/dist/boardgameio.es.js +14238 -0
  8. package/dist/boardgameio.js +14277 -0
  9. package/dist/boardgameio.min.js +16 -0
  10. package/dist/cjs/Debug-9d141c06.js +9586 -0
  11. package/dist/cjs/ai-e0e8a768.js +377 -0
  12. package/dist/cjs/ai.js +20 -0
  13. package/dist/cjs/client-76dec77b.js +258 -0
  14. package/dist/cjs/client-a22d7500.js +524 -0
  15. package/dist/cjs/client.js +26 -0
  16. package/dist/cjs/core.js +52 -0
  17. package/dist/cjs/debug.js +18 -0
  18. package/dist/cjs/filter-player-view-bb02e2f6.js +89 -0
  19. package/dist/cjs/initialize-267fcd69.js +61 -0
  20. package/dist/cjs/internal.js +25 -0
  21. package/dist/cjs/master-2904879d.js +320 -0
  22. package/dist/cjs/master.js +18 -0
  23. package/dist/cjs/multiplayer.js +23 -0
  24. package/dist/cjs/plugin-random-7425844d.js +229 -0
  25. package/dist/cjs/plugins.js +59 -0
  26. package/dist/cjs/react-native.js +182 -0
  27. package/dist/cjs/react.js +727 -0
  28. package/dist/cjs/reducer-16eec232.js +1203 -0
  29. package/dist/cjs/server.js +4087 -0
  30. package/dist/cjs/socketio-7a0837eb.js +478 -0
  31. package/dist/cjs/testing.js +30 -0
  32. package/dist/cjs/transport-b1874dfa.js +37 -0
  33. package/dist/cjs/turn-order-b2ff8740.js +1136 -0
  34. package/dist/cjs/util-fcfd8fb8.js +140 -0
  35. package/dist/esm/Debug-0141fe2d.js +9577 -0
  36. package/dist/esm/ai-5c06e761.js +371 -0
  37. package/dist/esm/ai.js +8 -0
  38. package/dist/esm/client-2e653027.js +522 -0
  39. package/dist/esm/client-5f57c3f2.js +255 -0
  40. package/dist/esm/client.js +16 -0
  41. package/dist/esm/core.js +40 -0
  42. package/dist/esm/debug.js +10 -0
  43. package/dist/esm/filter-player-view-2c6cc96f.js +87 -0
  44. package/dist/esm/initialize-11d626ca.js +59 -0
  45. package/dist/esm/internal.js +10 -0
  46. package/dist/esm/master-fa8f2e43.js +318 -0
  47. package/dist/esm/master.js +10 -0
  48. package/dist/esm/multiplayer.js +14 -0
  49. package/dist/esm/plugin-random-087f861e.js +226 -0
  50. package/dist/esm/plugins.js +55 -0
  51. package/dist/esm/react-native.js +173 -0
  52. package/dist/esm/react.js +716 -0
  53. package/dist/esm/reducer-c46da7e5.js +1198 -0
  54. package/dist/esm/socketio-c22ffa65.js +455 -0
  55. package/dist/esm/testing.js +26 -0
  56. package/dist/esm/transport-ce07b771.js +35 -0
  57. package/dist/esm/turn-order-376d315e.js +1091 -0
  58. package/dist/esm/util-b6147cef.js +135 -0
  59. package/dist/types/packages/ai.d.ts +5 -0
  60. package/dist/types/packages/client.d.ts +3 -0
  61. package/dist/types/packages/core.d.ts +5 -0
  62. package/dist/types/packages/debug.d.ts +2 -0
  63. package/dist/types/packages/internal.d.ts +8 -0
  64. package/dist/types/packages/master.d.ts +2 -0
  65. package/dist/types/packages/multiplayer.d.ts +3 -0
  66. package/dist/types/packages/plugins.d.ts +3 -0
  67. package/dist/types/packages/react-native.d.ts +2 -0
  68. package/dist/types/packages/react.d.ts +3 -0
  69. package/dist/types/packages/server.d.ts +6 -0
  70. package/dist/types/packages/testing.d.ts +1 -0
  71. package/dist/types/src/ai/ai.d.ts +53 -0
  72. package/dist/types/src/ai/ai.test.d.ts +1 -0
  73. package/dist/types/src/ai/bot.d.ts +40 -0
  74. package/dist/types/src/ai/mcts-bot.d.ts +60 -0
  75. package/dist/types/src/ai/random-bot.d.ts +27 -0
  76. package/dist/types/src/client/client.d.ts +104 -0
  77. package/dist/types/src/client/client.test.d.ts +1 -0
  78. package/dist/types/src/client/debug/tests/debug.test.d.ts +1 -0
  79. package/dist/types/src/client/manager.d.ts +61 -0
  80. package/dist/types/src/client/react.d.ts +75 -0
  81. package/dist/types/src/client/react.ssr.test.d.ts +4 -0
  82. package/dist/types/src/client/react.test.d.ts +1 -0
  83. package/dist/types/src/client/transport/dummy.d.ts +18 -0
  84. package/dist/types/src/client/transport/local.d.ts +59 -0
  85. package/dist/types/src/client/transport/local.test.d.ts +1 -0
  86. package/dist/types/src/client/transport/socketio.d.ts +45 -0
  87. package/dist/types/src/client/transport/socketio.test.d.ts +1 -0
  88. package/dist/types/src/client/transport/transport.d.ts +50 -0
  89. package/dist/types/src/client/transport/transport.test.d.ts +1 -0
  90. package/dist/types/src/core/action-creators.d.ts +144 -0
  91. package/dist/types/src/core/action-types.d.ts +10 -0
  92. package/dist/types/src/core/backwards-compatibility.d.ts +12 -0
  93. package/dist/types/src/core/constants.d.ts +6 -0
  94. package/dist/types/src/core/errors.d.ts +15 -0
  95. package/dist/types/src/core/flow.d.ts +28 -0
  96. package/dist/types/src/core/flow.test.d.ts +1 -0
  97. package/dist/types/src/core/game-methods.d.ts +9 -0
  98. package/dist/types/src/core/game.d.ts +26 -0
  99. package/dist/types/src/core/game.test.d.ts +1 -0
  100. package/dist/types/src/core/initialize.d.ts +9 -0
  101. package/dist/types/src/core/logger.d.ts +2 -0
  102. package/dist/types/src/core/player-view.d.ts +7 -0
  103. package/dist/types/src/core/player-view.test.d.ts +1 -0
  104. package/dist/types/src/core/reducer.d.ts +155 -0
  105. package/dist/types/src/core/reducer.test.d.ts +1 -0
  106. package/dist/types/src/core/turn-order.d.ts +179 -0
  107. package/dist/types/src/core/turn-order.test.d.ts +8 -0
  108. package/dist/types/src/lobby/client.d.ts +194 -0
  109. package/dist/types/src/lobby/client.test.d.ts +1 -0
  110. package/dist/types/src/lobby/connection.d.ts +44 -0
  111. package/dist/types/src/lobby/connection.test.d.ts +1 -0
  112. package/dist/types/src/lobby/create-match-form.d.ts +26 -0
  113. package/dist/types/src/lobby/login-form.d.ts +23 -0
  114. package/dist/types/src/lobby/match-instance.d.ts +31 -0
  115. package/dist/types/src/lobby/react.d.ts +113 -0
  116. package/dist/types/src/lobby/react.ssr.test.d.ts +4 -0
  117. package/dist/types/src/lobby/react.test.d.ts +1 -0
  118. package/dist/types/src/master/filter-player-view.d.ts +96 -0
  119. package/dist/types/src/master/filter-player-view.test.d.ts +1 -0
  120. package/dist/types/src/master/master.d.ts +94 -0
  121. package/dist/types/src/master/master.test.d.ts +1 -0
  122. package/dist/types/src/plugins/events/events.d.ts +54 -0
  123. package/dist/types/src/plugins/events/events.test.d.ts +1 -0
  124. package/dist/types/src/plugins/main.d.ts +75 -0
  125. package/dist/types/src/plugins/main.test.d.ts +1 -0
  126. package/dist/types/src/plugins/plugin-events.d.ts +5 -0
  127. package/dist/types/src/plugins/plugin-immer.d.ts +7 -0
  128. package/dist/types/src/plugins/plugin-immer.test.d.ts +1 -0
  129. package/dist/types/src/plugins/plugin-log.d.ts +14 -0
  130. package/dist/types/src/plugins/plugin-log.test.d.ts +1 -0
  131. package/dist/types/src/plugins/plugin-player.d.ts +29 -0
  132. package/dist/types/src/plugins/plugin-player.test.d.ts +1 -0
  133. package/dist/types/src/plugins/plugin-random.d.ts +4 -0
  134. package/dist/types/src/plugins/plugin-serializable.d.ts +7 -0
  135. package/dist/types/src/plugins/plugin-serializable.test.d.ts +1 -0
  136. package/dist/types/src/plugins/random/random.alea.d.ts +19 -0
  137. package/dist/types/src/plugins/random/random.d.ts +54 -0
  138. package/dist/types/src/plugins/random/random.test.d.ts +1 -0
  139. package/dist/types/src/server/api.d.ts +13 -0
  140. package/dist/types/src/server/api.test.d.ts +1 -0
  141. package/dist/types/src/server/auth.d.ts +38 -0
  142. package/dist/types/src/server/auth.test.d.ts +1 -0
  143. package/dist/types/src/server/cors.d.ts +4 -0
  144. package/dist/types/src/server/cors.test.d.ts +1 -0
  145. package/dist/types/src/server/db/base.d.ts +192 -0
  146. package/dist/types/src/server/db/flatfile.d.ts +44 -0
  147. package/dist/types/src/server/db/flatfile.test.d.ts +1 -0
  148. package/dist/types/src/server/db/index.d.ts +4 -0
  149. package/dist/types/src/server/db/index.test.d.ts +1 -0
  150. package/dist/types/src/server/db/inmemory.d.ts +43 -0
  151. package/dist/types/src/server/db/inmemory.test.d.ts +1 -0
  152. package/dist/types/src/server/db/localstorage.d.ts +7 -0
  153. package/dist/types/src/server/db/localstorage.test.d.ts +1 -0
  154. package/dist/types/src/server/index.d.ts +68 -0
  155. package/dist/types/src/server/index.test.d.ts +1 -0
  156. package/dist/types/src/server/transport/pubsub/generic-pub-sub.d.ts +6 -0
  157. package/dist/types/src/server/transport/pubsub/in-memory-pub-sub.d.ts +7 -0
  158. package/dist/types/src/server/transport/pubsub/in-memory-pub-sub.test.d.ts +1 -0
  159. package/dist/types/src/server/transport/socketio-simultaneous.test.d.ts +1 -0
  160. package/dist/types/src/server/transport/socketio.d.ts +65 -0
  161. package/dist/types/src/server/transport/socketio.test.d.ts +1 -0
  162. package/dist/types/src/server/util.d.ts +35 -0
  163. package/dist/types/src/testing/mock-random.d.ts +15 -0
  164. package/dist/types/src/testing/mock-random.test.d.ts +1 -0
  165. package/dist/types/src/types.d.ts +387 -0
  166. package/internal/package.json +7 -0
  167. package/master/package.json +7 -0
  168. package/multiplayer/package.json +7 -0
  169. package/package.json +211 -0
  170. package/plugins/package.json +7 -0
  171. package/react/package.json +7 -0
  172. package/react-native/package.json +7 -0
  173. package/server/package.json +6 -0
  174. package/src/ai/ai.test.ts +433 -0
  175. package/src/ai/ai.ts +84 -0
  176. package/src/ai/bot.ts +122 -0
  177. package/src/ai/mcts-bot.ts +331 -0
  178. package/src/ai/random-bot.ts +20 -0
  179. package/src/client/client.test.ts +993 -0
  180. package/src/client/client.ts +588 -0
  181. package/src/client/debug/Debug.svelte +239 -0
  182. package/src/client/debug/Menu.svelte +65 -0
  183. package/src/client/debug/ai/AI.svelte +215 -0
  184. package/src/client/debug/ai/Options.svelte +48 -0
  185. package/src/client/debug/info/Info.svelte +22 -0
  186. package/src/client/debug/info/Item.svelte +24 -0
  187. package/src/client/debug/log/Log.svelte +157 -0
  188. package/src/client/debug/log/LogEvent.svelte +149 -0
  189. package/src/client/debug/log/LogMetadata.svelte +7 -0
  190. package/src/client/debug/log/PhaseMarker.svelte +27 -0
  191. package/src/client/debug/log/TurnMarker.svelte +23 -0
  192. package/src/client/debug/main/ClientSwitcher.svelte +59 -0
  193. package/src/client/debug/main/Controls.svelte +58 -0
  194. package/src/client/debug/main/Hotkey.svelte +84 -0
  195. package/src/client/debug/main/InteractiveFunction.svelte +85 -0
  196. package/src/client/debug/main/Main.svelte +121 -0
  197. package/src/client/debug/main/Move.svelte +68 -0
  198. package/src/client/debug/main/PlayerInfo.svelte +70 -0
  199. package/src/client/debug/mcts/Action.svelte +22 -0
  200. package/src/client/debug/mcts/MCTS.svelte +78 -0
  201. package/src/client/debug/mcts/Table.svelte +98 -0
  202. package/src/client/debug/tests/JSONTree.mock.svelte +3 -0
  203. package/src/client/debug/tests/debug.test.ts +183 -0
  204. package/src/client/debug/utils/shortcuts.js +50 -0
  205. package/src/client/debug/utils/shortcuts.test.js +49 -0
  206. package/src/client/manager.ts +177 -0
  207. package/src/client/react-native.js +136 -0
  208. package/src/client/react-native.test.js +229 -0
  209. package/src/client/react.ssr.test.tsx +24 -0
  210. package/src/client/react.test.tsx +213 -0
  211. package/src/client/react.tsx +192 -0
  212. package/src/client/transport/dummy.ts +19 -0
  213. package/src/client/transport/local.test.ts +353 -0
  214. package/src/client/transport/local.ts +230 -0
  215. package/src/client/transport/socketio.test.ts +328 -0
  216. package/src/client/transport/socketio.ts +210 -0
  217. package/src/client/transport/transport.test.ts +27 -0
  218. package/src/client/transport/transport.ts +95 -0
  219. package/src/core/action-creators.ts +159 -0
  220. package/src/core/action-types.ts +18 -0
  221. package/src/core/backwards-compatibility.ts +23 -0
  222. package/src/core/constants.ts +6 -0
  223. package/src/core/errors.ts +35 -0
  224. package/src/core/flow.test.ts +2433 -0
  225. package/src/core/flow.ts +897 -0
  226. package/src/core/game-methods.ts +9 -0
  227. package/src/core/game.test.ts +286 -0
  228. package/src/core/game.ts +114 -0
  229. package/src/core/initialize.ts +77 -0
  230. package/src/core/logger.test.js +90 -0
  231. package/src/core/logger.ts +18 -0
  232. package/src/core/player-view.test.ts +50 -0
  233. package/src/core/player-view.ts +39 -0
  234. package/src/core/reducer.test.ts +991 -0
  235. package/src/core/reducer.ts +532 -0
  236. package/src/core/turn-order.test.ts +1123 -0
  237. package/src/core/turn-order.ts +473 -0
  238. package/src/lobby/client.test.ts +385 -0
  239. package/src/lobby/client.ts +358 -0
  240. package/src/lobby/connection.test.ts +207 -0
  241. package/src/lobby/connection.ts +162 -0
  242. package/src/lobby/create-match-form.tsx +122 -0
  243. package/src/lobby/login-form.tsx +75 -0
  244. package/src/lobby/match-instance.tsx +135 -0
  245. package/src/lobby/react.ssr.test.tsx +22 -0
  246. package/src/lobby/react.test.tsx +594 -0
  247. package/src/lobby/react.tsx +402 -0
  248. package/src/master/filter-player-view.test.ts +381 -0
  249. package/src/master/filter-player-view.ts +102 -0
  250. package/src/master/master.test.ts +1068 -0
  251. package/src/master/master.ts +492 -0
  252. package/src/plugins/events/events.test.ts +108 -0
  253. package/src/plugins/events/events.ts +209 -0
  254. package/src/plugins/main.test.ts +411 -0
  255. package/src/plugins/main.ts +314 -0
  256. package/src/plugins/plugin-events.ts +40 -0
  257. package/src/plugins/plugin-immer.test.ts +86 -0
  258. package/src/plugins/plugin-immer.ts +37 -0
  259. package/src/plugins/plugin-log.test.ts +37 -0
  260. package/src/plugins/plugin-log.ts +40 -0
  261. package/src/plugins/plugin-player.test.ts +172 -0
  262. package/src/plugins/plugin-player.ts +100 -0
  263. package/src/plugins/plugin-random.ts +40 -0
  264. package/src/plugins/plugin-serializable.test.ts +40 -0
  265. package/src/plugins/plugin-serializable.ts +55 -0
  266. package/src/plugins/random/random.alea.ts +109 -0
  267. package/src/plugins/random/random.test.ts +167 -0
  268. package/src/plugins/random/random.ts +198 -0
  269. package/src/server/api.test.ts +1699 -0
  270. package/src/server/api.ts +527 -0
  271. package/src/server/auth.test.ts +275 -0
  272. package/src/server/auth.ts +89 -0
  273. package/src/server/cors.test.ts +121 -0
  274. package/src/server/cors.ts +7 -0
  275. package/src/server/db/base.ts +296 -0
  276. package/src/server/db/flatfile.test.ts +221 -0
  277. package/src/server/db/flatfile.ts +228 -0
  278. package/src/server/db/index.test.ts +8 -0
  279. package/src/server/db/index.ts +12 -0
  280. package/src/server/db/inmemory.test.ts +143 -0
  281. package/src/server/db/inmemory.ts +143 -0
  282. package/src/server/db/localstorage.test.ts +73 -0
  283. package/src/server/db/localstorage.ts +44 -0
  284. package/src/server/index.test.ts +265 -0
  285. package/src/server/index.ts +175 -0
  286. package/src/server/transport/pubsub/generic-pub-sub.ts +11 -0
  287. package/src/server/transport/pubsub/in-memory-pub-sub.test.ts +47 -0
  288. package/src/server/transport/pubsub/in-memory-pub-sub.ts +28 -0
  289. package/src/server/transport/socketio-simultaneous.test.ts +603 -0
  290. package/src/server/transport/socketio.test.ts +303 -0
  291. package/src/server/transport/socketio.ts +279 -0
  292. package/src/server/util.ts +85 -0
  293. package/src/testing/mock-random.test.ts +45 -0
  294. package/src/testing/mock-random.ts +27 -0
  295. package/src/types.ts +511 -0
  296. package/testing/package.json +7 -0
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ var turnOrder = require('./turn-order-b2ff8740.js');
4
+ var rfc6902 = require('rfc6902');
5
+
6
+ const applyPlayerView = (game, playerID, state) => ({
7
+ ...state,
8
+ G: game.playerView({ G: state.G, ctx: state.ctx, playerID }),
9
+ plugins: turnOrder.PlayerView(state, { playerID, game }),
10
+ deltalog: undefined,
11
+ _undo: [],
12
+ _redo: [],
13
+ });
14
+ /** Gets a function that filters the TransportData for a given player and game. */
15
+ const getFilterPlayerView = (game) => (playerID, payload) => {
16
+ switch (payload.type) {
17
+ case 'patch': {
18
+ const [matchID, stateID, prevState, state] = payload.args;
19
+ const log = redactLog(state.deltalog, playerID);
20
+ const filteredState = applyPlayerView(game, playerID, state);
21
+ const newStateID = state._stateID;
22
+ const prevFilteredState = applyPlayerView(game, playerID, prevState);
23
+ const patch = rfc6902.createPatch(prevFilteredState, filteredState);
24
+ return {
25
+ type: 'patch',
26
+ args: [matchID, stateID, newStateID, patch, log],
27
+ };
28
+ }
29
+ case 'update': {
30
+ const [matchID, state] = payload.args;
31
+ const log = redactLog(state.deltalog, playerID);
32
+ const filteredState = applyPlayerView(game, playerID, state);
33
+ return {
34
+ type: 'update',
35
+ args: [matchID, filteredState, log],
36
+ };
37
+ }
38
+ case 'sync': {
39
+ const [matchID, syncInfo] = payload.args;
40
+ const filteredState = applyPlayerView(game, playerID, syncInfo.state);
41
+ const log = redactLog(syncInfo.log, playerID);
42
+ const newSyncInfo = {
43
+ ...syncInfo,
44
+ state: filteredState,
45
+ log,
46
+ };
47
+ return {
48
+ type: 'sync',
49
+ args: [matchID, newSyncInfo],
50
+ };
51
+ }
52
+ default: {
53
+ return payload;
54
+ }
55
+ }
56
+ };
57
+ /**
58
+ * Redact the log.
59
+ *
60
+ * @param {Array} log - The game log (or deltalog).
61
+ * @param {String} playerID - The playerID that this log is
62
+ * to be sent to.
63
+ */
64
+ function redactLog(log, playerID) {
65
+ if (log === undefined) {
66
+ return log;
67
+ }
68
+ return log.map((logEvent) => {
69
+ // filter for all other players and spectators.
70
+ if (playerID !== null && +playerID === +logEvent.action.payload.playerID) {
71
+ return logEvent;
72
+ }
73
+ if (logEvent.redact !== true) {
74
+ return logEvent;
75
+ }
76
+ const payload = {
77
+ ...logEvent.action.payload,
78
+ args: null,
79
+ };
80
+ const filteredEvent = {
81
+ ...logEvent,
82
+ action: { ...logEvent.action, payload },
83
+ };
84
+ const { redact, ...remaining } = filteredEvent;
85
+ return remaining;
86
+ });
87
+ }
88
+
89
+ exports.getFilterPlayerView = getFilterPlayerView;
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ var reducer = require('./reducer-16eec232.js');
4
+ var turnOrder = require('./turn-order-b2ff8740.js');
5
+
6
+ /*
7
+ * Copyright 2020 The boardgame.io Authors
8
+ *
9
+ * Use of this source code is governed by a MIT-style
10
+ * license that can be found in the LICENSE file or at
11
+ * https://opensource.org/licenses/MIT.
12
+ */
13
+ /**
14
+ * Creates the initial game state.
15
+ */
16
+ function InitializeGame({ game, numPlayers, setupData, }) {
17
+ game = reducer.ProcessGameConfig(game);
18
+ if (!numPlayers) {
19
+ numPlayers = 2;
20
+ }
21
+ const ctx = game.flow.ctx(numPlayers);
22
+ let state = {
23
+ // User managed state.
24
+ G: {},
25
+ // Framework managed state.
26
+ ctx,
27
+ // Plugin related state.
28
+ plugins: {},
29
+ };
30
+ // Run plugins over initial state.
31
+ state = turnOrder.Setup(state, { game });
32
+ state = turnOrder.Enhance(state, { game, playerID: undefined });
33
+ const pluginAPIs = turnOrder.GetAPIs(state);
34
+ state.G = game.setup({ ...pluginAPIs, ctx: state.ctx }, setupData);
35
+ let initial = {
36
+ ...state,
37
+ // List of {G, ctx} pairs that can be undone.
38
+ _undo: [],
39
+ // List of {G, ctx} pairs that can be redone.
40
+ _redo: [],
41
+ // A monotonically non-decreasing ID to ensure that
42
+ // state updates are only allowed from clients that
43
+ // are at the same version that the server.
44
+ _stateID: 0,
45
+ };
46
+ initial = game.flow.init(initial);
47
+ [initial] = turnOrder.FlushAndValidate(initial, { game });
48
+ // Initialize undo stack.
49
+ if (!game.disableUndo) {
50
+ initial._undo = [
51
+ {
52
+ G: initial.G,
53
+ ctx: initial.ctx,
54
+ plugins: initial.plugins,
55
+ },
56
+ ];
57
+ }
58
+ return initial;
59
+ }
60
+
61
+ exports.InitializeGame = InitializeGame;
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var initialize = require('./initialize-267fcd69.js');
6
+ var reducer = require('./reducer-16eec232.js');
7
+ var filterPlayerView = require('./filter-player-view-bb02e2f6.js');
8
+ var util = require('./util-fcfd8fb8.js');
9
+ var transport = require('./transport-b1874dfa.js');
10
+ require('./turn-order-b2ff8740.js');
11
+ require('immer');
12
+ require('./plugin-random-7425844d.js');
13
+ require('lodash.isplainobject');
14
+ require('rfc6902');
15
+
16
+
17
+
18
+ exports.InitializeGame = initialize.InitializeGame;
19
+ exports.CreateGameReducer = reducer.CreateGameReducer;
20
+ exports.ProcessGameConfig = reducer.ProcessGameConfig;
21
+ exports.getFilterPlayerView = filterPlayerView.getFilterPlayerView;
22
+ exports.Async = util.Async;
23
+ exports.Sync = util.Sync;
24
+ exports.createMatch = util.createMatch;
25
+ exports.Transport = transport.Transport;
@@ -0,0 +1,320 @@
1
+ 'use strict';
2
+
3
+ var reducer = require('./reducer-16eec232.js');
4
+ var turnOrder = require('./turn-order-b2ff8740.js');
5
+ var redux = require('redux');
6
+ var util = require('./util-fcfd8fb8.js');
7
+
8
+ /*
9
+ * Copyright 2018 The boardgame.io Authors
10
+ *
11
+ * Use of this source code is governed by a MIT-style
12
+ * license that can be found in the LICENSE file or at
13
+ * https://opensource.org/licenses/MIT.
14
+ */
15
+ /**
16
+ * Filter match data to get a player metadata object with credentials stripped.
17
+ */
18
+ const filterMatchData = (matchData) => Object.values(matchData.players).map((player) => {
19
+ const { credentials, ...filteredData } = player;
20
+ return filteredData;
21
+ });
22
+ /**
23
+ * Remove player credentials from action payload
24
+ */
25
+ const stripCredentialsFromAction = (action) => {
26
+ const { credentials, ...payload } = action.payload;
27
+ return { ...action, payload };
28
+ };
29
+ /**
30
+ * Master
31
+ *
32
+ * Class that runs the game and maintains the authoritative state.
33
+ * It uses the transportAPI to communicate with clients and the
34
+ * storageAPI to communicate with the database.
35
+ */
36
+ class Master {
37
+ constructor(game, storageAPI, transportAPI, auth) {
38
+ this.game = reducer.ProcessGameConfig(game);
39
+ this.storageAPI = storageAPI;
40
+ this.transportAPI = transportAPI;
41
+ this.subscribeCallback = () => { };
42
+ this.auth = auth;
43
+ }
44
+ subscribe(fn) {
45
+ this.subscribeCallback = fn;
46
+ }
47
+ /**
48
+ * Called on each move / event made by the client.
49
+ * Computes the new value of the game state and returns it
50
+ * along with a deltalog.
51
+ */
52
+ async onUpdate(credAction, stateID, matchID, playerID) {
53
+ if (!credAction || !credAction.payload) {
54
+ return { error: 'missing action or action payload' };
55
+ }
56
+ let metadata;
57
+ if (util.isSynchronous(this.storageAPI)) {
58
+ ({ metadata } = this.storageAPI.fetch(matchID, { metadata: true }));
59
+ }
60
+ else {
61
+ ({ metadata } = await this.storageAPI.fetch(matchID, { metadata: true }));
62
+ }
63
+ if (this.auth) {
64
+ const isAuthentic = await this.auth.authenticateCredentials({
65
+ playerID,
66
+ credentials: credAction.payload.credentials,
67
+ metadata,
68
+ });
69
+ if (!isAuthentic) {
70
+ return { error: 'unauthorized action' };
71
+ }
72
+ }
73
+ const action = stripCredentialsFromAction(credAction);
74
+ const key = matchID;
75
+ let state;
76
+ if (util.isSynchronous(this.storageAPI)) {
77
+ ({ state } = this.storageAPI.fetch(key, { state: true }));
78
+ }
79
+ else {
80
+ ({ state } = await this.storageAPI.fetch(key, { state: true }));
81
+ }
82
+ if (state === undefined) {
83
+ turnOrder.error(`game not found, matchID=[${key}]`);
84
+ return { error: 'game not found' };
85
+ }
86
+ if (state.ctx.gameover !== undefined) {
87
+ turnOrder.error(`game over - matchID=[${key}] - playerID=[${playerID}]` +
88
+ ` - action[${action.payload.type}]`);
89
+ return;
90
+ }
91
+ const reducer$1 = reducer.CreateGameReducer({
92
+ game: this.game,
93
+ });
94
+ const middleware = redux.applyMiddleware(reducer.TransientHandlingMiddleware);
95
+ const store = redux.createStore(reducer$1, state, middleware);
96
+ // Only allow UNDO / REDO if there is exactly one player
97
+ // that can make moves right now and the person doing the
98
+ // action is that player.
99
+ if (action.type == turnOrder.UNDO || action.type == turnOrder.REDO) {
100
+ const hasActivePlayers = state.ctx.activePlayers !== null;
101
+ const isCurrentPlayer = state.ctx.currentPlayer === playerID;
102
+ if (
103
+ // If activePlayers is empty, non-current players can’t undo.
104
+ (!hasActivePlayers && !isCurrentPlayer) ||
105
+ // If player is not active or multiple players are active, can’t undo.
106
+ (hasActivePlayers &&
107
+ (state.ctx.activePlayers[playerID] === undefined ||
108
+ Object.keys(state.ctx.activePlayers).length > 1))) {
109
+ turnOrder.error(`playerID=[${playerID}] cannot undo / redo right now`);
110
+ return;
111
+ }
112
+ }
113
+ // Check whether the player is active.
114
+ if (!this.game.flow.isPlayerActive(state.G, state.ctx, playerID)) {
115
+ turnOrder.error(`player not active - playerID=[${playerID}]` +
116
+ ` - action[${action.payload.type}]`);
117
+ return;
118
+ }
119
+ // Get move for further checks
120
+ const move = action.type == turnOrder.MAKE_MOVE
121
+ ? this.game.flow.getMove(state.ctx, action.payload.type, playerID)
122
+ : null;
123
+ // Check whether the player is allowed to make the move.
124
+ if (action.type == turnOrder.MAKE_MOVE && !move) {
125
+ turnOrder.error(`move not processed - canPlayerMakeMove=false - playerID=[${playerID}]` +
126
+ ` - action[${action.payload.type}]`);
127
+ return;
128
+ }
129
+ // Check if action's stateID is different than store's stateID
130
+ // and if move does not have ignoreStaleStateID truthy.
131
+ if (state._stateID !== stateID &&
132
+ !(move && reducer.IsLongFormMove(move) && move.ignoreStaleStateID)) {
133
+ turnOrder.error(`invalid stateID, was=[${stateID}], expected=[${state._stateID}]` +
134
+ ` - playerID=[${playerID}] - action[${action.payload.type}]`);
135
+ return;
136
+ }
137
+ const prevState = store.getState();
138
+ // Update server's version of the store.
139
+ store.dispatch(action);
140
+ state = store.getState();
141
+ this.subscribeCallback({
142
+ state,
143
+ action,
144
+ matchID,
145
+ });
146
+ if (this.game.deltaState) {
147
+ this.transportAPI.sendAll({
148
+ type: 'patch',
149
+ args: [matchID, stateID, prevState, state],
150
+ });
151
+ }
152
+ else {
153
+ this.transportAPI.sendAll({
154
+ type: 'update',
155
+ args: [matchID, state],
156
+ });
157
+ }
158
+ const { deltalog, ...stateWithoutDeltalog } = state;
159
+ let newMetadata;
160
+ if (metadata &&
161
+ (metadata.gameover === undefined || metadata.gameover === null)) {
162
+ newMetadata = {
163
+ ...metadata,
164
+ updatedAt: Date.now(),
165
+ };
166
+ if (state.ctx.gameover !== undefined) {
167
+ newMetadata.gameover = state.ctx.gameover;
168
+ }
169
+ }
170
+ if (util.isSynchronous(this.storageAPI)) {
171
+ this.storageAPI.setState(key, stateWithoutDeltalog, deltalog);
172
+ if (newMetadata)
173
+ this.storageAPI.setMetadata(key, newMetadata);
174
+ }
175
+ else {
176
+ const writes = [
177
+ this.storageAPI.setState(key, stateWithoutDeltalog, deltalog),
178
+ ];
179
+ if (newMetadata) {
180
+ writes.push(this.storageAPI.setMetadata(key, newMetadata));
181
+ }
182
+ await Promise.all(writes);
183
+ }
184
+ }
185
+ /**
186
+ * Called when the client connects / reconnects.
187
+ * Returns the latest game state and the entire log.
188
+ */
189
+ async onSync(matchID, playerID, credentials, numPlayers = 2) {
190
+ const key = matchID;
191
+ const fetchOpts = {
192
+ state: true,
193
+ metadata: true,
194
+ log: true,
195
+ initialState: true,
196
+ };
197
+ const fetchResult = util.isSynchronous(this.storageAPI)
198
+ ? this.storageAPI.fetch(key, fetchOpts)
199
+ : await this.storageAPI.fetch(key, fetchOpts);
200
+ let { state, initialState, log, metadata } = fetchResult;
201
+ if (this.auth && playerID !== undefined && playerID !== null) {
202
+ const isAuthentic = await this.auth.authenticateCredentials({
203
+ playerID,
204
+ credentials,
205
+ metadata,
206
+ });
207
+ if (!isAuthentic) {
208
+ return { error: 'unauthorized' };
209
+ }
210
+ }
211
+ // If the game doesn't exist, then create one on demand.
212
+ // TODO: Move this out of the sync call.
213
+ if (state === undefined) {
214
+ const match = util.createMatch({
215
+ game: this.game,
216
+ unlisted: true,
217
+ numPlayers,
218
+ setupData: undefined,
219
+ });
220
+ if ('setupDataError' in match) {
221
+ return { error: 'game requires setupData' };
222
+ }
223
+ initialState = state = match.initialState;
224
+ metadata = match.metadata;
225
+ this.subscribeCallback({ state, matchID });
226
+ if (util.isSynchronous(this.storageAPI)) {
227
+ this.storageAPI.createMatch(key, { initialState, metadata });
228
+ }
229
+ else {
230
+ await this.storageAPI.createMatch(key, { initialState, metadata });
231
+ }
232
+ }
233
+ const filteredMetadata = metadata ? filterMatchData(metadata) : undefined;
234
+ const syncInfo = {
235
+ state,
236
+ log,
237
+ filteredMetadata,
238
+ initialState,
239
+ };
240
+ this.transportAPI.send({
241
+ playerID,
242
+ type: 'sync',
243
+ args: [matchID, syncInfo],
244
+ });
245
+ return;
246
+ }
247
+ /**
248
+ * Called when a client connects or disconnects.
249
+ * Updates and sends out metadata to reflect the player’s connection status.
250
+ */
251
+ async onConnectionChange(matchID, playerID, credentials, connected) {
252
+ const key = matchID;
253
+ // Ignore changes for clients without a playerID, e.g. spectators.
254
+ if (playerID === undefined || playerID === null) {
255
+ return;
256
+ }
257
+ let metadata;
258
+ if (util.isSynchronous(this.storageAPI)) {
259
+ ({ metadata } = this.storageAPI.fetch(key, { metadata: true }));
260
+ }
261
+ else {
262
+ ({ metadata } = await this.storageAPI.fetch(key, { metadata: true }));
263
+ }
264
+ if (metadata === undefined) {
265
+ turnOrder.error(`metadata not found for matchID=[${key}]`);
266
+ return { error: 'metadata not found' };
267
+ }
268
+ if (metadata.players[playerID] === undefined) {
269
+ turnOrder.error(`Player not in the match, matchID=[${key}] playerID=[${playerID}]`);
270
+ return { error: 'player not in the match' };
271
+ }
272
+ if (this.auth) {
273
+ const isAuthentic = await this.auth.authenticateCredentials({
274
+ playerID,
275
+ credentials,
276
+ metadata,
277
+ });
278
+ if (!isAuthentic) {
279
+ return { error: 'unauthorized' };
280
+ }
281
+ }
282
+ metadata.players[playerID].isConnected = connected;
283
+ const filteredMetadata = filterMatchData(metadata);
284
+ this.transportAPI.sendAll({
285
+ type: 'matchData',
286
+ args: [matchID, filteredMetadata],
287
+ });
288
+ if (util.isSynchronous(this.storageAPI)) {
289
+ this.storageAPI.setMetadata(key, metadata);
290
+ }
291
+ else {
292
+ await this.storageAPI.setMetadata(key, metadata);
293
+ }
294
+ }
295
+ async onChatMessage(matchID, chatMessage, credentials) {
296
+ const key = matchID;
297
+ if (this.auth) {
298
+ const { metadata } = await this.storageAPI.fetch(key, {
299
+ metadata: true,
300
+ });
301
+ if (!(chatMessage && typeof chatMessage.sender === 'string')) {
302
+ return { error: 'unauthorized' };
303
+ }
304
+ const isAuthentic = await this.auth.authenticateCredentials({
305
+ playerID: chatMessage.sender,
306
+ credentials,
307
+ metadata,
308
+ });
309
+ if (!isAuthentic) {
310
+ return { error: 'unauthorized' };
311
+ }
312
+ }
313
+ this.transportAPI.sendAll({
314
+ type: 'chat',
315
+ args: [matchID, chatMessage],
316
+ });
317
+ }
318
+ }
319
+
320
+ exports.Master = Master;
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var master = require('./master-2904879d.js');
6
+ require('./reducer-16eec232.js');
7
+ require('./turn-order-b2ff8740.js');
8
+ require('immer');
9
+ require('./plugin-random-7425844d.js');
10
+ require('lodash.isplainobject');
11
+ require('rfc6902');
12
+ require('redux');
13
+ require('./util-fcfd8fb8.js');
14
+ require('./initialize-267fcd69.js');
15
+
16
+
17
+
18
+ exports.Master = master.Master;
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var socketio = require('./socketio-7a0837eb.js');
6
+ require('./util-fcfd8fb8.js');
7
+ require('./initialize-267fcd69.js');
8
+ require('./reducer-16eec232.js');
9
+ require('./turn-order-b2ff8740.js');
10
+ require('immer');
11
+ require('./plugin-random-7425844d.js');
12
+ require('lodash.isplainobject');
13
+ require('rfc6902');
14
+ require('./master-2904879d.js');
15
+ require('redux');
16
+ require('./transport-b1874dfa.js');
17
+ require('./filter-player-view-bb02e2f6.js');
18
+ require('socket.io-client');
19
+
20
+
21
+
22
+ exports.Local = socketio.Local;
23
+ exports.SocketIO = socketio.SocketIO;