@hellacardgames/speed 0.5.2 → 0.6.0

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 (45) hide show
  1. package/dist/client/index.cjs.map +1 -1
  2. package/dist/client/index.d.cts +2 -3
  3. package/dist/client/index.d.cts.map +1 -1
  4. package/dist/client/index.d.mts +2 -3
  5. package/dist/client/index.d.mts.map +1 -1
  6. package/dist/client/index.mjs.map +1 -1
  7. package/dist/{startGame-5InkAgEp.d.cts → index-FveApXzq.d.cts} +52 -36
  8. package/dist/index-FveApXzq.d.cts.map +1 -0
  9. package/dist/{startGame-ayp8a-Cl.d.mts → index-J8s2QklC.d.mts} +52 -36
  10. package/dist/index-J8s2QklC.d.mts.map +1 -0
  11. package/dist/index-YAYbNr-s.d.cts +200 -0
  12. package/dist/index-YAYbNr-s.d.cts.map +1 -0
  13. package/dist/index-YAYbNr-s.d.mts +200 -0
  14. package/dist/index-YAYbNr-s.d.mts.map +1 -0
  15. package/dist/manager/index.cjs +2 -32
  16. package/dist/manager/index.d.cts +2 -109
  17. package/dist/manager/index.d.mts +2 -109
  18. package/dist/manager/index.mjs +2 -22
  19. package/dist/manager-BOymBQ4E.mjs +817 -0
  20. package/dist/manager-BOymBQ4E.mjs.map +1 -0
  21. package/dist/manager-BpKvQbcp.cjs +822 -0
  22. package/dist/manager-BpKvQbcp.cjs.map +1 -0
  23. package/dist/server/index.cjs +138 -157
  24. package/dist/server/index.cjs.map +1 -1
  25. package/dist/server/index.d.cts +3 -40
  26. package/dist/server/index.d.mts +3 -40
  27. package/dist/server/index.mjs +138 -157
  28. package/dist/server/index.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/dist/GameEvent-DDQ4jXxt.d.cts +0 -111
  31. package/dist/GameEvent-DDQ4jXxt.d.cts.map +0 -1
  32. package/dist/GameEvent-DDQ4jXxt.d.mts +0 -111
  33. package/dist/GameEvent-DDQ4jXxt.d.mts.map +0 -1
  34. package/dist/manager/index.cjs.map +0 -1
  35. package/dist/manager/index.d.cts.map +0 -1
  36. package/dist/manager/index.d.mts.map +0 -1
  37. package/dist/manager/index.mjs.map +0 -1
  38. package/dist/server/index.d.cts.map +0 -1
  39. package/dist/server/index.d.mts.map +0 -1
  40. package/dist/startGame-5InkAgEp.d.cts.map +0 -1
  41. package/dist/startGame-BC9XfFzG.mjs +0 -815
  42. package/dist/startGame-BC9XfFzG.mjs.map +0 -1
  43. package/dist/startGame-Bhk__XWk.cjs +0 -898
  44. package/dist/startGame-Bhk__XWk.cjs.map +0 -1
  45. package/dist/startGame-ayp8a-Cl.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-BpKvQbcp.cjs","names":[],"sources":["../src/manager/constants.ts","../src/manager/Watchdog.ts","../src/lib/emitEvent.ts","../src/lib/emitEventToPlayer.ts","../src/manager/lib/isCardPlayable.ts","../src/manager/lib/hasPlayableCard.ts","../src/lib/shuffleCards.ts","../src/manager/Manager.ts"],"sourcesContent":["import type { Card } from \"./types/Card.js\";\n\nexport const GAME_KEY = \"speed\";\nexport const MAX_GAMES = 50;\nexport const WATCHDOG_INTERVAL_MS = 10000;\n\nexport const EXPIRY_EXTENSION_MS = 300000; // 5 minutes\nexport const MIN_PLAYERS = 2;\nexport const MAX_PLAYERS = 2;\nexport const MAX_HAND_SIZE = 5;\nexport const CAN_PLAY_AT_DELAY_MS = 3000;\n\nexport const CARDS: readonly Card[] = [\n { id: crypto.randomUUID(), rank: 2, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 3, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 4, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 5, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 6, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 7, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 8, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 9, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 10, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 11, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 12, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 13, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 14, suite: \"clubs\" },\n { id: crypto.randomUUID(), rank: 2, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 3, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 4, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 5, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 6, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 7, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 8, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 9, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 10, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 11, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 12, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 13, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 14, suite: \"diamonds\" },\n { id: crypto.randomUUID(), rank: 2, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 3, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 4, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 5, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 6, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 7, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 8, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 9, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 10, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 11, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 12, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 13, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 14, suite: \"hearts\" },\n { id: crypto.randomUUID(), rank: 2, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 3, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 4, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 5, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 6, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 7, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 8, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 9, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 10, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 11, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 12, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 13, suite: \"spades\" },\n { id: crypto.randomUUID(), rank: 14, suite: \"spades\" },\n];\n","import { GAME_KEY, WATCHDOG_INTERVAL_MS } from \"./constants.js\";\n\ntype Game = {\n readonly id: string;\n readonly expiresAt: number;\n};\n\nexport class Watchdog<TGame extends Game> {\n private readonly games: Map<string, TGame>;\n\n constructor(games: Map<string, TGame>) {\n this.games = games;\n }\n\n start() {\n console.log(`watchdog start at ${Date.now()} (${GAME_KEY})`);\n setInterval(() => this.wakeUp(), WATCHDOG_INTERVAL_MS);\n }\n\n wakeUp() {\n const now = Date.now();\n // console.log(`watchdog wakeUp at ${now} (${GAME_KEY})`);\n for (const game of this.games.values()) {\n if (game.expiresAt <= now) {\n this.games.delete(game.id);\n console.log(`watchdog purged ${game.id} (${GAME_KEY})`);\n }\n }\n }\n}\n","type Game = {\n readonly players: {\n readonly events: { readonly id: string }[];\n }[];\n};\n\ntype OmitId<T> = T extends unknown ? Omit<T, \"id\"> : never;\n\nexport function emitEvent<T extends Game>(\n game: T,\n data: OmitId<T[\"players\"][number][\"events\"][number]>,\n): void {\n const event = { ...data, id: crypto.randomUUID() };\n for (const p of game.players) {\n p.events.push(event);\n }\n}\n","type Player = {\n readonly events: { readonly id: string }[];\n};\n\ntype OmitId<T> = T extends unknown ? Omit<T, \"id\"> : never;\n\nexport function emitEventToPlayer<T extends Player>(\n player: T,\n data: OmitId<T[\"events\"][number]>,\n): void {\n player.events.push({ ...data, id: crypto.randomUUID() });\n}\n","import type { Card } from \"../types/Card.js\";\n\nexport function isCardPlayable(card: Card, targetPile: Card[]) {\n const targetCard = targetPile[targetPile.length - 1]!;\n const diff = Math.abs(card.rank - targetCard.rank) % 11;\n return diff === 1;\n}\n","import { isCardPlayable } from \"./isCardPlayable.js\";\nimport type { Game } from \"../types/Game.js\";\nimport type { Player } from \"../types/Player.js\";\n\nexport function hasPlayableCard(player: Player, game: Game) {\n const otherPlayer = game.players.find((p) => p !== player)!;\n const targetPile1 = player.centerPile;\n const targetPile2 = otherPlayer.centerPile;\n for (const card of player.hand) {\n if (\n isCardPlayable(card, targetPile1) ||\n isCardPlayable(card, targetPile2)\n ) {\n return true;\n }\n }\n return false;\n}\n","type Card = { readonly id: string };\n\nexport function shuffleCards<T extends Card>(cards: T[]): void {\n for (let i = cards.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [cards[i], cards[j]] = [cards[j]!, cards[i]!];\n }\n}\n","import {\n CAN_PLAY_AT_DELAY_MS,\n CARDS,\n EXPIRY_EXTENSION_MS,\n MAX_GAMES,\n MAX_HAND_SIZE,\n MAX_PLAYERS,\n MIN_PLAYERS,\n} from \"./constants.js\";\nimport { Watchdog } from \"./Watchdog.js\";\nimport { emitEvent } from \"../lib/emitEvent.js\";\nimport { emitEventToPlayer } from \"../lib/emitEventToPlayer.js\";\nimport { isCardPlayable } from \"./lib/isCardPlayable.js\";\nimport { hasPlayableCard } from \"./lib/hasPlayableCard.js\";\nimport { shuffleCards } from \"../lib/shuffleCards.js\";\nimport type { ChatMessage } from \"./types/ChatMessage.js\";\nimport type { ClientState } from \"./types/ClientState.js\";\nimport type { Game } from \"./types/Game.js\";\nimport type { GameEvent } from \"./types/GameEvent.js\";\nimport type { Player } from \"./types/Player.js\";\n\nexport type CreateGameResult =\n | {\n readonly success: true;\n readonly gameId: string;\n readonly playerId: string;\n }\n | {\n readonly success: false;\n readonly error: \"maxGamesReached\";\n };\n\nexport type DrawCardResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"handFull\"\n | \"drawPileEmpty\";\n };\n\nexport type GetClientStateAndClearEventsResult =\n | {\n readonly success: true;\n readonly state: ClientState;\n }\n | {\n readonly success: false;\n readonly error: \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type GetEventsAndClearAcknowledgedResult =\n | {\n readonly success: true;\n readonly events: readonly GameEvent[];\n }\n | {\n readonly success: false;\n readonly error: \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type GetJoinableGamesResult = {\n readonly games: readonly {\n readonly id: string;\n readonly numPlayers: number;\n }[];\n};\n\nexport type JoinGameResult =\n | {\n readonly success: true;\n readonly playerId: string;\n }\n | {\n readonly success: false;\n readonly error:\n | \"gameNotFound\"\n | \"invalidStatus\"\n | \"maxPlayersReached\"\n | \"alreadyInGame\";\n };\n\nexport type LeaveGameResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error: \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type PlayCardResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"cardNotFound\"\n | \"cardNotPlayable\";\n };\n\nexport type ReportNoPlayableCardsResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"alreadyReported\"\n | \"hasPlayableCard\"\n | \"canDraw\";\n };\n\nexport type SendChatResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error: \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type StartGameResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"gameNotFound\"\n | \"invalidStatus\"\n | \"playerNotFound\"\n | \"playerNotAdmin\"\n | \"minPlayersNotReached\";\n };\n\nexport class Manager {\n private readonly games: Map<string, Game>;\n private readonly watchdog: Watchdog<Game>;\n\n constructor() {\n this.games = new Map<string, Game>();\n this.watchdog = new Watchdog(this.games);\n this.watchdog.start();\n }\n\n createGame(userId: string, username: string): CreateGameResult {\n if (this.games.size === MAX_GAMES) {\n return { success: false, error: \"maxGamesReached\" };\n }\n const player: Player = {\n id: crypto.randomUUID(),\n userId,\n username,\n events: [],\n hand: [],\n drawPile: [],\n sidePile: [],\n centerPile: [],\n hasNoPlayableCards: false,\n };\n const createdAt = Date.now();\n const game: Game = {\n status: \"open\",\n id: crypto.randomUUID(),\n createdAt,\n expiresAt: createdAt + EXPIRY_EXTENSION_MS,\n chatMessages: [],\n players: [player],\n };\n this.games.set(game.id, game);\n return { success: true, gameId: game.id, playerId: player.id };\n }\n\n drawCard(gameId: string, playerId: string): DrawCardResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n if (game.status !== \"started\") {\n return { success: false, error: \"invalidStatus\" };\n }\n if (Date.now() < game.canPlayAt) {\n return { success: false, error: \"canPlayAtNotReached\" };\n }\n if (player.hand.length >= MAX_HAND_SIZE) {\n return { success: false, error: \"handFull\" };\n }\n if (player.drawPile.length === 0) {\n return { success: false, error: \"drawPileEmpty\" };\n }\n game.expiresAt = Date.now() + EXPIRY_EXTENSION_MS;\n emitEvent(game, { type: \"expirationUpdated\", expiresAt: game.expiresAt });\n const card = player.drawPile.pop()!;\n player.hand.push(card);\n emitEventToPlayer(player, { type: \"drewCard\", card });\n emitEvent(game, { type: \"playerDrewCard\", username: player.username });\n return { success: true };\n }\n\n getClientStateAndClearEvents(\n gameId: string,\n playerId: string,\n ): GetClientStateAndClearEventsResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n const state: ClientState = {\n status: game.status,\n gameId,\n playerId,\n username: player.username,\n players: game.players.map((p) => ({\n username: p.username,\n handSize: p.hand.length,\n drawPileSize: p.drawPile.length,\n sidePileSize: p.sidePile.length,\n centerPileTopCard: p.centerPile.length\n ? p.centerPile[p.centerPile.length - 1]!\n : null,\n })),\n expiresAt: game.expiresAt,\n chatMessages: game.chatMessages,\n hand: player.hand,\n canPlayAt: game.status === \"started\" ? game.canPlayAt : null,\n };\n player.events.length = 0;\n return { success: true, state };\n }\n\n getEventsAndClearAcknowledged(\n gameId: string,\n playerId: string,\n lastReadId: string | null,\n ): GetEventsAndClearAcknowledgedResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n const lastReadEventIndex = player.events.findIndex(\n (e) => e.id === lastReadId,\n );\n player.events.splice(0, lastReadEventIndex + 1);\n return { success: true, events: player.events };\n }\n\n getJoinableGames(): GetJoinableGamesResult {\n return {\n games: Array.from(this.games.values())\n .filter((g) => g.status === \"open\" && g.players.length < MAX_PLAYERS)\n .map((g) => ({\n id: g.id,\n numPlayers: g.players.length,\n })),\n };\n }\n\n joinGame(gameId: string, userId: string, username: string): JoinGameResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n if (game.status !== \"open\") {\n return { success: false, error: \"invalidStatus\" };\n }\n if (game.players.length === MAX_PLAYERS) {\n return { success: false, error: \"maxPlayersReached\" };\n }\n if (game.players.find((p) => p.userId === userId)) {\n return { success: false, error: \"alreadyInGame\" };\n }\n const player: Player = {\n id: crypto.randomUUID(),\n userId,\n username,\n events: [],\n hand: [],\n drawPile: [],\n sidePile: [],\n centerPile: [],\n hasNoPlayableCards: false,\n };\n game.players.push(player);\n emitEvent(game, { type: \"playerJoined\", username });\n return { success: true, playerId: player.id };\n }\n\n leaveGame(gameId: string, playerId: string): LeaveGameResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const playerIndex = game.players.findIndex((p) => p.id === playerId);\n if (playerIndex === -1) {\n return { success: false, error: \"playerNotFound\" };\n }\n\n const player = game.players[playerIndex]!;\n emitEvent(game, { type: \"playerLeft\", username: player.username });\n\n game.players.splice(playerIndex, 1);\n\n if (game.status === \"started\" && game.players.length < MIN_PLAYERS) {\n const forfeitedGame: Game = {\n ...game,\n status: \"forfeited\",\n expiresAt: Date.now() + EXPIRY_EXTENSION_MS,\n };\n this.games.set(game.id, forfeitedGame);\n emitEvent(forfeitedGame, { type: \"gameForfeited\" });\n emitEvent(forfeitedGame, {\n type: \"expirationUpdated\",\n expiresAt: forfeitedGame.expiresAt,\n });\n }\n if (game.players.length === 0) {\n this.games.delete(game.id);\n }\n return { success: true };\n }\n\n playCard(\n gameId: string,\n playerId: string,\n cardId: string,\n isForOtherPlayerPile: boolean,\n ): PlayCardResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n if (game.status !== \"started\") {\n return { success: false, error: \"invalidStatus\" };\n }\n if (Date.now() < game.canPlayAt) {\n return { success: false, error: \"canPlayAtNotReached\" };\n }\n const cardIndex = player.hand.findIndex((c) => c.id === cardId);\n if (cardIndex === -1) {\n return { success: false, error: \"cardNotFound\" };\n }\n const otherPlayer = game.players.find((p) => p !== player)!;\n const targetPile = isForOtherPlayerPile\n ? otherPlayer.centerPile\n : player.centerPile;\n const card = player.hand[cardIndex]!;\n if (!isCardPlayable(card, targetPile)) {\n return { success: false, error: \"cardNotPlayable\" };\n }\n\n game.expiresAt = Date.now() + EXPIRY_EXTENSION_MS;\n emitEvent(game, { type: \"expirationUpdated\", expiresAt: game.expiresAt });\n\n player.hand.splice(cardIndex, 1);\n targetPile.push(card);\n emitEvent(game, {\n type: \"cardPlayed\",\n username: player.username,\n card,\n isForOtherPlayerPile,\n });\n\n if (otherPlayer.hasNoPlayableCards && hasPlayableCard(otherPlayer, game)) {\n otherPlayer.hasNoPlayableCards = false;\n }\n\n if (player.hand.length === 0 && player.drawPile.length === 0) {\n emitEvent(game, { type: \"gameCompleted\" });\n const completedGame: Game = {\n ...game,\n status: \"completed\",\n };\n this.games.set(game.id, completedGame);\n }\n\n return { success: true };\n }\n\n reportNoPlayableCards(\n gameId: string,\n playerId: string,\n ): ReportNoPlayableCardsResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n if (game.status !== \"started\") {\n return { success: false, error: \"invalidStatus\" };\n }\n if (Date.now() < game.canPlayAt) {\n return { success: false, error: \"canPlayAtNotReached\" };\n }\n if (player.hasNoPlayableCards) {\n return { success: false, error: \"alreadyReported\" };\n }\n if (hasPlayableCard(player, game)) {\n return { success: false, error: \"hasPlayableCard\" };\n }\n if (player.drawPile.length > 0 && player.hand.length < MAX_HAND_SIZE) {\n return { success: false, error: \"canDraw\" };\n }\n\n game.expiresAt = Date.now() + EXPIRY_EXTENSION_MS;\n emitEvent(game, { type: \"expirationUpdated\", expiresAt: game.expiresAt });\n\n player.hasNoPlayableCards = true;\n\n const otherPlayer = game.players.find((p) => p !== player)!;\n if (otherPlayer.hasNoPlayableCards) {\n if (player.sidePile.length === 0 && otherPlayer.sidePile.length === 0) {\n const cards = [...player.centerPile, ...otherPlayer.centerPile];\n shuffleCards(cards);\n player.sidePile.push(...cards.splice(0, 5));\n emitEvent(game, {\n type: \"playerSidePileInitialized\",\n username: player.username,\n numCards: player.sidePile.length,\n });\n player.centerPile.push(...cards.splice(0, 1));\n emitEvent(game, {\n type: \"playerCenterPileInitialized\",\n username: player.username,\n card: player.centerPile[player.centerPile.length - 1]!,\n });\n otherPlayer.centerPile.push(...cards.splice(0, 1));\n emitEvent(game, {\n type: \"playerCenterPileInitialized\",\n username: otherPlayer.username,\n card: otherPlayer.centerPile[otherPlayer.centerPile.length - 1]!,\n });\n otherPlayer.sidePile.push(...cards.splice(0, 5));\n emitEvent(game, {\n type: \"playerSidePileInitialized\",\n username: otherPlayer.username,\n numCards: otherPlayer.sidePile.length,\n });\n } else {\n const playerSidePileCard = player.sidePile.pop()!;\n player.centerPile.push(playerSidePileCard);\n emitEvent(game, {\n type: \"cardDrawnFromSidePileToCenterPile\",\n username: player.username,\n card: playerSidePileCard,\n });\n const otherPlayerSidePileCard = otherPlayer.sidePile.pop()!;\n otherPlayer.centerPile.push(otherPlayerSidePileCard);\n emitEvent(game, {\n type: \"cardDrawnFromSidePileToCenterPile\",\n username: otherPlayer.username,\n card: otherPlayerSidePileCard,\n });\n }\n player.hasNoPlayableCards = false;\n otherPlayer.hasNoPlayableCards = false;\n game.canPlayAt = Date.now() + CAN_PLAY_AT_DELAY_MS;\n emitEvent(game, {\n type: \"canPlayAtUpdated\",\n canPlayAt: game.canPlayAt,\n });\n }\n\n return { success: true };\n }\n\n sendChat(gameId: string, playerId: string, text: string): SendChatResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n const message: ChatMessage = {\n id: crypto.randomUUID(),\n username: player.username,\n text,\n };\n game.chatMessages.push(message);\n emitEvent(game, { type: \"chat\", message });\n return { success: true };\n }\n\n startGame(gameId: string, playerId: string): StartGameResult {\n const game = this.games.get(gameId);\n if (!game) {\n return { success: false, error: \"gameNotFound\" };\n }\n const player = game.players.find((p) => p.id === playerId);\n if (!player) {\n return { success: false, error: \"playerNotFound\" };\n }\n if (game.status !== \"open\") {\n return { success: false, error: \"invalidStatus\" };\n }\n if (game.players.indexOf(player) !== 0) {\n return { success: false, error: \"playerNotAdmin\" };\n }\n if (game.players.length < MIN_PLAYERS) {\n return { success: false, error: \"minPlayersNotReached\" };\n }\n const otherPlayer = game.players[1]!;\n const cards = [...CARDS];\n shuffleCards(cards);\n\n player.sidePile.push(...cards.splice(0, 5));\n emitEvent(game, {\n type: \"playerSidePileInitialized\",\n username: player.username,\n numCards: player.sidePile.length,\n });\n\n player.centerPile.push(...cards.splice(0, 1));\n emitEvent(game, {\n type: \"playerCenterPileInitialized\",\n username: player.username,\n card: player.centerPile[player.centerPile.length - 1]!,\n });\n\n otherPlayer.centerPile.push(...cards.splice(0, 1));\n emitEvent(game, {\n type: \"playerCenterPileInitialized\",\n username: otherPlayer.username,\n card: otherPlayer.centerPile[otherPlayer.centerPile.length - 1]!,\n });\n\n otherPlayer.sidePile.push(...cards.splice(0, 5));\n emitEvent(game, {\n type: \"playerSidePileInitialized\",\n username: otherPlayer.username,\n numCards: otherPlayer.sidePile.length,\n });\n\n player.drawPile.push(...cards.splice(0, 15));\n emitEvent(game, {\n type: \"playerDrawPileInitialized\",\n username: player.username,\n numCards: player.drawPile.length,\n });\n\n player.hand.push(...cards.splice(0, 5));\n emitEventToPlayer(player, { type: \"handInitialized\", cards: player.hand });\n emitEvent(game, {\n type: \"playerHandInitialized\",\n username: player.username,\n numCards: player.hand.length,\n });\n\n otherPlayer.drawPile.push(...cards.splice(0, 15));\n emitEvent(game, {\n type: \"playerDrawPileInitialized\",\n username: otherPlayer.username,\n numCards: otherPlayer.drawPile.length,\n });\n\n otherPlayer.hand.push(...cards.splice(0, 5));\n emitEventToPlayer(otherPlayer, {\n type: \"handInitialized\",\n cards: otherPlayer.hand,\n });\n emitEvent(game, {\n type: \"playerHandInitialized\",\n username: otherPlayer.username,\n numCards: otherPlayer.hand.length,\n });\n\n const startedGame: Game = {\n ...game,\n status: \"started\",\n expiresAt: Date.now() + EXPIRY_EXTENSION_MS,\n canPlayAt: Date.now() + CAN_PLAY_AT_DELAY_MS,\n };\n this.games.set(game.id, startedGame);\n emitEvent(startedGame, { type: \"gameStarted\" });\n emitEvent(startedGame, {\n type: \"expirationUpdated\",\n expiresAt: startedGame.expiresAt,\n });\n emitEvent(startedGame, {\n type: \"canPlayAtUpdated\",\n canPlayAt: startedGame.canPlayAt,\n });\n return { success: true };\n }\n}\n"],"mappings":"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"}
@@ -1,41 +1,16 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_startGame = require("../startGame-Bhk__XWk.cjs");
2
+ const require_manager = require("../manager-BpKvQbcp.cjs");
3
3
  let zod = require("zod");
4
- //#region src/server/actions/createGame.ts
5
- function createGame(userId, username) {
6
- return require_startGame.createGame(userId, username);
7
- }
8
- //#endregion
9
- //#region src/server/actions/drawCard.ts
10
- const inputSchema$8 = zod.z.object({
4
+ //#region src/server/Server.ts
5
+ const drawCardInputSchema = zod.z.object({
11
6
  gameId: zod.z.string(),
12
7
  playerId: zod.z.string()
13
8
  }).transform(({ gameId, playerId }) => [gameId, playerId]);
14
- function drawCard(input) {
15
- const parseResult = inputSchema$8.safeParse(input);
16
- if (!parseResult.success) return {
17
- success: false,
18
- error: "invalidInput"
19
- };
20
- return require_startGame.drawCard(...parseResult.data);
21
- }
22
- //#endregion
23
- //#region src/server/actions/getClientStateAndClearEvents.ts
24
- const inputSchema$7 = zod.z.object({
9
+ const getClientStateAndClearEventsInputSchema = zod.z.object({
25
10
  gameId: zod.z.string(),
26
11
  playerId: zod.z.string()
27
12
  }).transform(({ gameId, playerId }) => [gameId, playerId]);
28
- function getClientStateAndClearEvents(input) {
29
- const parseResult = inputSchema$7.safeParse(input);
30
- if (!parseResult.success) return {
31
- success: false,
32
- error: "invalidInput"
33
- };
34
- return require_startGame.getClientStateAndClearEvents(...parseResult.data);
35
- }
36
- //#endregion
37
- //#region src/server/actions/getEventsAndClearAcknowledged.ts
38
- const inputSchema$6 = zod.z.object({
13
+ const getEventsAndClearAcknowledgedInputSchema = zod.z.object({
39
14
  gameId: zod.z.string(),
40
15
  playerId: zod.z.string(),
41
16
  lastReadId: zod.z.string().nullable()
@@ -44,47 +19,12 @@ const inputSchema$6 = zod.z.object({
44
19
  playerId,
45
20
  lastReadId
46
21
  ]);
47
- function getEventsAndClearAcknowledged(input) {
48
- const parseResult = inputSchema$6.safeParse(input);
49
- if (!parseResult.success) return {
50
- success: false,
51
- error: "invalidInput"
52
- };
53
- return require_startGame.getEventsAndClearAcknowledged(...parseResult.data);
54
- }
55
- //#endregion
56
- //#region src/server/actions/getJoinableGames.ts
57
- function getJoinableGames() {
58
- return require_startGame.getJoinableGames();
59
- }
60
- //#endregion
61
- //#region src/server/actions/joinGame.ts
62
- const inputSchema$5 = zod.z.object({ gameId: zod.z.string() }).transform(({ gameId }) => [gameId]);
63
- function joinGame(input, userId, username) {
64
- const parseResult = inputSchema$5.safeParse(input);
65
- if (!parseResult.success) return {
66
- success: false,
67
- error: "invalidInput"
68
- };
69
- return require_startGame.joinGame(...parseResult.data, userId, username);
70
- }
71
- //#endregion
72
- //#region src/server/actions/leaveGame.ts
73
- const inputSchema$4 = zod.z.object({
22
+ const joinGameInputSchema = zod.z.object({ gameId: zod.z.string() }).transform(({ gameId }) => [gameId]);
23
+ const leaveGameInputSchema = zod.z.object({
74
24
  gameId: zod.z.string(),
75
25
  playerId: zod.z.string()
76
26
  }).transform(({ gameId, playerId }) => [gameId, playerId]);
77
- function leaveGame(input) {
78
- const parseResult = inputSchema$4.safeParse(input);
79
- if (!parseResult.success) return {
80
- success: false,
81
- error: "invalidInput"
82
- };
83
- return require_startGame.leaveGame(...parseResult.data);
84
- }
85
- //#endregion
86
- //#region src/server/actions/playCard.ts
87
- const inputSchema$3 = zod.z.object({
27
+ const playCardInputSchema = zod.z.object({
88
28
  gameId: zod.z.string(),
89
29
  playerId: zod.z.string(),
90
30
  cardId: zod.z.string(),
@@ -95,31 +35,11 @@ const inputSchema$3 = zod.z.object({
95
35
  cardId,
96
36
  isForOtherPlayerPile
97
37
  ]);
98
- function playCard(input) {
99
- const parseResult = inputSchema$3.safeParse(input);
100
- if (!parseResult.success) return {
101
- success: false,
102
- error: "invalidInput"
103
- };
104
- return require_startGame.playCard(...parseResult.data);
105
- }
106
- //#endregion
107
- //#region src/server/actions/reportNoPlayableCards.ts
108
- const inputSchema$2 = zod.z.object({
38
+ const reportNoPlayableCardsInputSchema = zod.z.object({
109
39
  gameId: zod.z.string(),
110
40
  playerId: zod.z.string()
111
41
  }).transform(({ gameId, playerId }) => [gameId, playerId]);
112
- function reportNoPlayableCards(input) {
113
- const parseResult = inputSchema$2.safeParse(input);
114
- if (!parseResult.success) return {
115
- success: false,
116
- error: "invalidInput"
117
- };
118
- return require_startGame.reportNoPlayableCards(...parseResult.data);
119
- }
120
- //#endregion
121
- //#region src/server/actions/sendChat.ts
122
- const inputSchema$1 = zod.z.object({
42
+ const sendChatInputSchema = zod.z.object({
123
43
  gameId: zod.z.string(),
124
44
  playerId: zod.z.string(),
125
45
  text: zod.z.string()
@@ -128,77 +48,138 @@ const inputSchema$1 = zod.z.object({
128
48
  playerId,
129
49
  text
130
50
  ]);
131
- function sendChat(input) {
132
- const parseResult = inputSchema$1.safeParse(input);
133
- if (!parseResult.success) return {
134
- success: false,
135
- error: "invalidInput"
136
- };
137
- return require_startGame.sendChat(...parseResult.data);
138
- }
139
- //#endregion
140
- //#region src/server/actions/startGame.ts
141
- const inputSchema = zod.z.object({
51
+ const startGameInputSchema = zod.z.object({
142
52
  gameId: zod.z.string(),
143
53
  playerId: zod.z.string()
144
54
  }).transform(({ gameId, playerId }) => [gameId, playerId]);
145
- function startGame(input) {
146
- const parseResult = inputSchema.safeParse(input);
147
- if (!parseResult.success) return {
148
- success: false,
149
- error: "invalidInput"
150
- };
151
- return require_startGame.startGame(...parseResult.data);
152
- }
153
- //#endregion
154
- //#region src/server/index.ts
155
- const actions = [
156
- {
157
- path: "/createGame",
158
- action: createGame
159
- },
160
- {
161
- path: "/drawCard",
162
- action: drawCard
163
- },
164
- {
165
- path: "/getClientStateAndClearEvents",
166
- action: getClientStateAndClearEvents
167
- },
168
- {
169
- path: "/getEventsAndClearAcknowledged",
170
- action: getEventsAndClearAcknowledged
171
- },
172
- {
173
- path: "/getJoinableGames",
174
- action: getJoinableGames
175
- },
176
- {
177
- path: "/joinGame",
178
- action: joinGame
179
- },
180
- {
181
- path: "/leaveGame",
182
- action: leaveGame
183
- },
184
- {
185
- path: "/playCard",
186
- action: playCard
187
- },
188
- {
189
- path: "/reportNoPlayableCards",
190
- action: reportNoPlayableCards
191
- },
192
- {
193
- path: "/sendChat",
194
- action: sendChat
195
- },
196
- {
197
- path: "/startGame",
198
- action: startGame
55
+ var Server = class {
56
+ manager = new require_manager.Manager();
57
+ actions = [
58
+ {
59
+ path: "/createGame",
60
+ action: this.createGame.bind(this)
61
+ },
62
+ {
63
+ path: "/drawCard",
64
+ action: this.drawCard.bind(this)
65
+ },
66
+ {
67
+ path: "/getClientStateAndClearEvents",
68
+ action: this.getClientStateAndClearEvents.bind(this)
69
+ },
70
+ {
71
+ path: "/getEventsAndClearAcknowledged",
72
+ action: this.getEventsAndClearAcknowledged.bind(this)
73
+ },
74
+ {
75
+ path: "/getJoinableGames",
76
+ action: this.getJoinableGames.bind(this)
77
+ },
78
+ {
79
+ path: "/joinGame",
80
+ action: this.joinGame.bind(this)
81
+ },
82
+ {
83
+ path: "/leaveGame",
84
+ action: this.leaveGame.bind(this)
85
+ },
86
+ {
87
+ path: "/playCard",
88
+ action: this.playCard.bind(this)
89
+ },
90
+ {
91
+ path: "/reportNoPlayableCards",
92
+ action: this.reportNoPlayableCards.bind(this)
93
+ },
94
+ {
95
+ path: "/sendChat",
96
+ action: this.sendChat.bind(this)
97
+ },
98
+ {
99
+ path: "/startGame",
100
+ action: this.startGame.bind(this)
101
+ }
102
+ ];
103
+ createGame(userId, username) {
104
+ return this.manager.createGame(userId, username);
105
+ }
106
+ drawCard(input) {
107
+ const parseResult = drawCardInputSchema.safeParse(input);
108
+ if (!parseResult.success) return {
109
+ success: false,
110
+ error: "invalidInput"
111
+ };
112
+ return this.manager.drawCard(...parseResult.data);
113
+ }
114
+ getClientStateAndClearEvents(input) {
115
+ const parseResult = getClientStateAndClearEventsInputSchema.safeParse(input);
116
+ if (!parseResult.success) return {
117
+ success: false,
118
+ error: "invalidInput"
119
+ };
120
+ return this.manager.getClientStateAndClearEvents(...parseResult.data);
121
+ }
122
+ getEventsAndClearAcknowledged(input) {
123
+ const parseResult = getEventsAndClearAcknowledgedInputSchema.safeParse(input);
124
+ if (!parseResult.success) return {
125
+ success: false,
126
+ error: "invalidInput"
127
+ };
128
+ return this.manager.getEventsAndClearAcknowledged(...parseResult.data);
129
+ }
130
+ getJoinableGames() {
131
+ return this.manager.getJoinableGames();
132
+ }
133
+ joinGame(input, userId, username) {
134
+ const parseResult = joinGameInputSchema.safeParse(input);
135
+ if (!parseResult.success) return {
136
+ success: false,
137
+ error: "invalidInput"
138
+ };
139
+ return this.manager.joinGame(...parseResult.data, userId, username);
140
+ }
141
+ leaveGame(input) {
142
+ const parseResult = leaveGameInputSchema.safeParse(input);
143
+ if (!parseResult.success) return {
144
+ success: false,
145
+ error: "invalidInput"
146
+ };
147
+ return this.manager.leaveGame(...parseResult.data);
148
+ }
149
+ playCard(input) {
150
+ const parseResult = playCardInputSchema.safeParse(input);
151
+ if (!parseResult.success) return {
152
+ success: false,
153
+ error: "invalidInput"
154
+ };
155
+ return this.manager.playCard(...parseResult.data);
156
+ }
157
+ reportNoPlayableCards(input) {
158
+ const parseResult = reportNoPlayableCardsInputSchema.safeParse(input);
159
+ if (!parseResult.success) return {
160
+ success: false,
161
+ error: "invalidInput"
162
+ };
163
+ return this.manager.reportNoPlayableCards(...parseResult.data);
164
+ }
165
+ sendChat(input) {
166
+ const parseResult = sendChatInputSchema.safeParse(input);
167
+ if (!parseResult.success) return {
168
+ success: false,
169
+ error: "invalidInput"
170
+ };
171
+ return this.manager.sendChat(...parseResult.data);
172
+ }
173
+ startGame(input) {
174
+ const parseResult = startGameInputSchema.safeParse(input);
175
+ if (!parseResult.success) return {
176
+ success: false,
177
+ error: "invalidInput"
178
+ };
179
+ return this.manager.startGame(...parseResult.data);
199
180
  }
200
- ];
181
+ };
201
182
  //#endregion
202
- exports.actions = actions;
183
+ exports.Server = Server;
203
184
 
204
185
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["doCreateGame","inputSchema","z","doDrawCard","inputSchema","z","doGetClientStateAndClearEvents","inputSchema","z","doGetEventsAndClearAcknowledged","doGetJoinableGames","inputSchema","z","doJoinGame","inputSchema","z","doLeaveGame","inputSchema","z","doPlayCard","inputSchema","z","doReportNoPlayableCards","inputSchema","z","doSendChat","z","doStartGame"],"sources":["../../src/server/actions/createGame.ts","../../src/server/actions/drawCard.ts","../../src/server/actions/getClientStateAndClearEvents.ts","../../src/server/actions/getEventsAndClearAcknowledged.ts","../../src/server/actions/getJoinableGames.ts","../../src/server/actions/joinGame.ts","../../src/server/actions/leaveGame.ts","../../src/server/actions/playCard.ts","../../src/server/actions/reportNoPlayableCards.ts","../../src/server/actions/sendChat.ts","../../src/server/actions/startGame.ts","../../src/server/index.ts"],"sourcesContent":["import { createGame as doCreateGame } from \"../../manager/actions/createGame.js\";\n\nexport type CreateGameResult =\n | {\n readonly success: true;\n readonly gameId: string;\n readonly playerId: string;\n }\n | {\n readonly success: false;\n readonly error: \"maxGamesReached\";\n };\n\nexport function createGame(userId: string, username: string): CreateGameResult {\n return doCreateGame(userId, username);\n}\n","import { z } from \"zod\";\nimport { drawCard as doDrawCard } from \"../../manager/actions/drawCard.js\";\n\nexport type DrawCardResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"handFull\"\n | \"drawPileEmpty\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nexport function drawCard(input: unknown): DrawCardResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doDrawCard(...parseResult.data);\n}\n","import { z } from \"zod\";\nimport { getClientStateAndClearEvents as doGetClientStateAndClearEvents } from \"../../manager/actions/getClientStateAndClearEvents.js\";\nimport type { ClientState } from \"../../manager/types/ClientState.js\";\n\nexport type GetClientStateAndClearEventsResult =\n | {\n readonly success: true;\n readonly state: ClientState;\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nexport function getClientStateAndClearEvents(\n input: unknown,\n): GetClientStateAndClearEventsResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doGetClientStateAndClearEvents(...parseResult.data);\n}\n","import { z } from \"zod\";\nimport { getEventsAndClearAcknowledged as doGetEventsAndClearAcknowledged } from \"../../manager/actions/getEventsAndClearAcknowledged.js\";\nimport type { GameEvent } from \"../../manager/types/GameEvent.js\";\n\nexport type GetEventsAndClearAcknowledgedResult =\n | {\n readonly success: true;\n readonly events: readonly GameEvent[];\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n lastReadId: z.string().nullable(),\n })\n .transform(\n ({ gameId, playerId, lastReadId }) =>\n [gameId, playerId, lastReadId] as const,\n );\n\nexport function getEventsAndClearAcknowledged(\n input: unknown,\n): GetEventsAndClearAcknowledgedResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doGetEventsAndClearAcknowledged(...parseResult.data);\n}\n","import { getJoinableGames as doGetJoinableGames } from \"../../manager/actions/getJoinableGames.js\";\n\nexport type GetJoinableGamesResult = {\n readonly games: readonly {\n readonly id: string;\n readonly numPlayers: number;\n }[];\n};\n\nexport function getJoinableGames(): GetJoinableGamesResult {\n return doGetJoinableGames();\n}\n","import { z } from \"zod\";\nimport { joinGame as doJoinGame } from \"../../manager/actions/joinGame.js\";\n\nexport type JoinGameResult =\n | {\n readonly success: true;\n readonly playerId: string;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"invalidStatus\"\n | \"maxPlayersReached\"\n | \"alreadyInGame\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n })\n .transform(({ gameId }) => [gameId] as const);\n\nexport function joinGame(\n input: unknown,\n userId: string,\n username: string,\n): JoinGameResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doJoinGame(...parseResult.data, userId, username);\n}\n","import { z } from \"zod\";\nimport { leaveGame as doLeaveGame } from \"../../manager/actions/leaveGame.js\";\n\nexport type LeaveGameResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nexport function leaveGame(input: unknown): LeaveGameResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doLeaveGame(...parseResult.data);\n}\n","import { z } from \"zod\";\nimport { playCard as doPlayCard } from \"../../manager/actions/playCard.js\";\n\nexport type PlayCardResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"cardNotFound\"\n | \"cardNotPlayable\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n cardId: z.string(),\n isForOtherPlayerPile: z.boolean(),\n })\n .transform(\n ({ gameId, playerId, cardId, isForOtherPlayerPile }) =>\n [gameId, playerId, cardId, isForOtherPlayerPile] as const,\n );\n\nexport function playCard(input: unknown): PlayCardResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doPlayCard(...parseResult.data);\n}\n","import { z } from \"zod\";\nimport { reportNoPlayableCards as doReportNoPlayableCards } from \"../../manager/actions/reportNoPlayableCards.js\";\n\nexport type ReportNoPlayableCardsResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"alreadyReported\"\n | \"hasPlayableCard\"\n | \"canDraw\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nexport function reportNoPlayableCards(\n input: unknown,\n): ReportNoPlayableCardsResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doReportNoPlayableCards(...parseResult.data);\n}\n","import { z } from \"zod\";\nimport { sendChat as doSendChat } from \"../../manager/actions/sendChat.js\";\n\nexport type SendChatResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n text: z.string(),\n })\n .transform(({ gameId, playerId, text }) => [gameId, playerId, text] as const);\n\nexport function sendChat(input: unknown): SendChatResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doSendChat(...parseResult.data);\n}\n","import { z } from \"zod\";\nimport { startGame as doStartGame } from \"../../manager/actions/startGame.js\";\n\nexport type StartGameResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"invalidStatus\"\n | \"playerNotFound\"\n | \"playerNotAdmin\"\n | \"minPlayersNotReached\";\n };\n\nconst inputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nexport function startGame(input: unknown): StartGameResult {\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return doStartGame(...parseResult.data);\n}\n","import { createGame } from \"./actions/createGame.js\";\nimport { drawCard } from \"./actions/drawCard.js\";\nimport { getClientStateAndClearEvents } from \"./actions/getClientStateAndClearEvents.js\";\nimport { getEventsAndClearAcknowledged } from \"./actions/getEventsAndClearAcknowledged.js\";\nimport { getJoinableGames } from \"./actions/getJoinableGames.js\";\nimport { joinGame } from \"./actions/joinGame.js\";\nimport { leaveGame } from \"./actions/leaveGame.js\";\nimport { playCard } from \"./actions/playCard.js\";\nimport { reportNoPlayableCards } from \"./actions/reportNoPlayableCards.js\";\nimport { sendChat } from \"./actions/sendChat.js\";\nimport { startGame } from \"./actions/startGame.js\";\n\nexport const actions = [\n { path: \"/createGame\", action: createGame },\n { path: \"/drawCard\", action: drawCard },\n {\n path: \"/getClientStateAndClearEvents\",\n action: getClientStateAndClearEvents,\n },\n {\n path: \"/getEventsAndClearAcknowledged\",\n action: getEventsAndClearAcknowledged,\n },\n { path: \"/getJoinableGames\", action: getJoinableGames },\n { path: \"/joinGame\", action: joinGame },\n { path: \"/leaveGame\", action: leaveGame },\n { path: \"/playCard\", action: playCard },\n { path: \"/reportNoPlayableCards\", action: reportNoPlayableCards },\n { path: \"/sendChat\", action: sendChat },\n { path: \"/startGame\", action: startGame },\n] as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["z","Manager"],"sources":["../../src/server/Server.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Manager } from \"../manager/index.js\";\nimport type { ClientState, GameEvent } from \"../manager/index.js\";\n\nexport type CreateGameResult =\n | {\n readonly success: true;\n readonly gameId: string;\n readonly playerId: string;\n }\n | {\n readonly success: false;\n readonly error: \"maxGamesReached\";\n };\n\nexport type DrawCardResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"handFull\"\n | \"drawPileEmpty\";\n };\n\nexport type GetClientStateAndClearEventsResult =\n | {\n readonly success: true;\n readonly state: ClientState;\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type GetEventsAndClearAcknowledgedResult =\n | {\n readonly success: true;\n readonly events: readonly GameEvent[];\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type GetJoinableGamesResult = {\n readonly games: readonly {\n readonly id: string;\n readonly numPlayers: number;\n }[];\n};\n\nexport type JoinGameResult =\n | {\n readonly success: true;\n readonly playerId: string;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"invalidStatus\"\n | \"maxPlayersReached\"\n | \"alreadyInGame\";\n };\n\nexport type LeaveGameResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type PlayCardResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"cardNotFound\"\n | \"cardNotPlayable\";\n };\n\nexport type ReportNoPlayableCardsResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"playerNotFound\"\n | \"invalidStatus\"\n | \"canPlayAtNotReached\"\n | \"alreadyReported\"\n | \"hasPlayableCard\"\n | \"canDraw\";\n };\n\nexport type SendChatResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error: \"invalidInput\" | \"gameNotFound\" | \"playerNotFound\";\n };\n\nexport type StartGameResult =\n | {\n readonly success: true;\n }\n | {\n readonly success: false;\n readonly error:\n | \"invalidInput\"\n | \"gameNotFound\"\n | \"invalidStatus\"\n | \"playerNotFound\"\n | \"playerNotAdmin\"\n | \"minPlayersNotReached\";\n };\n\nconst drawCardInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nconst getClientStateAndClearEventsInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nconst getEventsAndClearAcknowledgedInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n lastReadId: z.string().nullable(),\n })\n .transform(\n ({ gameId, playerId, lastReadId }) =>\n [gameId, playerId, lastReadId] as const,\n );\n\nconst joinGameInputSchema = z\n .object({\n gameId: z.string(),\n })\n .transform(({ gameId }) => [gameId] as const);\n\nconst leaveGameInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nconst playCardInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n cardId: z.string(),\n isForOtherPlayerPile: z.boolean(),\n })\n .transform(\n ({ gameId, playerId, cardId, isForOtherPlayerPile }) =>\n [gameId, playerId, cardId, isForOtherPlayerPile] as const,\n );\n\nconst reportNoPlayableCardsInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nconst sendChatInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n text: z.string(),\n })\n .transform(({ gameId, playerId, text }) => [gameId, playerId, text] as const);\n\nconst startGameInputSchema = z\n .object({\n gameId: z.string(),\n playerId: z.string(),\n })\n .transform(({ gameId, playerId }) => [gameId, playerId] as const);\n\nexport class Server {\n private readonly manager = new Manager();\n\n readonly actions = [\n { path: \"/createGame\", action: this.createGame.bind(this) },\n { path: \"/drawCard\", action: this.drawCard.bind(this) },\n {\n path: \"/getClientStateAndClearEvents\",\n action: this.getClientStateAndClearEvents.bind(this),\n },\n {\n path: \"/getEventsAndClearAcknowledged\",\n action: this.getEventsAndClearAcknowledged.bind(this),\n },\n { path: \"/getJoinableGames\", action: this.getJoinableGames.bind(this) },\n { path: \"/joinGame\", action: this.joinGame.bind(this) },\n { path: \"/leaveGame\", action: this.leaveGame.bind(this) },\n { path: \"/playCard\", action: this.playCard.bind(this) },\n {\n path: \"/reportNoPlayableCards\",\n action: this.reportNoPlayableCards.bind(this),\n },\n { path: \"/sendChat\", action: this.sendChat.bind(this) },\n { path: \"/startGame\", action: this.startGame.bind(this) },\n ] as const;\n\n private createGame(userId: string, username: string): CreateGameResult {\n return this.manager.createGame(userId, username);\n }\n\n private drawCard(input: unknown): DrawCardResult {\n const parseResult = drawCardInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.drawCard(...parseResult.data);\n }\n\n private getClientStateAndClearEvents(\n input: unknown,\n ): GetClientStateAndClearEventsResult {\n const parseResult =\n getClientStateAndClearEventsInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.getClientStateAndClearEvents(...parseResult.data);\n }\n\n private getEventsAndClearAcknowledged(\n input: unknown,\n ): GetEventsAndClearAcknowledgedResult {\n const parseResult =\n getEventsAndClearAcknowledgedInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.getEventsAndClearAcknowledged(...parseResult.data);\n }\n\n private getJoinableGames(): GetJoinableGamesResult {\n return this.manager.getJoinableGames();\n }\n\n private joinGame(\n input: unknown,\n userId: string,\n username: string,\n ): JoinGameResult {\n const parseResult = joinGameInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.joinGame(...parseResult.data, userId, username);\n }\n\n private leaveGame(input: unknown): LeaveGameResult {\n const parseResult = leaveGameInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.leaveGame(...parseResult.data);\n }\n\n private playCard(input: unknown): PlayCardResult {\n const parseResult = playCardInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.playCard(...parseResult.data);\n }\n\n private reportNoPlayableCards(input: unknown): ReportNoPlayableCardsResult {\n const parseResult = reportNoPlayableCardsInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.reportNoPlayableCards(...parseResult.data);\n }\n\n private sendChat(input: unknown): SendChatResult {\n const parseResult = sendChatInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.sendChat(...parseResult.data);\n }\n\n private startGame(input: unknown): StartGameResult {\n const parseResult = startGameInputSchema.safeParse(input);\n if (!parseResult.success) {\n return { success: false, error: \"invalidInput\" };\n }\n return this.manager.startGame(...parseResult.data);\n }\n}\n"],"mappings":"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"}
@@ -1,40 +1,3 @@
1
- import { S as createGame, b as drawCard, c as playCard, f as joinGame, g as getEventsAndClearAcknowledged, i as sendChat, m as getJoinableGames, n as startGame, o as reportNoPlayableCards, u as leaveGame, v as getClientStateAndClearEvents } from "../startGame-5InkAgEp.cjs";
2
-
3
- //#region src/server/index.d.ts
4
- declare const actions: readonly [{
5
- readonly path: "/createGame";
6
- readonly action: typeof createGame;
7
- }, {
8
- readonly path: "/drawCard";
9
- readonly action: typeof drawCard;
10
- }, {
11
- readonly path: "/getClientStateAndClearEvents";
12
- readonly action: typeof getClientStateAndClearEvents;
13
- }, {
14
- readonly path: "/getEventsAndClearAcknowledged";
15
- readonly action: typeof getEventsAndClearAcknowledged;
16
- }, {
17
- readonly path: "/getJoinableGames";
18
- readonly action: typeof getJoinableGames;
19
- }, {
20
- readonly path: "/joinGame";
21
- readonly action: typeof joinGame;
22
- }, {
23
- readonly path: "/leaveGame";
24
- readonly action: typeof leaveGame;
25
- }, {
26
- readonly path: "/playCard";
27
- readonly action: typeof playCard;
28
- }, {
29
- readonly path: "/reportNoPlayableCards";
30
- readonly action: typeof reportNoPlayableCards;
31
- }, {
32
- readonly path: "/sendChat";
33
- readonly action: typeof sendChat;
34
- }, {
35
- readonly path: "/startGame";
36
- readonly action: typeof startGame;
37
- }];
38
- //#endregion
39
- export { actions };
40
- //# sourceMappingURL=index.d.cts.map
1
+ import { g as Card, h as ChatMessage, m as ClientState, p as GameEvent } from "../index-YAYbNr-s.cjs";
2
+ import { a as GetJoinableGamesResult, c as PlayCardResult, d as Server, f as StartGameResult, i as GetEventsAndClearAcknowledgedResult, l as ReportNoPlayableCardsResult, n as DrawCardResult, o as JoinGameResult, r as GetClientStateAndClearEventsResult, s as LeaveGameResult, t as CreateGameResult, u as SendChatResult } from "../index-FveApXzq.cjs";
3
+ export { type Card, type ChatMessage, type ClientState, type CreateGameResult, type DrawCardResult, type GameEvent, type GetClientStateAndClearEventsResult, type GetEventsAndClearAcknowledgedResult, type GetJoinableGamesResult, type JoinGameResult, type LeaveGameResult, type PlayCardResult, type ReportNoPlayableCardsResult, type SendChatResult, Server, type StartGameResult };
@@ -1,40 +1,3 @@
1
- import { S as createGame, b as drawCard, c as playCard, f as joinGame, g as getEventsAndClearAcknowledged, i as sendChat, m as getJoinableGames, n as startGame, o as reportNoPlayableCards, u as leaveGame, v as getClientStateAndClearEvents } from "../startGame-ayp8a-Cl.mjs";
2
-
3
- //#region src/server/index.d.ts
4
- declare const actions: readonly [{
5
- readonly path: "/createGame";
6
- readonly action: typeof createGame;
7
- }, {
8
- readonly path: "/drawCard";
9
- readonly action: typeof drawCard;
10
- }, {
11
- readonly path: "/getClientStateAndClearEvents";
12
- readonly action: typeof getClientStateAndClearEvents;
13
- }, {
14
- readonly path: "/getEventsAndClearAcknowledged";
15
- readonly action: typeof getEventsAndClearAcknowledged;
16
- }, {
17
- readonly path: "/getJoinableGames";
18
- readonly action: typeof getJoinableGames;
19
- }, {
20
- readonly path: "/joinGame";
21
- readonly action: typeof joinGame;
22
- }, {
23
- readonly path: "/leaveGame";
24
- readonly action: typeof leaveGame;
25
- }, {
26
- readonly path: "/playCard";
27
- readonly action: typeof playCard;
28
- }, {
29
- readonly path: "/reportNoPlayableCards";
30
- readonly action: typeof reportNoPlayableCards;
31
- }, {
32
- readonly path: "/sendChat";
33
- readonly action: typeof sendChat;
34
- }, {
35
- readonly path: "/startGame";
36
- readonly action: typeof startGame;
37
- }];
38
- //#endregion
39
- export { actions };
40
- //# sourceMappingURL=index.d.mts.map
1
+ import { g as Card, h as ChatMessage, m as ClientState, p as GameEvent } from "../index-YAYbNr-s.mjs";
2
+ import { a as GetJoinableGamesResult, c as PlayCardResult, d as Server, f as StartGameResult, i as GetEventsAndClearAcknowledgedResult, l as ReportNoPlayableCardsResult, n as DrawCardResult, o as JoinGameResult, r as GetClientStateAndClearEventsResult, s as LeaveGameResult, t as CreateGameResult, u as SendChatResult } from "../index-J8s2QklC.mjs";
3
+ export { type Card, type ChatMessage, type ClientState, type CreateGameResult, type DrawCardResult, type GameEvent, type GetClientStateAndClearEventsResult, type GetEventsAndClearAcknowledgedResult, type GetJoinableGamesResult, type JoinGameResult, type LeaveGameResult, type PlayCardResult, type ReportNoPlayableCardsResult, type SendChatResult, Server, type StartGameResult };