public LazyFileTransfer(IConfigManager config, ILogger <LazyFileTransfer> logger) { _config = config; _logger = logger; _config.WhenConfigChanges.Subscribe(ReloadConfig); ReloadConfig(null); _taskQueue = new SerialAsyncTasker(); }
public NodeManager(IEnumerable <INyxNode> runningNodes, ILogger <NodeManager> logger, PluginManager pluginManager) { Current = this; _logger = logger; _pluginManager = pluginManager; _tasker = new SerialAsyncTasker(); // Find the hub if its running in this app domain. var nyxNodes = runningNodes as IList <INyxNode> ?? runningNodes.ToList(); _hub = nyxNodes.FirstOrDefault(n => n is INyxHub) as INyxHub; _borg = nyxNodes.FirstOrDefault(n => n is INyxBorg) as INyxBorg; if (_borg != null) { _computerInfo = new ComputerInfo(); } _messageReceivedBorg = new Subject <INyxMessage>(); _messageReceivedHub = new Subject <INyxMessage>(); SupportedActions = _hub != null ? new[] { NodesInfo, NodesUpdateSubscribe, NodesPing, NodesPingStop } : new[] { NodesInfoReport }; // Run the cleaner in a queue with a max of 5 items in the queue. if (_borg != null) { _internalHubWatch = Observable.Create <bool>(o => { var disposable = new CompositeDisposable(); var synlock = new object(); var hubOnline = false; disposable.Add(_borg.ConnectionStatusStream .DistinctUntilChanged() .Subscribe(c => { lock (synlock) { var tempState = c.HasFlag(ConnectionStatus.Online); if (tempState == hubOnline) { return; } hubOnline = tempState; o.OnNext(tempState); } })); return(disposable); }).Publish().RefCount(); _disposables.Add(_internalHubWatch .Where(s => !s) .ObserveOnPool() .Subscribe(o => { lock (NodesLock) { var removed = new List <NodeInfo>(_nodesInfo); _nodesInfo.Clear(); _groups.NodesByGroup.Clear(); _nodesSubject.OnNext(new NodesChanges { Removed = removed }); _groupSubject.OnNext(GroupsInfo.Empty); _logger.Debug("Removed all nodes. Hub is offline or we lost connection."); } })); } if (_hub == null) { return; } _disposables.Add(Observable.Interval(TimeSpan.FromMinutes(1)).ObserveOn(new OrderedTaskScheduler(5)).Subscribe(o => { lock (NodesLock) { var removed = new List <NodeInfo>(); _nodesInfo.RemoveAll(ni => { var res = DateTime.Now.Subtract(ni.TimeStamp).TotalSeconds > 140; if (res) { removed.Add(ni); } return(res); }); if (removed.Count == 0) { return; } _logger.Debug("Removed {0} dead nodes.", removed.Count); foreach (var update in _pushUpdates) { SendNodesInfo(null, update, new List <NodeInfo>(), removed); } } })); }