Files
2026-07-03 05:02:26 +03:00

115 lines
5.6 KiB
C#

using Best.HTTP.Shared.Streams;
using System;
namespace Best.HTTP.Shared.PlatformSupport.Network.Tcp
{
/// <summary>
/// The IPeekableContentProvider interface defines an abstraction for providing content to an <see cref="IContentConsumer"/> with the ability to peek at the content without consuming it.
/// It is an essential part of content streaming over a TCP connection.
/// </summary>
/// <remarks>
/// <para>
/// Key Functions of IPeekableContentProvider:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>Content Provision</term><description>It provides content to an associated <see cref="IContentConsumer"/> without immediately consuming the content. This allows the consumer to examine the data before processing.
/// </description></item>
/// <item>
/// <term>Two-Way Binding</term><description>Supports establishing a two-way binding between the <see cref="IPeekableContentProvider"/> and an <see cref="IContentConsumer"/>, enabling bidirectional communication between the provider and consumer.
/// </description></item>
/// <item>
/// <term>Unbinding</term><description>Provides methods for unbinding a content consumer, terminating the association between the provider and consumer.
/// </description></item>
/// </list>
/// </remarks>
public interface IPeekableContentProvider
{
/// <summary>
/// Gets the <see cref="PeekableContentProviderStream"/> associated with this content provider, which allows peeking at the content without consuming it.
/// </summary>
PeekableContentProviderStream Peekable { get; }
/// <summary>
/// Gets the <see cref="IContentConsumer"/> implementor that will be notified through <see cref="IContentConsumer.OnContent"/> calls when new data is available in the TCPStreamer.
/// </summary>
IContentConsumer Consumer { get; }
/// <summary>
/// Sets up a two-way binding between this content provider and an <see cref="IContentConsumer"/>. This enables bidirectional communication between the provider and consumer.
/// </summary>
/// <param name="consumer">The <see cref="IContentConsumer"/> to bind to.</param>
void SetTwoWayBinding(IContentConsumer consumer);
/// <summary>
/// Unbinds the content provider from its associated content consumer. This terminates the association between the provider and consumer.
/// </summary>
void Unbind();
/// <summary>
/// Unbinds the content provider from a specific content consumer if it is currently bound to that consumer.
/// </summary>
/// <param name="consumer">The <see cref="IContentConsumer"/> to unbind from.</param>
void UnbindIf(IContentConsumer consumer);
/// <summary>
/// Unbinds the content provider from a specific content consumer if it is currently bound to that consumer, and changes to the new consumer.
/// </summary>
/// <param name="consumer">The <see cref="IContentConsumer"/> to unbind from.</param>
/// <param name="consumer">The <see cref="IContentConsumer"/> to bin to.</param>
void SwitchIf(IContentConsumer from, IContentConsumer to);
}
/// <summary>
/// The IContentConsumer interface represents a consumer of content provided by an <see cref="IPeekableContentProvider"/>. It defines methods for handling received content and connection-related events.
/// </summary>
/// <remarks>
/// <para>
/// Key Functions of IContentConsumer:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>Content Handling</term><description>Defines methods for handling incoming content, allowing consumers to process data as it becomes available.
/// </description></item>
/// <item>
/// <term>Connection Management</term><description>Provides event methods to notify consumers of connection closure and error conditions, facilitating graceful handling of connection-related issues.
/// </description></item>
/// </list>
/// </remarks>
public interface IContentConsumer
{
/// <summary>
/// Gets the <see cref="PeekableContentProviderStream"/> associated with this content consumer, which allows access to incoming content.
/// </summary>
PeekableContentProviderStream ContentProvider { get; }
/// <summary>
/// This method should not be called directly. It is used internally to set the binding between the content consumer and its associated content provider.
/// </summary>
/// <param name="contentProvider">The <see cref="PeekableContentProviderStream"/> to bind to.</param>
void SetBinding(PeekableContentProviderStream contentProvider);
/// <summary>
/// This method should not be called directly. It is used internally to unset the binding between the content consumer and its associated content provider.
/// </summary>
void UnsetBinding();
/// <summary>
/// Called when new content is available from the associated content provider.
/// </summary>
void OnContent();
/// <summary>
/// Called when the connection is closed by the remote peer. It notifies the content consumer about the connection closure.
/// </summary>
void OnConnectionClosed();
/// <summary>
/// Called when an error occurs during content processing or connection handling. It provides the exception that caused the error.
/// </summary>
/// <param name="ex">The <see cref="Exception"/> that represents the error condition.</param>
void OnError(Exception ex);
}
}