using Newtonsoft.Json;
using StackExchange.Redis;
namespace BlazorCanvas.Server.Components.Data;
// https://developer.redis.com/develop/dotnet/streams/stream-basics/
public class RedisService: IRedisService {
private IConnectionMultiplexer _cache;
private ChannelMessageQueue _channel;
public RedisService(IConnectionMultiplexer cache) {
_cache = cache;
_channel = _cache.GetSubscriber().Subscribe(RedisChannel.Literal("lol"));
}
///
/// Version Pub/Sub - Redis en mode Pub/Sub ne garde pas ses messages en mémoire,
/// donc les commandes faites avant la souscription ne sont pas copiées.
///
public async Task Subscribe(CancellationToken cToken) {
var mess = await _channel.ReadAsync(cToken);
var comm = JsonConvert.DeserializeObject(mess.Message);
if (comm is not null)
return comm;
else return null;
}
///
/// Version Pub/Sub - Redis en mode Pub/Sub ne garde pas ses messages en mémoire,
/// donc les commandes faites avant la souscription ne sont pas copiées.
///
/// La commande à publier
public async void Publish(CanvasCommand command) {
CanvasCommand cm = new(command);
await _cache.GetSubscriber().PublishAsync(_channel.Channel, JsonConvert.SerializeObject(cm));
}
}