示例#1
0
        // [Route("Subscribe")]
        public async Task <AcknowledgeAction> SubscribeAsync(SubscribeAction action)
        {
            var connectionId = CurrentRequest.RequestContext.ConnectionId;

            LogInfo($"Subscribe request from: {connectionId}");

            // validate request
            if (string.IsNullOrEmpty(action.Rule))
            {
                return(action.AcknowledgeError("missing or invalid rule name"));
            }

            // retrieve connection record
            var connection = await _dataTable.GetConnectionRecordAsync(connectionId);

            if (connection == null)
            {
                LogInfo("Connection was removed");
                return(action.AcknowledgeError("connection gone"));
            }
            if (connection.State == ConnectionState.Failed)
            {
                LogInfo("Connection is in failed state");
                throw Abort(action.AcknowledgeError("connection reset required"));
            }
            if (connection.SubscriptionArn == null)
            {
                LogInfo("Client has not announced itself");
                return(action.AcknowledgeError("client is unannounced"));
            }
            if (connection.State != ConnectionState.Open)
            {
                LogInfo("Connection is not open (state: {0})", connection.State);
                throw Abort(action.AcknowledgeError("action not allowed"));
            }

            // validate pattern
            var validPattern = false;

            try {
                validPattern = EventPatternMatcher.IsValid(JObject.Parse(action.Pattern));
            } catch {
                // nothing to do
            }
            if (!validPattern)
            {
                return(action.AcknowledgeError("invalid pattern"));
            }

            // create or update event rule
            await _dataTable.CreateOrUpdateRuleRecordAsync(new RuleRecord {
                Rule         = action.Rule,
                Pattern      = action.Pattern,
                ConnectionId = connection.ConnectionId
            });

            return(action.AcknowledgeOk());
        }
示例#2
0
        public void Pattern_with_null_serialized_is_valid()
        {
            // arrange
            var pattern = JObject.Parse("{\"source\":[\"Sample.BlazorEventsSample:1.0-DEV@stevebv7-lambdasharp-cor-deploymentbucketresource-9h53iqcat7uj::MyBlazorApp\"],\"detail-type\":[\"Sample.BlazorEventsSample.MyBlazorApp.Shared.TodoItem\"],\"resources\":[\"lambdasharp:tier:SteveBv7\"],\"detail\":null}");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeTrue();
        }
示例#3
0
        public void Empty_pattern_is_not_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{}");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeFalse();
        }
示例#4
0
        public void Pattern_with_nested_list_is_not_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ [ 42 ]  ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeFalse();
        }
示例#5
0
        public void Pattern_with_null_is_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ null ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeTrue();
        }
示例#6
0
        public void Pattern_with_invalid_filter_is_not_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""Bar"": 42 } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeFalse();
        }
示例#7
0
        public void Pattern_with_exists_null_is_not_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""exists"": null } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeFalse();
        }
示例#8
0
        public void Pattern_with_cidr_bad_prefix_is_not_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""cidr"": ""1.1.1.1/42"" } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeFalse();
        }
示例#9
0
        public void Pattern_with_numeric_two_operations_is_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""numeric"": [ "">"", 42, ""<"", 404 ] } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeTrue();
        }
示例#10
0
        public void Pattern_with_anything_but_content_filter_is_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""anything-but"": { ""prefix"": ""Bar"" } } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeTrue();
        }
示例#11
0
        public void Pattern_with_anything_but_numeric_is_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""anything-but"": 42 } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeTrue();
        }
示例#12
0
        public void Pattern_with_prefix_list_is_not_valid()
        {
            // arrange
            var pattern = JObject.Parse(@"{
                ""Foo"": [ { ""prefix"": [ ""Bar"" ] } ]
            }");

            // act
            var isValid = EventPatternMatcher.IsValid(pattern);

            // assert
            isValid.Should().BeFalse();
        }
示例#13
0
        // [Route("Subscribe")]
        public async Task <AcknowledgeAction> SubscribeAsync(SubscribeAction action)
        {
            var connectionId = CurrentRequest.RequestContext.ConnectionId;

            LogInfo($"Subscribe request from: {connectionId}");

            // validate request
            if (string.IsNullOrEmpty(action.Rule))
            {
                return(new AcknowledgeAction {
                    RequestId = action.RequestId,
                    Status = "Error",
                    Message = "Missing or invalid rule name"
                });
            }

            // retrieve websocket connection record
            var connection = await _dataTable.GetConnectionAsync(connectionId);

            if (connection == null)
            {
                LogInfo("Connection was removed");
                return(new AcknowledgeAction {
                    RequestId = action.RequestId,
                    Rule = action.Rule,
                    Status = "Error",
                    Message = "Connection gone"
                });
            }

            // validate pattern
            var validPattern = false;

            try {
                validPattern = EventPatternMatcher.IsValid(JObject.Parse(action.Pattern));
            } catch {
                // nothing to do
            }
            if (!validPattern)
            {
                return(new AcknowledgeAction {
                    RequestId = action.RequestId,
                    Rule = action.Rule,
                    Status = "Error",
                    Message = "Invalid pattern"
                });
            }

            // create or update event rule
            await _dataTable.CreateOrUpdateRuleAsync(new RuleRecord {
                Rule         = action.Rule,
                Pattern      = action.Pattern,
                ConnectionId = connection.ConnectionId
            });

            return(new AcknowledgeAction {
                RequestId = action.RequestId,
                Rule = action.Rule,
                Status = "Ok"
            });
        }