// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.Extensions.Logging; namespace AWS.Deploy.ServerMode.Client { public interface IDeploymentCommunicationClient : IDisposable { Action? ReceiveLogDebugMessage { get; set; } Action? ReceiveLogErrorMessage { get; set; } Action? ReceiveLogInfoMessage { get; set; } Action? ReceiveLogSectionStart { get; set; } Task JoinSession(string sessionId); } public class DeploymentCommunicationClient : IDeploymentCommunicationClient { private bool _disposedValue; private bool _initialized = false; private readonly HubConnection _connection; public Action? ReceiveLogDebugMessage { get; set; } public Action? ReceiveLogErrorMessage { get; set; } public Action? ReceiveLogInfoMessage { get; set; } public Action? ReceiveLogSectionStart { get; set; } public DeploymentCommunicationClient(string baseUrl) { _connection = new HubConnectionBuilder() .WithUrl(new Uri(new Uri(baseUrl), "DeploymentCommunicationHub")) .WithAutomaticReconnect() .Build(); _connection.On("OnLogDebugMessage", (message) => { ReceiveLogDebugMessage?.Invoke(message); }); _connection.On("OnLogErrorMessage", (message) => { ReceiveLogErrorMessage?.Invoke(message); }); _connection.On("OnLogInfoMessage", (message) => { ReceiveLogInfoMessage?.Invoke(message); }); _connection.On("OnLogSectionStart", (message, description) => { ReceiveLogSectionStart?.Invoke(message, description); }); } public async Task JoinSession(string sessionId) { if(!_initialized) { _initialized = true; await _connection.StartAsync(); } await _connection.SendAsync("JoinSession", sessionId); } protected virtual void Dispose(bool disposing) { if (!_disposedValue) { if (disposing) { _connection.DisposeAsync().GetAwaiter().GetResult(); } _disposedValue = true; } } public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } } }