private async Task <IMessage> SubscribeToEvents(IBus bus, IMessage message, IMessagesWaiter messagesWaiter) { // Handle only commands if (message is ICommand) { // Create events to subscribe for this command Type[] eventTypes = EventTypes.Select(t => t.IsGenericTypeDefinition ? t.MakeGenericType(message.GetType()) : t).ToArray(); // Create wait task using (IMessageWaiter messageWaiter = await messagesWaiter.GetAsync(eventTypes, m => m is ICommandEvent ce && ce.CommandId == message.MessageId)) { return(await messageWaiter.WhenAsync(TimeSpan.FromSeconds(30))); } } return(null); }