internal AutoRefreshTokenCredential(
            CommunicationTokenRefreshOptions options,
            Func <Action, TimeSpan, ThreadSafeRefreshableAccessTokenCache.IScheduledAction>?scheduler,
            Func <DateTimeOffset>?utcNowProvider)
        {
            if (options.InitialToken is null)
            {
                _accessTokenCache = new ThreadSafeRefreshableAccessTokenCache(
                    Refresh,
                    RefreshAsync,
                    options.RefreshProactively,
                    scheduler,
                    utcNowProvider);
            }
            else
            {
                _accessTokenCache = new ThreadSafeRefreshableAccessTokenCache(
                    Refresh,
                    RefreshAsync,
                    options.RefreshProactively,
                    initialValue: JwtTokenParser.CreateAccessToken(options.InitialToken),
                    scheduler,
                    utcNowProvider);
            }

            AccessToken Refresh(CancellationToken cancellationToken)
            => JwtTokenParser.CreateAccessToken(options.TokenRefresher(cancellationToken));

            async ValueTask <AccessToken> RefreshAsync(CancellationToken cancellationToken)
            => JwtTokenParser.CreateAccessToken(await options.AsyncTokenRefresher(cancellationToken).ConfigureAwait(false));
        }