Files
messengerapi.QueryClient/code/MessengerApi.QueryClient/QueryClient.cs
masiton 9766124241
All checks were successful
Pack and Push NuGet Package / publish (push) Successful in 43s
Implementation carried over from v1.
2025-07-05 05:11:04 +02:00

72 lines
2.1 KiB
C#

using portaloggy;
using MessengerApi.Model.Messages;
using MessengerApi.Model;
namespace MessengerApi
{
public interface IQueryClient : IDisposable
{
Task<InboxMessage> Query(OutboxMessage message);
}
public class QueryClient : SubscriptionClient, IQueryClient
{
private readonly int _timeoutInSeconds;
public QueryClient(
Credentials credentials,
HttpClient httpClient = null,
ILogger logger = null,
int maximumPermittedWaitTimeInSeconds = 10) :base(credentials, httpClient, logger)
{
this._timeoutInSeconds = maximumPermittedWaitTimeInSeconds;
}
public async Task<InboxMessage> Query(OutboxMessage message)
{
try
{
var messageTypeMask = $"{message.PayloadType}-{Guid.NewGuid()}";
var maskedMessage = new OutboxMessage
{
Payload = message.Payload,
LifespanInSeconds = message.LifespanInSeconds,
PayloadType = messageTypeMask,
ToUserId = message.ToUserId
};
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(this._timeoutInSeconds));
var sub = this.Subscribe(messageTypeMask);
var result = (InboxMessage)null;
sub.OnMessage += (source, message) =>
{
result = message;
cts.Cancel();
};
this.SendMessage(maskedMessage);
while (!cts.IsCancellationRequested)
{
await Task.Delay(TimeSpan.FromSeconds(1));
}
this.Unsubscribe(sub);
if (result == null)
{
throw new InvalidOperationException("Couldn't retrieve response.");
}
result.PayloadType = message.PayloadType;
return result;
}
catch
{
throw;
}
}
}
}