public ClientSession(ISocketTask socket, Guid sessionID, IClusterClient clusterClient) { m_Socket = socket; SessionID = sessionID; socket.MessageEncoder = new MessageEncoder(); socket.MessageDecoder = new MessageDecoder(); m_Socket.OnDisconnect += OnDisconnect; m_Socket.OnMessage += OnMessage; try { m_ClientSessionGrain = clusterClient.GetGrain <IPlayerGrain>(sessionID); var obj = clusterClient.CreateObjectReference <IGatewayGrainObserver>(this).GetAwaiter().GetResult(); m_ClientSessionGrain.Subscribe(obj).Wait(); } catch (Exception e) { Logger.Warn(e); } socket.Startup(); }
async Task IPlayerRegistrationGrain.Register(IPlayerObserver playerObserver) { var playerId = this.GetPrimaryKey(); // first have someone else to wait for future notifications from the GameServerGrain IPlayerGrain playerInGame = PlayerGrainFactory.GetGrain(playerId); // Forward subscription to the corresponding PlayerInGameGrain and trigger lobby service. var playerInfo = await playerInGame.Subscribe(playerObserver); // *then* ask to start a GameServerGrain via lobby await _lobby.RegisterPlayer(playerInGame, playerInfo); }