mirror of
https://gitea.tendokyu.moe/Kayori/Medusa.net.git
synced 2026-09-29 02:08:04 +03:00
32 lines
919 B
C#
32 lines
919 B
C#
using System.Collections.Concurrent;
|
|
using System.Threading.Channels;
|
|
|
|
namespace Server.Plugins;
|
|
|
|
public sealed record PluginUiEvent(string Type, string PluginUiId);
|
|
|
|
public sealed class PluginUiEventBroadcaster
|
|
{
|
|
private readonly ConcurrentDictionary<string, Channel<PluginUiEvent>> _channels = new();
|
|
|
|
public (string connectionId, Channel<PluginUiEvent> channel) Subscribe()
|
|
{
|
|
var id = Guid.NewGuid().ToString("N");
|
|
var ch = Channel.CreateUnbounded<PluginUiEvent>(
|
|
new UnboundedChannelOptions { SingleReader = true });
|
|
_channels[id] = ch;
|
|
return (id, ch);
|
|
}
|
|
|
|
public void Unsubscribe(string connectionId)
|
|
{
|
|
if (_channels.TryRemove(connectionId, out var ch))
|
|
ch.Writer.TryComplete();
|
|
}
|
|
|
|
public void Broadcast(PluginUiEvent evt)
|
|
{
|
|
foreach (var ch in _channels.Values)
|
|
ch.Writer.TryWrite(evt);
|
|
}
|
|
} |