using System; using System.Threading; using Cysharp.Threading.Tasks; namespace MessagePipe { // handler public interface IMessageHandler { void Handle(TMessage message); } public interface IAsyncMessageHandler { UniTask HandleAsync(TMessage message, CancellationToken cancellationToken); } // Keyless public interface IPublisher { void Publish(TMessage message); } public interface ISubscriber { IDisposable Subscribe(IMessageHandler handler, params MessageHandlerFilter[] filters); } public interface IAsyncPublisher { void Publish(TMessage message, CancellationToken cancellationToken = default(CancellationToken)); UniTask PublishAsync(TMessage message, CancellationToken cancellationToken = default(CancellationToken)); UniTask PublishAsync(TMessage message, AsyncPublishStrategy publishStrategy, CancellationToken cancellationToken = default(CancellationToken)); } public interface IAsyncSubscriber { IDisposable Subscribe(IAsyncMessageHandler asyncHandler, params AsyncMessageHandlerFilter[] filters); } public interface ISingletonPublisher : IPublisher { } public interface ISingletonSubscriber : ISubscriber { } public interface IScopedPublisher : IPublisher { } public interface IScopedSubscriber : ISubscriber { } public interface ISingletonAsyncPublisher : IAsyncPublisher { } public interface ISingletonAsyncSubscriber : IAsyncSubscriber { } public interface IScopedAsyncPublisher : IAsyncPublisher { } public interface IScopedAsyncSubscriber : IAsyncSubscriber { } // Keyed public interface IPublisher { void Publish(TKey key, TMessage message); } public interface ISubscriber { IDisposable Subscribe(TKey key, IMessageHandler handler, params MessageHandlerFilter[] filters); } public interface IAsyncPublisher { void Publish(TKey key, TMessage message, CancellationToken cancellationToken = default(CancellationToken)); UniTask PublishAsync(TKey key, TMessage message, CancellationToken cancellationToken = default(CancellationToken)); UniTask PublishAsync(TKey key, TMessage message, AsyncPublishStrategy publishStrategy, CancellationToken cancellationToken = default(CancellationToken)); } public interface IAsyncSubscriber { IDisposable Subscribe(TKey key, IAsyncMessageHandler asyncHandler, params AsyncMessageHandlerFilter[] filters); } public interface ISingletonPublisher : IPublisher { } public interface ISingletonSubscriber : ISubscriber { } public interface IScopedPublisher : IPublisher { } public interface IScopedSubscriber : ISubscriber { } public interface ISingletonAsyncPublisher : IAsyncPublisher { } public interface ISingletonAsyncSubscriber : IAsyncSubscriber { } public interface IScopedAsyncPublisher : IAsyncPublisher { } public interface IScopedAsyncSubscriber : IAsyncSubscriber { } // buffered keyless public interface IBufferedPublisher { void Publish(TMessage message); } public interface IBufferedSubscriber { IDisposable Subscribe(IMessageHandler handler, params MessageHandlerFilter[] filters); } public interface IBufferedAsyncPublisher { void Publish(TMessage message, CancellationToken cancellationToken = default(CancellationToken)); UniTask PublishAsync(TMessage message, CancellationToken cancellationToken = default(CancellationToken)); UniTask PublishAsync(TMessage message, AsyncPublishStrategy publishStrategy, CancellationToken cancellationToken = default(CancellationToken)); } public interface IBufferedAsyncSubscriber { UniTask SubscribeAsync(IAsyncMessageHandler handler, CancellationToken cancellationToken = default); UniTask SubscribeAsync(IAsyncMessageHandler handler, AsyncMessageHandlerFilter[] filters, CancellationToken cancellationToken = default); } // NOTE: buffered Keyed is undefined // because difficult to avoid (unused)key and keep latest value memory leak. }