* * This file is subject to the MIT license that is bundled * with this source code in the LICENSE.md file. */ const TIMEOUT = 10; function wait(callable $callback, float $timeout = TIMEOUT, callable $timeoutFn = null) { $discord = DiscordSingleton::get(); $result = null; $finally = null; $timedOut = false; $discord->getLoop()->futureTick(function () use ($callback, $discord, &$result, &$finally) { $resolve = function ($x = null) use ($discord, &$result) { $result = $x; $discord->getLoop()->stop(); }; try { $finally = $callback($discord, $resolve); } catch (\Throwable $e) { $resolve($e); } }); $timeout = $discord->getLoop()->addTimer($timeout, function () use ($discord, &$timedOut) { $timedOut = true; $discord->getLoop()->stop(); }); $discord->getLoop()->run(); $discord->getLoop()->cancelTimer($timeout); if ($result instanceof Exception) { throw $result; } if (is_callable($finally)) { $finally(); } if ($timedOut) { if ($timeoutFn != null) { $timeoutFn(); } else { throw new \Exception('Timed out'); } } return $result; }