using Microsoft.Extensions.Logging;
namespace ZB.MOM.WW.OtOpcUa.Host.OpcUa;
/// Coordinates endpoint cleanup after ServiceLevel binding fails during startup.
internal static class FailedServiceLevelBindingCleanup
{
/// Stops and disposes the endpoint, returning whether ownership can be released.
/// The SDK stop operation.
/// The application-host disposal operation.
/// The cleanup logger.
/// Whether cleanup completed successfully.
internal static async Task StopAndDisposeAsync(
Func stop, Func dispose, ILogger logger)
{
var completed = true;
try
{
await stop().ConfigureAwait(false);
}
catch (Exception ex)
{
completed = false;
logger.LogError(ex, "OtOpcUaServerHostedService: SDK stop failed after binding failure; retaining endpoint ownership for shutdown retry");
}
// Attempt application cleanup even when stopping faults; keep ownership on either failure.
try
{
await dispose().ConfigureAwait(false);
}
catch (Exception ex)
{
completed = false;
logger.LogError(ex, "OtOpcUaServerHostedService: endpoint disposal failed after binding failure; retaining endpoint ownership for shutdown retry");
}
return completed;
}
}