private protected new async Task <T?> Load <T>(UriQueryStringBuilder uri, bool hasPayload = true) where T : class, IWiremessagePayload
        {
            await Authenticate();

            if (!SkipAuthentication())
            {
                var sessionToken = _authData.SessionToken;
                if (sessionToken is null)
                {
                    throw new ArgumentException("No session token present for connecting");
                }

                uri = uri.AddQuery("token", sessionToken);
            }

            var result = await base.Load <T>(uri, hasPayload);

            // only touch token if successful
            if (!SkipAuthentication())
            {
                await _authData.TouchSessionTokenAsync();
            }

            return(result);
        }