using Ananta.SDK.Logging; using Ananta.SDK.Network; using Ananta.SDK.Serialization; namespace Ananta.SDK.Rpc; /// /// Small handler-facing wrapper around TcpSession. Prefer typed Return/Notify overloads; /// Raw methods exist only for packets whose contract has not been described yet. /// public sealed class Connection { private readonly TcpSession _session; private readonly CancellationToken _token; internal Connection(TcpSession session, CancellationToken token) { _session = session; _token = token; } public ServerLogger Log => _session.Log; public TcpSession Session => _session; public Task ReturnEmptyOkAsync(UxRpcMessage request) => ReturnEmptyAsync(request); public Task ReturnEmptyAsync(UxRpcMessage request, int error = 0) => request.IsInvoke ? _session.ReturnAsync(request.MethodId, request.InvokeId, error, Array.Empty(), _token) : Task.CompletedTask; public Task ReturnAsync(UxRpcMessage request, T body, int error = 0) { if (!request.IsInvoke) return Task.CompletedTask; var bytes = UxSerializer.Serialize(body); var send = _session.ReturnAsync(request.MethodId, request.InvokeId, error, bytes, _token); RuntimeLogs.Decoded(_session.Log.Scope, "S2C", request.MethodId, typeof(T), body); return send; } public Task ReturnRawAsync(UxRpcMessage request, byte[] body, int error = 0) => request.IsInvoke ? _session.ReturnAsync(request.MethodId, request.InvokeId, error, body, _token) : Task.CompletedTask; public Task NotifyAsync(uint methodId, T body) { var bytes = UxSerializer.Serialize(body); var send = _session.NotifyAsync(methodId, bytes, _token); RuntimeLogs.Decoded(_session.Log.Scope, "S2C", methodId, typeof(T), body); return send; } public Task NotifyRawAsync(uint methodId, byte[] body) => _session.NotifyAsync(methodId, body, _token); }