Ejemplo n.º 1
0
        public void Connect <TIn, TOut>(Expression expression, IObserver <TOut> observer)
        {
            var seralizedExpression = SerializationHelper.SerializeLinqExpression <TIn, TOut>(
                expression,
                _options.TypesToTransfer.ToArray());

            Channel channel = new Channel(_options.ConnectionString, ChannelCredentials.Insecure);
            var     client  = new StreamService.StreamServiceClient(channel.CreateCallInvoker());

            var definer         = new PortableTypeDefiner();
            var classDefinition = definer.BuildDefinition(typeof(TIn));
            var enums           = definer.BuildDefinitions(_options.TypesToTransfer.Where(t => t.IsEnum).ToArray());
            var types           = definer.BuildDefinitions(_options.TypesToTransfer.Where(t => !t.IsEnum).ToArray());

            _types = enums
                     .Concat(new[] { classDefinition })
                     .Concat(types)
                     .GroupBy(t => new { t.AssemblyName, t.ClassName })
                     .Select(g => g.First())
                     .ToArray();

            var queryEnvelope = new QueryEnvelope
            {
                Payload         = seralizedExpression,
                SourceTypeName  = classDefinition.ClassName,
                RegisteredTypes = JsonConvert.SerializeObject(_types),
                StreamPattern   = JsonConvert.SerializeObject(_streamPatterns)
            };

            _streamingCall = client.QueryStreamAsync(queryEnvelope);

            // TODO: No need for one thread per subscription - this can be made more efficient
            Task.Run(GetObserveTask(observer), _cancelSource.Token)
            .ContinueWith(_ => _cancelSource.Dispose());
        }
Ejemplo n.º 2
0
        public GrpcBroker(QueryEnvelope queryEnvelope)
        {
            var registeredTypeDefinitions = JsonConvert.DeserializeObject <PortableTypeDefinition[]>(queryEnvelope.RegisteredTypes);

            RegisteredTypes = new PortableTypeBuilder().BuildTypes(registeredTypeDefinitions);
            SourceType      = RegisteredTypes.Single(t => t.FullName == queryEnvelope.SourceTypeName);

            _subject = new Subject <object>();

            var queryExpression = SerializationHelper.DeserializeLinqExpression(queryEnvelope.Payload, RegisteredTypes);

            Observable = new ServerQueryObservable <object>(SourceType, _subject.AsQbservable(), queryExpression);
        }
Ejemplo n.º 3
0
        public override async Task QueryStreamAsync(
            QueryEnvelope queryEnvelope,
            IServerStreamWriter <ResponseEnvelope> responseStream,
            ServerCallContext callContext
            )
        {
            var streamPatterns = JsonConvert.DeserializeObject <string[]>(queryEnvelope.StreamPattern);

            try {
                var broker = new GrpcBroker(queryEnvelope);
                await Run(broker, responseStream, streamPatterns);
            } catch (Exception ex) {
                Log.ErrorException(ex, "Error running Rx query");
                await ClientOnError(responseStream, ex);
            }
        }
Ejemplo n.º 4
0
        public override async Task QueryStreamAsync(
            QueryEnvelope queryEnvelope,
            IServerStreamWriter <ResponseEnvelope> responseStream,
            ServerCallContext callContext)
        {
            try
            {
                var broker = new GrpcBroker(queryEnvelope);
                await Run(broker, responseStream);
            }
            catch (Exception ex)
            {
                await ClientOnError(responseStream, ex);

                throw;
            }
        }