UNPKG

5.96 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/game-middleware.js"],"names":["createGameMiddleware","gameActions","clientActions","clientFetch","clientPoll","clientNext","gameMiddleware","store","action","dispatch","getState","type","Promise","resolve","next","prevState","me","client","keys","id","prevHash","CREATE_GAME","REMOTE_ACTION","agent","prev","Error","nextHash","nextState","signedAction","Keys","signAction","res","encodeURIComponent","method","body","headers","ok","text","verifyAction","JSON","stringify"],"mappings":"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","file":"game-middleware.js","sourcesContent":["import { REMOTE_ACTION, hashState, Keys } from \"@cardcore/util\";\n\nexport default function createGameMiddleware(gameActions, clientActions) {\n const { clientFetch, clientPoll, clientNext } = clientActions;\n\n return function gameMiddleware(store) {\n return next => {\n return async action => {\n // Hacky, but we need this in the store before anything.\n\n // First thing first... implement thunk.\n if (typeof action === \"function\") {\n return action(store.dispatch, store.getState);\n }\n\n // Next... if it's not a game action, pass through as a promise.\n if (!gameActions[action.type]) {\n return Promise.resolve(next(action));\n }\n\n // Okay, it's a game action. Great! Let's handle some special cases first.\n\n // Special case: we're loading the state from the server. Pass through.\n\n // Resolve the action.\n const prevState = store.getState();\n const me = prevState.client.keys.id;\n let prevHash = null;\n // Special case until we have an actual blockchain to build on\n if (action.type !== gameActions.CREATE_GAME) {\n prevHash = hashState(prevState);\n }\n if (!action[REMOTE_ACTION]) {\n action = {\n ...action,\n agent: me,\n prev: prevHash\n };\n } else {\n if (action.prev !== prevHash) {\n throw new Error(`hash mismatch, ${action.next} !== ${nextHash}`);\n }\n }\n next(action);\n const nextState = store.getState();\n const nextHash = hashState(nextState);\n\n if (action[REMOTE_ACTION]) {\n if (action.next !== nextHash) {\n throw new Error(`hash mismatch, ${action.next} !== ${nextHash}`);\n }\n } else {\n action = {\n ...action,\n next: nextHash\n };\n }\n\n // Resolved. Are we the user making this action? Neato! Let's tell the server about it.\n if (!action[REMOTE_ACTION]) {\n const signedAction = Keys.signAction(prevState, action);\n let res;\n try {\n res = await store.dispatch(\n clientFetch(`/${encodeURIComponent(nextHash)}`, {\n method: \"POST\",\n body: signedAction,\n headers: {\n \"content-type\": \"application/json\"\n }\n })\n );\n } catch (e) {\n throw new Error(\n \"Failed to create an action. We should probably handle this error.\"\n );\n }\n if (!res.ok) {\n throw new Error(await res.text());\n }\n }\n\n // Are we _not_ the user making this action? Okay, let's verify it.\n else {\n if (!Keys.verifyAction(prevState, action)) {\n throw new Error(\n `Remote action failed to verify: ${JSON.stringify(action)}`\n );\n }\n }\n\n await store.dispatch(clientNext());\n store.dispatch(clientPoll());\n };\n };\n };\n}\n"]}
\No newline at end of file