refactor: make Bus dispatch synchronous

Remove async coroutine wrapper from event dispatch to simplify execution model and improve trace hierarchy. Listeners now execute synchronously in the caller's context, with dependency resolution inlined.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
loks0n
2026-03-03 20:06:06 +00:00
co-authored by Claude Sonnet 4.5
parent 20f248a6ae
commit a0854e0591
+9 -18
View File
@@ -35,26 +35,17 @@ class Bus
$resolver = $this->resolver;
$listeners = $this->listeners[$event::class] ?? [];
/** @var array<array{Listener, array<mixed>}> $resolved */
$resolved = [];
foreach ($listeners as $listener) {
$deps = array_map($resolver, $listener->getInjections());
$resolved[] = [$listener, $deps];
}
go(function () use ($resolved, $event) {
foreach ($resolved as [$listener, $deps]) {
$action = 'listener.' . $listener::getName();
Span::init($action);
Span::add('bus.event', $event::class);
try {
($listener->getCallback())($event, ...$deps);
} catch (\Throwable $e) {
Span::error($e);
} finally {
Span::current()?->finish();
}
Span::init('listener.' . $listener::getName());
Span::add('bus.event', $event::class);
try {
($listener->getCallback())($event, ...$deps);
} catch (\Throwable $e) {
Span::error($e);
} finally {
Span::current()?->finish();
}
});
}
}
}