@hellacardgames/speed 0.5.3 → 0.7.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 (39) hide show
  1. package/dist/client/index.cjs.map +1 -1
  2. package/dist/client/index.d.cts +2 -2
  3. package/dist/client/index.d.cts.map +1 -1
  4. package/dist/client/index.d.mts +2 -2
  5. package/dist/client/index.d.mts.map +1 -1
  6. package/dist/client/index.mjs.map +1 -1
  7. package/dist/index-BRtLpRz1.d.mts +125 -0
  8. package/dist/index-BRtLpRz1.d.mts.map +1 -0
  9. package/dist/index-BvZyhFek.d.cts +125 -0
  10. package/dist/index-BvZyhFek.d.cts.map +1 -0
  11. package/dist/{index-BilCO_4a.d.cts → index-xmcja9Bl.d.cts} +91 -60
  12. package/dist/index-xmcja9Bl.d.cts.map +1 -0
  13. package/dist/{index-BilCO_4a.d.mts → index-xmcja9Bl.d.mts} +91 -60
  14. package/dist/index-xmcja9Bl.d.mts.map +1 -0
  15. package/dist/manager/index.cjs +2 -12
  16. package/dist/manager/index.d.cts +2 -2
  17. package/dist/manager/index.d.mts +2 -2
  18. package/dist/manager/index.mjs +2 -2
  19. package/dist/manager-8x5AFyzq.mjs +790 -0
  20. package/dist/manager-8x5AFyzq.mjs.map +1 -0
  21. package/dist/manager-BxLMVu_o.cjs +795 -0
  22. package/dist/manager-BxLMVu_o.cjs.map +1 -0
  23. package/dist/server/index.cjs +141 -157
  24. package/dist/server/index.cjs.map +1 -1
  25. package/dist/server/index.d.cts +3 -3
  26. package/dist/server/index.d.mts +3 -3
  27. package/dist/server/index.mjs +141 -157
  28. package/dist/server/index.mjs.map +1 -1
  29. package/package.json +2 -2
  30. package/dist/index-BilCO_4a.d.cts.map +0 -1
  31. package/dist/index-BilCO_4a.d.mts.map +0 -1
  32. package/dist/index-DSPZZlhq.d.cts +0 -143
  33. package/dist/index-DSPZZlhq.d.cts.map +0 -1
  34. package/dist/index-S-oO1z9X.d.mts +0 -143
  35. package/dist/index-S-oO1z9X.d.mts.map +0 -1
  36. package/dist/manager-CPmezdJa.mjs +0 -834
  37. package/dist/manager-CPmezdJa.mjs.map +0 -1
  38. package/dist/manager-DErQ_XUq.cjs +0 -899
  39. package/dist/manager-DErQ_XUq.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-BxLMVu_o.cjs","names":["ManagerBase"],"sources":["../src/manager/constants.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 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","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 { ManagerBase } from \"@hellacardgames/lib\";\nimport {\n CAN_PLAY_AT_DELAY_MS,\n CARDS,\n EXPIRY_EXTENSION_MS,\n MAX_HAND_SIZE,\n MAX_PLAYERS,\n MIN_PLAYERS,\n} from \"./constants.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 extends ManagerBase<Game> {\n createGame(userId: string, username: string): CreateGameResult {\n if (this.games.size === this.maxGames) {\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_manager = require("../manager-DErQ_XUq.cjs");
2
+ const require_manager = require("../manager-BxLMVu_o.cjs");
3
3
  let zod = require("zod");
4
- //#region src/server/actions/createGame.ts
5
- function createGame(userId, username) {
6
- return require_manager.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_manager.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_manager.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_manager.getEventsAndClearAcknowledged(...parseResult.data);
54
- }
55
- //#endregion
56
- //#region src/server/actions/getJoinableGames.ts
57
- function getJoinableGames() {
58
- return require_manager.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_manager.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_manager.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_manager.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_manager.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,141 @@ 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_manager.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_manager.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;
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
+ constructor(...args) {
104
+ this.manager = new require_manager.Manager(...args);
105
+ }
106
+ createGame(userId, username) {
107
+ return this.manager.createGame(userId, username);
108
+ }
109
+ drawCard(input) {
110
+ const parseResult = drawCardInputSchema.safeParse(input);
111
+ if (!parseResult.success) return {
112
+ success: false,
113
+ error: "invalidInput"
114
+ };
115
+ return this.manager.drawCard(...parseResult.data);
116
+ }
117
+ getClientStateAndClearEvents(input) {
118
+ const parseResult = getClientStateAndClearEventsInputSchema.safeParse(input);
119
+ if (!parseResult.success) return {
120
+ success: false,
121
+ error: "invalidInput"
122
+ };
123
+ return this.manager.getClientStateAndClearEvents(...parseResult.data);
124
+ }
125
+ getEventsAndClearAcknowledged(input) {
126
+ const parseResult = getEventsAndClearAcknowledgedInputSchema.safeParse(input);
127
+ if (!parseResult.success) return {
128
+ success: false,
129
+ error: "invalidInput"
130
+ };
131
+ return this.manager.getEventsAndClearAcknowledged(...parseResult.data);
132
+ }
133
+ getJoinableGames() {
134
+ return this.manager.getJoinableGames();
135
+ }
136
+ joinGame(input, userId, username) {
137
+ const parseResult = joinGameInputSchema.safeParse(input);
138
+ if (!parseResult.success) return {
139
+ success: false,
140
+ error: "invalidInput"
141
+ };
142
+ return this.manager.joinGame(...parseResult.data, userId, username);
143
+ }
144
+ leaveGame(input) {
145
+ const parseResult = leaveGameInputSchema.safeParse(input);
146
+ if (!parseResult.success) return {
147
+ success: false,
148
+ error: "invalidInput"
149
+ };
150
+ return this.manager.leaveGame(...parseResult.data);
151
+ }
152
+ playCard(input) {
153
+ const parseResult = playCardInputSchema.safeParse(input);
154
+ if (!parseResult.success) return {
155
+ success: false,
156
+ error: "invalidInput"
157
+ };
158
+ return this.manager.playCard(...parseResult.data);
159
+ }
160
+ reportNoPlayableCards(input) {
161
+ const parseResult = reportNoPlayableCardsInputSchema.safeParse(input);
162
+ if (!parseResult.success) return {
163
+ success: false,
164
+ error: "invalidInput"
165
+ };
166
+ return this.manager.reportNoPlayableCards(...parseResult.data);
167
+ }
168
+ sendChat(input) {
169
+ const parseResult = sendChatInputSchema.safeParse(input);
170
+ if (!parseResult.success) return {
171
+ success: false,
172
+ error: "invalidInput"
173
+ };
174
+ return this.manager.sendChat(...parseResult.data);
175
+ }
176
+ startGame(input) {
177
+ const parseResult = startGameInputSchema.safeParse(input);
178
+ if (!parseResult.success) return {
179
+ success: false,
180
+ error: "invalidInput"
181
+ };
182
+ return this.manager.startGame(...parseResult.data);
199
183
  }
200
- ];
184
+ };
201
185
  //#endregion
202
- exports.actions = actions;
186
+ exports.Server = Server;
203
187
 
204
188
  //# 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/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 function createGame(userId: string, username: string): CreateGameResult {\n return doCreateGame(userId, username);\n}\n","import { z } from \"zod\";\nimport { drawCard as doDrawCard } from \"../../manager/index.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/index.js\";\nimport type { ClientState } from \"../../manager/index.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/index.js\";\nimport type { GameEvent } from \"../../manager/index.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/index.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/index.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/index.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/index.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/index.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/index.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/index.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 type { CreateGameResult } from \"./actions/createGame.js\";\nexport type { DrawCardResult } from \"./actions/drawCard.js\";\nexport type { GetClientStateAndClearEventsResult } from \"./actions/getClientStateAndClearEvents.js\";\nexport type { GetEventsAndClearAcknowledgedResult } from \"./actions/getEventsAndClearAcknowledged.js\";\nexport type { GetJoinableGamesResult } from \"./actions/getJoinableGames.js\";\nexport type { JoinGameResult } from \"./actions/joinGame.js\";\nexport type { LeaveGameResult } from \"./actions/leaveGame.js\";\nexport type { PlayCardResult } from \"./actions/playCard.js\";\nexport type { ReportNoPlayableCardsResult } from \"./actions/reportNoPlayableCards.js\";\nexport type { SendChatResult } from \"./actions/sendChat.js\";\nexport type { StartGameResult } from \"./actions/startGame.js\";\n\nexport type {\n Card,\n ChatMessage,\n ClientState,\n GameEvent,\n} from \"../manager/index.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: 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 constructor(...args: ConstructorParameters<typeof Manager>) {\n this.manager = new Manager(...args);\n }\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,3 +1,3 @@
1
- import { a as PlayCardResult, c as GetJoinableGamesResult, d as DrawCardResult, f as CreateGameResult, i as ReportNoPlayableCardsResult, l as GetEventsAndClearAcknowledgedResult, n as StartGameResult, o as LeaveGameResult, r as SendChatResult, s as JoinGameResult, t as actions, u as GetClientStateAndClearEventsResult } from "../index-DSPZZlhq.cjs";
2
- import { d as ClientState, f as ChatMessage, l as GameEvent, p as Card } from "../index-BilCO_4a.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, type StartGameResult, actions };
1
+ import { g as Card, h as ChatMessage, m as ClientState, p as GameEvent } from "../index-xmcja9Bl.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-BvZyhFek.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,3 +1,3 @@
1
- import { a as PlayCardResult, c as GetJoinableGamesResult, d as DrawCardResult, f as CreateGameResult, i as ReportNoPlayableCardsResult, l as GetEventsAndClearAcknowledgedResult, n as StartGameResult, o as LeaveGameResult, r as SendChatResult, s as JoinGameResult, t as actions, u as GetClientStateAndClearEventsResult } from "../index-S-oO1z9X.mjs";
2
- import { d as ClientState, f as ChatMessage, l as GameEvent, p as Card } from "../index-BilCO_4a.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, type StartGameResult, actions };
1
+ import { g as Card, h as ChatMessage, m as ClientState, p as GameEvent } from "../index-xmcja9Bl.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-BRtLpRz1.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 };