Звонки

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

@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
namespace Knot.Contracts.Settings.Application.DTOs;
@@ -53,6 +53,7 @@ public class MessagesConfig
public class WebRtcConfig
{
public bool Enabled { get; set; } = false;
public bool EnableVoiceCalls { get; set; } = true;
public bool EnableVideoCalls { get; set; } = true;
public bool EnableScreenSharing { get; set; } = true;
public string TurnHost { get; set; } = string.Empty;

View File

@@ -80,6 +80,7 @@ builder.Services.AddStorageModule(builder.Configuration);
builder.Services.AddStoriesModule(builder.Configuration);
builder.Services.AddKlipyModule();
builder.Services.AddAdminModule();
builder.Services.AddWebRtcModule();
builder.Services.AddSharedInfrastructure(builder.Configuration);
// CQRS / MediatR для команд в Host (например, AdminController)
@@ -91,7 +92,8 @@ builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(
typeof(Knot.Modules.Conversations.DependencyInjection).Assembly,
typeof(Knot.Modules.Stories.DependencyInjection).Assembly,
typeof(Knot.Modules.Klipy.DependencyInjection).Assembly,
typeof(Knot.Modules.Relations.DependencyInjection).Assembly
typeof(Knot.Modules.Relations.DependencyInjection).Assembly,
typeof(Knot.Modules.WebRtc.DependencyInjection).Assembly
));
// Настройка CORS

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