From e7dfe97c6df90aaf4d3ca752cddc42f4b882d683 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:30:56 +0000 Subject: [PATCH 01/25] refactor!: remove TSend generic parameter from SendAndReceiveAsync --- TcpDotNet.ClientIntegrationTest/Program.cs | 4 ++-- TcpDotNet/BaseClientNode.cs | 4 +--- TcpDotNet/ProtocolClient.cs | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/TcpDotNet.ClientIntegrationTest/Program.cs b/TcpDotNet.ClientIntegrationTest/Program.cs index ada9729..0ecd968 100644 --- a/TcpDotNet.ClientIntegrationTest/Program.cs +++ b/TcpDotNet.ClientIntegrationTest/Program.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using TcpDotNet; using TcpDotNet.ClientIntegrationTest; using TcpDotNet.ClientIntegrationTest.PacketHandlers; @@ -17,7 +17,7 @@ Console.WriteLine($"Connected to {client.RemoteEndPoint}. My session is {client. var ping = new PingPacket(); Console.WriteLine($"Sending ping packet with payload: {BitConverter.ToString(ping.Payload)}"); -var pong = await client.SendAndReceiveAsync(ping); +var pong = await client.SendAndReceiveAsync(ping); Console.WriteLine($"Received pong packet with payload: {BitConverter.ToString(pong.Payload)}"); Console.WriteLine(pong.Payload.SequenceEqual(ping.Payload) ? "Payload matches!" : "Payload does not match!"); diff --git a/TcpDotNet/BaseClientNode.cs b/TcpDotNet/BaseClientNode.cs index 9670bb0..c1df784 100644 --- a/TcpDotNet/BaseClientNode.cs +++ b/TcpDotNet/BaseClientNode.cs @@ -221,15 +221,13 @@ public abstract class BaseClientNode : Node /// /// The packet to send. /// A cancellation token that can be used to cancel the asynchronous operation. - /// The type of the packet to send. /// The type of the packet to return. /// The received packet. /// /// This method will consume all incoming packets, raising their associated handlers if such packets are recognised. /// - public async Task SendAndReceiveAsync(TSend packetToSend, + public async Task SendAndReceiveAsync(Packet packetToSend, CancellationToken cancellationToken = default) - where TSend : Packet where TReceive : Packet { var attribute = typeof(TReceive).GetCustomAttribute(); diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index 1294eb8..ff9979b 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -96,7 +96,7 @@ public sealed class ProtocolClient : BaseClientNode State = ClientState.Handshaking; var handshakeRequest = new HandshakeRequestPacket(ProtocolVersion); var handshakeResponse = - await SendAndReceiveAsync(handshakeRequest, cancellationToken); + await SendAndReceiveAsync(handshakeRequest, cancellationToken); if (handshakeResponse.HandshakeResponse != HandshakeResponse.Success) { From 259fdddd6ee3c6a7ff0fa546ed675089aff508c0 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:32:29 +0000 Subject: [PATCH 02/25] refactor!: rename BaseClientNode to ClientNode --- .../PacketHandlers/GoodbyePacketHandler.cs | 2 +- .../PacketHandlers/HelloPacketHandler.cs | 2 +- TcpDotNet.ListenerIntegrationTest/Program.cs | 2 +- TcpDotNet/{BaseClientNode.cs => ClientNode.cs} | 6 +++--- TcpDotNet/ClientState.cs | 2 +- TcpDotNet/Protocol/PacketHandler.cs | 8 ++++---- .../Protocol/PacketHandlers/DisconnectPacketHandler.cs | 2 +- .../PacketHandlers/EncryptionResponsePacketHandler.cs | 2 +- .../PacketHandlers/HandshakeRequestPacketHandler.cs | 2 +- TcpDotNet/ProtocolClient.cs | 2 +- TcpDotNet/ProtocolListener.Client.cs | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) rename TcpDotNet/{BaseClientNode.cs => ClientNode.cs} (98%) diff --git a/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs b/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs index 243aa78..5277031 100644 --- a/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs +++ b/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs @@ -4,7 +4,7 @@ namespace TcpDotNet.ClientIntegrationTest.PacketHandlers; internal sealed class GoodbyePacketHandler : PacketHandler { - public override Task HandleAsync(BaseClientNode recipient, GoodbyePacket packet, CancellationToken cancellationToken = default) + public override Task HandleAsync(ClientNode recipient, GoodbyePacket packet, CancellationToken cancellationToken = default) { Console.WriteLine($"Server sent {packet.Message}"); return Task.CompletedTask; diff --git a/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs b/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs index f181fea..20646a0 100644 --- a/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs +++ b/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs @@ -4,7 +4,7 @@ namespace TcpDotNet.ListenerIntegrationTest.PacketHandlers; internal sealed class HelloPacketHandler : PacketHandler { - public override Task HandleAsync(BaseClientNode recipient, HelloPacket packet, CancellationToken cancellationToken = default) + public override Task HandleAsync(ClientNode recipient, HelloPacket packet, CancellationToken cancellationToken = default) { Console.WriteLine($"Client sent {packet.Message}"); return recipient.SendPacketAsync(new GoodbyePacket {Message = "Goodbye!"}, cancellationToken); diff --git a/TcpDotNet.ListenerIntegrationTest/Program.cs b/TcpDotNet.ListenerIntegrationTest/Program.cs index 8f88848..b0a3829 100644 --- a/TcpDotNet.ListenerIntegrationTest/Program.cs +++ b/TcpDotNet.ListenerIntegrationTest/Program.cs @@ -16,7 +16,7 @@ await Task.Delay(-1); internal sealed class PingPacketHandler : PacketHandler { - public override async Task HandleAsync(BaseClientNode recipient, PingPacket packet, CancellationToken cancellationToken = default) + public override async Task HandleAsync(ClientNode recipient, PingPacket packet, CancellationToken cancellationToken = default) { Console.WriteLine($"Client {recipient.SessionId} sent ping with payload {BitConverter.ToString(packet.Payload)}"); var pong = new PongPacket(packet.CallbackId, packet.Payload); diff --git a/TcpDotNet/BaseClientNode.cs b/TcpDotNet/ClientNode.cs similarity index 98% rename from TcpDotNet/BaseClientNode.cs rename to TcpDotNet/ClientNode.cs index c1df784..546dcb3 100644 --- a/TcpDotNet/BaseClientNode.cs +++ b/TcpDotNet/ClientNode.cs @@ -13,16 +13,16 @@ namespace TcpDotNet; /// /// Represents a client node. /// -public abstract class BaseClientNode : Node +public abstract class ClientNode : Node { private readonly ObjectIDGenerator _callbackIdGenerator = new(); private readonly ConcurrentDictionary>> _packetCompletionSources = new(); private EndPoint? _remoteEP; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - protected BaseClientNode() + protected ClientNode() { } diff --git a/TcpDotNet/ClientState.cs b/TcpDotNet/ClientState.cs index 01532ba..7fe88b8 100644 --- a/TcpDotNet/ClientState.cs +++ b/TcpDotNet/ClientState.cs @@ -1,7 +1,7 @@ namespace TcpDotNet; /// -/// An enumeration of states for a to be in. +/// An enumeration of states for a to be in. /// public enum ClientState { diff --git a/TcpDotNet/Protocol/PacketHandler.cs b/TcpDotNet/Protocol/PacketHandler.cs index c303e27..825363f 100644 --- a/TcpDotNet/Protocol/PacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandler.cs @@ -12,7 +12,7 @@ public abstract class PacketHandler /// The recipient of the packet. /// The packet to handle. /// A cancellation token that can be used to cancel the asynchronous operation. - public abstract Task HandleAsync(BaseClientNode recipient, Packet packet, CancellationToken cancellationToken = default); + public abstract Task HandleAsync(ClientNode recipient, Packet packet, CancellationToken cancellationToken = default); } /// @@ -27,7 +27,7 @@ public abstract class PacketHandler : PacketHandler public static readonly PacketHandler Empty = new NullPacketHandler(); /// - public override Task HandleAsync(BaseClientNode recipient, Packet packet, CancellationToken cancellationToken = default) + public override Task HandleAsync(ClientNode recipient, Packet packet, CancellationToken cancellationToken = default) { if (packet is T actual) return HandleAsync(recipient, actual, cancellationToken); return Task.CompletedTask; @@ -39,7 +39,7 @@ public abstract class PacketHandler : PacketHandler /// The recipient of the packet. /// The packet to handle. /// A cancellation token that can be used to cancel the asynchronous operation. - public abstract Task HandleAsync(BaseClientNode recipient, T packet, CancellationToken cancellationToken = default); + public abstract Task HandleAsync(ClientNode recipient, T packet, CancellationToken cancellationToken = default); } /// @@ -50,7 +50,7 @@ internal sealed class NullPacketHandler : PacketHandler where T : Packet { /// - public override Task HandleAsync(BaseClientNode recipient, T packet, CancellationToken cancellationToken = default) + public override Task HandleAsync(ClientNode recipient, T packet, CancellationToken cancellationToken = default) { return Task.CompletedTask; } diff --git a/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs index 0107ba9..ea9ce27 100644 --- a/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs @@ -6,7 +6,7 @@ internal sealed class DisconnectPacketHandler : PacketHandler { /// public override Task HandleAsync( - BaseClientNode recipient, + ClientNode recipient, DisconnectPacket packet, CancellationToken cancellationToken = default ) diff --git a/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs index c79914a..0a6194a 100644 --- a/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs @@ -11,7 +11,7 @@ internal sealed class EncryptionResponsePacketHandler : PacketHandler public override async Task HandleAsync( - BaseClientNode recipient, + ClientNode recipient, EncryptionResponsePacket packet, CancellationToken cancellationToken = default ) diff --git a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs index 2df88d0..9ec2a75 100644 --- a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs @@ -10,7 +10,7 @@ internal sealed class HandshakeRequestPacketHandler : PacketHandler public override async Task HandleAsync( - BaseClientNode recipient, + ClientNode recipient, HandshakeRequestPacket packet, CancellationToken cancellationToken = default ) diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index ff9979b..e510ca3 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -14,7 +14,7 @@ namespace TcpDotNet; /// /// Represents a client on the TcpDotNet protocol. /// -public sealed class ProtocolClient : BaseClientNode +public sealed class ProtocolClient : ClientNode { /// /// Initializes a new instance of the class. diff --git a/TcpDotNet/ProtocolListener.Client.cs b/TcpDotNet/ProtocolListener.Client.cs index 2755a31..3c834c4 100644 --- a/TcpDotNet/ProtocolListener.Client.cs +++ b/TcpDotNet/ProtocolListener.Client.cs @@ -8,7 +8,7 @@ public sealed partial class ProtocolListener /// /// Represents a client that is connected to a . /// - public sealed class Client : BaseClientNode + public sealed class Client : ClientNode { internal Client(ProtocolListener listener, Socket socket) { From ed279cfd69bc8414c15313e34aaf08bcaece4c42 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:33:56 +0000 Subject: [PATCH 03/25] feat: add .net 8 target --- .../TcpDotNet.ClientIntegrationTest.csproj | 2 +- .../TcpDotNet.ListenerIntegrationTest.csproj | 2 +- TcpDotNet/TcpDotNet.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj b/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj index ed854e8..8532d3c 100644 --- a/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj +++ b/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable diff --git a/TcpDotNet.ListenerIntegrationTest/TcpDotNet.ListenerIntegrationTest.csproj b/TcpDotNet.ListenerIntegrationTest/TcpDotNet.ListenerIntegrationTest.csproj index ed854e8..8532d3c 100644 --- a/TcpDotNet.ListenerIntegrationTest/TcpDotNet.ListenerIntegrationTest.csproj +++ b/TcpDotNet.ListenerIntegrationTest/TcpDotNet.ListenerIntegrationTest.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable diff --git a/TcpDotNet/TcpDotNet.csproj b/TcpDotNet/TcpDotNet.csproj index 3e8b637..aa54b53 100644 --- a/TcpDotNet/TcpDotNet.csproj +++ b/TcpDotNet/TcpDotNet.csproj @@ -1,7 +1,7 @@ - netstandard2.1;net6.0;net7.0 + netstandard2.1;net6.0;net7.0;net8.0 enable enable 10 From 32fecb5ace202ed40d1178a194f705b1a6a7054c Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:35:44 +0000 Subject: [PATCH 04/25] fix: pass in not ref with net8.0 to MemoryMarshal.TryWrite --- TcpDotNet/Protocol/ProtocolWriter.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/TcpDotNet/Protocol/ProtocolWriter.cs b/TcpDotNet/Protocol/ProtocolWriter.cs index 76280fe..138bee6 100644 --- a/TcpDotNet/Protocol/ProtocolWriter.cs +++ b/TcpDotNet/Protocol/ProtocolWriter.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Numerics; using System.Runtime.InteropServices; using System.Text; @@ -38,7 +38,11 @@ public sealed class ProtocolWriter : BinaryWriter public override void Write(double value) { Span buffer = stackalloc byte[8]; +#if NET8_0_OR_GREATER + MemoryMarshal.TryWrite(buffer, in value); +#else MemoryMarshal.TryWrite(buffer, ref value); +#endif if (BitConverter.IsLittleEndian) buffer.Reverse(); Write(buffer); @@ -89,7 +93,11 @@ public sealed class ProtocolWriter : BinaryWriter public override void Write(float value) { Span buffer = stackalloc byte[4]; +#if NET8_0_OR_GREATER + MemoryMarshal.TryWrite(buffer, in value); +#else MemoryMarshal.TryWrite(buffer, ref value); +#endif if (BitConverter.IsLittleEndian) buffer.Reverse(); Write(buffer); From 0c5c2087b93c6dedc70dc4ba1879be57962d12f1 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:40:15 +0000 Subject: [PATCH 05/25] [ci skip] style: run code cleanup --- TcpDotNet/ClientNode.cs | 12 ++++++----- TcpDotNet/Node.cs | 6 ++++-- .../HandshakeRequestPacketHandler.cs | 3 ++- .../Packets/ClientBound/DisconnectPacket.cs | 4 ++-- .../ClientBound/HandshakeResponsePacket.cs | 4 ++-- TcpDotNet/Protocol/ProtocolReader.cs | 18 ++++++++--------- TcpDotNet/Protocol/ProtocolWriter.cs | 20 +++++++++---------- TcpDotNet/ProtocolListener.Client.cs | 3 ++- 8 files changed, 38 insertions(+), 32 deletions(-) diff --git a/TcpDotNet/ClientNode.cs b/TcpDotNet/ClientNode.cs index 546dcb3..13b1738 100644 --- a/TcpDotNet/ClientNode.cs +++ b/TcpDotNet/ClientNode.cs @@ -148,7 +148,7 @@ public abstract class ClientNode : Node if (constructor is null) return null; - var packet = (Packet) constructor.Invoke(null); + var packet = (Packet)constructor.Invoke(null); packet.Deserialize(bufferReader); await targetStream.DisposeAsync(); @@ -198,7 +198,7 @@ public abstract class ClientNode : Node buffer.Position = 0; } - var length = (int) buffer.Length; + var length = (int)buffer.Length; networkWriter.Write(length); try @@ -239,7 +239,8 @@ public abstract class ClientNode : Node requestPacket.CallbackId = _callbackIdGenerator.GetId(packetToSend, out _); var completionSource = new TaskCompletionSource(); - if (!_packetCompletionSources.TryGetValue(attribute.Id, out List>? completionSources)) + if (!_packetCompletionSources.TryGetValue(attribute.Id, + out List>? completionSources)) { completionSources = new List>(); _packetCompletionSources.TryAdd(attribute.Id, completionSources); @@ -292,7 +293,8 @@ public abstract class ClientNode : Node if (attribute is null) throw new ArgumentException($"The packet type {typeof(TPacket).Name} is not a valid packet."); - if (!_packetCompletionSources.TryGetValue(attribute.Id, out List>? completionSources)) + if (!_packetCompletionSources.TryGetValue(attribute.Id, + out List>? completionSources)) { completionSources = new List>(); _packetCompletionSources.TryAdd(attribute.Id, completionSources); @@ -326,7 +328,7 @@ public abstract class ClientNode : Node completionSource.SetCanceled(); }, cancellationToken); - var packet = (TPacket) await Task.Run(() => completionSource.Task, cancellationToken); + var packet = (TPacket)await Task.Run(() => completionSource.Task, cancellationToken); if (_packetCompletionSources.TryGetValue(attribute.Id, out completionSources)) { lock (completionSources) diff --git a/TcpDotNet/Node.cs b/TcpDotNet/Node.cs index bdcf759..ed50de5 100644 --- a/TcpDotNet/Node.cs +++ b/TcpDotNet/Node.cs @@ -38,7 +38,8 @@ public abstract class Node : IDisposable /// The registered packets. public IReadOnlyDictionary> RegisteredPacketHandlers => new ReadOnlyDictionary>( - _registeredPacketHandlers.ToDictionary(p => p.Key, p => (IReadOnlyCollection) p.Value.AsReadOnly())); + _registeredPacketHandlers.ToDictionary(p => p.Key, + p => (IReadOnlyCollection)p.Value.AsReadOnly())); /// /// Closes the base socket connection and releases all associated resources. @@ -124,7 +125,8 @@ public abstract class Node : IDisposable var attribute = packetType.GetCustomAttribute(); if (attribute is null) throw new ArgumentException($"{packetType.Name} is not a valid packet."); if (_registeredPackets.TryGetValue(attribute.Id, out Type? registeredPacket)) - throw new ArgumentException($"The packet type {attribute.Id:X8} is already registered to {registeredPacket.Name}."); + throw new ArgumentException( + $"The packet type {attribute.Id:X8} is already registered to {registeredPacket.Name}."); _registeredPackets.TryAdd(attribute.Id, packetType); } diff --git a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs index 9ec2a75..d37209d 100644 --- a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs @@ -22,7 +22,8 @@ internal sealed class HandshakeRequestPacketHandler : PacketHandler protected internal override void Deserialize(ProtocolReader reader) { - Reason = (DisconnectReason) reader.ReadByte(); + Reason = (DisconnectReason)reader.ReadByte(); } /// protected internal override void Serialize(ProtocolWriter writer) { - writer.Write((byte) Reason); + writer.Write((byte)Reason); } } diff --git a/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs index 0cc020e..8fcf1a8 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs @@ -38,14 +38,14 @@ internal sealed class HandshakeResponsePacket : Packet /// protected internal override void Deserialize(ProtocolReader reader) { - HandshakeResponse = (HandshakeResponse) reader.ReadByte(); + HandshakeResponse = (HandshakeResponse)reader.ReadByte(); ProtocolVersion = reader.ReadInt32(); } /// protected internal override void Serialize(ProtocolWriter writer) { - writer.Write((byte) HandshakeResponse); + writer.Write((byte)HandshakeResponse); writer.Write(ProtocolVersion); } } diff --git a/TcpDotNet/Protocol/ProtocolReader.cs b/TcpDotNet/Protocol/ProtocolReader.cs index 810613d..36df3bb 100644 --- a/TcpDotNet/Protocol/ProtocolReader.cs +++ b/TcpDotNet/Protocol/ProtocolReader.cs @@ -66,7 +66,7 @@ public sealed class ProtocolReader : BinaryReader result |= (byteReadJustNow & 0x7Fu) << shift; if (byteReadJustNow <= 0x7Fu) - return (int) result; // early exit + return (int)result; // early exit } // Read the 5th byte. Since we already read 28 bits, @@ -77,8 +77,8 @@ public sealed class ProtocolReader : BinaryReader if (byteReadJustNow > 0b_1111u) throw new FormatException(); - result |= (uint) byteReadJustNow << (maxBytesWithoutOverflow * 7); - return (int) result; + result |= (uint)byteReadJustNow << (maxBytesWithoutOverflow * 7); + return (int)result; } /// @@ -107,7 +107,7 @@ public sealed class ProtocolReader : BinaryReader result |= (byteReadJustNow & 0x7Ful) << shift; if (byteReadJustNow <= 0x7Fu) - return (long) result; // early exit + return (long)result; // early exit } // Read the 10th byte. Since we already read 63 bits, @@ -118,8 +118,8 @@ public sealed class ProtocolReader : BinaryReader if (byteReadJustNow > 0b_1u) throw new FormatException(); - result |= (ulong) byteReadJustNow << (maxBytesWithoutOverflow * 7); - return (long) result; + result |= (ulong)byteReadJustNow << (maxBytesWithoutOverflow * 7); + return (long)result; } /// @@ -196,21 +196,21 @@ public sealed class ProtocolReader : BinaryReader [CLSCompliant(false)] public override ushort ReadUInt16() { - return (ushort) IPAddress.NetworkToHostOrder((short) base.ReadUInt16()); + return (ushort)IPAddress.NetworkToHostOrder((short)base.ReadUInt16()); } /// [CLSCompliant(false)] public override uint ReadUInt32() { - return (uint) IPAddress.NetworkToHostOrder((int) base.ReadUInt32()); + return (uint)IPAddress.NetworkToHostOrder((int)base.ReadUInt32()); } /// [CLSCompliant(false)] public override ulong ReadUInt64() { - return (ulong) IPAddress.NetworkToHostOrder((long) base.ReadUInt64()); + return (ulong)IPAddress.NetworkToHostOrder((long)base.ReadUInt64()); } /// diff --git a/TcpDotNet/Protocol/ProtocolWriter.cs b/TcpDotNet/Protocol/ProtocolWriter.cs index 138bee6..f667a30 100644 --- a/TcpDotNet/Protocol/ProtocolWriter.cs +++ b/TcpDotNet/Protocol/ProtocolWriter.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Numerics; using System.Runtime.InteropServices; using System.Text; @@ -107,21 +107,21 @@ public sealed class ProtocolWriter : BinaryWriter [CLSCompliant(false)] public override void Write(ushort value) { - base.Write((ushort) IPAddress.HostToNetworkOrder((short) value)); + base.Write((ushort)IPAddress.HostToNetworkOrder((short)value)); } /// [CLSCompliant(false)] public override void Write(uint value) { - base.Write((uint) IPAddress.HostToNetworkOrder((int) value)); + base.Write((uint)IPAddress.HostToNetworkOrder((int)value)); } /// [CLSCompliant(false)] public override void Write(ulong value) { - base.Write((ulong) IPAddress.HostToNetworkOrder((long) value)); + base.Write((ulong)IPAddress.HostToNetworkOrder((long)value)); } /// @@ -163,7 +163,7 @@ public sealed class ProtocolWriter : BinaryWriter /// The 32-bit integer to be written. public void Write7BitEncodedInt32(int value) { - var uValue = (uint) value; + var uValue = (uint)value; // Write out an int 7 bits at a time. The high bit of the byte, // when on, tells reader to continue reading more bytes. @@ -173,11 +173,11 @@ public sealed class ProtocolWriter : BinaryWriter while (uValue > 0x7Fu) { - Write((byte) (uValue | ~0x7Fu)); + Write((byte)(uValue | ~0x7Fu)); uValue >>= 7; } - Write((byte) uValue); + Write((byte)uValue); } /// @@ -186,7 +186,7 @@ public sealed class ProtocolWriter : BinaryWriter /// The 64-bit integer to be written. public void Write7BitEncodedInt64(long value) { - var uValue = (ulong) value; + var uValue = (ulong)value; // Write out an int 7 bits at a time. The high bit of the byte, // when on, tells reader to continue reading more bytes. @@ -196,10 +196,10 @@ public sealed class ProtocolWriter : BinaryWriter while (uValue > 0x7Fu) { - Write((byte) ((uint) uValue | ~0x7Fu)); + Write((byte)((uint)uValue | ~0x7Fu)); uValue >>= 7; } - Write((byte) uValue); + Write((byte)uValue); } } diff --git a/TcpDotNet/ProtocolListener.Client.cs b/TcpDotNet/ProtocolListener.Client.cs index 3c834c4..2364d1b 100644 --- a/TcpDotNet/ProtocolListener.Client.cs +++ b/TcpDotNet/ProtocolListener.Client.cs @@ -35,7 +35,8 @@ public sealed partial class ProtocolListener foreach (Type packetType in ParentListener.RegisteredPackets.Values) RegisterPacket(packetType); - foreach ((Type packetType, IReadOnlyCollection? handlers) in ParentListener.RegisteredPacketHandlers) + foreach ((Type packetType, IReadOnlyCollection? handlers) in ParentListener + .RegisteredPacketHandlers) foreach (PacketHandler handler in handlers) RegisterPacketHandler(packetType, handler); From d7ba24e302757269b9d8198c501024874543bca8 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:41:52 +0000 Subject: [PATCH 06/25] style: remove UTF-8 BOM --- TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs | 2 +- TcpDotNet.ClientIntegrationTest/HelloPacket.cs | 2 +- .../PacketHandlers/GoodbyePacketHandler.cs | 2 +- TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs | 2 +- TcpDotNet.ListenerIntegrationTest/HelloPacket.cs | 2 +- .../PacketHandlers/HelloPacketHandler.cs | 2 +- TcpDotNet.ListenerIntegrationTest/Program.cs | 2 +- TcpDotNet/Assembly.cs | 2 +- TcpDotNet/ClientNode.cs | 2 +- TcpDotNet/ClientState.cs | 2 +- TcpDotNet/CryptographyUtils.cs | 2 +- TcpDotNet/Node.cs | 2 +- TcpDotNet/Protocol/HandshakeResponse.cs | 2 +- TcpDotNet/Protocol/Packet.cs | 2 +- TcpDotNet/Protocol/PacketAttribute.cs | 2 +- TcpDotNet/Protocol/PacketHandler.cs | 2 +- TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs | 2 +- .../Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs | 2 +- .../Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs | 2 +- TcpDotNet/Protocol/Packets/ClientBound/DisconnectPacket.cs | 2 +- .../Protocol/Packets/ClientBound/EncryptionRequestPacket.cs | 2 +- .../Protocol/Packets/ClientBound/HandshakeResponsePacket.cs | 2 +- TcpDotNet/Protocol/Packets/ClientBound/PongPacket.cs | 2 +- TcpDotNet/Protocol/Packets/ClientBound/SessionExchangePacket.cs | 2 +- .../Protocol/Packets/ServerBound/EncryptionResponsePacket.cs | 2 +- .../Protocol/Packets/ServerBound/HandshakeRequestPacket.cs | 2 +- TcpDotNet/Protocol/Packets/ServerBound/PingPacket.cs | 2 +- TcpDotNet/Protocol/ProtocolReader.cs | 2 +- TcpDotNet/Protocol/ProtocolWriter.cs | 2 +- TcpDotNet/Protocol/RequestPacket.cs | 2 +- TcpDotNet/Protocol/ResponsePacket.cs | 2 +- TcpDotNet/ProtocolClient.cs | 2 +- TcpDotNet/ProtocolListener.cs | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs b/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs index d79d97c..9892853 100644 --- a/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs +++ b/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol; +using TcpDotNet.Protocol; namespace TcpDotNet.ClientIntegrationTest; diff --git a/TcpDotNet.ClientIntegrationTest/HelloPacket.cs b/TcpDotNet.ClientIntegrationTest/HelloPacket.cs index 0b4f357..0cc4e9f 100644 --- a/TcpDotNet.ClientIntegrationTest/HelloPacket.cs +++ b/TcpDotNet.ClientIntegrationTest/HelloPacket.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol; +using TcpDotNet.Protocol; namespace TcpDotNet.ClientIntegrationTest; diff --git a/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs b/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs index 5277031..58fec4a 100644 --- a/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs +++ b/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol; +using TcpDotNet.Protocol; namespace TcpDotNet.ClientIntegrationTest.PacketHandlers; diff --git a/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs b/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs index 02baa10..40e03c1 100644 --- a/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs +++ b/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol; +using TcpDotNet.Protocol; namespace TcpDotNet.ListenerIntegrationTest; diff --git a/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs b/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs index 80a958b..6adb687 100644 --- a/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs +++ b/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol; +using TcpDotNet.Protocol; namespace TcpDotNet.ListenerIntegrationTest; diff --git a/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs b/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs index 20646a0..f138f55 100644 --- a/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs +++ b/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol; +using TcpDotNet.Protocol; namespace TcpDotNet.ListenerIntegrationTest.PacketHandlers; diff --git a/TcpDotNet.ListenerIntegrationTest/Program.cs b/TcpDotNet.ListenerIntegrationTest/Program.cs index b0a3829..611cae2 100644 --- a/TcpDotNet.ListenerIntegrationTest/Program.cs +++ b/TcpDotNet.ListenerIntegrationTest/Program.cs @@ -1,4 +1,4 @@ -using TcpDotNet; +using TcpDotNet; using TcpDotNet.ListenerIntegrationTest.PacketHandlers; using TcpDotNet.Protocol; using TcpDotNet.Protocol.Packets.ClientBound; diff --git a/TcpDotNet/Assembly.cs b/TcpDotNet/Assembly.cs index f547610..c0d560e 100644 --- a/TcpDotNet/Assembly.cs +++ b/TcpDotNet/Assembly.cs @@ -1 +1 @@ -[assembly: CLSCompliant(true)] +[assembly: CLSCompliant(true)] diff --git a/TcpDotNet/ClientNode.cs b/TcpDotNet/ClientNode.cs index 13b1738..6ff6b55 100644 --- a/TcpDotNet/ClientNode.cs +++ b/TcpDotNet/ClientNode.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; using System.Reflection; diff --git a/TcpDotNet/ClientState.cs b/TcpDotNet/ClientState.cs index 7fe88b8..fec2980 100644 --- a/TcpDotNet/ClientState.cs +++ b/TcpDotNet/ClientState.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet; +namespace TcpDotNet; /// /// An enumeration of states for a to be in. diff --git a/TcpDotNet/CryptographyUtils.cs b/TcpDotNet/CryptographyUtils.cs index 2907bb9..f1b287a 100644 --- a/TcpDotNet/CryptographyUtils.cs +++ b/TcpDotNet/CryptographyUtils.cs @@ -1,4 +1,4 @@ -using Chilkat; +using Chilkat; namespace TcpDotNet; diff --git a/TcpDotNet/Node.cs b/TcpDotNet/Node.cs index ed50de5..7af3a01 100644 --- a/TcpDotNet/Node.cs +++ b/TcpDotNet/Node.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Net.Sockets; using System.Reflection; diff --git a/TcpDotNet/Protocol/HandshakeResponse.cs b/TcpDotNet/Protocol/HandshakeResponse.cs index a0a5a30..4534962 100644 --- a/TcpDotNet/Protocol/HandshakeResponse.cs +++ b/TcpDotNet/Protocol/HandshakeResponse.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol; +namespace TcpDotNet.Protocol; /// /// An enumeration of handshake responses. diff --git a/TcpDotNet/Protocol/Packet.cs b/TcpDotNet/Protocol/Packet.cs index e984dbc..c1c79ce 100644 --- a/TcpDotNet/Protocol/Packet.cs +++ b/TcpDotNet/Protocol/Packet.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; namespace TcpDotNet.Protocol; diff --git a/TcpDotNet/Protocol/PacketAttribute.cs b/TcpDotNet/Protocol/PacketAttribute.cs index 8bda278..a613d81 100644 --- a/TcpDotNet/Protocol/PacketAttribute.cs +++ b/TcpDotNet/Protocol/PacketAttribute.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol; +namespace TcpDotNet.Protocol; /// /// Specifies metadata for a . diff --git a/TcpDotNet/Protocol/PacketHandler.cs b/TcpDotNet/Protocol/PacketHandler.cs index 825363f..9431b8a 100644 --- a/TcpDotNet/Protocol/PacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandler.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol; +namespace TcpDotNet.Protocol; /// /// Represents the base class for a packet handler. diff --git a/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs index ea9ce27..b36f755 100644 --- a/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/DisconnectPacketHandler.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol.Packets.ClientBound; +using TcpDotNet.Protocol.Packets.ClientBound; namespace TcpDotNet.Protocol.PacketHandlers; diff --git a/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs index 0a6194a..16dc115 100644 --- a/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/EncryptionResponsePacketHandler.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; using TcpDotNet.Protocol.Packets.ClientBound; using TcpDotNet.Protocol.Packets.ServerBound; diff --git a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs index d37209d..78a1861 100644 --- a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol.Packets.ClientBound; +using TcpDotNet.Protocol.Packets.ClientBound; using TcpDotNet.Protocol.Packets.ServerBound; namespace TcpDotNet.Protocol.PacketHandlers; diff --git a/TcpDotNet/Protocol/Packets/ClientBound/DisconnectPacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/DisconnectPacket.cs index 9f365c1..ad680c8 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/DisconnectPacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/DisconnectPacket.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol.Packets.ClientBound; +namespace TcpDotNet.Protocol.Packets.ClientBound; [Packet(0x7FFFFFFF)] internal sealed class DisconnectPacket : Packet diff --git a/TcpDotNet/Protocol/Packets/ClientBound/EncryptionRequestPacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/EncryptionRequestPacket.cs index c3960f5..cbbef56 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/EncryptionRequestPacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/EncryptionRequestPacket.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; namespace TcpDotNet.Protocol.Packets.ClientBound; diff --git a/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs index 8fcf1a8..2e3ecd2 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol.Packets.ServerBound; +using TcpDotNet.Protocol.Packets.ServerBound; namespace TcpDotNet.Protocol.Packets.ClientBound; diff --git a/TcpDotNet/Protocol/Packets/ClientBound/PongPacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/PongPacket.cs index 7952016..7bc7a60 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/PongPacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/PongPacket.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol.Packets.ClientBound; +namespace TcpDotNet.Protocol.Packets.ClientBound; /// /// Represents a packet which performs a heartbeat response. diff --git a/TcpDotNet/Protocol/Packets/ClientBound/SessionExchangePacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/SessionExchangePacket.cs index e7679ac..3301b50 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/SessionExchangePacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/SessionExchangePacket.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol.Packets.ClientBound; +namespace TcpDotNet.Protocol.Packets.ClientBound; [Packet(0x7FFFFFE4)] internal sealed class SessionExchangePacket : Packet diff --git a/TcpDotNet/Protocol/Packets/ServerBound/EncryptionResponsePacket.cs b/TcpDotNet/Protocol/Packets/ServerBound/EncryptionResponsePacket.cs index 935cca6..4107174 100644 --- a/TcpDotNet/Protocol/Packets/ServerBound/EncryptionResponsePacket.cs +++ b/TcpDotNet/Protocol/Packets/ServerBound/EncryptionResponsePacket.cs @@ -1,4 +1,4 @@ -using TcpDotNet.Protocol.Packets.ClientBound; +using TcpDotNet.Protocol.Packets.ClientBound; namespace TcpDotNet.Protocol.Packets.ServerBound; diff --git a/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs b/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs index 82e4ef3..3ac8b30 100644 --- a/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs +++ b/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol.Packets.ServerBound; +namespace TcpDotNet.Protocol.Packets.ServerBound; /// /// Represents a packet which requests a handshake with a . diff --git a/TcpDotNet/Protocol/Packets/ServerBound/PingPacket.cs b/TcpDotNet/Protocol/Packets/ServerBound/PingPacket.cs index 06eb33c..1ce5e8e 100644 --- a/TcpDotNet/Protocol/Packets/ServerBound/PingPacket.cs +++ b/TcpDotNet/Protocol/Packets/ServerBound/PingPacket.cs @@ -1,4 +1,4 @@ -using System.Security.Cryptography; +using System.Security.Cryptography; namespace TcpDotNet.Protocol.Packets.ServerBound; diff --git a/TcpDotNet/Protocol/ProtocolReader.cs b/TcpDotNet/Protocol/ProtocolReader.cs index 36df3bb..e9b5e53 100644 --- a/TcpDotNet/Protocol/ProtocolReader.cs +++ b/TcpDotNet/Protocol/ProtocolReader.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Numerics; using System.Runtime.InteropServices; using System.Text; diff --git a/TcpDotNet/Protocol/ProtocolWriter.cs b/TcpDotNet/Protocol/ProtocolWriter.cs index f667a30..920b867 100644 --- a/TcpDotNet/Protocol/ProtocolWriter.cs +++ b/TcpDotNet/Protocol/ProtocolWriter.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Numerics; using System.Runtime.InteropServices; using System.Text; diff --git a/TcpDotNet/Protocol/RequestPacket.cs b/TcpDotNet/Protocol/RequestPacket.cs index 42f3bcf..f1ebe51 100644 --- a/TcpDotNet/Protocol/RequestPacket.cs +++ b/TcpDotNet/Protocol/RequestPacket.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol; +namespace TcpDotNet.Protocol; /// /// Represents a request packet, which forms a request/response packet pair. diff --git a/TcpDotNet/Protocol/ResponsePacket.cs b/TcpDotNet/Protocol/ResponsePacket.cs index 7aade8b..87a4f8c 100644 --- a/TcpDotNet/Protocol/ResponsePacket.cs +++ b/TcpDotNet/Protocol/ResponsePacket.cs @@ -1,4 +1,4 @@ -namespace TcpDotNet.Protocol; +namespace TcpDotNet.Protocol; /// /// Represents a response packet, which forms a request/response packet pair. diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index e510ca3..f9a464f 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Sockets; using System.Security.Cryptography; using TcpDotNet.EventData; diff --git a/TcpDotNet/ProtocolListener.cs b/TcpDotNet/ProtocolListener.cs index 335d313..4787449 100644 --- a/TcpDotNet/ProtocolListener.cs +++ b/TcpDotNet/ProtocolListener.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using System.Net.Sockets; using System.Security.Cryptography; using TcpDotNet.EventData; From 5b96ef20986f8ef087c58b91f30b6efa9984b2d2 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:45:33 +0000 Subject: [PATCH 07/25] ci: use .NET 8 SDK --- .github/workflows/dotnet.yml | 4 ++-- .github/workflows/nightly.yml | 4 ++-- .github/workflows/prerelease.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- global.json | 7 +++++++ 5 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 global.json diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 41cf44d..57096f3 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -16,9 +16,9 @@ jobs: uses: actions/checkout@v3 - name: Setup .NET - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Add NuGet source run: dotnet nuget add source --username oliverbooth --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/oliverbooth/index.json" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ca5ca69..266e2b4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -15,9 +15,9 @@ jobs: uses: actions/checkout@v3 - name: Setup .NET - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Add GitHub NuGet source run: dotnet nuget add source --username oliverbooth --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/oliverbooth/index.json" diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index 7f089d9..06245fd 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -15,9 +15,9 @@ jobs: uses: actions/checkout@v3 - name: Setup .NET - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Add GitHub NuGet source run: dotnet nuget add source --username oliverbooth --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/oliverbooth/index.json" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b234990..910cb8d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,9 +15,9 @@ jobs: uses: actions/checkout@v3 - name: Setup .NET - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Add GitHub NuGet source run: dotnet nuget add source --username oliverbooth --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/oliverbooth/index.json" diff --git a/global.json b/global.json new file mode 100644 index 0000000..b5b37b6 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "8.0.0", + "rollForward": "latestMajor", + "allowPrerelease": false + } +} \ No newline at end of file From 86ef24478900b2faeca6c83c75de98415378fa83 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:45:48 +0000 Subject: [PATCH 08/25] chore: add workflows and solution items to sln --- TcpDotNet.sln | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/TcpDotNet.sln b/TcpDotNet.sln index 1a518a6..655709f 100644 --- a/TcpDotNet.sln +++ b/TcpDotNet.sln @@ -6,6 +6,21 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpDotNet.ListenerIntegrati EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpDotNet.ClientIntegrationTest", "TcpDotNet.ClientIntegrationTest\TcpDotNet.ClientIntegrationTest.csproj", "{ED9C812F-9835-4268-9AFC-57CFAAC16162}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D55FB87A-1066-489D-B0CC-F2C09B611751}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + LICENSE.md = LICENSE.md + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workflows", "Workflows", "{0FAB77D5-AAE4-4722-A5F4-88A239858D65}" + ProjectSection(SolutionItems) = preProject + .github\workflows\dotnet.yml = .github\workflows\dotnet.yml + .github\workflows\nightly.yml = .github\workflows\nightly.yml + .github\workflows\prerelease.yml = .github\workflows\prerelease.yml + .github\workflows\release.yml = .github\workflows\release.yml + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From 6959778e09a2b71ba10324a2846998bf93b99cb4 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:46:37 +0000 Subject: [PATCH 09/25] ci: run dotnet on all branches --- .github/workflows/dotnet.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 57096f3..ae53f18 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -2,9 +2,13 @@ name: .NET on: push: - branches: [ main, develop ] + branches: + - '*' + - '*/*' pull_request: - branches: [ main, develop ] + branches: + - '*' + - '*/*' jobs: build: From 7b21514dc43352af96ce5fa210e42f7150e11588 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:46:58 +0000 Subject: [PATCH 10/25] ci: run nightly on push to main, or workflow_dispatch --- .github/workflows/nightly.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 266e2b4..913a55b 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -3,7 +3,8 @@ name: Publish Nightly on: push: branches: - - develop + - main + workflow_dispatch: jobs: nightly: From 65cb143b0648810953ab6582395bf0a43adb648f Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:48:40 +0000 Subject: [PATCH 11/25] [ci skip] style(docs): use flat-square shield style --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c08825b..264e42d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@

TcpDotNet

-GitHub Workflow Status -GitHub Issues -NuGet Downloads -Stable Version -Nightly Version -MIT License +GitHub Workflow Status +GitHub Issues +NuGet Downloads +Stable Version +Nightly Version +MIT License

### About From ff78acfb56e039ec9d7f2635ee2261a101e40024 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:58:38 +0000 Subject: [PATCH 12/25] fix: HandshakeRequestPacket inherits RequestPacket --- .../Protocol/Packets/ServerBound/HandshakeRequestPacket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs b/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs index 3ac8b30..afe4102 100644 --- a/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs +++ b/TcpDotNet/Protocol/Packets/ServerBound/HandshakeRequestPacket.cs @@ -4,7 +4,7 @@ namespace TcpDotNet.Protocol.Packets.ServerBound; /// Represents a packet which requests a handshake with a . ///
[Packet(0x7FFFFFE0)] -internal sealed class HandshakeRequestPacket : Packet +internal sealed class HandshakeRequestPacket : RequestPacket { /// /// Initializes a new instance of the class. From 18b0ff3f251e3a454d96dfdd47841f75cce2d598 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 17:59:54 +0000 Subject: [PATCH 13/25] perf: use static RandomNumberGenerator to generate AES key --- TcpDotNet/ProtocolClient.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index f9a464f..f16829e 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -113,8 +113,7 @@ public sealed class ProtocolClient : ClientNode byte[] encryptedPayload = rsa.Encrypt(encryptionRequest.Payload, true); var key = new byte[128]; - using var rng = new RNGCryptoServiceProvider(); - rng.GetBytes(key); + RandomNumberGenerator.Fill(key); Aes = CryptographyUtils.GenerateAes(key); byte[] aesKey = rsa.Encrypt(key, true); From a3e540ac83026a382aca865bf4d3284f22458c02 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 18:03:46 +0000 Subject: [PATCH 14/25] refactor: generate callback ID from RequestPacket, not client --- TcpDotNet/ClientNode.cs | 26 ++++++++++++-------------- TcpDotNet/Protocol/RequestPacket.cs | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/TcpDotNet/ClientNode.cs b/TcpDotNet/ClientNode.cs index 6ff6b55..7a931b4 100644 --- a/TcpDotNet/ClientNode.cs +++ b/TcpDotNet/ClientNode.cs @@ -15,7 +15,6 @@ namespace TcpDotNet; /// public abstract class ClientNode : Node { - private readonly ObjectIDGenerator _callbackIdGenerator = new(); private readonly ConcurrentDictionary>> _packetCompletionSources = new(); private EndPoint? _remoteEP; @@ -219,25 +218,27 @@ public abstract class ClientNode : Node /// /// Sends a packet, and waits for a specific packet to be received. /// - /// The packet to send. - /// A cancellation token that can be used to cancel the asynchronous operation. + /// The packet to send. + /// + /// A cancellation token that can be used to cancel the asynchronous operation. + /// /// The type of the packet to return. /// The received packet. /// - /// This method will consume all incoming packets, raising their associated handlers if such packets are recognised. + /// This method will consume all incoming packets, raising their associated handlers if such packets are + /// recognised. /// - public async Task SendAndReceiveAsync(Packet packetToSend, + /// is . + public async Task SendAndReceiveAsync(RequestPacket packet, CancellationToken cancellationToken = default) where TReceive : Packet { + if (packet is null) throw new ArgumentNullException(nameof(packet)); + var attribute = typeof(TReceive).GetCustomAttribute(); if (attribute is null) throw new ArgumentException($"The packet type {typeof(TReceive).Name} is not a valid packet."); - var requestPacket = packetToSend as RequestPacket; - if (requestPacket is not null) - requestPacket.CallbackId = _callbackIdGenerator.GetId(packetToSend, out _); - var completionSource = new TaskCompletionSource(); if (!_packetCompletionSources.TryGetValue(attribute.Id, out List>? completionSources)) @@ -252,15 +253,12 @@ public abstract class ClientNode : Node completionSources.Add(completionSource); } - await SendPacketAsync(packetToSend, cancellationToken); + await SendPacketAsync(packet, cancellationToken); TReceive response; do { response = await WaitForPacketAsync(completionSource, cancellationToken); - if (requestPacket is null) - break; - - if (response is ResponsePacket responsePacket && responsePacket.CallbackId == requestPacket.CallbackId) + if (response is ResponsePacket responsePacket && responsePacket.CallbackId == packet.CallbackId) break; } while (true); diff --git a/TcpDotNet/Protocol/RequestPacket.cs b/TcpDotNet/Protocol/RequestPacket.cs index f1ebe51..21037d9 100644 --- a/TcpDotNet/Protocol/RequestPacket.cs +++ b/TcpDotNet/Protocol/RequestPacket.cs @@ -1,3 +1,6 @@ +using System.Buffers.Binary; +using System.Security.Cryptography; + namespace TcpDotNet.Protocol; /// @@ -5,11 +8,21 @@ namespace TcpDotNet.Protocol; /// public abstract class RequestPacket : Packet { + /// + /// Initializes a new instance of the class. + /// + protected RequestPacket() + { + Span buffer = stackalloc byte[8]; + RandomNumberGenerator.Fill(buffer); + CallbackId = BinaryPrimitives.ReadInt64BigEndian(buffer); + } + /// /// Gets the request identifier. /// /// The request identifier. - public long CallbackId { get; internal set; } + public long CallbackId { get; private set; } /// protected internal override void Deserialize(ProtocolReader reader) From 4f846180aa8b3accc34a66ce886069ed74c1430f Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 18:06:46 +0000 Subject: [PATCH 15/25] [ci skip] chore: add ko_fi funding link to repo --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 835b96d..86dc0fe 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ +ko_fi: oliverbooth custom: ['https://buymeacoffee.com/oliverbooth'] From 94f8886a64eebdf018af9a23dfdff1335c0eb5b8 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 18:10:02 +0000 Subject: [PATCH 16/25] chore!: remove netstandard2.1 target --- README.md | 2 +- TcpDotNet/TcpDotNet.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 264e42d..339255f 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@

### About -TcpDotNet is a .NET Standard 2.1 package that enables you to perform server/client communications over the TCP protocol. +TcpDotNet is a .NET package that enables you to perform server/client communications over the TCP protocol. This package is a work-in-progress and not deemed ready for production use. However, it is available on NuGet as a very crude and early development build. This package will be maintained as I see fit. *(I'm also [dogfooding](https://www.pcmag.com/encyclopedia/term/dogfooding) this library, so there's that.)* diff --git a/TcpDotNet/TcpDotNet.csproj b/TcpDotNet/TcpDotNet.csproj index aa54b53..13471c9 100644 --- a/TcpDotNet/TcpDotNet.csproj +++ b/TcpDotNet/TcpDotNet.csproj @@ -1,7 +1,7 @@ - netstandard2.1;net6.0;net7.0;net8.0 + net6.0;net7.0;net8.0 enable enable 10 From 3aebd26460a5a735f11284dbc05b9d413dd0b4c9 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 19:13:22 +0000 Subject: [PATCH 17/25] [ci skip] docs: bump version in readme to 1.0.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 339255f..da8bb22 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This package is a work-in-progress and not deemed ready for production use. Howe ## Installation ### NuGet installation ```ps -Install-Package TcpDotNet -Version 0.1.0-nightly.1 +Install-Package TcpDotNet -Version 1.0.0 ``` ### Manual installation From 0a9348fd66fb675e6870e10327df5409ed1c1833 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 19:24:58 +0000 Subject: [PATCH 18/25] feat: add parameterless ctor for reflection --- TcpDotNet/Protocol/ResponsePacket.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TcpDotNet/Protocol/ResponsePacket.cs b/TcpDotNet/Protocol/ResponsePacket.cs index 87a4f8c..f162c92 100644 --- a/TcpDotNet/Protocol/ResponsePacket.cs +++ b/TcpDotNet/Protocol/ResponsePacket.cs @@ -14,6 +14,10 @@ public abstract class ResponsePacket : Packet CallbackId = callbackId; } + internal ResponsePacket() + { + } + /// /// Gets the response identifier. /// From 362c51cd095d61e3d9c25bcb67d4088cca54e1fc Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 19:26:33 +0000 Subject: [PATCH 19/25] refactor!: use completion source for expected response This commit changes the constraint on TReceive making it a breaking change! --- TcpDotNet/ClientNode.cs | 40 ++++--------------- .../ClientBound/HandshakeResponsePacket.cs | 6 ++- 2 files changed, 12 insertions(+), 34 deletions(-) diff --git a/TcpDotNet/ClientNode.cs b/TcpDotNet/ClientNode.cs index 7a931b4..bc8ebd9 100644 --- a/TcpDotNet/ClientNode.cs +++ b/TcpDotNet/ClientNode.cs @@ -2,7 +2,6 @@ using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; using System.Reflection; -using System.Runtime.Serialization; using Chilkat; using TcpDotNet.Protocol; using Stream = System.IO.Stream; @@ -16,6 +15,7 @@ namespace TcpDotNet; public abstract class ClientNode : Node { private readonly ConcurrentDictionary>> _packetCompletionSources = new(); + private readonly ConcurrentDictionary> _callbackCompletionSources = new(); private EndPoint? _remoteEP; /// @@ -231,38 +231,16 @@ public abstract class ClientNode : Node /// is . public async Task SendAndReceiveAsync(RequestPacket packet, CancellationToken cancellationToken = default) - where TReceive : Packet + where TReceive : ResponsePacket { if (packet is null) throw new ArgumentNullException(nameof(packet)); - var attribute = typeof(TReceive).GetCustomAttribute(); - if (attribute is null) - throw new ArgumentException($"The packet type {typeof(TReceive).Name} is not a valid packet."); - - var completionSource = new TaskCompletionSource(); - if (!_packetCompletionSources.TryGetValue(attribute.Id, - out List>? completionSources)) - { - completionSources = new List>(); - _packetCompletionSources.TryAdd(attribute.Id, completionSources); - } - - lock (completionSources) - { - if (!completionSources.Contains(completionSource)) - completionSources.Add(completionSource); - } + var completionSource = new TaskCompletionSource(); + if (!_callbackCompletionSources.TryAdd(packet.CallbackId, completionSource)) + throw new InvalidOperationException("Duplicate packet sent"); await SendPacketAsync(packet, cancellationToken); - TReceive response; - do - { - response = await WaitForPacketAsync(completionSource, cancellationToken); - if (response is ResponsePacket responsePacket && responsePacket.CallbackId == packet.CallbackId) - break; - } while (true); - - return response; + return (TReceive)await completionSource.Task; } /// @@ -281,10 +259,8 @@ public abstract class ClientNode : Node return WaitForPacketAsync(completionSource, cancellationToken); } - private async Task WaitForPacketAsync( - TaskCompletionSource completionSource, - CancellationToken cancellationToken = default - ) + private async Task WaitForPacketAsync(TaskCompletionSource completionSource, + CancellationToken cancellationToken = default) where TPacket : Packet { var attribute = typeof(TPacket).GetCustomAttribute(); diff --git a/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs b/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs index 2e3ecd2..b0eb8e2 100644 --- a/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs +++ b/TcpDotNet/Protocol/Packets/ClientBound/HandshakeResponsePacket.cs @@ -6,14 +6,16 @@ namespace TcpDotNet.Protocol.Packets.ClientBound; /// Represents a packet which responds to a . /// [Packet(0x7FFFFFE1)] -internal sealed class HandshakeResponsePacket : Packet +internal sealed class HandshakeResponsePacket : ResponsePacket { /// /// Initializes a new instance of the class. /// + /// The callback ID. /// The requested protocol version. /// The handshake response. - public HandshakeResponsePacket(int protocolVersion, HandshakeResponse handshakeResponse) + public HandshakeResponsePacket(long callbackId, int protocolVersion, HandshakeResponse handshakeResponse) + : base(callbackId) { ProtocolVersion = protocolVersion; HandshakeResponse = handshakeResponse; From bb734eac96ef5603fb6cebc87a60d5feaa89f3cf Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 19:26:49 +0000 Subject: [PATCH 20/25] feat: pass cancellation token to ConnectAsync --- TcpDotNet/ProtocolClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index f16829e..550368e 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -82,7 +82,7 @@ public sealed class ProtocolClient : ClientNode BaseSocket = new Socket(remoteEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { - await Task.Run(() => BaseSocket.ConnectAsync(remoteEP), cancellationToken); + await Task.Run(() => BaseSocket.ConnectAsync(remoteEP, cancellationToken), cancellationToken); } catch { From 56de55ca40490cb0d177b1e9c0ac9330b990f39b Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 19:28:38 +0000 Subject: [PATCH 21/25] fix: pass callback id to handshake response ctor --- .../PacketHandlers/HandshakeRequestPacketHandler.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs index 78a1861..217f411 100644 --- a/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs +++ b/TcpDotNet/Protocol/PacketHandlers/HandshakeRequestPacketHandler.cs @@ -22,14 +22,14 @@ internal sealed class HandshakeRequestPacketHandler : PacketHandler Date: Mon, 12 Feb 2024 22:48:00 +0000 Subject: [PATCH 22/25] style: add branding graphics --- README.md | 2 +- TcpDotNet.sln | 2 ++ TcpDotNet/TcpDotNet.csproj | 9 +++++++++ branding_Banner.png | Bin 0 -> 20139 bytes branding_Icon.png | Bin 0 -> 7054 bytes 5 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 branding_Banner.png create mode 100644 branding_Icon.png diff --git a/README.md b/README.md index da8bb22..5a5c582 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

TcpDotNet

+

TCP.NET

GitHub Workflow Status GitHub Issues diff --git a/TcpDotNet.sln b/TcpDotNet.sln index 655709f..dd1fca7 100644 --- a/TcpDotNet.sln +++ b/TcpDotNet.sln @@ -11,6 +11,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .gitignore = .gitignore LICENSE.md = LICENSE.md README.md = README.md + branding_Banner.png = branding_Banner.png + branding_Icon.png = branding_Icon.png EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workflows", "Workflows", "{0FAB77D5-AAE4-4722-A5F4-88A239858D65}" diff --git a/TcpDotNet/TcpDotNet.csproj b/TcpDotNet/TcpDotNet.csproj index 13471c9..515cbd5 100644 --- a/TcpDotNet/TcpDotNet.csproj +++ b/TcpDotNet/TcpDotNet.csproj @@ -12,6 +12,7 @@ git A TCP library for .NET with support for AES encryption. LICENSE.md + branding_Icon.png dotnet networking encryption tcp 0.1.0 true @@ -40,10 +41,18 @@ + + True + + True + + True + + diff --git a/branding_Banner.png b/branding_Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..50ae366d7296c4670b2a20c04a947ac612c715b3 GIT binary patch literal 20139 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 literal 0 HcmV?d00001 diff --git a/branding_Icon.png b/branding_Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..781d41153d7f47832f3b1f79032108ba6219fd2d GIT binary patch literal 7054 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 Date: Mon, 12 Feb 2024 22:53:54 +0000 Subject: [PATCH 23/25] perf: remove redundant Task.Run --- TcpDotNet/ProtocolClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index 550368e..b9d362c 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -82,7 +82,7 @@ public sealed class ProtocolClient : ClientNode BaseSocket = new Socket(remoteEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { - await Task.Run(() => BaseSocket.ConnectAsync(remoteEP, cancellationToken), cancellationToken); + await BaseSocket.ConnectAsync(remoteEP, cancellationToken); } catch { From 1485578088f6f2e5d42a331b206103b8ab555680 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 22:55:29 +0000 Subject: [PATCH 24/25] style: remove redundant line break --- TcpDotNet/ProtocolClient.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index b9d362c..42e9a44 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -95,8 +95,7 @@ public sealed class ProtocolClient : ClientNode State = ClientState.Handshaking; var handshakeRequest = new HandshakeRequestPacket(ProtocolVersion); - var handshakeResponse = - await SendAndReceiveAsync(handshakeRequest, cancellationToken); + var handshakeResponse = await SendAndReceiveAsync(handshakeRequest, cancellationToken); if (handshakeResponse.HandshakeResponse != HandshakeResponse.Success) { From 45111aae721f3b593e1e9ff6214e6339e50b39fa Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 12 Feb 2024 22:57:19 +0000 Subject: [PATCH 25/25] [ci skip] style: give exception message a variable to remove concat --- TcpDotNet/ProtocolClient.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TcpDotNet/ProtocolClient.cs b/TcpDotNet/ProtocolClient.cs index 42e9a44..de0bb89 100644 --- a/TcpDotNet/ProtocolClient.cs +++ b/TcpDotNet/ProtocolClient.cs @@ -101,8 +101,9 @@ public sealed class ProtocolClient : ClientNode { Close(); IsConnected = false; - throw new InvalidOperationException("Handshake failed. " + - $"Server responded with {handshakeResponse.HandshakeResponse:D}"); + + var message = $"Handshake failed. Server responded with {handshakeResponse.HandshakeResponse:D}"; + throw new InvalidOperationException(message); } State = ClientState.Encrypting;