<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.1" />

Timeout

class Timeout
using Org.BouncyCastle.Utilities.Date; using System; namespace Org.BouncyCastle.Tls { internal class Timeout { private long durationMillis; private long startMillis; internal Timeout(long durationMillis) : this(durationMillis, DateTimeUtilities.CurrentUnixMs()) { } internal Timeout(long durationMillis, long currentTimeMillis) { this.durationMillis = System.Math.Max(0, durationMillis); startMillis = System.Math.Max(0, currentTimeMillis); } internal long RemainingMillis(long currentTimeMillis) { lock (this) { if (startMillis <= currentTimeMillis) { long num = currentTimeMillis - startMillis; long num2 = durationMillis - num; if (num2 > 0) return num2; return durationMillis = 0; } startMillis = currentTimeMillis; return durationMillis; } } internal static int ConstrainWaitMillis(int waitMillis, Timeout timeout, long currentTimeMillis) { if (waitMillis < 0) return -1; int waitMillis2 = GetWaitMillis(timeout, currentTimeMillis); if (waitMillis2 < 0) return -1; if (waitMillis == 0) return waitMillis2; if (waitMillis2 == 0) return waitMillis; return System.Math.Min(waitMillis, waitMillis2); } internal static Timeout ForWaitMillis(int waitMillis) { return ForWaitMillis(waitMillis, DateTimeUtilities.CurrentUnixMs()); } internal static Timeout ForWaitMillis(int waitMillis, long currentTimeMillis) { if (waitMillis < 0) throw new ArgumentException("cannot be negative", "waitMillis"); if (waitMillis > 0) return new Timeout(waitMillis, currentTimeMillis); return null; } internal static int GetWaitMillis(Timeout timeout, long currentTimeMillis) { if (timeout == null) return 0; long num = timeout.RemainingMillis(currentTimeMillis); if (num < 1) return -1; if (num > 2147483647) return 2147483647; return (int)num; } internal static bool HasExpired(Timeout timeout) { return HasExpired(timeout, DateTimeUtilities.CurrentUnixMs()); } internal static bool HasExpired(Timeout timeout, long currentTimeMillis) { if (timeout != null) return timeout.RemainingMillis(currentTimeMillis) < 1; return false; } } }