-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathCloudSessionConnectionService.cs
More file actions
122 lines (104 loc) · 5.21 KB
/
CloudSessionConnectionService.cs
File metadata and controls
122 lines (104 loc) · 5.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System.Reactive.Linq;
using System.Security.Cryptography;
using System.Threading;
using ByteSync.Business.Sessions;
using ByteSync.Business.Sessions.Connecting;
using ByteSync.Common.Business.Sessions.Cloud.Connections;
using ByteSync.Interfaces.Controls.Communications;
using ByteSync.Interfaces.Controls.Synchronizations;
using ByteSync.Interfaces.Repositories;
using ByteSync.Interfaces.Services.Sessions;
using ByteSync.Interfaces.Services.Sessions.Connecting;
namespace ByteSync.Services.Sessions.Connecting;
class CloudSessionConnectionService : ICloudSessionConnectionService
{
private readonly ICloudSessionConnectionRepository _cloudSessionConnectionRepository;
private readonly IDigitalSignaturesRepository _digitalSignaturesRepository;
private readonly ITrustProcessPublicKeysRepository _trustProcessPublicKeysRepository;
private readonly ISessionService _sessionService;
private readonly ISynchronizationService _synchronizationService;
private readonly ILogger<CloudSessionConnectionService> _logger;
public CloudSessionConnectionService(ICloudSessionConnectionRepository cloudSessionConnectionRepository,
IDigitalSignaturesRepository digitalSignaturesRepository, ITrustProcessPublicKeysRepository trustPublicKeysRepository,
ISessionService sessionService, ISynchronizationService synchronizationService, ILogger<CloudSessionConnectionService> logger)
{
_cloudSessionConnectionRepository = cloudSessionConnectionRepository;
_digitalSignaturesRepository = digitalSignaturesRepository;
_trustProcessPublicKeysRepository = trustPublicKeysRepository;
_sessionService = sessionService;
_synchronizationService = synchronizationService;
_logger = logger;
}
public IObservable<bool> CanLogOutOrShutdown
{
get
{
return Observable.CombineLatest(_cloudSessionConnectionRepository.ConnectionStatusObservable,
_sessionService.SessionObservable, _synchronizationService.SynchronizationProcessData.SynchronizationEnd,
_sessionService.SessionStatusObservable,
(connectionStatus, session, synchronizationEnd, sessionStatus) =>
!connectionStatus.In(SessionConnectionStatus.CreatingSession, SessionConnectionStatus.JoiningSession) &&
(session == null || synchronizationEnd != null)
&& sessionStatus.In(SessionStatus.FatalError, SessionStatus.None, SessionStatus.RegularEnd));
}
}
public async Task ClearConnectionData()
{
await Task.WhenAll(
_cloudSessionConnectionRepository.ClearAsync(),
_trustProcessPublicKeysRepository.ClearAsync(),
_digitalSignaturesRepository.ClearAsync());
}
public async Task InitializeConnection(SessionConnectionStatus sessionConnectionStatus)
{
await ClearConnectionData();
_cloudSessionConnectionRepository.SetConnectionStatus(sessionConnectionStatus);
if (sessionConnectionStatus == SessionConnectionStatus.CreatingSession)
{
using var aes = Aes.Create();
aes.GenerateKey();
_cloudSessionConnectionRepository.SetAesEncryptionKey(aes.Key);
}
if (sessionConnectionStatus.In(SessionConnectionStatus.CreatingSession, SessionConnectionStatus.JoiningSession))
{
_cloudSessionConnectionRepository.ClearErrors();
_cloudSessionConnectionRepository.CancellationTokenSource = new CancellationTokenSource();
}
if (sessionConnectionStatus != SessionConnectionStatus.InSession)
{
_sessionService.ClearCloudSession();
}
}
public async Task OnJoinSessionError(JoinSessionError joinSessionError)
{
_logger.LogError("Can not join the Cloud Session. Reason: {Reason}", joinSessionError.Status);
_cloudSessionConnectionRepository.SetJoinSessionError(joinSessionError);
await InitializeConnection(SessionConnectionStatus.NoSession);
}
public async Task OnCreateSessionError(CreateSessionError createSessionError)
{
_logger.LogError("Can not create a Cloud Session. Reason: {Reason}", createSessionError.Status);
_cloudSessionConnectionRepository.SetCreateSessionError(createSessionError);
await InitializeConnection(SessionConnectionStatus.NoSession);
}
public async Task HandleJoinSessionError(Exception exception)
{
_logger.LogError(exception, "An error occurred while joining the Cloud Session");
var status = JoinSessionStatus.UnexpectedError;
if ((exception is TaskCanceledException || exception.InnerException is TaskCanceledException)
&& _cloudSessionConnectionRepository.CancellationToken.IsCancellationRequested)
{
status = JoinSessionStatus.CanceledByUser;
}
else if (exception is TimeoutException)
{
status = JoinSessionStatus.TimeoutError;
}
var joinSessionError = new JoinSessionError
{
Exception = exception,
Status = status
};
await OnJoinSessionError(joinSessionError);
}
}