Example #1
0
        public async Task Subscribe(EventsSubscribeRequest request, ReceiveEventsMessage messageHandler, ReceiveEventsError errorHandler, CancellationToken cancellationToken = new CancellationToken())
        {
            request.ClientId = this.ClientOptions.PopulateClientId(request.ClientId);
            request.Validate();
            if (messageHandler == null)
            {
                throw new ArgumentNullException(nameof(messageHandler), "request must have a non-null message delegate");
            }
            if (errorHandler == null)
            {
                throw new ArgumentNullException(nameof(messageHandler), "request must have a non-null error delegate");
            }

            while (true)
            {
                try
                {
                    using (var call = Client.SubscribeToEvents(request.ToSubscribeRequest(),
                                                               ClientOptions.GetGrpcMetadata(),
                                                               null, cancellationToken))
                    {
                        while (await call.ResponseStream.MoveNext())
                        {
                            EventsReceiveMessage message = new EventsReceiveMessage(call.ResponseStream.Current);
                            messageHandler(message);
                        }
                    }
                }
                catch (RpcException rpcx)
                {
                    if (rpcx.StatusCode == StatusCode.Cancelled)
                    {
                        break;
                    }
                    else
                    {
                        errorHandler(rpcx.Message);
                    }
                }
                catch (Exception e)
                {
                    errorHandler(e.Message);
                }

                await Task.Delay(ClientOptions.ReconnectInterval);
            }
        }