TimeoutTracker.java

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.core.amqp.implementation;

import java.time.Duration;
import java.time.Instant;

class TimeoutTracker {
    private final Duration originalTimeout;
    private boolean isTimerStarted;
    private Instant startTime;

    /**
     * Creates an instance to keep track of timed out sends.
     *
     * @param timeout original operationTimeout
     * @param startTrackingTimeout whether/not to start the timeout tracking - right now. If not started now, timer
     * tracking will start upon the first call to {@link TimeoutTracker#elapsed()}/{@link TimeoutTracker#remaining()}
     */
    TimeoutTracker(Duration timeout, boolean startTrackingTimeout) {
        if (timeout.compareTo(Duration.ZERO) < 0) {
            throw new IllegalArgumentException("timeout should be non-negative");
        }

        this.originalTimeout = timeout;

        if (startTrackingTimeout) {
            this.startTime = Instant.now();
        }

        this.isTimerStarted = startTrackingTimeout;
    }

    Duration remaining() {
        return this.originalTimeout.minus(elapsed());
    }

    Duration elapsed() {
        if (!this.isTimerStarted) {
            this.startTime = Instant.now();
            this.isTimerStarted = true;
        }

        return Duration.between(this.startTime, Instant.now());
    }
}