コード例 #1
0
 public ConnectionFactory(string hubName, IServiceEndpointProvider provider, IServerNameProvider nameProvider, ILoggerFactory loggerFactory)
 {
     _provider      = provider ?? throw new ArgumentNullException(nameof(provider));
     _loggerFactory = loggerFactory == null ? (ILoggerFactory)NullLoggerFactory.Instance : new GracefulLoggerFactory(loggerFactory);
     _userId        = nameProvider?.GetName();
     _hubName       = hubName;
 }
コード例 #2
0
        public MockServiceHubDispatcher(
            IServiceProtocol serviceProtocol,
            IHubContext <THub> context,
            IServiceConnectionManager <THub> serviceConnectionManager,
            IClientConnectionManager clientConnectionManager,
            IServiceEndpointManager serviceEndpointManager,
            IOptions <ServiceOptions> options,
            ILoggerFactory loggerFactory,
            IEndpointRouter router,
            IServerNameProvider nameProvider,
            ServerLifetimeManager serverLifetimeManager,
            IClientConnectionFactory clientConnectionFactory) : base(
                serviceProtocol,
                context,
                serviceConnectionManager,
                clientConnectionManager,
                serviceEndpointManager,
                options,
                loggerFactory,
                router,
                nameProvider,
                serverLifetimeManager,
                clientConnectionFactory,
                null)
        {
            MockService = new ConnectionTrackingMockService();

            // just store copies of these locally to keep the base class' accessor modifiers intact
            _loggerFactory           = loggerFactory;
            _clientConnectionManager = clientConnectionManager;
            _serviceProtocol         = serviceProtocol;
            _clientConnectionFactory = clientConnectionFactory;
        }
コード例 #3
0
 public ServiceEndpointManager(IServerNameProvider provider, ServiceOptions options, ILoggerFactory loggerFactory) :
     base(options,
          loggerFactory?.CreateLogger <ServiceEndpointManager>())
 {
     _provider = provider;
     _options  = options;
 }
コード例 #4
0
 public NegotiateHandler(
     IOptions <HubOptions> globalHubOptions,
     IOptions <HubOptions <THub> > hubOptions,
     IServiceEndpointManager endpointManager,
     IEndpointRouter router,
     IUserIdProvider userIdProvider,
     IServerNameProvider nameProvider,
     IConnectionRequestIdProvider connectionRequestIdProvider,
     IOptions <ServiceOptions> options,
     IBlazorDetector blazorDetector,
     ILogger <NegotiateHandler <THub> > logger)
 {
     _logger                      = logger ?? throw new ArgumentNullException(nameof(logger));
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _serverName                  = nameProvider?.GetName();
     _userIdProvider              = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _claimsProvider              = options?.Value?.ClaimsProvider;
     _diagnosticClientFilter      = options?.Value?.DiagnosticClientFilter;
     _blazorDetector              = blazorDetector ?? new DefaultBlazorDetector();
     _mode = options.Value.ServerStickyMode;
     _enableDetailedErrors   = globalHubOptions.Value.EnableDetailedErrors == true;
     _endpointsCount         = options.Value.Endpoints.Length;
     _maxPollInterval        = options.Value.MaxPollIntervalInSeconds;
     _transportTypeDetector  = options.Value.TransportTypeDetector;
     _customHandshakeTimeout = GetCustomHandshakeTimeout(hubOptions.Value.HandshakeTimeout ?? globalHubOptions.Value.HandshakeTimeout);
     _hubName = typeof(THub).Name;
 }
コード例 #5
0
        private async Task UpdateAccessKeyAsyncCore(IServerNameProvider provider, ILoggerFactory loggerFactory)
        {
            _timer.Start();

            var logger = loggerFactory.CreateLogger <AadAccessKey>();

            while (await _timer)
            {
                int i;
                for (i = 0; i < AuthorizeMaxRetryTimes; i++)
                {
                    var source = new CancellationTokenSource(AuthorizeTimeout);
                    try
                    {
                        await AuthorizeAsync(provider.GetName(), source.Token);

                        Log.SucceedAuthorizeAccessKey(logger, Endpoint);
                        _isAuthorized = true;
                        break;
                    }
                    catch (Exception e)
                    {
                        Log.FailedAuthorizeAccessKey(logger, Endpoint, e);
                        await Task.Delay(AuthorizeRetryInterval);
                    }
                }

                if (i == AuthorizeMaxRetryTimes)
                {
                    _isAuthorized = false;
                    Log.ErrorAuthorizeAccessKey(logger, Endpoint);
                }
                _initializedTcs.TrySetResult(null);
            }
        }
コード例 #6
0
        public ServiceHubDispatcher(
            IServiceProtocol serviceProtocol,
            IHubContext <THub> context,
            IServiceConnectionManager <THub> serviceConnectionManager,
            IClientConnectionManager clientConnectionManager,
            IServiceEndpointManager serviceEndpointManager,
            IOptions <ServiceOptions> options,
            ILoggerFactory loggerFactory,
            IEndpointRouter router,
            IServerNameProvider nameProvider,
            ServerLifetimeManager serverLifetimeManager,
            IClientConnectionFactory clientConnectionFactory,
            IServiceEventHandler serviceEventHandler)
        {
            _serviceProtocol          = serviceProtocol;
            _serviceConnectionManager = serviceConnectionManager;
            _clientConnectionManager  = clientConnectionManager;
            _serviceEndpointManager   = serviceEndpointManager;
            _options = options != null ? options.Value : throw new ArgumentNullException(nameof(options));

            Context = context;

            _router                  = router ?? throw new ArgumentNullException(nameof(router));
            _loggerFactory           = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
            _logger                  = loggerFactory.CreateLogger <ServiceHubDispatcher <THub> >();
            _clientConnectionFactory = clientConnectionFactory;
            _nameProvider            = nameProvider;
            _hubName                 = typeof(THub).Name;
            _serviceEventHandler     = serviceEventHandler;

            serverLifetimeManager?.Register(ShutdownAsync);
        }
コード例 #7
0
 internal ServiceManager(ServiceManagerOptions serviceManagerOptions)
 {
     _serviceManagerOptions = serviceManagerOptions;
     _endpoint           = new ServiceEndpoint(_serviceManagerOptions.ConnectionString, EndpointType.Secondary);
     _endpointProvider   = new ServiceEndpointProvider(_endpoint, appName: _serviceManagerOptions.ApplicationName);
     _serverNameProvider = new DefaultServerNameProvider();
 }
コード例 #8
0
 public Task UpdateAccessKeyAsync(IServerNameProvider provider, ILoggerFactory loggerFactory)
 {
     if (Interlocked.CompareExchange(ref initialized, 1, 0) == 0)
     {
         Task.Run(() => UpdateAccessKeyAsyncCore(provider, loggerFactory));
     }
     return(Task.CompletedTask);
 }
コード例 #9
0
 internal ServiceManager(ServiceManagerOptions serviceManagerOptions, string productInfo)
 {
     _serviceManagerOptions = serviceManagerOptions;
     _endpoint         = new ServiceEndpoint(_serviceManagerOptions.ConnectionString, EndpointType.Secondary);
     _endpointProvider = new ServiceEndpointProvider(_endpoint, Options.Create(new ServiceOptions
     {
         ApplicationName = _serviceManagerOptions.ApplicationName
     }));
     _serverNameProvider = new DefaultServerNameProvider();
     _productInfo        = productInfo;
 }
コード例 #10
0
 public ServiceConnectionFactory(
     IServiceProtocol serviceProtocol,
     IClientConnectionManager clientConnectionManager,
     IConnectionFactory connectionFactory,
     ILoggerFactory logger,
     IServerNameProvider nameProvider
     )
 {
     _serviceProtocol         = serviceProtocol;
     _clientConnectionManager = clientConnectionManager;
     _connectionFactory       = connectionFactory;
     _logger       = logger;
     _nameProvider = nameProvider;
 }
コード例 #11
0
 internal ServiceManager(ServiceManagerOptions serviceManagerOptions, string productInfo)
 {
     _serviceManagerOptions = serviceManagerOptions;
     _endpoint         = new ServiceEndpoint(_serviceManagerOptions.ConnectionString, EndpointType.Secondary);
     _endpointProvider = new ServiceEndpointProvider(_endpoint, Options.Create(new ServiceOptions
     {
         ApplicationName = _serviceManagerOptions.ApplicationName,
         Proxy           = serviceManagerOptions.Proxy
     }).Value);
     _serverNameProvider = new DefaultServerNameProvider();
     _productInfo        = productInfo;
     _restClient         = new RestClient();
     _restApiProvider    = new RestApiProvider(_serviceManagerOptions.ConnectionString);
 }
コード例 #12
0
        /// <summary>
        /// For test only.
        /// </summary>
        internal AccessKeySynchronizer(
            IServerNameProvider serverNameProvider,
            ILoggerFactory loggerFactory,
            bool start
            )
        {
            if (start)
            {
                _ = UpdateAsync();
            }

            _provider = serverNameProvider ?? throw new ArgumentNullException(nameof(serverNameProvider));
            _factory  = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
        }
 public MultiEndpointServiceConnectionContainerFactory(
     IServiceConnectionFactory serviceConnectionFactory,
     IServiceEndpointManager serviceEndpointManager,
     IEndpointRouter router,
     IOptions <ServiceOptions> options,
     IServerNameProvider nameProvider,
     ILoggerFactory loggerFactory)
 {
     _loggerFactory            = loggerFactory;
     _router                   = router ?? throw new ArgumentNullException(nameof(router));
     _serviceConnectionFactory = serviceConnectionFactory;
     _nameProvider             = nameProvider;
     _options                  = options?.Value;
     _serviceEndpointManager   = serviceEndpointManager ?? throw new ArgumentNullException(nameof(serviceEndpointManager));
 }
コード例 #14
0
        public ServiceEndpointProvider(IServerNameProvider provider, ServiceEndpoint endpoint, ServiceOptions options)
        {
            _accessTokenLifetime = options.AccessTokenLifetime;

            // Version is ignored for aspnet signalr case
            _endpoint  = endpoint.Endpoint;
            _accessKey = endpoint.AccessKey;
            _appName   = options.ApplicationName;
            _port      = endpoint.Port;
            _algorithm = options.AccessTokenAlgorithm;

            _provider = provider;

            Proxy = options.Proxy;
        }
コード例 #15
0
 public ServiceConnectionContainerFactory(
     IServiceConnectionFactory serviceConnectionFactory,
     IServiceEndpointManager serviceEndpointManager,
     IMessageRouter router,
     IServiceEndpointOptions options,
     IServerNameProvider nameProvider,
     ILoggerFactory loggerFactory)
 {
     _serviceConnectionFactory = serviceConnectionFactory;
     _serviceEndpointManager   = serviceEndpointManager ?? throw new ArgumentNullException(nameof(serviceEndpointManager));
     _router        = router ?? throw new ArgumentNullException(nameof(router));
     _options       = options;
     _nameProvider  = nameProvider;
     _loggerFactory = loggerFactory;
 }
コード例 #16
0
        public ServiceEndpointManager(
            IServerNameProvider provider,
            IOptionsMonitor <ServiceOptions> optionsMonitor,
            ILoggerFactory loggerFactory
            ) :
            base(optionsMonitor.CurrentValue, loggerFactory.CreateLogger <ServiceEndpointManager>())
        {
            _options       = optionsMonitor.CurrentValue;
            _logger        = loggerFactory?.CreateLogger <ServiceEndpointManager>() ?? throw new ArgumentNullException(nameof(loggerFactory));
            _loggerFactory = loggerFactory;

            optionsMonitor.OnChange(OnChange);
            _scaleTimeout = _options.ServiceScaleTimeout;

            _provider = provider;
        }
 public MultiEndpointServiceConnectionContainer(
     IServiceConnectionFactory serviceConnectionFactory,
     string hub,
     int count,
     IServiceEndpointManager endpointManager,
     IMessageRouter router,
     IServerNameProvider nameProvider,
     ILoggerFactory loggerFactory
     ) : this(
         hub,
         endpoint => CreateContainer(serviceConnectionFactory, endpoint, count, loggerFactory),
         endpointManager,
         router,
         loggerFactory
         )
 {
 }
コード例 #18
0
        internal ServiceManager(ServiceManagerContext context, RestClientFactory restClientFactory)
        {
            _endpoint = context.ServiceEndpoints.Single();//temp solution

            _serverNameProvider = new DefaultServerNameProvider();

            var serviceOptions = Options.Create(new ServiceOptions
            {
                ApplicationName = context.ApplicationName,
                Proxy           = context.Proxy
            }).Value;

            _endpointProvider = new ServiceEndpointProvider(_serverNameProvider, _endpoint, serviceOptions);

            _productInfo       = context.ProductInfo;
            _context           = context;
            _restClientFactory = restClientFactory;
        }
コード例 #19
0
        public ServiceEndpointProvider(
            IServerNameProvider provider,
            ServiceEndpoint endpoint,
            ServiceOptions serviceOptions,
            ILoggerFactory loggerFactory = null
            )
        {
            _accessTokenLifetime = serviceOptions.AccessTokenLifetime;
            _accessKey           = endpoint.AccessKey;
            _appName             = serviceOptions.ApplicationName;
            _algorithm           = serviceOptions.AccessTokenAlgorithm;

            Proxy = serviceOptions.Proxy;

            _generator = new DefaultServiceEndpointGenerator(endpoint);

            _ = UpdateAccessKeyAsync(provider, endpoint, loggerFactory ?? NullLoggerFactory.Instance);
        }
コード例 #20
0
 public ServiceConnectionFactory(
     IServiceProtocol serviceProtocol,
     IClientConnectionManager clientConnectionManager,
     IConnectionFactory connectionFactory,
     ILoggerFactory loggerFactory,
     ConnectionDelegate connectionDelegate,
     IClientConnectionFactory clientConnectionFactory,
     IServerNameProvider nameProvider,
     IServiceEventHandler serviceEventHandler)
 {
     _serviceProtocol         = serviceProtocol;
     _clientConnectionManager = clientConnectionManager;
     _connectionFactory       = connectionFactory;
     _loggerFactory           = loggerFactory;
     _connectionDelegate      = connectionDelegate;
     _clientConnectionFactory = clientConnectionFactory;
     _nameProvider            = nameProvider;
     _serviceEventHandler     = serviceEventHandler;
 }
コード例 #21
0
 public MockServiceConnectionFactory(
     IMockService mockService,
     IServiceProtocol serviceProtocol,
     IClientConnectionManager clientConnectionManager,
     IConnectionFactory connectionFactory,
     ILoggerFactory loggerFactory,
     ConnectionDelegate connectionDelegate,
     IClientConnectionFactory clientConnectionFactory,
     IServerNameProvider nameProvider)
     : base(
         serviceProtocol,
         clientConnectionManager,
         new MockServiceConnectionContextFactory(mockService),   // use instead of connectionFactory
         loggerFactory,
         connectionDelegate,
         clientConnectionFactory,
         nameProvider)
 {
     _mockService = mockService;
 }
コード例 #22
0
        public ServiceEndpointProvider(
            IServerNameProvider provider,
            ServiceEndpoint endpoint,
            ServiceOptions serviceOptions,
            ILoggerFactory loggerFactory)
        {
            _accessTokenLifetime = serviceOptions.AccessTokenLifetime;
            _accessKey           = endpoint.AccessKey;
            _appName             = serviceOptions.ApplicationName;
            _algorithm           = serviceOptions.AccessTokenAlgorithm;

            Proxy = serviceOptions.Proxy;

            _generator = new DefaultServiceEndpointGenerator(endpoint);

            if (endpoint.AccessKey is AadAccessKey key)
            {
                _ = key.UpdateAccessKeyAsync(provider, loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)));
            }
        }
コード例 #23
0
 public ServiceHubDispatcher(IReadOnlyList <string> hubNames, IServiceProtocol protocol,
                             IServiceConnectionManager serviceConnectionManager, IClientConnectionManager clientConnectionManager,
                             IServiceEndpointManager serviceEndpointManager,
                             IEndpointRouter router,
                             IOptions <ServiceOptions> options,
                             IServerNameProvider nameProvider,
                             ILoggerFactory loggerFactory)
 {
     _hubNames                 = hubNames;
     _name                     = $"{nameof(ServiceHubDispatcher)}[{string.Join(",", hubNames)}]";
     _loggerFactory            = loggerFactory;
     _protocol                 = protocol ?? throw new ArgumentNullException(nameof(protocol));
     _router                   = router ?? throw new ArgumentNullException(nameof(router));
     _serviceConnectionManager = serviceConnectionManager ?? throw new ArgumentNullException(nameof(serviceConnectionManager));
     _clientConnectionManager  = clientConnectionManager ?? throw new ArgumentNullException(nameof(clientConnectionManager));
     _nameProvider             = nameProvider;
     _options                  = options?.Value;
     _serviceEndpointManager   = serviceEndpointManager ?? throw new ArgumentNullException(nameof(serviceEndpointManager));
     _logger                   = _loggerFactory.CreateLogger <ServiceHubDispatcher>();
 }
コード例 #24
0
        public async Task UpdateAccessKeyAsync(IServerNameProvider provider, ServiceEndpoint endpoint, ILoggerFactory loggerFactory)
        {
            if (endpoint.AccessKey is AadAccessKey key)
            {
                _timer.Start();
            }
            else
            {
                return;
            }

            var logger = loggerFactory.CreateLogger <ServiceEndpointProvider>();

            while (await _timer)
            {
                var isAuthorized = false;
                for (int i = 0; i < AuthorizeMaxRetryTimes; i++)
                {
                    logger.LogInformation($"Try authorizing AccessKey...({i})");
                    var source = new CancellationTokenSource(AuthorizeTimeout);
                    try
                    {
                        await key.AuthorizeAsync(endpoint.Endpoint, endpoint.Port, provider.GetName(), source.Token);

                        logger.LogInformation("AccessKey has been authorized successfully.");
                        isAuthorized = true;
                        break;
                    }
                    catch (Exception e)
                    {
                        logger.LogWarning(e, $"Failed to authorize AccessKey, will retry in {AuthorizeRetryIntervalInSec} seconds.");
                        await Task.Delay(AuthorizeRetryInterval);
                    }
                }

                if (!isAuthorized)
                {
                    logger.LogError($"AccessKey authorized failed more than {AuthorizeMaxRetryTimes} times.");
                }
            }
        }
コード例 #25
0
 public NegotiateHandler(
     IOptions <HubOptions> hubOptions,
     IServiceEndpointManager endpointManager,
     IEndpointRouter router,
     IUserIdProvider userIdProvider,
     IServerNameProvider nameProvider,
     IConnectionRequestIdProvider connectionRequestIdProvider,
     IOptions <ServiceOptions> options,
     IBlazorDetector blazorDetector)
 {
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _serverName                  = nameProvider?.GetName();
     _userIdProvider              = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _claimsProvider              = options?.Value?.ClaimsProvider;
     _diagnosticClientFilter      = options?.Value?.DiagnosticClientFilter;
     _blazorDetector              = blazorDetector ?? new DefaultBlazorDetector();
     _mode = options.Value.ServerStickyMode;
     _enableDetailedErrors = hubOptions.Value.EnableDetailedErrors == true;
     _endpointsCount       = options.Value.Endpoints.Length;
     _maxPollInterval      = options.Value.MaxPollIntervalInSeconds;
 }
コード例 #26
0
        public ServiceHubDispatcher(IServiceProtocol serviceProtocol,
                                    IServiceConnectionManager <THub> serviceConnectionManager,
                                    IClientConnectionManager clientConnectionManager,
                                    IServiceEndpointManager serviceEndpointManager,
                                    IOptions <ServiceOptions> options,
                                    ILoggerFactory loggerFactory,
                                    IEndpointRouter router,
                                    IServerNameProvider nameProvider,
                                    IClientConnectionFactory clientConnectionFactory)
        {
            _serviceProtocol          = serviceProtocol;
            _serviceConnectionManager = serviceConnectionManager;
            _clientConnectionManager  = clientConnectionManager;
            _serviceEndpointManager   = serviceEndpointManager;
            _options = options != null ? options.Value : throw new ArgumentNullException(nameof(options));

            _router                  = router ?? throw new ArgumentNullException(nameof(router));
            _loggerFactory           = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
            _logger                  = loggerFactory.CreateLogger <ServiceHubDispatcher <THub> >();
            _clientConnectionFactory = clientConnectionFactory;
            _nameProvider            = nameProvider;
            _hubName                 = typeof(THub).Name;
        }
コード例 #27
0
        public ServiceEndpointProvider(
            IServerNameProvider provider,
            ServiceEndpoint endpoint,
            ServiceOptions options,
            ILoggerFactory loggerFactory)
        {
            _accessTokenLifetime = options.AccessTokenLifetime;

            // Version is ignored for aspnet signalr case
            _endpoint       = endpoint.Endpoint;
            _clientEndpoint = endpoint.ClientEndpoint ?? endpoint.Endpoint;
            _accessKey      = endpoint.AccessKey;
            _appName        = options.ApplicationName;
            _port           = endpoint.Port;
            _algorithm      = options.AccessTokenAlgorithm;

            _provider = provider;
            Proxy     = options.Proxy;

            if (endpoint.AccessKey is AadAccessKey key)
            {
                _ = key.UpdateAccessKeyAsync(provider, loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)));
            }
        }
コード例 #28
0
 public NegotiateMiddleware(OwinMiddleware next, HubConfiguration configuration, string appName, IServiceEndpointManager endpointManager, IEndpointRouter router, ServiceOptions options, IServerNameProvider serverNameProvider, IConnectionRequestIdProvider connectionRequestIdProvider, ILoggerFactory loggerFactory)
     : base(next)
 {
     _configuration               = configuration;
     _provider                    = configuration.Resolver.Resolve <IUserIdProvider>();
     _appName                     = appName ?? throw new ArgumentNullException(nameof(appName));
     _claimsProvider              = options?.ClaimsProvider;
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _logger                      = loggerFactory?.CreateLogger <NegotiateMiddleware>() ?? throw new ArgumentNullException(nameof(loggerFactory));
     _serverName                  = serverNameProvider?.GetName();
     _mode = options.ServerStickyMode;
     _enableDetailedErrors = configuration.EnableDetailedErrors;
     _endpointsCount       = options.Endpoints.Length;
     _maxPollInterval      = options.MaxPollIntervalInSeconds;
 }
コード例 #29
0
 public NegotiateMiddleware(OwinMiddleware next, HubConfiguration configuration, string appName, IServiceEndpointManager endpointManager, IEndpointRouter router, ServiceOptions options, IServerNameProvider serverNameProvider, ILoggerFactory loggerFactory)
     : base(next)
 {
     _configuration   = configuration;
     _provider        = configuration.Resolver.Resolve <IUserIdProvider>();
     _appName         = appName ?? throw new ArgumentNullException(nameof(appName));
     _claimsProvider  = options?.ClaimsProvider;
     _endpointManager = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router          = router ?? throw new ArgumentNullException(nameof(router));
     _logger          = loggerFactory?.CreateLogger <NegotiateMiddleware>() ?? throw new ArgumentNullException(nameof(loggerFactory));
     _serverName      = serverNameProvider?.GetName();
     _mode            = options.ServerStickyMode;
 }
コード例 #30
0
 public NegotiateHandler(
     IOptions <HubOptions> hubOptions,
     IServiceEndpointManager endpointManager, IEndpointRouter router, IUserIdProvider userIdProvider, IServerNameProvider nameProvider, IConnectionRequestIdProvider connectionRequestIdProvider, IOptions <ServiceOptions> options)
 {
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _serverName                  = nameProvider?.GetName();
     _userIdProvider              = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _claimsProvider              = options?.Value?.ClaimsProvider;
     _mode = options.Value.ServerStickyMode;
     _enableDetailedErrors = hubOptions.Value.EnableDetailedErrors == true;
     _endpointsCount       = options.Value.Endpoints.Length;
 }