You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
4.9 KiB
111 lines
4.9 KiB
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNet.SignalR.Hubs;
|
|
using Microsoft.AspNet.SignalR.Json;
|
|
using Microsoft.AspNet.SignalR.Messaging;
|
|
using Microsoft.AspNet.SignalR.Tracing;
|
|
|
|
namespace Microsoft.AspNet.SignalR.Infrastructure
|
|
{
|
|
/// <summary>
|
|
/// Default <see cref="IConnectionManager"/> implementation.
|
|
/// </summary>
|
|
public class ConnectionManager : IConnectionManager
|
|
{
|
|
private readonly IDependencyResolver _resolver;
|
|
private readonly IPerformanceCounterManager _counters;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="ConnectionManager"/> class.
|
|
/// </summary>
|
|
/// <param name="resolver">The <see cref="IDependencyResolver"/>.</param>
|
|
public ConnectionManager(IDependencyResolver resolver)
|
|
{
|
|
_resolver = resolver;
|
|
_counters = _resolver.Resolve<IPerformanceCounterManager>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a <see cref="IPersistentConnectionContext"/> for the <see cref="PersistentConnection"/>.
|
|
/// </summary>
|
|
/// <typeparam name="T">Type of the <see cref="PersistentConnection"/></typeparam>
|
|
/// <returns>A <see cref="IPersistentConnectionContext"/> for the <see cref="PersistentConnection"/>.</returns>
|
|
public IPersistentConnectionContext GetConnectionContext<T>() where T : PersistentConnection
|
|
{
|
|
return GetConnection(typeof(T));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a <see cref="IPersistentConnectionContext"/> for the <see cref="PersistentConnection"/>.
|
|
/// </summary>
|
|
/// <param name="type">Type of the <see cref="PersistentConnection"/></param>
|
|
/// <returns>A <see cref="IPersistentConnectionContext"/> for the <see cref="PersistentConnection"/>.</returns>
|
|
public IPersistentConnectionContext GetConnection(Type type)
|
|
{
|
|
if (type == null)
|
|
{
|
|
throw new ArgumentNullException("type");
|
|
}
|
|
|
|
string rawConnectionName = type.FullName;
|
|
string connectionName = PrefixHelper.GetPersistentConnectionName(rawConnectionName);
|
|
IConnection connection = GetConnectionCore(connectionName);
|
|
|
|
return new PersistentConnectionContext(connection, new GroupManager(connection, PrefixHelper.GetPersistentConnectionGroupName(rawConnectionName)));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a <see cref="IHubContext"/> for the specified <see cref="IHub"/>.
|
|
/// </summary>
|
|
/// <typeparam name="T">Type of the <see cref="IHub"/></typeparam>
|
|
/// <returns>a <see cref="IHubContext"/> for the specified <see cref="IHub"/></returns>
|
|
public IHubContext GetHubContext<T>() where T : IHub
|
|
{
|
|
return GetHubContext(typeof(T).GetHubName());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a <see cref="IHubContext"/>for the specified hub.
|
|
/// </summary>
|
|
/// <param name="hubName">Name of the hub</param>
|
|
/// <returns>a <see cref="IHubContext"/> for the specified hub</returns>
|
|
public IHubContext GetHubContext(string hubName)
|
|
{
|
|
var connection = GetConnectionCore(connectionName: null);
|
|
var hubManager = _resolver.Resolve<IHubManager>();
|
|
var pipelineInvoker = _resolver.Resolve<IHubPipelineInvoker>();
|
|
|
|
hubManager.EnsureHub(hubName,
|
|
_counters.ErrorsHubResolutionTotal,
|
|
_counters.ErrorsHubResolutionPerSec,
|
|
_counters.ErrorsAllTotal,
|
|
_counters.ErrorsAllPerSec);
|
|
|
|
Func<string, ClientHubInvocation, IList<string>, Task> send = (signal, value, exclude) => pipelineInvoker.Send(new HubOutgoingInvokerContext(connection, signal, value, exclude));
|
|
|
|
return new HubContext(send, hubName, connection);
|
|
}
|
|
|
|
internal Connection GetConnectionCore(string connectionName)
|
|
{
|
|
IList<string> signals = connectionName == null ? ListHelper<string>.Empty : new[] { connectionName };
|
|
|
|
// Give this a unique id
|
|
var connectionId = Guid.NewGuid().ToString();
|
|
return new Connection(_resolver.Resolve<IMessageBus>(),
|
|
_resolver.Resolve<IJsonSerializer>(),
|
|
connectionName,
|
|
connectionId,
|
|
signals,
|
|
ListHelper<string>.Empty,
|
|
_resolver.Resolve<ITraceManager>(),
|
|
_resolver.Resolve<IAckHandler>(),
|
|
_resolver.Resolve<IPerformanceCounterManager>(),
|
|
_resolver.Resolve<IProtectedData>());
|
|
}
|
|
}
|
|
}
|