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:
loks0nandClaude Sonnet 4.5 committed 2026-03-03 20:06:06 +00:00
1 parent 20f248a6ae
commit a0854e0591
1 file changed
+9 -18
+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();
}
});
}
}
}