using Grpc.Core; using MxGateway.Contracts.Proto; namespace MxGateway.Client; internal sealed class GrpcMxGatewayClientTransport( MxGatewayClientOptions options, MxAccessGateway.MxAccessGatewayClient rawClient) : IMxGatewayClientTransport { public MxGatewayClientOptions Options { get; } = options; public MxAccessGateway.MxAccessGatewayClient RawClient { get; } = rawClient; MxAccessGateway.MxAccessGatewayClient? IMxGatewayClientTransport.RawClient => RawClient; public async Task OpenSessionAsync( OpenSessionRequest request, CallOptions callOptions) { return await RawClient.OpenSessionAsync(request, callOptions) .ResponseAsync .ConfigureAwait(false); } public async Task CloseSessionAsync( CloseSessionRequest request, CallOptions callOptions) { return await RawClient.CloseSessionAsync(request, callOptions) .ResponseAsync .ConfigureAwait(false); } public async Task InvokeAsync( MxCommandRequest request, CallOptions callOptions) { return await RawClient.InvokeAsync(request, callOptions) .ResponseAsync .ConfigureAwait(false); } public async IAsyncEnumerable StreamEventsAsync( StreamEventsRequest request, CallOptions callOptions, [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default) { CancellationToken effectiveCancellationToken = cancellationToken.CanBeCanceled ? cancellationToken : callOptions.CancellationToken; using AsyncServerStreamingCall call = RawClient.StreamEvents(request, callOptions); await foreach (MxEvent gatewayEvent in call.ResponseStream .ReadAllAsync(effectiveCancellationToken) .ConfigureAwait(false)) { yield return gatewayEvent; } } IAsyncEnumerable IMxGatewayClientTransport.StreamEventsAsync( StreamEventsRequest request, CallOptions callOptions) { return StreamEventsAsync(request, callOptions); } }