diff --git a/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs b/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs index b99fa8e0..43a71abe 100644 --- a/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs +++ b/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs @@ -311,6 +311,25 @@ public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification return Task.FromResult((IList)result); } + public Task GetSessionStatus(string id) + { + _sessionsManagementLock.EnterReadLock(); + try + { + if (!_sessionsStorage.TryGetSession(id, out var session)) + { + throw new InvalidOperationException($"Session with ID '{id}' not found."); + } + + var sessionStatus = new MqttSessionStatus(session); + return Task.FromResult(sessionStatus); + } + finally + { + _sessionsManagementLock.ExitReadLock(); + } + } + public Task> GetSessionsStatus() { var result = new List(); diff --git a/Source/MQTTnet.Server/MqttServer.cs b/Source/MQTTnet.Server/MqttServer.cs index f0f423f0..8f1807cf 100644 --- a/Source/MQTTnet.Server/MqttServer.cs +++ b/Source/MQTTnet.Server/MqttServer.cs @@ -237,6 +237,13 @@ public class MqttServer : Disposable return _clientSessionsManager.GetSessionsStatus(); } + public Task GetSessionAsync(string id) + { + ThrowIfNotStarted(); + + return _clientSessionsManager.GetSessionStatus(id); + } + public Task InjectApplicationMessage(InjectedMqttApplicationMessage injectedApplicationMessage, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(injectedApplicationMessage);