void ConnectionImpl::refresh(Milliseconds timeout, RefreshCallback cb) {
    _refreshCallback = std::move(cb);

    _timer.setTimeout(
        timeout,
        [this] { _refreshCallback(this, Status(ErrorCodes::ExceededTimeLimit, "timeout")); });

    _refreshQueue.push_back(this);

    if (_pushRefreshQueue.size()) {
        _refreshQueue.front()->_refreshCallback(_refreshQueue.front(), _pushRefreshQueue.front()());
        _refreshQueue.pop_front();
        _pushRefreshQueue.pop_front();
    }
}
void ConnectionImpl::refresh(Milliseconds timeout, RefreshCallback cb) {
    _refreshCallback = std::move(cb);

    _timer.setTimeout(timeout, [this] {
        _refreshCallback(this, Status(ErrorCodes::NetworkInterfaceExceededTimeLimit, "timeout"));
    });

    _refreshQueue.push_back(this);

    if (_pushRefreshQueue.size()) {
        auto connPtr = _refreshQueue.front();
        auto callback = _pushRefreshQueue.front();

        _refreshQueue.pop_front();
        _pushRefreshQueue.pop_front();

        auto refreshCb = connPtr->_refreshCallback;
        connPtr->indicateUsed();
        refreshCb(connPtr, callback());
    }
}