SessionHelper.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. namespace Model
  5. {
  6. public static class SessionHelper
  7. {
  8. public static async Task<IResponse> Call(this Session session, IRequest request)
  9. {
  10. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  11. ushort opcode = opcodeTypeComponent.GetOpcode(request.GetType());
  12. byte[] bytes = session.Network.MessagePacker.SerializeToByteArray(request);
  13. PacketInfo packetInfo = await session.Call(opcode, bytes);
  14. Type responseType = opcodeTypeComponent.GetType(packetInfo.Opcode);
  15. object message = session.Network.MessagePacker.DeserializeFrom(responseType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);
  16. IResponse response = (IResponse) message;
  17. if (response.Error > 100)
  18. {
  19. throw new RpcException(response.Error, response.Message);
  20. }
  21. return response;
  22. }
  23. public static async Task<IResponse> Call(this Session session, IRequest request, CancellationToken cancellationToken)
  24. {
  25. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  26. ushort opcode = opcodeTypeComponent.GetOpcode(request.GetType());
  27. byte[] bytes = session.Network.MessagePacker.SerializeToByteArray(request);
  28. PacketInfo packetInfo = await session.Call(opcode, bytes, cancellationToken);
  29. Type responseType = opcodeTypeComponent.GetType(packetInfo.Opcode);
  30. object message = session.Network.MessagePacker.DeserializeFrom(responseType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);
  31. IResponse response = (IResponse)message;
  32. if (response.Error > 100)
  33. {
  34. throw new RpcException(response.Error, response.Message);
  35. }
  36. return response;
  37. }
  38. public static void Send(this Session session, IMessage message)
  39. {
  40. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  41. ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
  42. byte[] bytes = session.Network.MessagePacker.SerializeToByteArray(message);
  43. session.Send(opcode, bytes);
  44. }
  45. public static void Reply(this Session session, uint rpcId, IResponse message)
  46. {
  47. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  48. ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
  49. byte[] bytes = session.Network.MessagePacker.SerializeToByteArray(message);
  50. session.Reply(opcode, rpcId, bytes);
  51. }
  52. }
  53. }