Esempio n. 1
0
        public override async Task DoPut(
            FlightServerRecordBatchStreamReader requestStream,
            IAsyncStreamWriter <FlightPutResult> responseStream,
            ServerCallContext context
            )
        {
            var newTable = new List <RecordBatch> {
            };
            long numRows = 0;

            await foreach (var batch in requestStream.ReadAllAsync(context.CancellationToken))
            {
                newTable.Add(batch);
                numRows += batch.Length;
            }

            var descriptor = await requestStream.FlightDescriptor;
            var ticket     = DescriptorAsTicket(descriptor);
            var schema     = await requestStream.Schema;

            _flightData.Flights.Add(ticket, new FlightInfo(
                                        schema,
                                        descriptor,
                                        new List <FlightEndpoint> {
                GetEndpoint(ticket, $"http://{context.Host}")
            },
                                        numRows,
                                        -1 // Unknown
                                        ));
            _flightData.Tables.Add(ticket, newTable);

            await responseStream.WriteAsync(new FlightPutResult("Table saved."));
        }
Esempio n. 2
0
 public override async Task ListActions(
     IAsyncStreamWriter <FlightActionType> responseStream,
     ServerCallContext context
     )
 {
     await responseStream.WriteAsync(new FlightActionType("clear", "Clear the flights from the server"));
 }
Esempio n. 3
0
 public DuplexStreamingContext(ServiceContext context)
 {
     this.context     = context;
     this.innerReader = context.RequestStream;
     this.innerWriter = context.ResponseStream;
     this.logger      = context.MagicOnionLogger;
 }
Esempio n. 4
0
 /// <summary>
 /// Writes the specified objects.
 /// </summary>
 /// <typeparam name="T">The type of the object.</typeparam>
 /// <param name="streamWriter"></param>
 /// <param name="objects">The objects.</param>
 /// <returns></returns>
 public static async Task WritesAsync <T>(this IAsyncStreamWriter <T> streamWriter, IEnumerable <Task <T> > objects)
 {
     foreach (Task <T> request in objects)
     {
         await streamWriter.WriteAsync(await request.ConfigureAwait(false)).ConfigureAwait(false);
     }
 }
Esempio n. 5
0
 public DuplexStreamingContext(ServiceContext context)
 {
     this.context            = context;
     this.innerReader        = new LoggableStreamReader <byte[]>(context.MagicOnionLogger, context, context.RequestStream);
     this.innerWriter        = new LoggableStreamWriter <byte[]>(context.MagicOnionLogger, context, context.ResponseStream);
     this.requestMarshaller  = (Marshaller <TRequest>)context.RequestMarshaller;
     this.responseMarshaller = (Marshaller <TResponse>)context.ResponseMarshaller;
 }
Esempio n. 6
0
 /// <inheritdoc/>
 public virtual IWorkflowRuntimeProxy CreateProxy(string id, IAsyncStreamWriter <V1RuntimeSignal> signalStream)
 {
     if (string.IsNullOrWhiteSpace(id))
     {
         throw new ArgumentNullException(nameof(id));
     }
     return(ActivatorUtilities.CreateInstance <WorkflowRuntimeProxy>(this.ServiceProvider, id, signalStream));
 }
Esempio n. 7
0
        public override async Task ListFlights(FlightCriteria request, IAsyncStreamWriter <FlightInfo> responseStream, ServerCallContext context)
        {
            var flightInfos = _flightStore.Flights.Select(x => x.Value.GetFlightInfo()).ToList();

            foreach (var flightInfo in flightInfos)
            {
                await responseStream.WriteAsync(flightInfo);
            }
        }
Esempio n. 8
0
        public override async Task ListActions(IAsyncStreamWriter <FlightActionType> responseStream, ServerCallContext context)
        {
            await responseStream.WriteAsync(new FlightActionType("get", "get a flight"));

            await responseStream.WriteAsync(new FlightActionType("put", "add a flight"));

            await responseStream.WriteAsync(new FlightActionType("delete", "delete a flight"));

            await responseStream.WriteAsync(new FlightActionType("test", "test action"));
        }
Esempio n. 9
0
 public override async Task ListFlights(
     FlightCriteria request,
     IAsyncStreamWriter <FlightInfo> responseStream,
     ServerCallContext context
     )
 {
     foreach (var flight in _flightData.Flights.Values)
     {
         await responseStream.WriteAsync(flight);
     }
 }
Esempio n. 10
0
        public override async Task Countdown(IMessage <Box <uint> > request, IAsyncStreamWriter <IMessage <Box <uint> > > responses, ServerCallContext context)
        {
            uint num = request.Payload.Deserialize().value;

            while (num > 0)
            {
                await responses.WriteAsync(Message.From(Box.Create(num)));

                --num;
            }
        }
Esempio n. 11
0
        public async void Init()
        {
            // Add client cert to the handler
            Task AsyncAuthInterceptor(AuthInterceptorContext context, Grpc.Core.Metadata metadata)
            {
                return(Task.Run(() => { metadata.Add("Authorization", $"Bearer {_token}"); }));
            }

            var channelCredentials = new SslCredentials(File.ReadAllText($"{Application.streamingAssetsPath}/server1.crt"));//, //new KeyCertificatePair(File.ReadAllText($"{Application.dataPath}/server1.crt"), ""));

            var callCredentials = CallCredentials.FromInterceptor(AsyncAuthInterceptor);

            Record.Log($"Trying to connect ...");

            _channel = new Channel(
                "127.0.0.1",
                50051,
                ChannelCredentials.Create(
                    channelCredentials,
                    callCredentials)/*,
                                     * new []{ // https://grpc.github.io/grpc/node/grpc.html#~ChannelOptions
                                     * new ChannelOption("grpc.keepalive_permit_without_calls", 1),
                                     * new ChannelOption("grpc.keepalive_time_ms", 5 * 1000), // 5 seconds
                                     * }*/
                );

            await _channel.ConnectAsync(deadline : System.DateTime.UtcNow.AddSeconds(20));

            Record.Log($"gRPC channel status: {_channel.State}");
            _networkClient = new ErutanClient(_channel);
            //var headers = new Grpc.Core.Metadata(); // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md
            //headers.Add(new Grpc.Core.Metadata.Entry("grpc-timeout", "2S"));
            _stream = _networkClient.Stream();

            _inStream  = _stream.ResponseStream;
            _outStream = _stream.RequestStream;

            // Listen to server packets on different thread
            _listenerThread = new Thread(Listen)
            {
                IsBackground = true
            };
            _listenerThread.Start();

            // Send packets to server on different thread
            _senderThread = new Thread(DequeuePacketsToBeSent)
            {
                IsBackground = true
            };
            _senderThread.Start();

            StreamConnected?.Invoke();
            IsConnected = true;
        }
Esempio n. 12
0
        public override async Task ListFlights(FlightCriteria request, IAsyncStreamWriter <FlightInfo> responseStream, ServerCallContext context)
        {
            var tables = _koraliumTransportService.GetTables();

            var httpContext = context.GetHttpContext();

            foreach (var table in tables)
            {
                var selectAllSql = table.SelectAllColumnsStatement();
                await responseStream.WriteAsync(GetFlightInfo(selectAllSql, context));
            }
        }
Esempio n. 13
0
        public override async Task DoAction(FlightAction request, IAsyncStreamWriter <FlightResult> responseStream, ServerCallContext context)
        {
            switch (request.Type)
            {
            case "test":
                await responseStream.WriteAsync(new FlightResult("test data"));

                break;

            default:
                throw new NotImplementedException();
            }
        }
        static async Task CommandLoopAsync(IAsyncStreamWriter <ActionMessage> stream, CancellationToken token)
        {
            Console.WriteLine("Use +XXXX to add a symbol, -XXXX to remove it.");
            await Task.Yield();

            while (!token.IsCancellationRequested)
            {
                Console.Write("> ");
                var command = Console.ReadLine();
                if (string.IsNullOrWhiteSpace(command))
                {
                    break;
                }
                ActionMessage message;
                switch (command[0])
                {
                case '+':
                    message = new ActionMessage {
                        Add = new AddSymbolRequest {
                            Symbol = command.Substring(1)
                        }
                    };
                    break;

                case '-':
                    message = new ActionMessage {
                        Remove = new RemoveSymbolRequest {
                            Symbol = command.Substring(1)
                        }
                    };
                    break;

                default:
                    Console.WriteLine($"Unknown command: {command}");
                    continue;
                }

                try
                {
                    await stream.WriteAsync(message);
                }
                catch (RpcException ex)
                {
                    Console.WriteLine($"Error sending command: {ex.Message}");
                }
                catch (OperationCanceledException)
                {
                    // Ignored
                }
            }
        }
Esempio n. 15
0
        async Task SendJoin(IAsyncStreamWriter <TransportMessage> requestStream)
        {
            var message = new TransportMessage
            {
                MessageId = NewId.NextGuid().ToString(),
                Join      = new Join {
                    Node = new Node().Initialize(_hostNode)
                }
            };

            await requestStream.WriteAsync(message).ConfigureAwait(false);

            _node.LogSent(message);
        }
 public BaseDiscoveryRequestStreamHandler(
     IAsyncStreamReader <DiscoveryRequest> requestStream,
     IServerStreamWriter <DiscoveryResponse> responseStream,
     string defaultTypeUrl,
     long streamId,
     IConfigWatcher configWatcher,
     IEnumerable <IDiscoveryServerCallbacks> callbacks)
 {
     _defaultTypeUrl = defaultTypeUrl;
     _requestStream  = requestStream;
     _responseStream = responseStream;
     _streamId       = streamId;
     _configWatcher  = configWatcher;
     _callbacks      = callbacks;
 }
Esempio n. 17
0
        public override Task DoAction(
            FlightAction request,
            IAsyncStreamWriter <FlightResult> responseStream,
            ServerCallContext context
            )
        {
            if (request.Type == "clear")
            {
                _flightData.Flights.Clear();
                _flightData.Tables.Clear();
            }
            else
            {
                throw new RpcException(new Status(StatusCode.InvalidArgument, "Action does not exist."));
            }

            return(Task.CompletedTask);
        }
Esempio n. 18
0
        private async Task SendLoginResponses(string targetLogin,
                                              IAsyncStreamWriter <ServerResponse> responseStream,
                                              ServerResponse loginResponse)
        {
            if (loginResponse.Type == ResponseType.Init || loginResponse.Type == ResponseType.LoginExists)
            {
                await responseStream.WriteAsync(loginResponse);

                if (loginResponse.Type == ResponseType.Init)
                {
                    Responses.TryAdd(targetLogin, new ConcurrentQueue <ServerResponse>());
                }
            }
            else if (loginResponse.Type == ResponseType.PlayerJoin)
            {
                await responseStream.WriteAsync(loginResponse);
            }
        }
Esempio n. 19
0
 /// <inheritdoc/>
 public IPingedConnection <TClientMessage, TServerMessage> CreatePingedReverseCallConnection <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>(
     RequestId requestId,
     IAsyncStreamReader <TClientMessage> runtimeStream,
     IAsyncStreamWriter <TServerMessage> clientStream,
     ServerCallContext context,
     IConvertReverseCallMessages <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> messageConverter)
     where TClientMessage : IMessage, new()
     where TServerMessage : IMessage, new()
     where TConnectArguments : class
     where TConnectResponse : class
     where TRequest : class
     where TResponse : class
 => new PingedConnection <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>(
     requestId,
     runtimeStream,
     clientStream,
     context,
     messageConverter,
     new TokenSourceDeadline(),
     _callbackScheduler,
     _metricsCollector,
     _loggerFactory);
Esempio n. 20
0
    /// <summary>
    /// Initializes a new instance of the <see cref="PingedConnection{TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse}"/> class.
    /// </summary>
    /// <param name="requestId">The request id for the gRPC method call.</param>
    /// <param name="runtimeStream">The <see cref="IAsyncStreamReader{TClientMessage}"/> to read messages to the Runtime.</param>
    /// <param name="clientStream">The <see cref="IServerStreamWriter{TServerMessage}"/> to write messages to the Client.</param>
    /// <param name="context">The <see cref="ServerCallContext"/> of the method call.</param>
    /// <param name="messageConverter">The <see cref="MethodConverter"/> to use for decoding the connect arguments and reading the desired ping interval from.</param>
    /// <param name="keepalive">The keepalive token canceller to use for keeping track of ping timeouts.</param>
    /// <param name="pingScheduler">The callback scheduler to use for scheduling accurate pings.</param>
    /// <param name="metrics">The metrics collector to use for metrics about reverse calls.</param>
    /// <param name="loggerFactory">The logger factory to use to create loggers.</param>
    public PingedConnection(
        RequestId requestId,
        IAsyncStreamReader <TClientMessage> runtimeStream,
        IAsyncStreamWriter <TServerMessage> clientStream,
        ServerCallContext context,
        IConvertReverseCallMessages <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> messageConverter,
        ICancelTokenIfDeadlineIsMissed keepalive,
        ICallbackScheduler pingScheduler,
        IMetricsCollector metrics,
        ILoggerFactory loggerFactory)
    {
        _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken, keepalive.Token);

        _requestId     = requestId;
        _keepalive     = keepalive;
        _pingScheduler = pingScheduler;

        _wrappedReader = new WrappedAsyncStreamReader <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>(
            requestId,
            runtimeStream,
            messageConverter,
            metrics,
            loggerFactory.CreateLogger <WrappedAsyncStreamReader <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(),
            _cancellationTokenSource.Token);
        _wrappedWriter = new WrappedAsyncStreamWriter <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>(
            requestId,
            clientStream,
            messageConverter,
            metrics,
            loggerFactory.CreateLogger <WrappedAsyncStreamWriter <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(),
            _cancellationTokenSource.Token);

        _metrics = metrics;
        _logger  = loggerFactory.CreateLogger <PingedConnection <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >();

        WaitForCallContextInFirstMessageThenStartPinging();
        _keepAliveExpiredRegistration = keepalive.Token.Register(NotifyKeepaliveTimedOut);
    }
Esempio n. 21
0
 public BuildJobRunner(ILogger logger, string buildDir, IAsyncStreamReader <RunBuildCommand> commandStream, IAsyncStreamWriter <BuildStatusUpdate> updateStream, CancellationToken cancellationToken)
 {
     this.logger            = logger;
     this.buildDir          = buildDir;
     this.commandStream     = commandStream;
     this.updateStream      = updateStream;
     this.cancellationToken = cancellationToken;
 }
Esempio n. 22
0
 /// <summary>
 /// Converts the request type.
 /// </summary>
 /// <typeparam name="TSource">The type before conversion.</typeparam>
 /// <typeparam name="T">The type of the object.</typeparam>
 /// <param name="streamWriter"></param>
 /// <param name="requestConverter">Method to convert a object.</param>
 /// <returns>A stream writer to write a converted object.</returns>
 public static IAsyncStreamWriter <TSource> Convert <TSource, T>(this IAsyncStreamWriter <T> streamWriter, Func <TSource, Task <T> > requestConverter)
 {
     return(new Internals.AsyncConvertAsyncStreamWriter <TSource, T>(streamWriter, requestConverter));
 }
Esempio n. 23
0
        public override async Task DoPut(FlightServerRecordBatchStreamReader requestStream, IAsyncStreamWriter <FlightPutResult> responseStream, ServerCallContext context)
        {
            var flightDescriptor = await requestStream.FlightDescriptor;

            if (!_flightStore.Flights.TryGetValue(flightDescriptor, out var flightHolder))
            {
                flightHolder = new FlightHolder(flightDescriptor, await requestStream.Schema, $"http://{context.Host}");
                _flightStore.Flights.Add(flightDescriptor, flightHolder);
            }

            while (await requestStream.MoveNext())
            {
                flightHolder.AddBatch(new RecordBatchWithMetadata(requestStream.Current, requestStream.ApplicationMetadata.FirstOrDefault()));
                await responseStream.WriteAsync(FlightPutResult.Empty);
            }
        }
Esempio n. 24
0
 public void ConnectCustomerToChatRoom(int roomId, Guid customerId, IAsyncStreamWriter <ChatMessage> responseStream)
 {
     _chatRoomProvider.GetChatRoomById(roomId).CustomersInRoom.FirstOrDefault(c => c.Id == customerId).Stream = responseStream;
 }
Esempio n. 25
0
 private protected FlightRecordBatchStreamWriter(IAsyncStreamWriter <FlightData> clientStreamWriter, FlightDescriptor flightDescriptor)
 {
     _clientStreamWriter = clientStreamWriter;
     _flightDescriptor   = flightDescriptor;
 }
Esempio n. 26
0
 internal StreamWriter(IAsyncStreamWriter <TOut> inputStream, Func <TIn, TOut> convertFunction)
 {
     _inputStream     = inputStream;
     _convertFunction = convertFunction;
 }
Esempio n. 27
0
 public ServerStreamingContext(ServiceContext context)
 {
     this.context = context;
     this.inner   = context.ResponseStream;
     this.logger  = context.MagicOnionLogger;
 }
Esempio n. 28
0
 public void ConnectPlayerStream(int PlayerId, IAsyncStreamWriter <CommandReplay> stream)
 {
     playerStreamlist[PlayerId].Stream = stream;
 }
Esempio n. 29
0
 private static async Task <IResult> RewriteStream <T>(IAsyncStreamReader <T> source, IAsyncStreamWriter <T> destination) where T : class
 {
     try
     {
         while (await source.MoveNext())
         {
             await destination.WriteAsync(source.Current);
         }
     }
     catch (Exception e)
     {
         return(Result.Failure(e.Message));
     }
     return(Result.Success());
 }
 /// <summary>
 /// Create a new instance.
 /// </summary>
 /// <param name="streamWriter">The stream writer.</param>
 /// <param name="converter">Conversion method.</param>
 internal ConvertAsyncStreamWriter(IAsyncStreamWriter <T> streamWriter, Func <TSource, T> converter)
 {
     m_StreamWriter = streamWriter;
     m_Converter    = converter;
 }