From a0854e05919af810e1538c7e1be78fda35d9beeb Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Tue, 3 Mar 2026 20:06:06 +0000 Subject: [PATCH] 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 --- src/Utopia/Bus/Bus.php | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Utopia/Bus/Bus.php b/src/Utopia/Bus/Bus.php index f8cba49a97..bef39f0481 100644 --- a/src/Utopia/Bus/Bus.php +++ b/src/Utopia/Bus/Bus.php @@ -35,26 +35,17 @@ class Bus $resolver = $this->resolver; $listeners = $this->listeners[$event::class] ?? []; - /** @var array}> $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(); } - }); + } } }