/// <summary>
        /// Adds the minimum essential Azure SignalR services to the specified <see cref="ISignalRServerBuilder" />.
        /// </summary>
        /// <param name="builder">The <see cref="ISignalRServerBuilder"/>.</param>
        /// <param name="configure">A callback to configure the <see cref="ServiceOptions"/>.</param>
        /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
        public static ISignalRServerBuilder AddAzureSignalR(this ISignalRServerBuilder builder, Action <ServiceOptions> configure)
        {
            builder.AddAzureSignalR()
            .Services.Configure(configure);

            return(builder);
        }
 public static ISignalRServerBuilder AddRedis(this ISignalRServerBuilder builder, string redisConnectionString)
 {
     return(AddRedis(builder, o =>
     {
         o.Configuration = ConfigurationOptions.Parse(redisConnectionString);
     }));
 }
 /// <summary>
 /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using an Azure Service Bus topic.
 /// </summary>
 /// <param name="builder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="configureOptions">A callback to configure the service bus options.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddAzureServiceBus(this ISignalRServerBuilder builder, Action <SignalRAzureServiceBusOptions> configureOptions)
 {
     builder.Services.Configure(configureOptions);
     builder.Services.PostConfigure <SignalRAzureServiceBusOptions>(options =>
     {
         if (string.IsNullOrEmpty(options.ConnectionString))
         {
             throw new ArgumentException("ConnectionString must be specified");
         }
         if (string.IsNullOrEmpty(options.TopicName))
         {
             throw new ArgumentException("TopicName must be specified");
         }
         if (options.AutoDeleteSubscriptionOnIdle.TotalMinutes < 5)
         {
             throw new ArgumentException("AutoDeleteSubscriptionOnIdle must be at least 5 minutes");
         }
         if (options.MessageTimeToLive.Ticks <= 0)
         {
             throw new ArgumentException("MessageTimeToLive must be strictly positive");
         }
     });
     builder.Services.AddSingleton <INodeIdProvider, NodeIdProvider>();
     builder.Services.AddSingleton <IMessageSenderProvider, MessageSenderProvider>();
     builder.Services.AddSingleton <IServiceBusPublisher, ServiceBusPublisher>();
     builder.Services.AddSingleton <IServiceBusListener, ServiceBusListener>();
     builder.Services.AddSingleton(typeof(MessageSenderHubLifetimeManager <>));
     builder.Services.AddSingleton(typeof(HubLifetimeManager <>), typeof(AzureServiceBusHubLifetimeManager <>));
     builder.Services.AddHostedService <MessageDispatcher>();
     return(builder);
 }
Example #4
0
        private static ISignalRServerBuilder AddAzureSignalRCore(this ISignalRServerBuilder builder)
        {
            builder.Services
            .AddSingleton(typeof(HubLifetimeManager <>), typeof(ServiceLifetimeManager <>))
            .AddSingleton(typeof(IServiceProtocol), typeof(ServiceProtocol))
            .AddSingleton(typeof(IClientConnectionManager), typeof(ClientConnectionManager))
            .AddSingleton(typeof(IServiceConnectionManager <>), typeof(ServiceConnectionManager <>))
            .AddSingleton(typeof(IServiceEndpointManager), typeof(ServiceEndpointManager))
            .AddSingleton(typeof(IServerNameProvider), typeof(DefaultServerNameProvider))
            .AddSingleton(typeof(IBlazorDetector), typeof(DefaultBlazorDetector))
            .AddSingleton(typeof(ServiceHubDispatcher <>))
            .AddSingleton(typeof(ServerLifetimeManager))
            .AddSingleton(typeof(AzureSignalRMarkerService))
            .AddSingleton <IClientConnectionFactory, ClientConnectionFactory>()
            .AddSingleton <IHostedService, HeartBeat>()
            .AddSingleton <NegotiateHandler>();

            // If a custom router is added, do not add the default router
            builder.Services.TryAddSingleton(typeof(IEndpointRouter), typeof(DefaultEndpointRouter));
            builder.Services.TryAddSingleton(typeof(IConnectionRequestIdProvider), typeof(DefaultConnectionRequestIdProvider));

#if !NETSTANDARD2_0
            builder.Services.TryAddSingleton <AzureSignalRHostedService>();
            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <IStartupFilter, AzureSignalRStartupFilter>());
            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <MatcherPolicy, NegotiateMatcherPolicy>());
#endif

            return(builder);
        }
Example #5
0
 /// <summary>
 /// Adds the minimum essential Azure SignalR services to the specified <see cref="ISignalRServerBuilder" />.
 /// </summary>
 /// <param name="builder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="connectionString">The connection string of an Azure SignalR Service instance.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddAzureSignalR(this ISignalRServerBuilder builder, string connectionString)
 {
     return(builder.AddAzureSignalR(options =>
     {
         options.ConnectionString = connectionString;
     }));
 }
 /// <summary>
 /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using a shared Orleans cluster.
 /// </summary>
 /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="clusterClient">The <see cref="IClusterClient"/>.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddOrleans <THub>(this ISignalRServerBuilder signalrBuilder, Action <OrleansOptions <THub> > configure) where THub : Hub
 {
     signalrBuilder.Services.Configure(configure);
     signalrBuilder.Services.AddSingleton(typeof(HubLifetimeManager <THub>), typeof(OrleansHubLifetimeManager <THub>));
     signalrBuilder.Services.AddSingleton(typeof(IHubProxy <THub>), provider => new HubProxy <THub>(provider.GetRequiredService <IOptions <OrleansOptions <THub> > >().Value.ClusterClient));
     return(signalrBuilder);
 }
        public static void AddSignalR(this IServiceCollection services, ApplicationConfiguration applicationConfiguration)
        {
            // register SignalR
            ISignalRServerBuilder signalRBuilder = services.AddSignalR(configure: options => { options.EnableDetailedErrors = applicationConfiguration.Environment.IsLocalDevelopmentOrTest(); })
                                                   .AddJsonProtocol(configure: options =>
            {
                JsonSerializerOptions serializerSettings       = options.PayloadSerializerOptions;
                serializerSettings.IgnoreNullValues            = true;
                serializerSettings.PropertyNameCaseInsensitive = false;
                serializerSettings.PropertyNamingPolicy        = JsonNamingPolicy.CamelCase;
                serializerSettings.WriteIndented = false;

                JsonConverterSetup.Configure(serializerSettings.Converters);

                // Note Additional converters that require DI are enabled elsewhere
            });

            // if we're running anywhere but LOCAL or TEST then configure the redis backplane for SignalR
            // DON'T ATTEMPT TO ENABLE THIS LOCALLY, IT WILL NOT WORK. AWS redis does not allow connections
            // from outside AWS (regardless of security group configuration)
            if (!applicationConfiguration.Environment.IsLocalOrTest())
            {
                _signalRConnectionFactory = new SignalRConnectionFactory();

                signalRBuilder.AddStackExchangeRedis(configure: options =>
                {
                    options.Configuration.ChannelPrefix = $"Labs-NFT-Server-{applicationConfiguration.Environment.GetName()}";
                    options.ConnectionFactory           =
                        writer => _signalRConnectionFactory.ConnectionFactoryAsync(writer: writer, applicationConfiguration: applicationConfiguration);
                });
            }
        }
Example #8
0
        /// <summary>
        ///     Adds scale-out to a <see cref="ISignalRServerBuilder" />, using a shared Orleans cluster.
        /// </summary>
        /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder" /> to which Orleans integration should be added.</param>
        /// <param name="configure">Action to configure the SignalR Orleans Integration.</param>
        /// <returns>The same instance of the <see cref="ISignalRServerBuilder" /> for chaining.</returns>
        public static ISignalRServerBuilder AddOrleans <THub>(this ISignalRServerBuilder signalrBuilder,
                                                              Action <OrleansSignalROptions <THub> > configure = null)
            where THub : Hub
        {
            if (configure != null)
            {
                signalrBuilder.Services.Configure(configure);
            }

            signalrBuilder.Services.AddSingleton(typeof(HubLifetimeManager <THub>), c =>
            {
                var options       = c.GetRequiredService <IOptions <OrleansSignalROptions <THub> > >();
                var clusterClient = options.Value.ClusterClient ?? c.GetRequiredService <IClusterClient>();
                var hubProxy      = c.GetRequiredService <IHubProxy <THub> >();
                var logger        = c.GetRequiredService <ILogger <OrleansHubLifetimeManager <THub> > >();

                return(new OrleansHubLifetimeManager <THub>(options, clusterClient, hubProxy, logger));
            });

            signalrBuilder.Services.AddSingleton(typeof(IHubProxy <THub>), c =>
            {
                var options       = c.GetRequiredService <IOptions <OrleansSignalROptions <THub> > >().Value;
                var clusterClient = options.ClusterClient ?? c.GetRequiredService <IClusterClient>();

                return(new HubProxy <THub>(clusterClient));
            });

            return(signalrBuilder);
        }
Example #9
0
 public static ISignalRServerBuilder AddAzureSignalRSyncDemo(this ISignalRServerBuilder builder)
 {
     //builder.Services.
     builder.Services.AddSingleton(typeof(ClientStatTracker <>)) // counter for demo purpose
     .AddSingleton(typeof(SyncServer));                          // generate the access token and redirect URL
     return(builder);
 }
Example #10
0
 /// <summary>
 /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using a shared Msmq server.
 /// </summary>
 /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="msmqConnectionString">The connection string used to connect to the Msmq server.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddSignalRMsmq(this ISignalRServerBuilder signalrBuilder, string msmqConnectionString)
 {
     return(AddSignalRMsmq(signalrBuilder, o =>
     {
         o.ConnectionString = msmqConnectionString;
     }));
 }
Example #11
0
 /// <summary>
 /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using a shared Orleans cluster.
 /// </summary>
 /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="clusterClient">The <see cref="IClusterClient"/>.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddOrleans <THub>(this ISignalRServerBuilder signalrBuilder, Action <OrleansOptions <THub> > configure) where THub : Hub
 {
     signalrBuilder.Services.Configure(configure);
     signalrBuilder.Services.AddSingleton(typeof(HubLifetimeManager <THub>), typeof(OrleansHubLifetimeManager <THub>));
     signalrBuilder.Services.TryAddSingleton(typeof(IClientSetPartitioner <>), typeof(DefaultClientSetPartitioner <>));
     return(signalrBuilder);
 }
Example #12
0
        /// <summary>
        /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using an Azure Service Bus topic.
        /// </summary>
        /// <param name="builder">The <see cref="ISignalRServerBuilder"/>.</param>
        /// <param name="configureOptions">A callback to configure the service bus options.</param>
        /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
        public static ISignalRServerBuilder AddHttpForwarder(this ISignalRServerBuilder builder, Action <SignalRHttpForwarderOptions> configureOptions = null)
        {
            if (configureOptions == null)
            {
                builder.Services.AddSingleton(new SignalRHttpForwarderOptions());
            }
            else
            {
                builder.Services.Configure(configureOptions);
            }

            builder.Services.AddSingleton <Subject <MessageHook> >();
            builder.Services.AddTransient <IObserver <MessageHook> >(s => s.GetRequiredService <Subject <MessageHook> >());
            builder.Services.AddTransient <IObservable <MessageHook> >(s => s.GetRequiredService <Subject <MessageHook> >());

            builder.Services.AddSingleton <IMessageSenderProvider, MessageSenderProvider>();
            builder.Services.AddSingleton(typeof(MessageSenderHubLifetimeManager <>));
            builder.Services.AddSingleton(typeof(HubLifetimeManager <>), typeof(HttpForwarderHubLifetimeManager <>));
            builder.Services.AddSingleton <MessageDispatcher>();
            builder.Services.AddSingleton <MessageForwarder>();
            builder.Services.AddHostedService <MessageForwarderBootstrapper>();
            builder.Services.AddSingleton <IForwarder>(s => s.GetRequiredService <MessageForwarder>());

            return(builder);
        }
 /// <summary>
 /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using a shared Redis server.
 /// </summary>
 /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="redisConnectionString">The connection string used to connect to the Redis server.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddStackExchangeRedis(this ISignalRServerBuilder signalrBuilder, string redisConnectionString)
 {
     return(AddStackExchangeRedis(signalrBuilder, o =>
     {
         o.Configuration = ConfigurationOptions.Parse(redisConnectionString);
     }));
 }
Example #14
0
 /// <summary>
 /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using a shared Msmq server.
 /// </summary>
 /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
 /// <param name="msmqConnectionString">The connection string used to connect to the Msmq server.</param>
 /// <param name="configure">A callback to configure the Msmq options.</param>
 /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
 public static ISignalRServerBuilder AddSignalRMsmq(this ISignalRServerBuilder signalrBuilder, string msmqConnectionString, Action <MsmqOptions> configure)
 {
     return(AddSignalRMsmq(signalrBuilder, o =>
     {
         o.ConnectionString = msmqConnectionString;
         configure(o);
     }));
 }
Example #15
0
        public static ISignalRServerBuilder AddRedisBackplaneForPopForums(this ISignalRServerBuilder signalRServerBuilder)
        {
            var serviceProvider = signalRServerBuilder.Services.BuildServiceProvider();
            var config          = serviceProvider.GetService <IConfig>();

            signalRServerBuilder.AddStackExchangeRedis(config.CacheConnectionString);
            return(signalRServerBuilder);
        }
Example #16
0
        /// <summary>
        /// Adds the minimum essential Azure SignalR services to the specified <see cref="ISignalRServerBuilder" />.
        /// </summary>
        /// <param name="builder">The <see cref="ISignalRServerBuilder"/>.</param>
        /// <param name="configure">A callback to configure the <see cref="ServiceOptions"/>.</param>
        /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
        public static ISignalRServerBuilder AddAzureSignalR(this ISignalRServerBuilder builder, Action <ServiceOptions> configure)
        {
            builder.AddAzureSignalR()
            .Services.Configure(configure)
            .PostConfigure <ServiceOptions>(o => o.Validate());

            return(builder);
        }
Example #17
0
        public static ISignalRServerBuilder AddQueryNotifications(this ISignalRServerBuilder signalR)
        {
            signalR.Services.AddScoped <QueryHub>();

            signalR.Services.AddSingleton <IQueryNotifier, QueryNotifier>();

            return(signalR);
        }
Example #18
0
 public static ISignalRServerBuilder AddAzureSignalR2(this ISignalRServerBuilder builder)
 {
     builder.AddAzureSignalR();
     builder.Services.TryAddSingleton <AzureSignalRHostedService>();
     builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <IStartupFilter, AzureSignalRStartupFilter>());
     builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <MatcherPolicy, NegotiateMatcherPolicy>());
     return(builder);
 }
Example #19
0
 /// <summary>
 ///     Add GraphQL query streaming hub with default options.
 ///     Defaults:
 ///     - ISchema is resolved from <see cref="IServiceCollection" />
 ///     - IExtension's are resolved from <see cref="IServiceCollection" />
 /// </summary>
 /// <param name="builder"></param>
 /// <returns></returns>
 public static ISignalRServerBuilder AddQueryStreamHub(this ISignalRServerBuilder builder)
 {
     return(AddQueryStreamHub(
                builder,
                optionsBuilder => optionsBuilder
                .Configure <ISchema>((options, schema) => options.Schema = schema)
                ));
 }
        /// <summary>
        /// Adds the minimum essential Azure SignalR services to the specified <see cref="ISignalRServerBuilder" />.
        /// </summary>
        /// <param name="builder">The <see cref="ISignalRServerBuilder"/>.</param>
        /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
        /// <remarks>
        /// It reads connection string from a configuration entry Azure:SignalR:ConnectionString.
        /// In development environment, try `dotnet user-secrets set Azure:SignalR:ConnectionString {YourConnectionString}`.
        /// </remarks>
        public static ISignalRServerBuilder AddAzureSignalR(this ISignalRServerBuilder builder)
        {
            builder.Services.AddSingleton <ServiceOptionsSetup>();
            builder.Services.AddSingleton <IConfigureOptions <ServiceOptions> >(s => s.GetService <ServiceOptionsSetup>());
            builder.Services.AddSingleton <IOptionsChangeTokenSource <ServiceOptions> >(s => s.GetService <ServiceOptionsSetup>());

            return(builder.AddAzureSignalRCore());
        }
 public static ISignalRServerBuilder AddRedis(this ISignalRServerBuilder builder, string redisConnectionString, Action <RedisOptions> configure)
 {
     return(AddRedis(builder, o =>
     {
         o.Options = ConfigurationOptions.Parse(redisConnectionString);
         configure(o);
     }));
 }
Example #22
0
        /// <summary>
        /// Adds scale-out to a <see cref="ISignalRServerBuilder"/>, using a shared Nats server.
        /// </summary>
        /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
        /// <param name="connection">The nats <see cref="IConnection"/>.</param>
        /// <returns>The same instance of the <see cref="IServiceCollection"/> for chaining.</returns>
        public static IServiceCollection AddNeonNats(
            this ISignalRServerBuilder signalrBuilder,
            IConnection connection)
        {
            signalrBuilder.Services.AddSingleton(connection);

            return(AddNeonNats(signalrBuilder));
        }
Example #23
0
        public static void AddRedisBackplane(this ISignalRServerBuilder builder, IConfiguration configuration)
        {
            var redisConnectionString = configuration.GetConnectionString("RedisConnectionString");

            if (!string.IsNullOrEmpty(redisConnectionString))
            {
                builder.AddStackExchangeRedis(redisConnectionString, options => options.Configuration.ChannelPrefix = configuration["SignalR:RedisBackplane:ChannelName"] ?? "VirtoCommerceChannel");
            }
        }
Example #24
0
        /// <summary>
        ///     Add GraphQL query streaming hub with configured options
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configureOptions"></param>
        /// <returns></returns>
        public static ISignalRServerBuilder AddTankaServerHub(
            this ISignalRServerBuilder builder)
        {
            var services = builder.Services;

            services.AddSignalR();
            services.TryAddScoped <IQueryStreamService, QueryStreamService>();

            return(builder);
        }
Example #25
0
        /// <summary>
        /// Registers the Hub Lifetime Manager based on the configuration options provided
        /// </summary>
        /// <param name="signalRServerBuilder">The SignalR builder abstraction for configuring SignalR servers.</param>
        /// <param name="configureOptions">The MassTransit SignalR configuration options</param>
        public static ISignalRServerBuilder AddMassTransitBackplane(this ISignalRServerBuilder signalRServerBuilder,
                                                                    Action <MassTransitSignalROptions> configureOptions = null)
        {
            var options = new MassTransitSignalROptions();

            configureOptions?.Invoke(options);

            signalRServerBuilder.Services.AddSingleton(options);

            return(signalRServerBuilder);
        }
        /// <summary>
        /// 将模块服务添加到依赖注入服务容器中
        /// </summary>
        /// <param name="services">依赖注入服务容器</param>
        /// <returns></returns>
        public override IServiceCollection AddServices(IServiceCollection services)
        {
            services.TryAddSingleton <IUserIdProvider, UserNameUserIdProvider>();

            ISignalRServerBuilder          builder     = services.AddSignalR();
            Action <ISignalRServerBuilder> buildAction = GetSignalRServerBuildAction(services);

            buildAction?.Invoke(builder);

            return(services);
        }
    /// <summary>
    /// Adds hub specific options to an <see cref="ISignalRServerBuilder"/>.
    /// </summary>
    /// <typeparam name="THub">The hub type to configure.</typeparam>
    /// <param name="signalrBuilder">The <see cref="ISignalRServerBuilder"/>.</param>
    /// <param name="configure">A callback to configure the hub options.</param>
    /// <returns>The same instance of the <see cref="ISignalRServerBuilder"/> for chaining.</returns>
    public static ISignalRServerBuilder AddHubOptions <THub>(this ISignalRServerBuilder signalrBuilder, Action <HubOptions <THub> > configure) where THub : Hub
    {
        if (signalrBuilder == null)
        {
            throw new ArgumentNullException(nameof(signalrBuilder));
        }

        signalrBuilder.Services.AddSingleton <IConfigureOptions <HubOptions <THub> >, HubOptionsSetup <THub> >();
        signalrBuilder.Services.Configure(configure);
        return(signalrBuilder);
    }
Example #28
0
        public static ISignalRServerBuilder AddAzureSignalR(this ISignalRServerBuilder signalR, IConfiguration configuration)
        {
            var connectionString = configuration["Azure:SignalR:ConnectionString"];

            if (connectionString != null)
            {
                return(signalR.AddAzureSignalR(connectionString));
            }

            return(signalR);
        }
 public static ISignalRServerBuilder AddRabbitMQ(this ISignalRServerBuilder signalrBuilder, string rabbitMQConnectionString, string exchangeName)
 {
     return(AddRabbitMQ(signalrBuilder, o =>
     {
         o.ConnectionFactory = new ConnectionFactory()
         {
             Uri = new Uri(rabbitMQConnectionString)
         };
         o.ExchangeName = exchangeName;
     }));
 }
Example #30
0
        public static ISignalRServerBuilder AddTankaServerHubWithTracing(
            this ISignalRServerBuilder builder)
        {
            var services = builder.Services;

            // add tracing extension
            services.AddTankaServerExecutionExtension <TraceExtension>();

            // default configuration
            return(AddTankaServerHub(
                       builder));
        }