public async Task Leave(IPlayerGrain player)
        {
            logger.LogInformation($"Player {player.GetPrimaryKeyString()} left the game");

            info.Players.Remove(player);

            logger.LogInformation($"Game {info.Key} now has {info.Players.Count} players");

            // TODO: This can fail, update with correct error handling
            await stream.OnNextAsync(new PlayerLeftMessage()
            {
                PlayerId = player.GetPrimaryKeyString()
            });
        }
        public async Task Join(IPlayerGrain player)
        {
            logger.LogInformation($"Player {player.GetPrimaryKeyString()} joined the game");

            if (info.Players.Contains(player))
            {
                logger.LogInformation($"Player {player.GetPrimaryKeyString()} was already in the game!");
                throw new Exception("Player was already in this game!");
            }

            info.Players.Add(player);

            logger.LogInformation($"Game {info.Key} now has {info.Players.Count} players");

            // TODO: This can fail, update with correct error handling
            await stream.OnNextAsync(new PlayerJoinedMessage()
            {
                PlayerId = player.GetPrimaryKeyString()
            });
        }