lots of necessary plumbing

This commit is contained in:
2025-08-24 22:04:29 -04:00
parent 4bcf071668
commit a117f6703f
6 changed files with 201 additions and 157 deletions

View File

@@ -1,9 +1,9 @@
import { Elysia, t } from "elysia";
import {
getSimplePlayerView,
SimpleAction,
SimpleConfiguration,
SimpleGameState,
getKnowledge,
getView,
} from "./games/simple";
import { human } from "./human";
import dayjs from "dayjs";
@@ -11,6 +11,7 @@ import db from "./db";
import { liveTable, WsOut, WsIn } from "./table";
import { Human } from "@prisma/client";
import _ from "lodash";
import { combine } from "kefir";
const api = new Elysia({ prefix: "/api" })
.post("/whoami", async ({ cookie: { token } }) => {
@@ -73,18 +74,29 @@ const api = new Elysia({ prefix: "/api" })
},
send,
}) {
const table = liveTable<SimpleGameState, SimpleAction>(tableKey);
const table = liveTable<
SimpleConfiguration,
SimpleGameState,
SimpleAction
>(tableKey);
table.outputs.playersPresent
.skipDuplicates((p1, p2) => _.isEqual(new Set(p1), new Set(p2)))
.onValue((players) => send({ players }));
table.outputs.gameState.onValue((gameState) =>
send({
view:
gameState &&
getView(getKnowledge(gameState, humanKey), humanKey),
})
table.outputs.playersPresent.onValue((players) =>
send({ players })
);
table.outputs.playersReady.onValue((readys) =>
send({ playersReady: readys })
);
combine(
[table.outputs.gameState],
[table.outputs.gameConfig],
(state, config) =>
state &&
config &&
getSimplePlayerView(config, state, humanKey)
).onValue((view) => send({ view }));
table.inputs.connectionChanges.emit({
humanKey,
presence: "joined",
@@ -104,15 +116,15 @@ const api = new Elysia({ prefix: "/api" })
body
) {
const {
inputs: { gameProposals, gameStarts, gameActions },
inputs: { readys, actions, quits },
} = liveTable(tableKey);
if ("proposeGame" in body) {
gameProposals.emit(body);
} else if ("startGame" in body) {
gameStarts.emit(body);
if ("ready" in body) {
readys.emit({ humanKey, ...body });
} else if ("action" in body) {
gameActions.emit({ humanKey, ...body.action });
actions.emit({ humanKey, ...body.action });
} else if ("quit" in body) {
quits.emit({ humanKey });
}
},