2023-09-08 22:26:28 -05:00
|
|
|
|
using IPXRelayDotNet;
|
2024-10-07 18:04:26 -05:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2023-09-08 22:26:28 -05:00
|
|
|
|
|
2024-08-04 18:44:33 -05:00
|
|
|
|
namespace LANCommander.Server.Services
|
2023-09-08 22:26:28 -05:00
|
|
|
|
{
|
|
|
|
|
|
public class IPXRelayService : BaseService
|
|
|
|
|
|
{
|
2025-03-07 01:03:14 -06:00
|
|
|
|
private CancellationTokenSource? _relayCts;
|
|
|
|
|
|
private Task? _relayTask;
|
|
|
|
|
|
private IPXRelay? _relay;
|
2023-09-08 22:26:28 -05:00
|
|
|
|
|
2025-11-16 12:31:25 -06:00
|
|
|
|
public IPXRelayService(ILogger<IPXRelayService> logger, SettingsProvider<Settings.Settings> settingsProvider) : base(logger, settingsProvider)
|
2023-09-08 22:26:28 -05:00
|
|
|
|
{
|
2025-03-09 01:51:17 -06:00
|
|
|
|
Init(logger);
|
2023-09-08 22:26:28 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-09 01:51:17 -06:00
|
|
|
|
public void Init(ILogger logger)
|
2023-09-08 22:26:28 -05:00
|
|
|
|
{
|
2025-03-07 01:03:14 -06:00
|
|
|
|
StopAsync().Wait();
|
2023-09-08 22:26:28 -05:00
|
|
|
|
|
2025-11-16 12:31:25 -06:00
|
|
|
|
_relay = new IPXRelay(_settingsProvider.CurrentValue.Server.IPXRelay.Port, logger);
|
2023-09-08 22:26:28 -05:00
|
|
|
|
|
2025-11-16 12:31:25 -06:00
|
|
|
|
if (!_settingsProvider.CurrentValue.Server.IPXRelay.Logging)
|
2025-03-07 01:03:14 -06:00
|
|
|
|
_relay.DisableLogging();
|
|
|
|
|
|
|
2025-11-16 12:31:25 -06:00
|
|
|
|
if (_settingsProvider.CurrentValue.Server.IPXRelay.Enabled)
|
2025-03-07 01:03:14 -06:00
|
|
|
|
{
|
|
|
|
|
|
_relayCts = new CancellationTokenSource();
|
|
|
|
|
|
_relayTask = Task.Run(async () =>
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
await _relay.StartAsync(_relayCts.Token);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (OperationCanceledException)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger.LogError(ex, "Failed to start IPX Relay");
|
|
|
|
|
|
}
|
|
|
|
|
|
}, _relayCts.Token);
|
|
|
|
|
|
}
|
2023-09-08 22:26:28 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-07 01:03:14 -06:00
|
|
|
|
public async Task StopAsync()
|
2023-09-08 22:26:28 -05:00
|
|
|
|
{
|
2025-03-07 01:03:14 -06:00
|
|
|
|
if (_relayCts != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
_relayCts.CancelAsync();
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (OperationCanceledException)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
_relayCts.Dispose();
|
|
|
|
|
|
_relayCts = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-09-08 22:26:28 -05:00
|
|
|
|
|
2025-03-09 14:50:25 -05:00
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
_relay?.Stop();
|
|
|
|
|
|
_relay = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
2023-09-08 22:26:28 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|