]> git.deb.at Git - rhonda/impostor.git/commitdiff
Update Hazel to async
authorAeonLucid <aeonlucid@gmail.com>
Sat, 17 Oct 2020 02:49:36 +0000 (04:49 +0200)
committerAeonLucid <aeonlucid@gmail.com>
Sat, 17 Oct 2020 02:49:36 +0000 (04:49 +0200)
src/Impostor.Server.Api/Net/IConnection.cs
src/Impostor.Server.Hazel/HazelConnection.cs
src/Impostor.Server.Hazel/HazelMatchmaker.cs
src/Impostor.Server.Hazel/Messages/HazelMessage.cs
src/Impostor.Server/Net/Manager/ClientManager.cs
src/Impostor.Tools.Proxy/Program.cs
submodules/Hazel-Networking

index 911748ff7575a432840a68398b7d49123880b8e9..371c5aca36ebd89b5adabc3ca310a77cc41961f6 100644 (file)
@@ -36,11 +36,5 @@ namespace Impostor.Server.Net
         /// <param name="messageType">Type of the message.</param>
         /// <returns>Message writer for the current connection.</returns>
         IConnectionMessageWriter CreateMessage(MessageType messageType);
-
-        /// <summary>
-        ///     Start listening to the client.
-        /// </summary>
-        /// <returns>A <see cref="ValueTask"/> representing the asynchronous operation.</returns>
-        ValueTask ListenAsync();
     }
 }
\ No newline at end of file
index a8edb03711e3e21b3ade93b9afd26bbc80ab8313..4c25f7065346e71dd213120dbc47ee04abfa0fd9 100644 (file)
@@ -13,15 +13,13 @@ namespace Impostor.Server.Hazel
     internal class HazelConnection : IConnection
     {
         private readonly ILogger<HazelConnection> _logger;
-        private readonly ConcurrentStack<DataReceivedEventArgs> _pendingMessages;
 
         public HazelConnection(Connection innerConnection, ILogger<HazelConnection> logger)
         {
             _logger = logger;
-            _pendingMessages = new ConcurrentStack<DataReceivedEventArgs>();
             InnerConnection = innerConnection;
-            innerConnection.DataReceived += ConnectionOnDataReceived;
-            innerConnection.Disconnected += ConnectionOnDisconnected;
+            innerConnection.DataReceived = ConnectionOnDataReceived;
+            innerConnection.Disconnected = ConnectionOnDisconnected;
         }
 
         public Connection InnerConnection { get; }
@@ -32,27 +30,16 @@ namespace Impostor.Server.Hazel
 
         public IClient Client { get; set; }
 
-        private void ConnectionOnDisconnected(object sender, DisconnectedEventArgs e)
+        private async ValueTask ConnectionOnDisconnected(DisconnectedEventArgs e)
         {
             if (Client != null)
             {
-                Task.Run(Client.HandleDisconnectAsync);
+                await Client.HandleDisconnectAsync();
             }
         }
 
-        private void ConnectionOnDataReceived(DataReceivedEventArgs e)
+        private async ValueTask ConnectionOnDataReceived(DataReceivedEventArgs e)
         {
-            Task.Run(() => HandleData(e));
-        }
-
-        private async Task HandleData(DataReceivedEventArgs e)
-        {
-            if (Client == null)
-            {
-                _pendingMessages.Push(e);
-                return;
-            }
-
             try
             {
                 while (true)
@@ -79,23 +66,11 @@ namespace Impostor.Server.Hazel
             {
                 _logger.LogError(ex, "Exception caught in client data handler.");
             }
-            finally
-            {
-                e.Message.Recycle();
-            }
         }
 
         public IConnectionMessageWriter CreateMessage(MessageType messageType)
         {
             return new HazelConnectionMessageWriter(messageType, this);
         }
-
-        public async ValueTask ListenAsync()
-        {
-            while (_pendingMessages.TryPop(out var eventArgs))
-            {
-                await HandleData(eventArgs);
-            }
-        }
     }
 }
\ No newline at end of file
index b4f8fadcbbf9e83788126ce9a97c0b55291eace9..e34f37ec40559cc214de0153ca4c406b1b2c0fe7 100644 (file)
@@ -6,7 +6,6 @@ using Hazel;
 using Hazel.Udp;
 using Impostor.Server.Games;
 using Impostor.Server.Hazel.Messages;
-using Impostor.Server.Net;
 using Impostor.Server.Net.Manager;
 using Impostor.Server.Net.Messages;
 using Microsoft.Extensions.Logging;
@@ -30,7 +29,7 @@ namespace Impostor.Server.Hazel
             _connectionLogger = connectionLogger;
         }
 
-        public ValueTask StartAsync(IPEndPoint ipEndPoint)
+        public async ValueTask StartAsync(IPEndPoint ipEndPoint)
         {
             var mode = ipEndPoint.AddressFamily switch
             {
@@ -39,31 +38,18 @@ namespace Impostor.Server.Hazel
                 _ => throw new InvalidOperationException()
             };
 
-            _connection = new UdpConnectionListener(ipEndPoint, mode, s =>
-            {
-                _logger.LogWarning("Log from Hazel: {0}", s);
-            });
-
-            _connection.NewConnection += OnNewConnection;
-
-            _connection.Start();
-
-            return default;
-        }
-
-        public ValueTask StopAsync()
-        {
-            _connection.Dispose();
+            _connection = new UdpConnectionListener(ipEndPoint, mode);
+            _connection.NewConnection = OnNewConnection;
 
-            return default;
+            await _connection.StartAsync();
         }
 
-        private void OnNewConnection(NewConnectionEventArgs e)
+        public async ValueTask StopAsync()
         {
-            Task.Run(() => HandleNewConnection(e));
+            await _connection.DisposeAsync();
         }
 
-        private async Task HandleNewConnection(NewConnectionEventArgs e)
+        private async ValueTask OnNewConnection(NewConnectionEventArgs e)
         {
             try
             {
@@ -71,8 +57,6 @@ namespace Impostor.Server.Hazel
                 var clientVersion = e.HandshakeData.ReadInt32();
                 var name = e.HandshakeData.ReadString();
 
-                e.HandshakeData.Recycle();
-
                 var connection = new HazelConnection(e.Connection, _connectionLogger);
 
                 // Register client
index 9339cb0d83871eda034eaa82721bf712adb3a800..4f08eb422022d4496f9f1910af85fc2253cede8a 100644 (file)
@@ -24,7 +24,7 @@ namespace Impostor.Server.Hazel.Messages
                 throw new ObjectDisposedException(nameof(_reader));
             }
 
-            return new BufferMessageReader(_reader.Tag, _reader.Buffer.AsMemory(_reader.Offset, _reader.Length));
+            return new BufferMessageReader(_reader.Tag, _reader.Buffer);
         }
 
         private void Dispose(bool disposing)
index 7e75c772204de72362f9ee9b7fce77766f473fa2..04189afdf48350d5da99255785e8824f63a643b8 100644 (file)
@@ -59,8 +59,6 @@ namespace Impostor.Server.Net.Manager
             var client = _clientFactory.Create(connection, name, clientVersion);
 
             Register(client);
-
-            await connection.ListenAsync();
         }
 
         public void Register(IClient client)
index 539463c225d86579de9297f4988def44718bd232..7af07f32e1ac291fb47770cb13dc8d7a763c6bf5 100644 (file)
@@ -68,25 +68,22 @@ namespace Impostor.Tools.Proxy
             // True if this is our own packet.
             using (var stream = udp.Payload.ToMemoryStream())
             {
-                var reader = MessageReader.Get(stream.ToArray());
-                if (reader.Buffer[0] == (byte) SendOption.Reliable)
+                var reader = new MessageReader(stream.ToArray());
+                var option = reader.Buffer.Span[0];
+                if (option == (byte) SendOption.Reliable)
                 {
-                    reader.Offset = 3;
-                    reader.Length = udp.Payload.Length - 3;
-                    reader.Position = 0;
+                    reader = reader.Slice(3);
                 }
-                else if (reader.Buffer[0] == (byte) UdpSendOption.Acknowledgement ||
-                         reader.Buffer[0] == (byte) UdpSendOption.Ping ||
-                         reader.Buffer[0] == (byte) UdpSendOption.Hello ||
-                         reader.Buffer[0] == (byte) UdpSendOption.Disconnect)
+                else if (option == (byte) UdpSendOption.Acknowledgement ||
+                         option == (byte) UdpSendOption.Ping ||
+                         option == (byte) UdpSendOption.Hello ||
+                         option == (byte) UdpSendOption.Disconnect)
                 {
                     return;
                 }
                 else
                 {
-                    reader.Offset = 1;
-                    reader.Length = udp.Payload.Length - 1;
-                    reader.Position = 0;
+                    reader = reader.Slice(1);
                 }
                 
                 var isSent = ipSrc.StartsWith("192.");
@@ -134,7 +131,7 @@ namespace Impostor.Tools.Proxy
                     break;
                 case 5:
                 case 6:
-                    Console.WriteLine(HexUtils.HexDump(packet.Buffer.Take(packet.Length).ToArray()));
+                    Console.WriteLine(HexUtils.HexDump(packet.Buffer.ToArray().Take(packet.Length).ToArray()));
                     packet.Position = packet.Length;
                     break;
                 case 7:
@@ -174,7 +171,7 @@ namespace Impostor.Tools.Proxy
                 case 5:
                 case 6:
                     Console.WriteLine("- GameCode        " + packet.ReadInt32());
-                    Console.WriteLine(HexUtils.HexDump(packet.Buffer.Take(packet.Length).ToArray()));
+                    Console.WriteLine(HexUtils.HexDump(packet.Buffer.ToArray().Take(packet.Length).ToArray()));
                     packet.Position = packet.Length;
                     break;
             }
index ebc3b36068f57ebc1d34106e7778560fc8c09559..1c5c51c2bd28482128120003e7f72bee22ff8115 160000 (submodule)
@@ -1 +1 @@
-Subproject commit ebc3b36068f57ebc1d34106e7778560fc8c09559
+Subproject commit 1c5c51c2bd28482128120003e7f72bee22ff8115