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()); }
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); }
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); } }
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; } }