public override async Task InitNdmExtension(NdmExtension request, IServerStreamWriter <NdmQuery> responseStream, ServerCallContext context) { var peer = context.Peer; if (_logger.IsInfo) { _logger.Info($"Received InitNdmExtension() GRPC call from peer: '{peer}'. Extension: '{request.Name}', type: '{request.Type}', accept all headers: {request.AcceptAllHeaders}, accepted headers: {request.AcceptedHeaders}."); } if (string.IsNullOrWhiteSpace(request.Name) || string.IsNullOrWhiteSpace(request.Type)) { if (_logger.IsWarn) { _logger.Warn($"Extension name and type cannot be empty."); } return; } var extension = _ndmExtensions.AddOrUpdate(request.Name.ToLowerInvariant(), _ => new NdmExtensionDetails(request), (_, e) => e); extension.Connect(); try { var acceptedHeaders = request.AcceptedHeaders?.Where(h => !string.IsNullOrEmpty(h)) .Select(h => new Keccak(h)) ?? Enumerable.Empty <Keccak>(); foreach (var headerId in acceptedHeaders) { _dataHeadersExtensions.TryAdd(headerId, extension); } } catch (Exception ex) { if (_logger.IsError) { _logger.Error($"Received an invalid header ID from peer: '{peer}'", ex); } return; } QueryArgs query = null; try { while (true) { query = extension.Queries.Take(); if (_logger.IsTrace) { _logger.Trace($"Sending query for header: '{query.HeaderId}', deposit: '{query.DepositId}', args: {string.Join(", ", query.Args)}, iterations: {query.Iterations}"); } await responseStream.WriteAsync(new NdmQuery { Iterations = query.Iterations, HeaderId = query.HeaderId.ToString(), DepositId = query.DepositId.ToString(), Args = { query.Args } }); } } catch (Exception ex) { if (_logger.IsError) { _logger.Error(ex.ToString(), ex); } if (!(query is null)) { extension.Queries.Add(query); if (_logger.IsInfo) { _logger.Info($"Queued again query for header: '{query.HeaderId}', deposit: '{query.DepositId}'."); } } } if (_logger.IsInfo) { _logger.Info($"Finished using an extension: '{request.Name}' [{request.Type}]."); } }
public NdmExtensionDetails(NdmExtension extension) { Extension = extension; Queries = new BlockingCollection <QueryArgs>(); }