From ab936a7ce47e4bd8e48caac1864da3f18a612c84 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 21 Jan 2026 19:17:32 +1300 Subject: [PATCH] Simplify Swoole adapter all() by delegating to SwoolePromise::all Instead of reimplementing the promise aggregation logic, extract adopted promises from GQLPromise wrappers and delegate to SwoolePromise::all() which already handles the coroutine synchronization properly. Co-Authored-By: Claude Opus 4.5 --- .../GraphQL/Promises/Adapter/Swoole.php | 57 ++++--------------- 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/src/Appwrite/GraphQL/Promises/Adapter/Swoole.php b/src/Appwrite/GraphQL/Promises/Adapter/Swoole.php index eff7a3b51b..3d5b14b107 100644 --- a/src/Appwrite/GraphQL/Promises/Adapter/Swoole.php +++ b/src/Appwrite/GraphQL/Promises/Adapter/Swoole.php @@ -5,7 +5,6 @@ namespace Appwrite\GraphQL\Promises\Adapter; use Appwrite\GraphQL\Promises\Adapter; use Appwrite\Promises\Swoole as SwoolePromise; use GraphQL\Executor\Promise\Promise as GQLPromise; -use Swoole\Coroutine\Channel; class Swoole extends Adapter { @@ -40,53 +39,19 @@ class Swoole extends Adapter { $promisesOrValues = \is_array($promisesOrValues) ? $promisesOrValues : \iterator_to_array($promisesOrValues); - return $this->create(function (callable $resolve, callable $reject) use ($promisesOrValues) { - $total = \count($promisesOrValues); - if ($total === 0) { - $resolve([]); - return; + // Extract adopted promises from GQLPromises + $extracted = []; + foreach ($promisesOrValues as $index => $promiseOrValue) { + if ($promiseOrValue instanceof GQLPromise) { + $extracted[$index] = $promiseOrValue->adoptedPromise; + } else { + $extracted[$index] = $promiseOrValue; } + } - $result = []; - $completed = 0; - $rejected = false; - $channel = new Channel($total); + // Use SwoolePromise::all to wait for all promises + $combinedPromise = SwoolePromise::all($extracted); - foreach ($promisesOrValues as $index => $promiseOrValue) { - if ($promiseOrValue instanceof GQLPromise) { - $result[$index] = null; - $promiseOrValue->then( - function ($value) use ($index, &$result, &$completed, $channel) { - $result[$index] = $value; - $completed++; - $channel->push(true); - return $value; - }, - function ($error) use (&$rejected, $channel, $reject) { - if (!$rejected) { - $rejected = true; - $reject($error); - } - $channel->push(false); - } - ); - } else { - $result[$index] = $promiseOrValue; - $completed++; - $channel->push(true); - } - } - - // Wait for all promises to complete - for ($i = 0; $i < $total; $i++) { - $channel->pop(); - } - $channel->close(); - - if (!$rejected) { - \ksort($result); - $resolve($result); - } - }); + return new GQLPromise($combinedPromise, $this); } }