public async ValueTask <object> ReceiveAsync(CancellationToken cancellationToken)
    {
        var message = await _connection.ReceiveAsync(cancellationToken)
                      .ConfigureAwait(false);

        if (message is not MessageData messageData)
        {
            throw new InvalidOperationException($"Received invalid message: {message.GetType().Name} is not a {typeof(MessageData).Name} type.");
        }

        var data        = messageData.Data;
        var messageType = _messageTypeCache.GetTypeById(messageData.TypeId);

        var deserialized = _serializer.Deserialize(data, messageType);

        // TODO: Consider using MetadataFactory here (but set messageId to null, because it wasn't passed).
        // Probably best to implement CreateEmpty() method on MetadataFactory.
        if (messageData.Metadata == null)
        {
            messageData.Metadata = MessageMetadata.CreateEmpty();
        }

        return(new MessageWithMetadata
        {
            Message = deserialized,
            Metadata = messageData.Metadata
        });
    }
Example #2
0
    public void ShouldCreateEmpty()
    {
        var sut = MessageMetadata.CreateEmpty();

        Assert.Null(sut.MessageId);
        Assert.Equal(DefaultAcknowledgementType, sut.AcknowledgementType);
        Assert.Null(sut.ResponseMessageTypeId);
    }
Example #3
0
    public void ShouldHaveFalseSendUpdateByDefault()
    {
        var sut = MessageMetadata.CreateEmpty();

        Assert.False(sut.SendUpdate);

        sut = new MessageMetadata();
        Assert.False(sut.SendUpdate);
    }
Example #4
0
    public void ShouldHaveHandledDefaultAcknowledgementType()
    {
        var sut = MessageMetadata.CreateEmpty();

        Assert.Equal(AcknowledgementType.Handled, sut.AcknowledgementType);

        sut = new MessageMetadata();
        Assert.Equal(AcknowledgementType.Handled, sut.AcknowledgementType);
    }
Example #5
0
    /// <summary>
    /// Gets metadata from object if it is <see cref="MessageWithMetadata"/>,
    /// otherwise returns empty <see cref="MessageMetadata"/>.
    /// </summary>
    public static MessageMetadata GetMetadataOrEmpty(this object message)
    {
        if (message is MessageWithMetadata messageWithMetadata &&
            messageWithMetadata.Metadata != null)
        {
            return(messageWithMetadata.Metadata);
        }

        return(MessageMetadata.CreateEmpty());
    }
Example #6
0
    public MessageMetadata CreateFor(object message)
    {
        var metadata = MessageMetadata.CreateEmpty();

        metadata.MessageId = _messageIdFactory.CreateMessageId();

        // Load any metadata from attributes here.
        // TODO: Cache types & attributes.
        var messageAttribute = message.GetType().GetCustomAttribute <MessageAttribute>();

        if (messageAttribute != null)
        {
            metadata.SendUpdate = messageAttribute.SendUpdate;
        }

        return(metadata);
    }