2023-11-17 17:12:41 +01:00
|
|
|
|
using Insight.Domain.Interfaces;
|
|
|
|
|
|
using Insight.Domain.Network;
|
|
|
|
|
|
using Insight.Domain.Network.Remote.Messages;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
using Vaitr.Bus;
|
|
|
|
|
|
using Vaitr.Network;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Insight.Server.Network.Remote.Handlers;
|
|
|
|
|
|
|
2023-12-18 16:31:00 +01:00
|
|
|
|
public class RemoteHandler(Bus bus, ISessionPool<RemoteSession, IMessage> remotePool, ILogger<RemoteHandler> logger) : IMessageHandler<RemoteSession>
|
2023-11-17 17:12:41 +01:00
|
|
|
|
{
|
2023-12-18 16:31:00 +01:00
|
|
|
|
private readonly Bus _bus = bus;
|
|
|
|
|
|
private readonly ISessionPool<RemoteSession, IMessage> _remotePool = remotePool;
|
|
|
|
|
|
private readonly ILogger<RemoteHandler> _logger = logger;
|
2023-11-17 17:12:41 +01:00
|
|
|
|
|
|
|
|
|
|
public async ValueTask HandleAsync<TMessage>(RemoteSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
|
|
|
|
|
|
{
|
|
|
|
|
|
if (message is RemoteSessionRequest sessionRequest)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnSessionRequest(sender, sessionRequest, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (message is CastRequestResponse castRequestResponse)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnCastRequestResponse(sender, castRequestResponse, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (message is CastMetric metricData)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnMetricData(sender, metricData, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (message is CastScreen screenData)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnScreenData(sender, screenData, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (message is CastCursor cursorData)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnCursorData(sender, cursorData, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (message is CastClipboardReceived clipboardData)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnClipboardData(sender, clipboardData, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (message is CastAudio audioData)
|
|
|
|
|
|
{
|
|
|
|
|
|
await OnAudioData(sender, audioData, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnSessionRequest(RemoteSession session, RemoteSessionRequest sessionRequest, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
2023-12-18 16:31:00 +01:00
|
|
|
|
_logger.LogInformation("Remote {session} => SessionRequest", session.Id);
|
2023-11-17 17:12:41 +01:00
|
|
|
|
|
|
|
|
|
|
session.Mode = sessionRequest.Mode;
|
|
|
|
|
|
|
|
|
|
|
|
await session.SendAsync(new RemoteSessionResponse
|
|
|
|
|
|
{
|
|
|
|
|
|
SessionId = session.Id
|
|
|
|
|
|
}, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnCastRequestResponse(RemoteSession session, CastRequestResponse castRequestResponse, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
|
|
|
|
|
await _bus.PublishAsync(castRequestResponse, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnMetricData(RemoteSession session, CastMetric streamMetrics, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
|
|
|
|
|
//_logger.LogInformation($"Remote {session.Id} => MetricData");
|
|
|
|
|
|
|
|
|
|
|
|
await _bus.PublishAsync(streamMetrics, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnScreenData(RemoteSession session, CastScreen screenData, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
|
|
|
|
|
//_logger.LogInformation($"Remote {session.Id} => ScreenData");
|
|
|
|
|
|
|
|
|
|
|
|
await _bus.PublishAsync(screenData, cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
await session.SendAsync(new CastScreenReceived
|
|
|
|
|
|
{
|
|
|
|
|
|
Timestamp = screenData.Timestamp
|
|
|
|
|
|
}, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnCursorData(RemoteSession session, CastCursor cursorChanged, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
|
|
|
|
|
//_logger.LogInformation($"Remote {session.Id} => CursorData");
|
|
|
|
|
|
|
|
|
|
|
|
await _bus.PublishAsync(cursorChanged, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnClipboardData(RemoteSession session, CastClipboardReceived clipboardChanged, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
2023-12-18 16:31:00 +01:00
|
|
|
|
_logger.LogInformation("Remote {session} => ClipboardData", session.Id);
|
2023-11-17 17:12:41 +01:00
|
|
|
|
|
|
|
|
|
|
await _bus.PublishAsync(clipboardChanged, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task OnAudioData(RemoteSession session, CastAudio audioSample, CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
2023-12-18 16:31:00 +01:00
|
|
|
|
_logger.LogInformation("Remote {session} => AudioData", session.Id);
|
2023-11-17 17:12:41 +01:00
|
|
|
|
|
|
|
|
|
|
await _bus.PublishAsync(audioSample, cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|