public void ConfigureCommands(IMqttApplicationBuilder mqttApplicationBuilder) { var topicHandlers = EntityConfigurations .SelectMany(x => x.EntityConfiguration.CommandHandlers.Select(y => (configuration: x, commandHandler: y))) .GroupBy(x => (topicPattern: x.commandHandler.GetTopicPattern(x.configuration.EntityConfiguration.EntityDefinition), qualityOfServiceLevel: x.configuration.EntityConfiguration.DiscoveryMessageQualityOfServiceLevel)) .ToDictionary(x => x.Key, x => x.ToArray()); foreach (var topicHandler in topicHandlers) { var topicPattern = topicHandler.Key.topicPattern; var qualityOfServiceLevel = topicHandler.Key.qualityOfServiceLevel; mqttApplicationBuilder.Map( topicPattern, async ctx => { var payload = ctx.GetPayloadAsString(); // Logger.LogInformation("> [{topic}] {payload}", ctx.Topic, payload); foreach (var(cfg, handler) in topicHandler.Value) { var commandContext = new MqttCommandContext <TEntity, TEntityDefinition>(ctx, cfg.EntityConfiguration.Entity, cfg.EntityConfiguration.EntityDefinition); var result = await handler.ProcessCommand(commandContext, payload); if (result) { return(true); } } return(false); }, qualityOfServiceLevel); } }
public static IMqttApplicationBuilder MapProcessor <TProcessor, TTopicParameters>( this IMqttApplicationBuilder mqttApplicationBuilder, string topicPattern, Func <TTopicParameters, bool> parametersPredicate = null, Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null, MqttQualityOfServiceLevel?qualityOfServiceLevel = null, bool?noLocal = null, bool?retainAsPublished = null, MqttRetainHandling?retainHandling = null) where TProcessor : IMqttRequestProcessor <TTopicParameters> where TTopicParameters : class, new() { var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator); return(mqttApplicationBuilder.Map( topicPattern, async context => { if (topicBinder.IsMatch(context.Topic)) { TTopicParameters parameters; try { parameters = topicBinder.Bind(context.Topic); } catch { return false; } if (parametersPredicate?.Invoke(parameters) ?? true) { var parameterizedContext = new MqttRequestContext <TTopicParameters>(context, parameters); var processor = context.ServiceProvider.GetRequiredService <TProcessor>(); return await processor.ProcessRequest(parameterizedContext); } } return false; }, qualityOfServiceLevel, noLocal, retainAsPublished, retainHandling)); }
public static IMqttApplicationBuilder Map <TTopicParameters>( this IMqttApplicationBuilder mqttApplicationBuilder, string topicPattern, MqttRequestDelegate <TTopicParameters> middleware, Func <TTopicParameters, bool> parametersPredicate = null, Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null, MqttQualityOfServiceLevel?qualityOfServiceLevel = null, bool?noLocal = null, bool?retainAsPublished = null, MqttRetainHandling?retainHandling = null) where TTopicParameters : class, new() { var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator); return(mqttApplicationBuilder.Map( topicPattern, async context => { if (topicBinder.IsMatch(context.Topic)) { TTopicParameters parameters; try { parameters = topicBinder.Bind(context.Topic); } catch { return false; } if (parametersPredicate?.Invoke(parameters) ?? true) { var ctx = new MqttRequestContext <TTopicParameters>(context, parameters); return await middleware.Invoke(ctx); } } return false; }, qualityOfServiceLevel, noLocal, retainAsPublished, retainHandling)); }
public static IMqttApplicationBuilder MapProcessor <TProcessor>( this IMqttApplicationBuilder mqttApplicationBuilder, string topicPattern, TProcessor processor, MqttQualityOfServiceLevel?qualityOfServiceLevel = null, bool?noLocal = null, bool?retainAsPublished = null, MqttRetainHandling?retainHandling = null ) where TProcessor : IMqttRequestProcessor { return(mqttApplicationBuilder.Map( topicPattern, async context => await processor.ProcessRequest(context), qualityOfServiceLevel, noLocal, retainAsPublished, retainHandling)); }
public void ConfigureMqttApplication(IMqttApplicationBuilder mqttApplicationBuilder) { mqttApplicationBuilder.Map( $"test/builder_{BuilderNumber}/build_{BuildCount++}", MqttRequestDelegateHelper.Throws(() => new Exception($"{InvocationCount++}"))); }