Звонки
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user