public Task SendAsync(string subscriberId, Message message) { return(_broadcastService.BroadcastAsync(subscriberId, message)); }
public Transaction[] TryBroadcast(ref uint256[] knownBroadcasted) { var height = _Cache.BlockCount; DateTimeOffset startTime = DateTimeOffset.UtcNow; int totalEntries = 0; HashSet <uint256> knownBroadcastedSet = new HashSet <uint256>(knownBroadcasted ?? new uint256[0]); foreach (var confirmedTx in _Cache.GetEntries().Where(e => e.Confirmations > 6).Select(t => t.TransactionId)) { knownBroadcastedSet.Add(confirmedTx); } List <Transaction> broadcasted = new List <Transaction>(); var broadcasting = new List <Tuple <Record, Transaction, Task <bool> > >(); foreach (var broadcast in GetRequests()) { totalEntries++; if (broadcast.Request.PreviousScriptPubKey == null) { var transaction = broadcast.Request.Transaction; var txHash = transaction.GetHash(); if (!broadcast.Tracked) { broadcast.Tracked = true; _Tracker.TransactionCreated(broadcast.Cycle, broadcast.TransactionType, txHash, broadcast.Correlation); RecordMaping(broadcast, transaction, txHash); AddBroadcast(broadcast); } if (!knownBroadcastedSet.Contains(txHash) && broadcast.Request.IsBroadcastableAt(height)) { broadcasting.Add(Tuple.Create(broadcast, transaction, _Broadcaster.BroadcastAsync(transaction))); } knownBroadcastedSet.Add(txHash); } else { foreach (var coin in GetReceivedTransactions(broadcast.Request.PreviousScriptPubKey) //Currently broadcasting transaction might have received transactions for PreviousScriptPubKey .Concat(broadcasting.ToArray().Select(b => b.Item2)) .SelectMany(tx => tx.Outputs.AsCoins()) .Concat(broadcast.Request.KnownPrevious ?? new Coin[0]) .Where(c => c.ScriptPubKey == broadcast.Request.PreviousScriptPubKey)) { var transaction = broadcast.Request.ReSign(RPCClient.Network, coin, out bool cached); var txHash = transaction.GetHash(); if (!cached || !broadcast.Tracked) { broadcast.Tracked = true; _Tracker.TransactionCreated(broadcast.Cycle, broadcast.TransactionType, txHash, broadcast.Correlation); RecordMaping(broadcast, transaction, txHash); AddBroadcast(broadcast); } if (!knownBroadcastedSet.Contains(txHash) && broadcast.Request.IsBroadcastableAt(height)) { broadcasting.Add(Tuple.Create(broadcast, transaction, _Broadcaster.BroadcastAsync(transaction))); } knownBroadcastedSet.Add(txHash); } } var isExpired = height >= broadcast.Expiration; var needTracking = broadcast.TransactionType == TransactionType.ClientRedeem; if (isExpired && (!needTracking || broadcast.Tracked)) { Repository.Delete <Record>("TrustedBroadcasts", broadcast.Request.Transaction.GetHash().ToString()); } } knownBroadcasted = knownBroadcastedSet.ToArray(); foreach (var b in broadcasting) { if (b.Item3.GetAwaiter().GetResult()) { LogBroadcasted(b.Item1); broadcasted.Add(b.Item2); } } Logs.Broadcasters.LogInformation($"Trusted Broadcaster is monitoring {totalEntries} entries in {(long)(DateTimeOffset.UtcNow - startTime).TotalSeconds} seconds"); return(broadcasted.ToArray()); }
public Task StrokeAsync(string subscriberId, Stroke stroke) { return(_broadcastService.BroadcastAsync(subscriberId, stroke)); }