private void Handle(CodedInputStream stream) { var packet = new ClientPacket(stream); if (packet.Service == PrevService) { //packet.Method should be 0, if there is no errors Callback callback = callbacks.Dequeue(); if (callback.RequestId != packet.RequestId) { throw new InvalidOperationException("Callback does not match!"); } callback.Action(packet.ReadMessage(callback.Builder)); return; } IService service = importedServices[packet.Service]; MethodDescriptor method = service.DescriptorForType.Methods.Single(m => GetMethodId(m) == packet.Method); Action <IMessage> done = response => { ServerPacket data = new ServerPacket(PrevService, (int)ErrorCode, packet.RequestId, 0).WriteMessage(response); Send(data); if (ErrorCode != AuthError.None) { DisconnectNotification dcNotify = DisconnectNotification.CreateBuilder().SetErrorCode((uint)ErrorCode).Build(); ConnectionService.CreateStub(this).ForceDisconnect(null, dcNotify, r => { }); Disconnect(); } }; IMessage requestProto = service.GetRequestPrototype(method); IMessage message = packet.ReadMessage(requestProto.WeakToBuilder()); // Logging Console.WriteLine(requestProto.GetType()); Console.WriteLine("Text View:"); Console.WriteLine(message.ToString()); service.CallMethod(method, null, message, done); }