Пример #1
0
 private HubConnectionContext CreateHubConnectionContext(HubInvocationMessage message)
 {
     return(new CloudHubConnectionContext(_connection, CreateConnectionContext(message), Timeout.InfiniteTimeSpan, _loggerFactory)
     {
         ProtocolReaderWriter = _protocolReaderWriter
     });
 }
Пример #2
0
        private async Task DispatchAsync(HubInvocationMessage message)
        {
            _logger.LogInformation($"Received message: {message}");
            var isMethodInvocation = message is HubMethodInvocationMessage;

            if (isMethodInvocation &&
                OnConnectedAsyncMethod.IgnoreCaseEquals(((HubMethodInvocationMessage)message).Target))
            {
                await OnClientConnectedAsync(message);

                return;
            }

            var connection = GetHubConnectionContext(message);

            if (connection == null)
            {
                await SendMessageAsync(CompletionMessage.WithError(message.InvocationId, "No connection found."));

                return;
            }

            if (isMethodInvocation &&
                OnDisconnectedAsyncMethod.IgnoreCaseEquals(((HubMethodInvocationMessage)message).Target))
            {
                await OnClientDisconnectedAsync(connection);

                return;
            }

            await _hubDispatcher.DispatchMessageAsync(connection, message);
        }
Пример #3
0
 public static void MessageSent(ILogger logger, HubInvocationMessage message)
 {
     if (logger.IsEnabled(LogLevel.Debug))
     {
         _messageSent(logger, message.GetType().Name, message.InvocationId, null);
     }
 }
Пример #4
0
 private static void WriteInvocationId(HubInvocationMessage message, Utf8JsonWriter writer)
 {
     if (!string.IsNullOrEmpty(message.InvocationId))
     {
         writer.WriteString(InvocationIdPropertyNameBytes, message.InvocationId);
     }
 }
Пример #5
0
 private Task SendLocal(HubConnectionContext connection, HubInvocationMessage hubMessage)
 {
     _logger.LogDebug(
         "Sending local message to connection {connectionId} on hub {hubName} (serverId: {serverId})",
         connection.ConnectionId, _hubName, _serverId);
     return(connection.WriteAsync(hubMessage).AsTask());
 }
Пример #6
0
 public static MockHubProtocol ReturnOnParse(HubInvocationMessage parsed)
 {
     return(new MockHubProtocol
     {
         _parsed = parsed
     });
 }
Пример #7
0
        public Task InvokeConnectionAsync(string connectionId, HubInvocationMessage message)
        {
            CheckNullConnectionId(connectionId);

            var connection = _connections[connectionId];

            return(connection?.WriteAsync(message) ?? Task.CompletedTask);
        }
Пример #8
0
 // This lets you add headers to a hub message and return it, in a single expression.
 public static HubMessage AddHeaders(IDictionary <string, string> headers, HubInvocationMessage hubMessage)
 {
     foreach (var header in headers)
     {
         hubMessage.Headers[header.Key] = header.Value;
     }
     return(hubMessage);
 }
Пример #9
0
 private static void WriteInvocationId(HubInvocationMessage message, JsonTextWriter writer)
 {
     if (!string.IsNullOrEmpty(message.InvocationId))
     {
         writer.WritePropertyName(InvocationIdPropertyName);
         writer.WriteValue(message.InvocationId);
     }
 }
Пример #10
0
        private async Task OnClientConnectedAsync(HubInvocationMessage message)
        {
            var connection = CreateHubConnectionContext(message);

            _connections.Add(connection);

            await _lifetimeManager.OnConnectedAsync(connection);

            await _hubDispatcher.OnConnectedAsync(connection);
        }
Пример #11
0
 private static void WriteHubInvocationMessageCommon(HubInvocationMessage message, JsonTextWriter writer, int type)
 {
     if (!string.IsNullOrEmpty(message.InvocationId))
     {
         writer.WritePropertyName(InvocationIdPropertyName);
         writer.WriteValue(message.InvocationId);
     }
     WriteMessageType(writer, type);
     WriteMessageMetadata(writer, message.Metadata);
 }
Пример #12
0
 public async Task WriteAsync(HubInvocationMessage message)
 {
     while (await Output.Writer.WaitToWriteAsync())
     {
         if (Output.Writer.TryWrite(message))
         {
             return;
         }
     }
 }
 public static Task ReturnResultAsync(this HubConnectionContext connection, HubInvocationMessage message)
 {
     if (message == null)
     {
         return(Task.CompletedTask);
     }
     message.AddAction(nameof(HubLifetimeManager <Hub> .SendConnectionAsync))
     .AddConnectionId(connection.ConnectionId);
     return(connection.WriteAsync(message));
 }
Пример #14
0
 private async Task WriteAsync(HubConnectionContext connection, HubInvocationMessage hubMessage)
 {
     while (await connection.Output.WaitToWriteAsync())
     {
         if (connection.Output.TryWrite(hubMessage))
         {
             break;
         }
     }
 }
Пример #15
0
        private HubConnectionContext CreateHubConnectionContext(HubInvocationMessage message)
        {
            var context = CreateConnectionContext(message);

            // TODO: configurable KeepAliveInterval
            return(new HubConnectionContext(context, TimeSpan.FromSeconds(30), _loggerFactory)
            {
                Output = _output,
                ProtocolReaderWriter = _protocolReaderWriter
            });
        }
Пример #16
0
        private async Task OnConnectedAsync(HubInvocationMessage message)
        {
            var connection = CreateHubConnectionContext(message);

            _connections.Add(connection);

            await _lifetimeManager.OnConnectedAsync(connection);

            await _hubInvoker.OnConnectedAsync(connection);

            await SendMessageAsync(CompletionMessage.WithResult(message.InvocationId, ""));
        }
Пример #17
0
 private static void WriteHeaders(Utf8JsonWriter writer, HubInvocationMessage message)
 {
     if (message.Headers != null && message.Headers.Count > 0)
     {
         writer.WriteStartObject(HeadersPropertyNameBytes);
         foreach (var value in message.Headers)
         {
             writer.WriteString(value.Key, value.Value);
         }
         writer.WriteEndObject();
     }
 }
Пример #18
0
        private async Task SendHubMessage(HubInvocationMessage hubMessage, CancellationToken cancellationToken = default)
        {
            AssertConnectionValid();

            _protocol.WriteMessage(hubMessage, _connectionState.Connection.Transport.Output);

            Log.SendingMessage(_logger, hubMessage);

            // REVIEW: If a token is passed in and is canceled during FlushAsync it seems to break .Complete()...
            await _connectionState.Connection.Transport.Output.FlushAsync();

            Log.MessageSent(_logger, hubMessage);
        }
Пример #19
0
 private static void WriteHeaders(JsonTextWriter writer, HubInvocationMessage message)
 {
     if (message.Headers != null && message.Headers.Count > 0)
     {
         writer.WritePropertyName(HeadersPropertyName);
         writer.WriteStartObject();
         foreach (var value in message.Headers)
         {
             writer.WritePropertyName(value.Key);
             writer.WriteValue(value.Value);
         }
         writer.WriteEndObject();
     }
 }
Пример #20
0
        private DefaultConnectionContext CreateConnectionContext(HubInvocationMessage message)
        {
            var connectionId = message.GetConnectionId();
            // TODO:
            // No physical pipeline for logical ConnectionContext. These pipelines won't be used in current context.
            // So no exception or error will be thrown.
            // We should have a cleaner approach to reuse DefaultConnectionContext for Azure SignalR.
            var connectionContext = new DefaultConnectionContext(connectionId, null, null);

            if (message.TryGetClaims(out var claims))
            {
                connectionContext.User = new ClaimsPrincipal();
                connectionContext.User.AddIdentity(new ClaimsIdentity(claims, "Bearer"));
            }
            return(connectionContext);
        }
Пример #21
0
        private async Task SendHubMessage(HubInvocationMessage hubMessage, InvocationRequest irq)
        {
            try
            {
                var payload = _protocol.WriteToArray(hubMessage);
                Log.SendInvocation(_logger, hubMessage.InvocationId);

                await _connection.SendAsync(payload, irq.CancellationToken);

                Log.SendInvocationCompleted(_logger, hubMessage.InvocationId);
            }
            catch (Exception ex)
            {
                Log.SendInvocationFailed(_logger, hubMessage.InvocationId, ex);
                irq.Fail(ex);
                TryRemoveInvocation(hubMessage.InvocationId, out _);
            }
        }
Пример #22
0
        private async Task OnDisconnectedAsync(HubInvocationMessage message)
        {
            var connection = GetHubConnectionContext(message);

            if (connection == null)
            {
                await SendMessageAsync(CompletionMessage.WithError(message.InvocationId, "No connection found."));

                return;
            }

            await _hubInvoker.OnDisconnectedAsync(connection, null);

            await _lifetimeManager.OnDisconnectedAsync(connection);

            await SendMessageAsync(CompletionMessage.WithResult(message.InvocationId, ""));

            _connections.Remove(connection);
        }
Пример #23
0
 public AddressedMessage(string connectionId, HubInvocationMessage messagePayload)
 {
     ConnectionId = connectionId;
     Payload      = messagePayload;
 }
 public void ReceiveMessage(HubInvocationMessage message, MessageHandle handle)
 {
     messageCallback(new AddressedMessage(connectionId, message), handle).Ignore();
 }
Пример #25
0
 public AnonymousMessage(ISet <string> excluding, HubInvocationMessage messagePayload)
 {
     Excluding = excluding;
     Payload   = messagePayload;
 }
Пример #26
0
        public async Task AcceptMessageAsync(HubInvocationMessage message, GrainCancellationToken cancellationToken)
        {
            var handle = await rewoundMessagesGrain.PushMessageAsync(message);

            observers.Notify(x => x.ReceiveMessage(message, handle));
        }
Пример #27
0
 private Task SendLocal(HubConnectionContext connection, HubInvocationMessage hubMessage)
 {
     return(connection.WriteAsync(hubMessage).AsTask());
 }
Пример #28
0
 private HubConnectionContext GetHubConnectionContext(HubInvocationMessage message)
 {
     return(message.TryGetConnectionId(out var connectionId) ? _connections[connectionId] : null);
 }