feat: improve deferred event processing

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-08-08 00:20:32 -04:00
parent f147ffc5c7
commit c8e6efe203
5 changed files with 107 additions and 11 deletions
@@ -230,9 +230,57 @@ final class EventDispatcherTest extends TestCase
$result = $dispatcher->processDeferred('test');
self::assertSame(1000, $result->processed);
self::assertSame(1000, $result->listenerInvocations);
self::assertSame(1, $result->remaining);
self::assertFalse($result->deadlineExceeded);
self::assertTrue($result->limitExceeded);
self::assertTrue($result->eventLimitExceeded);
self::assertFalse($result->listenerInvocationLimitExceeded);
}
#[Test]
#[TestDox('Deferred event and listener invocation limits are tracked separately')]
public function boundsDeferredListenerInvocations(): void
{
$recursive = new RecursiveListener();
$recording = new RecordingListener();
$registry = new EventListenerRegistry();
$registry->listen(
'test',
'test.event',
RecursiveListener::class,
'deferred',
DeliveryMode::Deferred,
);
$registry->listen(
'test',
'test.event',
RecordingListener::class,
'deferred',
DeliveryMode::Deferred,
);
$registry->freeze();
$dispatcher = new EventDispatcher(
$registry,
new RecordingContainer([
RecursiveListener::class => $recursive,
RecordingListener::class => $recording,
]),
new NullLogger(),
maxDeferredListenerInvocations: 3,
);
$recursive->dispatcher = $dispatcher;
$dispatcher->beginExecution('test');
$dispatcher->dispatch(new Event('test.event'));
$result = $dispatcher->processDeferred('test');
self::assertSame(1, $result->processed);
self::assertSame(2, $result->listenerInvocations);
self::assertSame(1, $result->remaining);
self::assertTrue($result->limitExceeded);
self::assertFalse($result->eventLimitExceeded);
self::assertTrue($result->listenerInvocationLimitExceeded);
}
}