/// <summary> /// Initializes parts of the object that are common for both inbound and outbound peers. /// </summary> /// <param name="inbound"><c>true</c> for inbound peers, <c>false</c> for outbound peers.</param> /// <param name="peerEndPoint">IP address and port on the side of the peer.</param> /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param> /// <param name="parameters">Various settings and requirements related to how the connections with peers are going to be established, or <c>null</c> to use default parameters.</param> /// <param name="dateTimeProvider">Provider of time functions.</param> /// <param name="loggerFactory">Factory for creating loggers.</param> /// <param name="selfEndpointTracker">Tracker for endpoints known to be self.</param> /// <param name="onDisconnected">Callback that is invoked when peer has finished disconnecting, or <c>null</c> when no notification after the disconnection is required.</param> private NetworkPeer(bool inbound, IPEndPoint peerEndPoint, Network network, NetworkPeerConnectionParameters parameters, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, ISelfEndpointTracker selfEndpointTracker, IAsyncProvider asyncProvider, Action <INetworkPeer> onDisconnected = null, Action <IPEndPoint, Payload> onSendingMessage = null) { this.dateTimeProvider = dateTimeProvider; this.preferredTransactionOptions = parameters.PreferredTransactionOptions; this.SupportedTransactionOptions = parameters.PreferredTransactionOptions & ~TransactionOptions.All; this.State = inbound ? NetworkPeerState.Connected : NetworkPeerState.Created; this.Inbound = inbound; this.PeerEndPoint = peerEndPoint; this.RemoteSocketEndpoint = this.PeerEndPoint; this.RemoteSocketAddress = this.RemoteSocketEndpoint.Address; this.RemoteSocketPort = this.RemoteSocketEndpoint.Port; this.Network = network; this.Behaviors = new List <INetworkPeerBehavior>(); this.selfEndpointTracker = selfEndpointTracker; this.asyncProvider = asyncProvider; this.onDisconnectedAsyncContext = new AsyncLocal <DisconnectedExecutionAsyncContext>(); this.ConnectionParameters = parameters ?? new NetworkPeerConnectionParameters(); this.MyVersion = this.ConnectionParameters.CreateVersion(this.selfEndpointTracker.MyExternalAddress, this.PeerEndPoint, network, this.dateTimeProvider.GetTimeOffset()); this.MessageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>(); this.StateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>(); this.onDisconnected = onDisconnected; this.onSendingMessage = onSendingMessage; string dequeuerName = $"{nameof(NetworkPeer)}-{nameof(this.asyncPayloadsQueue)}-{this.PeerEndPoint.ToString()}"; this.asyncPayloadsQueue = asyncProvider.CreateAndRunAsyncDelegateDequeuer <Payload>(dequeuerName, this.SendMessageHandledAsync); }
public FederationWalletSyncManager(ILoggerFactory loggerFactory, IFederationWalletManager walletManager, ChainIndexer chain, Network network, IBlockStore blockStore, StoreSettings storeSettings, INodeLifetime nodeLifetime, IAsyncProvider asyncProvider) { Guard.NotNull(loggerFactory, nameof(loggerFactory)); Guard.NotNull(walletManager, nameof(walletManager)); Guard.NotNull(chain, nameof(chain)); Guard.NotNull(network, nameof(network)); Guard.NotNull(blockStore, nameof(blockStore)); Guard.NotNull(storeSettings, nameof(storeSettings)); Guard.NotNull(nodeLifetime, nameof(nodeLifetime)); Guard.NotNull(asyncProvider, nameof(asyncProvider)); this.walletManager = walletManager; this.chain = chain; this.blockStore = blockStore; this.coinType = (CoinType)network.Consensus.CoinType; this.storeSettings = storeSettings; this.nodeLifetime = nodeLifetime; this.asyncProvider = asyncProvider; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.blocksQueue = asyncProvider.CreateAndRunAsyncDelegateDequeuer <Block>($"{nameof(FederationWalletSyncManager)}-{nameof(this.blocksQueue)}", this.OnProcessBlockAsync); this.blocksQueueSize = 0; }
/// <summary> /// Initializes the instance of the object. /// </summary> /// <param name="processMessageAsync">User defined callback routine to be executed when a new message arrives to the listener.</param> public CallbackMessageListener(IAsyncProvider asyncProvider, ProcessMessageAsync <T> processMessageAsync, INetworkPeer peer) { string queuerName = $"{nameof(CallbackMessageListener<T>)}-{typeof(T).Name}-{peer.PeerEndPoint?.ToString()}"; this.asyncQueue = asyncProvider.CreateAndRunAsyncDelegateDequeuer <T>(queuerName, new Func <T, CancellationToken, Task>(processMessageAsync)); }