1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2025-09-30 23:02:48 +02:00
Files
Minecraft-Phantom-Panel/Utils/Phantom.Utils.Rpc/Runtime/IRpcFrameSenderProvider.cs

44 lines
1.6 KiB
C#

using System.Threading.Channels;
namespace Phantom.Utils.Rpc.Runtime;
interface IRpcFrameSenderProvider<TMessageBase> {
Task NewValueReady(CancellationToken cancellationToken);
Task<RpcFrameSender<TMessageBase>> GetNewValue(CancellationToken cancellationToken);
sealed record Constant(RpcFrameSender<TMessageBase> FrameSender) : IRpcFrameSenderProvider<TMessageBase> {
public Task NewValueReady(CancellationToken cancellationToken) {
return Task.Delay(Timeout.Infinite, cancellationToken);
}
public Task<RpcFrameSender<TMessageBase>> GetNewValue(CancellationToken cancellationToken) {
return Task.FromResult(FrameSender);
}
}
sealed class Mutable : IRpcFrameSenderProvider<TMessageBase>, IDisposable {
private readonly Channel<RpcFrameSender<TMessageBase>> channel = Channel.CreateBounded<RpcFrameSender<TMessageBase>>(new BoundedChannelOptions(capacity: 1) {
AllowSynchronousContinuations = false,
FullMode = BoundedChannelFullMode.DropOldest,
SingleReader = true,
SingleWriter = false, // Technically there should only be a single writer, but it's external so this is safer.
});
public async Task NewValueReady(CancellationToken cancellationToken) {
await channel.Reader.WaitToReadAsync(cancellationToken);
}
public async Task<RpcFrameSender<TMessageBase>> GetNewValue(CancellationToken cancellationToken) {
return await channel.Reader.ReadAsync(cancellationToken);
}
public void SetNewValue(RpcFrameSender<TMessageBase> frameSender) {
channel.Writer.TryWrite(frameSender);
}
public void Dispose() {
channel.Writer.TryComplete();
}
}
}