SessionHelper.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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.Header.Opcode);
  15. object message = session.network.MessagePacker.DeserializeFrom(responseType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);
  16. return (IResponse) message;
  17. }
  18. public static async Task<IResponse> Call(this Session session, IRequest request, CancellationToken cancellationToken)
  19. {
  20. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  21. ushort opcode = opcodeTypeComponent.GetOpcode(request.GetType());
  22. byte[] bytes = session.network.MessagePacker.SerializeToByteArray(request);
  23. PacketInfo packetInfo = await session.Call(opcode, bytes, cancellationToken);
  24. Type responseType = opcodeTypeComponent.GetType(packetInfo.Header.Opcode);
  25. object message = session.network.MessagePacker.DeserializeFrom(responseType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);
  26. return (IResponse)message;
  27. }
  28. public static void Send(this Session session, IMessage message)
  29. {
  30. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  31. ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
  32. byte[] bytes = session.network.MessagePacker.SerializeToByteArray(message);
  33. session.Send(opcode, bytes);
  34. }
  35. public static void Reply(this Session session, uint rpcId, IResponse message)
  36. {
  37. OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent<OpcodeTypeComponent>();
  38. ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
  39. byte[] bytes = session.network.MessagePacker.SerializeToByteArray(message);
  40. session.Reply(opcode, rpcId, bytes);
  41. }
  42. }
  43. }