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);
}
}
}