From 8eb884fa5df608bf3f16e95b6719ff290b1b1791 Mon Sep 17 00:00:00 2001 From: Anton Smolkov Date: Mon, 23 Dec 2024 14:05:09 +0300 Subject: [PATCH] Add ability to get session from server by client id (#2131) Co-authored-by: Anton Smolkov --- .../Internal/MqttClientSessionsManager.cs | 19 +++++++++++++++++++ Source/MQTTnet.Server/MqttServer.cs | 7 +++++++ 2 files changed, 26 insertions(+) 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);