Звонки

This commit is contained in:
Халимов Рустам
2026-04-05 23:41:55 +03:00
parent e11240f78f
commit 65d5f5fee9
12 changed files with 400 additions and 228 deletions

View File

@@ -24,6 +24,18 @@ internal sealed class UpdateSettingsCommandHandler : ICommandHandler<UpdateSetti
public async Task<Result<SystemSettingsDto>> Handle(UpdateSettingsCommand request, CancellationToken cancellationToken)
{
// Enforce WebRTC hierarchy
if (!request.Settings.WebRtc.Enabled)
{
request.Settings.WebRtc.EnableVideoCalls = false;
request.Settings.WebRtc.EnableScreenSharing = false;
}
else
{
// Master switch always means standard voice calls are available
request.Settings.WebRtc.EnableVoiceCalls = true;
}
if (request.Settings.Federation.Enabled &&
(string.IsNullOrEmpty(request.Settings.Federation.PrivateKey) ||
string.IsNullOrEmpty(request.Settings.Federation.PublicKey)))

View File

@@ -5,6 +5,7 @@ using MediatR;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
namespace Knot.Modules.WebRtc.Application.WebRtc.Queries;
@@ -16,10 +17,12 @@ public record GetIceServersQuery : IQuery<IceServersResultDto>;
internal sealed class GetIceServersQueryHandler : IQueryHandler<GetIceServersQuery, IceServersResultDto>
{
private readonly ISettingsService _settingsService;
private readonly ILogger<GetIceServersQueryHandler> _logger;
public GetIceServersQueryHandler(ISettingsService settingsService)
public GetIceServersQueryHandler(ISettingsService settingsService, ILogger<GetIceServersQueryHandler> logger)
{
_settingsService = settingsService;
_logger = logger;
}
public async Task<Result<IceServersResultDto>> Handle(GetIceServersQuery request, CancellationToken cancellationToken)
@@ -27,8 +30,12 @@ internal sealed class GetIceServersQueryHandler : IQueryHandler<GetIceServersQue
var settings = await _settingsService.GetSettingsAsync(cancellationToken);
var webrtc = settings.WebRtc;
_logger.LogInformation("WebRTC Config: Enabled={Enabled}, TurnHost={TurnHost}, TurnPort={TurnPort}, HasUser={HasUser}",
webrtc.Enabled, webrtc.TurnHost, webrtc.TurnPort, !string.IsNullOrEmpty(webrtc.TurnUser));
if (!webrtc.Enabled)
{
_logger.LogWarning("WebRTC is disabled in server settings. Returning Failure.");
return Result.Failure<IceServersResultDto>(new Error(
"WebRtc.Disabled",
"WebRTC calls are disabled by the server administrator."));
@@ -48,6 +55,7 @@ internal sealed class GetIceServersQueryHandler : IQueryHandler<GetIceServersQue
// Добавляем TURN (TCP и UDP варианты)
if (!string.IsNullOrEmpty(webrtc.TurnUser))
{
_logger.LogInformation("Creating TURN server entry with user {TurnUser}", webrtc.TurnUser);
iceServers.Add(new IceServerDto(
new[] { turnUrl, $"{turnUrl}?transport=tcp" },
webrtc.TurnUser,
@@ -57,10 +65,12 @@ internal sealed class GetIceServersQueryHandler : IQueryHandler<GetIceServersQue
}
else
{
_logger.LogInformation("Using public Google STUN fallback because TurnHost is not configured.");
// Если своего сервера нет, используем публичный Google STUN как fallback
iceServers.Add(new IceServerDto(new[] { "stun:stun.l.google.com:19302" }));
}
_logger.LogInformation("WebRTC: successfully gathered {Count} ICE servers", iceServers.Count);
return Result.Success(new IceServersResultDto(iceServers));
}
}