private Task ProcessResponse(TrackingDictionary state, object result, HubRequest request, Exception error) { var exception = error.Unwrap(); string stackTrace = (exception != null && _isDebuggingEnabled) ? exception.StackTrace : null; string errorMessage = exception != null ? exception.Message : null; if (exception != null) { _counters.ErrorsHubInvocationTotal.Increment(); _counters.ErrorsHubInvocationPerSec.Increment(); _counters.ErrorsAllTotal.Increment(); _counters.ErrorsAllPerSec.Increment(); } var hubResult = new HubResponse { State = state.GetChanges(), Result = result, Id = request.Id, Error = errorMessage, StackTrace = stackTrace }; return(_transport.Send(hubResult)); }
/// <summary> /// Processes the hub's incoming method calls. /// </summary> protected override Task OnReceivedAsync(IRequest request, string connectionId, string data) { HubRequest hubRequest = _requestParser.Parse(data); // Create the hub HubDescriptor descriptor = _manager.EnsureHub(hubRequest.Hub, _counters.ErrorsHubInvocationTotal, _counters.ErrorsHubInvocationPerSec, _counters.ErrorsAllTotal, _counters.ErrorsAllPerSec); IJsonValue[] parameterValues = hubRequest.ParameterValues; // Resolve the method MethodDescriptor methodDescriptor = _manager.GetHubMethod(descriptor.Name, hubRequest.Method, parameterValues); if (methodDescriptor == null) { _counters.ErrorsHubInvocationTotal.Increment(); _counters.ErrorsHubInvocationPerSec.Increment(); throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, "'{0}' method could not be resolved.", hubRequest.Method)); } // Resolving the actual state object var state = new TrackingDictionary(hubRequest.State); var hub = CreateHub(request, descriptor, connectionId, state, throwIfFailedToCreate: true); return(InvokeHubPipeline(request, connectionId, data, hubRequest, parameterValues, methodDescriptor, state, hub) .ContinueWith(task => hub.Dispose(), TaskContinuationOptions.ExecuteSynchronously)); }
public static TestableChat GetTestableChat(string connectionId, TrackingDictionary clientState, ChatUser user, NameValueCollection cookies) { // setup things needed for chat var repository = new InMemoryRepository(); var resourceProcessor = new Mock<IResourceProcessor>(); var chatService = new Mock<IChatService>(); var connection = new Mock<IConnection>(); var settings = new Mock<IApplicationSettings>(); var mockPipeline = new Mock<IHubPipelineInvoker>(); settings.Setup(m => m.AuthApiKey).Returns("key"); // add user to repository repository.Add(user); // create testable chat var chat = new TestableChat(settings, resourceProcessor, chatService, repository, connection); var mockedConnectionObject = chat.MockedConnection.Object; chat.Clients = new HubConnectionContext(mockPipeline.Object, mockedConnectionObject, "Chat", connectionId, clientState); var prinicipal = new Mock<IPrincipal>(); var request = new Mock<IRequest>(); request.Setup(m => m.Cookies).Returns(new Cookies(cookies)); request.Setup(m => m.User).Returns(prinicipal.Object); // setup context chat.Context = new HubCallerContext(request.Object, connectionId); return chat; }
private Task ProcessTaskResult <T>(TrackingDictionary state, HubRequest request, Task <T> task) { if (task.IsFaulted) { return(ProcessResponse(state, null, request, task.Exception)); } return(ProcessResponse(state, task.Result, request, null)); }
/// <summary> /// Initializes a new instance of the <see cref="HubConnectionContext"/>. /// </summary> /// <param name="pipelineInvoker">The pipeline invoker.</param> /// <param name="connection">The connection.</param> /// <param name="hubName">The hub name.</param> /// <param name="connectionId">The connection id.</param> /// <param name="state">The connection hub state.</param> public HubConnectionContext(IHubPipelineInvoker pipelineInvoker, IConnection connection, string hubName, string connectionId, TrackingDictionary state) { _send = (signal, invocation, exclude) => pipelineInvoker.Send(new HubOutgoingInvokerContext(connection, signal, invocation, exclude)); _connectionId = connectionId; _hubName = hubName; Caller = new StatefulSignalProxy(_send, connectionId, hubName, state); All = AllExcept(); Others = AllExcept(connectionId); }
public void CanDeserializeClientState() { var clientState = new TrackingDictionary(); string clientId = "1"; var user = new ChatUser { Id = "1234", Name = "John", Identity = "foo" }; var cookies = new NameValueCollection(); cookies["jabbr.state"] = JsonConvert.SerializeObject(new ClientState { UserId = user.Id }); TestableChat chat = GetTestableChat(clientId, clientState, user, cookies); bool result = chat.Join(); Assert.Equal("1234", clientState["id"]); Assert.Equal("John", clientState["name"]); Assert.True(result); }
private IHub CreateHub(IRequest request, HubDescriptor descriptor, string connectionId, TrackingDictionary state = null, bool throwIfFailedToCreate = false) { try { var hub = _manager.ResolveHub(descriptor.Name); if (hub != null) { state = state ?? new TrackingDictionary(); hub.Context = new HubCallerContext(request, connectionId); hub.Clients = new HubConnectionContext(_pipelineInvoker, Connection, descriptor.Name, connectionId, state); hub.Groups = new GroupManager(Connection, descriptor.Name); } return(hub); } catch (Exception ex) { Trace.TraceInformation("Error creating hub {0}. " + ex.Message, descriptor.Name); if (throwIfFailedToCreate) { throw; } return(null); } }
private Task InvokeHubPipeline(IRequest request, string connectionId, string data, HubRequest hubRequest, IJsonValue[] parameterValues, MethodDescriptor methodDescriptor, TrackingDictionary state, IHub hub) { var args = _binder.ResolveMethodParameters(methodDescriptor, parameterValues); var context = new HubInvokerContext(hub, state, methodDescriptor, args); // Invoke the pipeline return(_pipelineInvoker.Invoke(context) .ContinueWith(task => { if (task.IsFaulted) { return ProcessResponse(state, null, hubRequest, task.Exception); } else { return ProcessResponse(state, task.Result, hubRequest, null); } }) .FastUnwrap()); }
public StatefulSignalProxy(Func <string, ClientHubInvocation, IEnumerable <string>, Task> send, string signal, string hubName, TrackingDictionary state) : base(send, signal, hubName) { _state = state; }
public void CanJoinChatIfIdentitySet() { var clientState = new TrackingDictionary(); string clientId = "1"; var user = new ChatUser { Id = "1234", Name = "John", Identity = "foo" }; TestableChat chat = GetTestableChat(clientId, clientState, user); chat.Clients.Caller.id = "1234"; bool result = chat.Join(); Assert.Equal("1234", clientState["id"]); Assert.Equal("John", clientState["name"]); Assert.True(result); // TODO: find out why these don't work //Assert.Equal(1, user.ConnectedClients.Count); //Assert.Equal("1", user.ConnectedClients.First().Id); }
public static TestableChat GetTestableChat(string clientId, TrackingDictionary clientState, ChatUser user) { return GetTestableChat(clientId, clientState, user, new NameValueCollection()); }
public void MissingUsernameReturnsFalse() { var clientState = new TrackingDictionary(); string clientId = "1"; var user = new ChatUser(); TestableChat chat = GetTestableChat(clientId, clientState, user); bool result = chat.Join(); Assert.False(result); }
public void CannotJoinChat() { var clientState = new TrackingDictionary(); string clientId = "1"; var user = new ChatUser { Id = "1234", Name = "John" }; TestableChat chat = GetTestableChat(clientId, clientState, user); chat.Clients.Caller.id = "1234"; bool result = chat.Join(); Assert.False(result); }
/// <summary> /// Initializes a new instance of the <see cref="HubConnectionContext"/>. /// </summary> /// <param name="pipelineInvoker">The pipeline invoker.</param> /// <param name="connection">The connection.</param> /// <param name="hubName">The hub name.</param> /// <param name="connectionId">The connection id.</param> /// <param name="state">The connection hub state.</param> public HubConnectionContext(IHubPipelineInvoker pipelineInvoker, IConnection connection, string hubName, string connectionId, TrackingDictionary state) { _send = (signal, invocation, exclude) => pipelineInvoker.Send(new HubOutgoingInvokerContext(connection, signal, invocation, exclude)); _connectionId = connectionId; _hubName = hubName; Caller = new StatefulSignalProxy(_send, connectionId, hubName, state); All = AllExcept(); Others = AllExcept(connectionId); }
public StatefulSignalProxy(Func<string, ClientHubInvocation, IEnumerable<string>, Task> send, string signal, string hubName, TrackingDictionary state) : base(send, signal, hubName) { _state = state; }