From a07262e690a81a116396fa578b153645717fd606 Mon Sep 17 00:00:00 2001 From: lumanskiy Date: Mon, 6 Dec 2021 20:57:58 -0800 Subject: [PATCH] Custom connection request data now propagates to IServerPeer.ConnectionRequestData. Added documentation --- README.md | 42 +++++++-------- docs/Connection.md | 14 ++++- docs/DocumentationIndex.md | 1 + docs/PeerObject.md | 25 ++++++++- docs/images/ConnectionFlows.png | Bin 0 -> 32561 bytes docs/images/FenrirLogo.png | Bin 0 -> 22041 bytes docs/images/FenrirLogo512.png | Bin 10679 -> 0 bytes docs/images/RequestResponseEvent.png | Bin 36857 -> 38065 bytes docs/images/ServerRooms.png | Bin 24650 -> 39583 bytes .../Integration/IntegrationTests.cs | 48 ++++++++++++++++-- .../LiteNet/LiteNetProtocolConnector.cs | 1 + .../LiteNet/LiteNetProtocolListener.cs | 14 ++--- .../Runtime/LiteNet/LiteNetServerPeer.cs | 10 +++- .../Network/ConnectionHandlerResult.cs | 37 ++++++++++++++ .../Network/ConnectionHandlerResult.cs.meta | 11 ++++ .../Assets/Runtime/Network/IServerPeer.cs | 9 +++- .../Assets/Runtime/Server/INetworkServer.cs | 23 ++++++--- .../Runtime/Server/IServerEventListener.cs | 2 +- .../Assets/Runtime/Server/NetworkServer.cs | 35 +++++++++---- 19 files changed, 219 insertions(+), 53 deletions(-) create mode 100644 docs/images/ConnectionFlows.png create mode 100644 docs/images/FenrirLogo.png delete mode 100644 docs/images/FenrirLogo512.png create mode 100644 source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs create mode 100644 source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs.meta diff --git a/README.md b/README.md index 9d4aee0..1737375 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Fenrir Multiplayer](/docs/images/FenrirLogo512.png) +![Fenrir Multiplayer](/docs/images/FenrirLogo.png) # Fenrir Multiplayer SDK @@ -22,22 +22,26 @@ Fenrir provides a great balance between performance and ease of development and **Table of Contents**: -- [Installation](/docs/Installation.md) -- [Quick Start](/docs/QuickStart.md) -- [Networking](/docs/NetworkingBasics.md) - - [Connection](/docs/Connection.md) - - [Peer Object](/docs/PeerObject.md) - - [Reliability](/docs/Reliability.md) -- [Serialization](/docs/Serialization.md) - - [Custom Type Serialization](/docs/CustomTypeSerialization.md) - - [Custom Serializer](/docs/CustomSerializer.md) -- [Room Management](/docs/RoomManagementBasics.md) -- [Logging](/docs/Logging.md) -- [Docker Setup](/docs/DockerBasics.md) -- [Thread Safety](/docs/ThreadSafety.md) -- [Client and Server Lifecycle](/docs/Lifecycle.md) - -# Installation +- [Documentation Home](DocumentationIndex.md) +- [Installation](Installation.md) +- [Quick Start](QuickStart.md) +- [Networking](NetworkingBasics.md) + - [Connection](Connection.md) + - [Peer Object](PeerObject.md) + - [Reliability](Reliability.md) +- [Serialization](Serialization.md) + - [Custom Type Serialization](CustomTypeSerialization.md) + - [Custom Serializer](CustomSerializer.md) +- [Room Management](RoomManagementBasics.md) +- [Logging](Logging.md) +- [Docker Setup](DockerBasics.md) +- [Thread Safety](ThreadSafety.md) +- [Client and Server Lifecycle](Lifecycle.md) +- [FAQ](FAQ.md) + +# Quick Start + +## Installing Unity Package This package can be installed using Unity Package from `https://upm.fenrirserver.org` registry. @@ -46,9 +50,7 @@ This package can be installed using Unity Package from `https://upm.fenrirserver 1. In Unity, open **Edit** → **Project Settings** → **Package Manager** and add a **Scoped Registry** using URL: `https://upm.fenrirserver.org` 2. Open **Window** → **Package Manager** and switch to **Packages: My Registries**. Select **Fenrir Multiplayer** and click **Install** -# Quick Start - -## Server Project +## Generating Server Project Fenrir Multiplayer Unity Package comes with a server template that is recommended (but is not strictly required) to use. diff --git a/docs/Connection.md b/docs/Connection.md index 6f026e3..b2229c9 100644 --- a/docs/Connection.md +++ b/docs/Connection.md @@ -20,7 +20,7 @@ Server Info endpoint is very useful for local testing and connecting to any spec In production setups, very often the Server Info will be provided by the matchmaking server. In that case, TCP port does not need to be exposed. -** TODO: Endpoint vs UDP infographic ** +![Connection Flows](images/ConnectionFlows.png) **Example connecting via http endpoint**: @@ -142,5 +142,17 @@ using var networkClient = new NetworkClient(); var connectionResponse = await networkClient.Connect("http://127.0.0.1:27016", connectionRequest); ``` +Once the peer is connected, you can also access connection request data using `IServerPeer.ConnectionRequestData` object, througuout the Peer lifecycle. +For example, you can access it in `PeerConnected` event or any of your Request Handlers. + +```csharp +networkServer.PeerConnected += (sender, e) => +{ + IServerPeer peer = e.Peer; + var requestData = (MyConnectionRequestData)peer.ConnectionRequestData; + Console.WriteLine("Player connected, name = " + requestData.Name); +}; +``` + Next Section: [Peer Object](PeerObject.md) Table of Contents: [Documentation Home](DocumentationIndex.md) diff --git a/docs/DocumentationIndex.md b/docs/DocumentationIndex.md index 95d4b39..432537b 100644 --- a/docs/DocumentationIndex.md +++ b/docs/DocumentationIndex.md @@ -2,6 +2,7 @@ This section contains Table of Contents for the Fenrir Multiplayer SDK documentation. +- [Documentation Home](DocumentationIndex.md) - [Installation](Installation.md) - [Quick Start](QuickStart.md) - [Networking](NetworkingBasics.md) diff --git a/docs/PeerObject.md b/docs/PeerObject.md index ecfb6ad..148eaa8 100644 --- a/docs/PeerObject.md +++ b/docs/PeerObject.md @@ -14,7 +14,30 @@ Previous Section: [Connection](Connection.md) ## Identifying Server Peer -There are two main ways of uniquely identifying each Peer. +There are several ways of uniquely identifying each Peer. + +## Connection Request Data + +If you set up a custom Connection Request Handler, you can validate custom Connection Request Data object and access it later using `IServerPeer.ConnectionRequestData` property: + +```csharp +// Use with NetworkServer.SetConnectionRequestHandler<> +class MyConnectionRequestData +{ + public string Name; + + ... +} + +... + +void HandleRequest(PlayerMoveRequest request, IServerPeer peer) +{ + string name = peer.ConnectionRequestData.Name; +} +``` + +See also: [Using Custom Connection Request Handler](Connection.md#custom-connection-request) ## Server Peer Data diff --git a/docs/images/ConnectionFlows.png b/docs/images/ConnectionFlows.png new file mode 100644 index 0000000000000000000000000000000000000000..8507d2089dd0193cd8aa1e3ffaabf8381745beb1 GIT binary patch literal 32561 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 Lr38xkzIpv$xAwox literal 0 HcmV?d00001 diff --git a/docs/images/FenrirLogo.png b/docs/images/FenrirLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c828c6af6c6caf496190c368d8d9eaa1d00ae1 GIT binary patch literal 22041 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 diff --git a/docs/images/RequestResponseEvent.png b/docs/images/RequestResponseEvent.png index d1f1f1f0e6a6647504ebe5a97d81a5b136ebbbcb..93f073a49a9f84203570160538463b69077c4c1f 100644 GIT binary patch delta 22057 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 UlvfvX90echsy9>$l+1$u0dCL4W&i*H delta 20939 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 Jmlzz4`5ibZMh5@@ diff --git a/docs/images/ServerRooms.png b/docs/images/ServerRooms.png index 835f629653b3df802406230b38f8b860c74ed0de..64ffd10e7efc2d994f6c2a3e0488642ffcfac3fd 100644 GIT binary patch literal 39583 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 literal 24650 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 peerConnectionRequestDataTcs = new TaskCompletionSource(); + using var logger = new TestLogger(); using var networkServer = new NetworkServer(logger); + networkServer.PeerConnected += (sender, e) => + { + var requestData = (CustomConnectionRequestData)e.Peer.ConnectionRequestData; + peerConnectionRequestDataTcs.SetResult(requestData); + }; TaskCompletionSource connectionRequestTcs = new TaskCompletionSource(); networkServer.SetConnectionRequestHandler(connectionRequest => + { + Assert.AreEqual("test", connectionRequest.Data.Token); + connectionRequestTcs.SetResult(true); + return new ConnectionResponse(true); + }); + networkServer.Start(); + + Assert.AreEqual(ServerStatus.Running, networkServer.Status, "server is not running"); + + using var networkClient = new NetworkClient(logger); + var connectionResponse = await networkClient.Connect("http://127.0.0.1:27016", new CustomConnectionRequestData() { Token = "test" }); + + Assert.AreEqual(ConnectionState.Connected, networkClient.State, "client is not connected"); + Assert.IsTrue(connectionResponse.Success, "connection rejected"); + + await connectionRequestTcs.Task; + + CustomConnectionRequestData peerConnectionRequestData = await peerConnectionRequestDataTcs.Task; + + Assert.IsNotNull(peerConnectionRequestData); + Assert.AreEqual("test", peerConnectionRequestData.Token); + } + + [TestMethod, Timeout(TestTimeout)] + public async Task NetworkClient_ConnectsToNetworkServer_WithCustomConnectionRequestHandlerAsync() + { + using var logger = new TestLogger(); + using var networkServer = new NetworkServer(logger); + + TaskCompletionSource connectionRequestTcs = new TaskCompletionSource(); + networkServer.SetConnectionRequestHandlerAsync(connectionRequest => { Assert.AreEqual("test", connectionRequest.Data.Token); connectionRequestTcs.SetResult(true); @@ -154,12 +192,12 @@ public async Task NetworkClient_ConnectsToNetworkServer_WithCustomConnectionRequ } [TestMethod, Timeout(TestTimeout)] - public async Task NetworkClient_FailsToConnectToNetworkServer_WhenCustomConnectionRequestHandlerRejects() + public async Task NetworkClient_FailsToConnectToNetworkServer_WhenCustomConnectionRequestHandlerAsyncRejects() { using var logger = new TestLogger(); using var networkServer = new NetworkServer(logger); - networkServer.SetConnectionRequestHandler(connectionRequest => + networkServer.SetConnectionRequestHandlerAsync(connectionRequest => { Assert.AreEqual("test", connectionRequest.Data.Token); return Task.FromResult(new ConnectionResponse(false, "test_reason")); @@ -179,13 +217,13 @@ public async Task NetworkClient_FailsToConnectToNetworkServer_WhenCustomConnecti [TestMethod, Timeout(TestTimeout)] - public async Task NetworkClient_FailsToConnectToNetworkServer_WhenCustomConnectionRequestHandlerThrowsException() + public async Task NetworkClient_FailsToConnectToNetworkServer_WhenCustomConnectionRequestHandlerAsyncThrowsException() { using var logger = new TestLogger(); using var networkServer = new NetworkServer(logger); - networkServer.SetConnectionRequestHandler(connectionRequest => + networkServer.SetConnectionRequestHandlerAsync(connectionRequest => { throw new InvalidOperationException("test_exception"); }); @@ -209,7 +247,7 @@ public async Task NetworkClient_FailsToConnectToNetworkServer_WhenRequestDataSer using var networkServer = new NetworkServer(logger); - networkServer.SetConnectionRequestHandler(connectionRequest => + networkServer.SetConnectionRequestHandlerAsync(connectionRequest => { return Task.FromResult(ConnectionResponse.Successful); }); diff --git a/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolConnector.cs b/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolConnector.cs index 82a7fe3..e4b7bc4 100644 --- a/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolConnector.cs +++ b/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolConnector.cs @@ -211,6 +211,7 @@ public int SimulationMaxLatency /// /// Creates /// + /// Client event listener /// Serializer /// Type Hash Map /// Logger diff --git a/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolListener.cs b/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolListener.cs index 1918bda..a893e91 100644 --- a/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolListener.cs +++ b/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetProtocolListener.cs @@ -280,10 +280,10 @@ private async Task HandleConnectionRequestAsync(ConnectionRequest connectionRequ } // Invoke connection request handler - ConnectionResponse response; + ConnectionHandlerResult connectionHandlerResult; try { - response = await _serverEventListener.HandleConnectionRequest(protocolVersion, clientId, connectionRequest.RemoteEndPoint, connectionRequestDataReader); + connectionHandlerResult = await _serverEventListener.HandleConnectionRequest(protocolVersion, clientId, connectionRequest.RemoteEndPoint, connectionRequestDataReader); } finally { @@ -293,17 +293,17 @@ private async Task HandleConnectionRequestAsync(ConnectionRequest connectionRequ } } - if(response.Success) + if(connectionHandlerResult.Response.Success) { - AcceptConnectionRequest(connectionRequest, protocolVersion, clientId); + AcceptConnectionRequest(connectionRequest, protocolVersion, clientId, connectionHandlerResult.ConnectionRequestData); } else { - RejectConnectionRequest(connectionRequest, response.Reason); + RejectConnectionRequest(connectionRequest, connectionHandlerResult.Response.Reason); } } - private void AcceptConnectionRequest(ConnectionRequest liteNetConnectionRequest, int protocolVersion, string clientId) + private void AcceptConnectionRequest(ConnectionRequest liteNetConnectionRequest, int protocolVersion, string clientId, object connectionRequestData) { _logger.Trace("Accepting connection request from {0}", liteNetConnectionRequest.RemoteEndPoint); @@ -311,7 +311,7 @@ private void AcceptConnectionRequest(ConnectionRequest liteNetConnectionRequest, // Create server peer var messageWriter = new MessageWriter(_serializer, _typeHashMap, _logger); - netPeer.Tag = new LiteNetServerPeer(clientId, protocolVersion, netPeer, messageWriter, _byteStreamWriterPool); + netPeer.Tag = new LiteNetServerPeer(clientId, protocolVersion, connectionRequestData, netPeer, messageWriter, _byteStreamWriterPool); } private void RejectConnectionRequest(ConnectionRequest connectionRequest, string reason) diff --git a/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetServerPeer.cs b/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetServerPeer.cs index f1849d5..099beb4 100644 --- a/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetServerPeer.cs +++ b/source/UnityPackage/Assets/Runtime/LiteNet/LiteNetServerPeer.cs @@ -32,18 +32,26 @@ class LiteNetServerPeer : LiteNetBasePeer, IServerPeer /// public object PeerData { get; set; } + /// + /// Connection request data + /// + public object ConnectionRequestData { get; set; } + + /// /// Default constructor /// /// Unique id of the client /// Peer protocol version + /// Custom connection request data. If no Connection Request Handler is set, always null /// LiteNet NetPeer /// Message Writer /// Byte Stream Writer Object Pool - public LiteNetServerPeer(string peerId, int protocolVersion, NetPeer netPeer, MessageWriter messageWriter, RecyclableObjectPool byteStreamWriterPool) + public LiteNetServerPeer(string peerId, int protocolVersion, object connectionRequestData, NetPeer netPeer, MessageWriter messageWriter, RecyclableObjectPool byteStreamWriterPool) : base(peerId, netPeer, messageWriter, byteStreamWriterPool) { ProtocolVersion = protocolVersion; + ConnectionRequestData = connectionRequestData; } /// diff --git a/source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs b/source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs new file mode 100644 index 0000000..59bd63d --- /dev/null +++ b/source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs @@ -0,0 +1,37 @@ +namespace Fenrir.Multiplayer.Network +{ + /// + /// Internal class to pass the result of user connection + /// + class ConnectionHandlerResult + { + /// + /// Connection response + /// + public ConnectionResponse Response { get; set; } + + /// + /// Custom connection request data. + /// If no custom connection request handler is set, always null + /// + public object ConnectionRequestData { get; set; } + + /// + /// Creates empty connection handler result + /// + public ConnectionHandlerResult() + { + } + + /// + /// Default constructor + /// + /// Connection Response + /// Connection Request Data + public ConnectionHandlerResult(ConnectionResponse response, object connectionRequestData) + { + Response = response; + ConnectionRequestData = connectionRequestData; + } + } +} diff --git a/source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs.meta b/source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs.meta new file mode 100644 index 0000000..5e63882 --- /dev/null +++ b/source/UnityPackage/Assets/Runtime/Network/ConnectionHandlerResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 04f289099ba85604297a72d27f51d3dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/source/UnityPackage/Assets/Runtime/Network/IServerPeer.cs b/source/UnityPackage/Assets/Runtime/Network/IServerPeer.cs index 56b9166..d7e3776 100644 --- a/source/UnityPackage/Assets/Runtime/Network/IServerPeer.cs +++ b/source/UnityPackage/Assets/Runtime/Network/IServerPeer.cs @@ -1,4 +1,5 @@ -using Fenrir.Multiplayer.Server.Events; +using Fenrir.Multiplayer.Server; +using Fenrir.Multiplayer.Server.Events; using System; namespace Fenrir.Multiplayer.Network @@ -23,6 +24,12 @@ public interface IServerPeer : IPeer /// object PeerData { get; set; } + /// + /// Custom connection request data. + /// Set only if custom Connection Request Handler is set on the . + /// + object ConnectionRequestData { get; } + /// /// Notifies client of the event. /// All events are encrypted by default. diff --git a/source/UnityPackage/Assets/Runtime/Server/INetworkServer.cs b/source/UnityPackage/Assets/Runtime/Server/INetworkServer.cs index 83b3564..4911478 100644 --- a/source/UnityPackage/Assets/Runtime/Server/INetworkServer.cs +++ b/source/UnityPackage/Assets/Runtime/Server/INetworkServer.cs @@ -1,5 +1,4 @@ -using Fenrir.Multiplayer.Logging; -using Fenrir.Multiplayer.Network; +using Fenrir.Multiplayer.Network; using Fenrir.Multiplayer.Serialization; using Fenrir.Multiplayer.Server.Events; using System; @@ -28,15 +27,25 @@ public interface INetworkServer : IServerInfoProvider, IDisposable event EventHandler PeerDisconnected; /// - /// Sets custom connection request handler on all installed protocols + /// Sets custom connection request handler. + /// Connection request handler allows to validate players before they are connected. /// /// Type of connection request /// Connection request handler - void SetConnectionRequestHandler(Func, Task> handler) + void SetConnectionRequestHandler(Func, ConnectionResponse> handler) where TConnectionRequestData : class, new(); /// - /// Adds request handler of a given request type, to all installed protocols + /// Sets custom asynchronous connection request handler. + /// Connection request handler allows to validate players before they are connected. + /// + /// Type of connection request + /// Asynchronous connection request handler + void SetConnectionRequestHandlerAsync(Func, Task> handler) + where TConnectionRequestData : class, new(); + + /// + /// Adds request handler of a given request type /// /// Type of request /// Request handler @@ -44,7 +53,7 @@ void AddRequestHandler(IRequestHandler requestHandler) where TRequest : IRequest; /// - /// Adds request handler for a given request and response type, to all installed protocols + /// Adds request handler for a given request and response type /// /// Type of request /// Type of response @@ -54,7 +63,7 @@ void AddRequestHandler(IRequestHandler where TResponse : IResponse; /// - /// Adds asynchronous request handler for a given request and response type, to all installed protocols + /// Adds asynchronous request handler for a given request and response type /// /// Type of request /// Type of response diff --git a/source/UnityPackage/Assets/Runtime/Server/IServerEventListener.cs b/source/UnityPackage/Assets/Runtime/Server/IServerEventListener.cs index 9b2ca80..ac1ebd9 100644 --- a/source/UnityPackage/Assets/Runtime/Server/IServerEventListener.cs +++ b/source/UnityPackage/Assets/Runtime/Server/IServerEventListener.cs @@ -8,7 +8,7 @@ namespace Fenrir.Multiplayer.Server { interface IServerEventListener { - Task HandleConnectionRequest(int protocolVersion, string clientId, IPEndPoint endPoint, IByteStreamReader connectionDataReader); + Task HandleConnectionRequest(int protocolVersion, string clientId, IPEndPoint endPoint, IByteStreamReader connectionDataReader); void OnReceiveRequest(IServerPeer serverPeer, MessageWrapper messageWrapper); diff --git a/source/UnityPackage/Assets/Runtime/Server/NetworkServer.cs b/source/UnityPackage/Assets/Runtime/Server/NetworkServer.cs index 7d1b6b2..5976ea9 100644 --- a/source/UnityPackage/Assets/Runtime/Server/NetworkServer.cs +++ b/source/UnityPackage/Assets/Runtime/Server/NetworkServer.cs @@ -32,8 +32,8 @@ public class NetworkServer : INetworkServer, IServerEventListener /// Unique ID of the client /// Remote IP /// Custom connection data - /// - private delegate Task ConnectionRequestHandler(int protocolVersion, string clientId, IPEndPoint remoteEndPoint, IByteStreamReader connectionRequestDataReader); + /// Connection Handler Result object that contains response and additional data + private delegate Task ConnectionRequestHandler(int protocolVersion, string clientId, IPEndPoint remoteEndPoint, IByteStreamReader connectionRequestDataReader); /// /// Type hash map @@ -218,7 +218,14 @@ private void SetStatus(ServerStatus status) } /// - public void SetConnectionRequestHandler(Func, Task> handler) + public void SetConnectionRequestHandler(Func, ConnectionResponse> handler) + where TConnectionRequestData : class, new() + { + SetConnectionRequestHandlerAsync((connectionRequestData) => Task.FromResult(handler(connectionRequestData))); + } + + /// + public void SetConnectionRequestHandlerAsync(Func, Task> handler) where TConnectionRequestData : class, new() { if(handler == null) @@ -235,6 +242,9 @@ public void SetConnectionRequestHandler(Func { + // Result + ConnectionHandlerResult result = new ConnectionHandlerResult(); + // If custom connection request data is present, deserialize if (connectionDataReader != null && !connectionDataReader.EndOfData) { @@ -245,7 +255,8 @@ public void SetConnectionRequestHandler(Func(Func IServerEventListener.HandleConnectionRequest(int protocolVersion, string clientId, IPEndPoint endPoint, IByteStreamReader connectionDataReader) + async Task IServerEventListener.HandleConnectionRequest(int protocolVersion, string clientId, IPEndPoint endPoint, IByteStreamReader connectionDataReader) { if(_connectionRequestHandler != null) { @@ -383,7 +400,7 @@ async Task IServerEventListener.HandleConnectionRequest(int else { // No custom request handler - return ConnectionResponse.Successful; + return new ConnectionHandlerResult(ConnectionResponse.Successful, null); } }