using System; namespace GameCult.Networking { /// /// Minimal client port for request/response services that speak CultNet schema-v0 messages. /// public interface ICultNetSchemaClient : IDisposable { /// /// Gets whether the underlying transport reports an established connection. /// bool Connected { get; } /// /// Connects the transport to a remote endpoint. /// void Connect(string host, int port); /// /// Sends one schema-v0 message through the transport. /// void SendCultNet(T message) where T : ICultNetSchemaMessage; /// /// Adds a callback for one schema-v0 response type. /// void OnCultNet(Action callback) where T : ICultNetSchemaMessage; } /// /// LiteNetLib-backed implementation of the CultNet schema client port. /// public sealed class LiteNetLibCultNetSchemaClient : ICultNetSchemaClient { private readonly Client _client; /// /// Creates a LiteNetLib schema client adapter. /// public LiteNetLibCultNetSchemaClient( ClientSecurityOptions? security = null, Action? configureClient = null) { _client = new Client(security ?? ClientSecurityOptions.Development()) { AllowUnverifiedCultNetMessages = true }; configureClient?.Invoke(_client); } /// public bool Connected => _client.Connected; /// public void Connect(string host, int port) { _client.Connect(host, port); } /// public void SendCultNet(T message) where T : ICultNetSchemaMessage { _client.SendCultNet(message); } /// public void OnCultNet(Action callback) where T : ICultNetSchemaMessage { _client.OnCultNet(callback); } /// public void Dispose() { _client.Dispose(); } } /// /// Factory helpers for schema client adapters. /// public static class CultNetSchemaClients { /// /// Creates the default C# LiteNetLib schema client adapter. /// public static ICultNetSchemaClient CreateLiteNetLib( ClientSecurityOptions? security = null, Action? configureClient = null) { return new LiteNetLibCultNetSchemaClient(security, configureClient); } } }