ExtendPeerRepository.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. namespace Abc.Zebus.Directory.Storage
  3. {
  4. public static class ExtendPeerRepository
  5. {
  6. public static bool SetPeerDown(this IPeerRepository repository, PeerId peerId, DateTime timestampUtc)
  7. {
  8. var peer = repository.Get(peerId);
  9. if (peer == null || peer.TimestampUtc > timestampUtc)
  10. return false;
  11. peer.Peer.IsUp = false;
  12. peer.Peer.IsResponding = false;
  13. peer.TimestampUtc = timestampUtc;
  14. repository.AddOrUpdatePeer(peer);
  15. return true;
  16. }
  17. public static bool SetPeerRespondingState(this IPeerRepository repository, PeerId peerId, bool isResponding, out DateTime timestampUtc)
  18. {
  19. var peer = repository.Get(peerId);
  20. if (peer == null || peer.TimestampUtc == null)
  21. {
  22. timestampUtc = default;
  23. return false;
  24. }
  25. timestampUtc = peer.TimestampUtc.Value.AddMilliseconds(1);
  26. repository.SetPeerResponding(peer.PeerId, isResponding, peer.TimestampUtc.Value.AddMilliseconds(1));
  27. return true;
  28. }
  29. public static bool SetPeerRespondingState(this IPeerRepository repository, PeerId peerId, bool isResponding, DateTime timestampUtc)
  30. {
  31. var peer = repository.Get(peerId);
  32. if (peer == null || peer.TimestampUtc == null || peer.TimestampUtc > timestampUtc)
  33. return false;
  34. repository.SetPeerResponding(peer.PeerId, isResponding, timestampUtc);
  35. return true;
  36. }
  37. public static PeerDescriptor? UpdatePeerSubscriptions(this IPeerRepository repository, PeerId peerId, Subscription[] subscriptions, DateTime? timestampUtc)
  38. {
  39. var peerDescriptor = repository.Get(peerId);
  40. if (peerDescriptor == null)
  41. throw new InvalidOperationException($"The specified Peer ({peerId}) does not exist.");
  42. if (peerDescriptor.TimestampUtc > timestampUtc)
  43. return null;
  44. peerDescriptor.TimestampUtc = timestampUtc;
  45. peerDescriptor.Subscriptions = subscriptions;
  46. repository.AddOrUpdatePeer(peerDescriptor);
  47. return peerDescriptor;
  48. }
  49. }
  50. }