+3
-1
composer.json
+3
-1
composer.json
···
+221
-1
composer.lock
+221
-1
composer.lock
······+"url": "https://api.github.com/repos/reactphp/async/zipball/635d50e30844a484495713e8cb8d9e079c0008a5",+"url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",+"url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
+1
css/_partials/_globals.scss
+1
css/_partials/_globals.scss
+2
-1
css/_partials/_popovers.scss
+2
-1
css/_partials/_popovers.scss
+8
-2
css/_partials/_post.scss
+8
-2
css/_partials/_post.scss
·········
+5
-1
css/_partials/_profile.scss
+5
-1
css/_partials/_profile.scss
+6
-1
css/_partials/_profileMini.scss
+6
-1
css/_partials/_profileMini.scss
······
+98
-15
index.php
+98
-15
index.php
······Flight::route('/u/@handle:[a-z0-9\.]+/@rkey:[a-z0-9]+', function (string $handle, string $rkey): void {Flight::route('/u/@handle:[a-z0-9\.]+(/@tab:[a-z]+)', function (string $handle, ?string $tab): void {+$latte->render('./templates/profile.latte', array_merge(Flight::get('standardParams'), $params));
+73
-53
lib/bskyToucher.php
+73
-53
lib/bskyToucher.php
·········array_splice($split_str, $facet->start + $additions, $facet->end - $facet->start, $replaceString);···-'avatar' => property_exists($pdsData->value, 'avatar') ? $this->getMediaUrl($pds, $did, $pdsData->value->avatar->ref->{'$link'}) : null,-'banner' => property_exists($pdsData->value, 'banner') ? $this->getMediaUrl($pds, $did, $pdsData->value->banner->ref->{'$link'}) : null,-'pinnedPost' => property_exists($pdsData->value, 'pinnedPost') ? $pdsData->value->pinnedPost->uri : null,+'avatar' => property_exists($userInfo->value, 'avatar') ? $this->getMediaUrl($pds, $did, $userInfo->value->avatar->ref->{'$link'}) : null,+'banner' => property_exists($userInfo->value, 'banner') ? $this->getMediaUrl($pds, $did, $userInfo->value->banner->ref->{'$link'}) : null,+'pinnedPost' => property_exists($userInfo->value, 'pinnedPost') ? $userInfo->value->pinnedPost->uri : null······+function getUserPosts(string $did, $auth = false, $cursor = null, $newer = false):array|bool {···'displayName' => property_exists($authorInfo->value, 'displayName') && $authorInfo->value->displayName !== "" ? $authorInfo->value->displayName : $authorInfo->handle,'avatar' => property_exists($authorInfo->value, 'avatar') ? $this->getMediaUrl($authorData->pds, $did, $authorInfo->value->avatar->ref->{'$link'}) : null,···'displayName' => property_exists($post->author, 'displayName') && $post->author->displayName !== "" ? $post->author->displayName : $post->author->handle,···$post = $this->getSlingshotData($uriComponents->did, $uriComponents->collection, $uriComponents->rkey);···'displayName' => $actorSlingshot->value->displayName !== "" ? htmlspecialchars($actorSlingshot->value->displayName) : $actorData->handle,···
+10
-5
templates/_partials/embed_record.latte
+10
-5
templates/_partials/embed_record.latte
···+<a href="{$embed->profileLink}"><img src="{$embed->avatar}" alt="{$embed->displayName}'s user icon" /></a>
+4
-4
templates/_partials/post.latte
+4
-4
templates/_partials/post.latte
···<a href="{$post->profileLink}"><img src="{$post->avatar}" alt="{$post->displayName}'s user icon" /></a>···
+5
-5
templates/_partials/profile_mini.latte
+5
-5
templates/_partials/profile_mini.latte
···
+31
-26
templates/profile.latte
+31
-26
templates/profile.latte
···-<button type="button" action="follow">follow</button> <button type="button" action="getNotifs">get notifs</button> <button type="button" action="starterPack">add to starter pack</button> <button type="button" action="list">add to list</button>+<button type="button" action="follow">follow</button> <button type="button" action="getNotifs">get notifs</button> <button type="button" action="starterPack">add to starter pack</button> <button type="button" action="list">add to list</button>
+18
-12
templates/search.latte
+18
-12
templates/search.latte
···
+2
templates/settings.latte
+2
templates/settings.latte
+33
-13
templates/single.latte
+33
-13
templates/single.latte
···<button type="button" popovertarget="likes" class="btn-invis">See Likes</button> <button type="button" popovertarget="reposts" class="btn-invis">See Reposts</button> <button type="button" popovertarget="quotes" class="btn-invis">See Quotes</button>+{include '_partials/profile_mini.latte', displayName: $like->actor->displayName, handle: $like->actor->handle, did: $like->actor->did, avatar: $like->actor->avatar, profileLink: '/u/'.$like->actor->handle}+{include '_partials/profile_mini.latte', displayName: $repost->actor->displayName, handle: $repost->actor->handle, did: $repost->actor->did, avatar: $repost->actor->avatar, profileLink: '/u/'.$repost->actor->handle}
+2
vendor/composer/autoload_files.php
+2
vendor/composer/autoload_files.php
···'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php','37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+3
vendor/composer/autoload_psr4.php
+3
vendor/composer/autoload_psr4.php
···'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
+20
vendor/composer/autoload_static.php
+20
vendor/composer/autoload_static.php
···'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php','4cdafd4a5191caf078235e7dd119fdaf' => __DIR__ . '/..' . '/flightphp/core/flight/autoload.php',+'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php','a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php','d507e002f7fce7f0c6dbf1f22edcb902' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/functions.php','37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',+'c4e03ecd470d2a87804979c0a8152284' => __DIR__ . '/..' . '/react/async/src/functions_include.php',······
+229
vendor/composer/installed.json
+229
vendor/composer/installed.json
···+"url": "https://api.github.com/repos/reactphp/async/zipball/635d50e30844a484495713e8cb8d9e079c0008a5",+"url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",+"url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
+29
-2
vendor/composer/installed.php
+29
-2
vendor/composer/installed.php
·········
+112
vendor/react/async/CHANGELOG.md
+112
vendor/react/async/CHANGELOG.md
···+A major new feature release, see [**release announcement**](https://clue.engineering/2022/announcing-reactphp-async).+See [`3.x` CHANGELOG](https://github.com/reactphp/async/blob/3.x/CHANGELOG.md) for more details.+See [`2.x` CHANGELOG](https://github.com/reactphp/async/blob/2.x/CHANGELOG.md) for more details.
+19
vendor/react/async/LICENSE
+19
vendor/react/async/LICENSE
···
+672
vendor/react/async/README.md
+672
vendor/react/async/README.md
···+[](https://github.com/reactphp/async/actions)+[](https://packagist.org/packages/react/async)+The `async(callable():(PromiseInterface<T>|T) $function): (callable():PromiseInterface<T>)` function can be used to+The `coroutine(callable(mixed ...$args):(\Generator|PromiseInterface<T>|T) $function, mixed ...$args): PromiseInterface<T>` function can be used to+$browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {+it will turn the entire given `$function` into a [`Generator`](https://www.php.net/manual/en/class.generator.php).+The `parallel(iterable<callable():PromiseInterface<T>> $tasks): PromiseInterface<array<T>>` function can be used+The `series(iterable<callable():PromiseInterface<T>> $tasks): PromiseInterface<array<T>>` function can be used+The `waterfall(iterable<callable(mixed=):PromiseInterface<T>> $tasks): PromiseInterface<T>` function can be used
+50
vendor/react/async/composer.json
+50
vendor/react/async/composer.json
···
+33
vendor/react/async/src/FiberFactory.php
+33
vendor/react/async/src/FiberFactory.php
···
+23
vendor/react/async/src/FiberInterface.php
+23
vendor/react/async/src/FiberInterface.php
···
+42
vendor/react/async/src/FiberMap.php
+42
vendor/react/async/src/FiberMap.php
···
+79
vendor/react/async/src/SimpleFiber.php
+79
vendor/react/async/src/SimpleFiber.php
···+$ret = (self::$scheduler->isStarted() ? self::$scheduler->resume() : self::$scheduler->start());
+846
vendor/react/async/src/functions.php
+846
vendor/react/async/src/functions.php
···+* @template A1 (any number of function arguments, see https://github.com/phpstan/phpstan/issues/8214)+$promise = new Promise(function (callable $resolve, callable $reject) use ($function, $args, &$fiber): void {+* @throws \UnexpectedValueException when the promise is rejected with an unexpected value (Promise API v1 or v2 only)+function (mixed $throwable) use (&$rejected, &$rejectedThrowable, &$fiber, $lowLevelFiber): void {+'Promise rejected with unexpected value of type ' . (is_object($throwable) ? get_class($throwable) : gettype($throwable)) /** @phpstan-ignore-line */+* $browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {+* it will turn the entire given `$function` into a [`Generator`](https://www.php.net/manual/en/class.generator.php).+* @template A1 (any number of function arguments, see https://github.com/phpstan/phpstan/issues/8214)+* @param callable(A1, A2, A3, A4, A5):(\Generator<mixed, PromiseInterface<TYield>, TYield, PromiseInterface<T>|T>|PromiseInterface<T>|T) $function+* @param mixed ...$args Optional list of additional arguments that will be passed to the given `$function` as is+'Expected coroutine to yield ' . PromiseInterface::class . ', but got ' . (is_object($promise) ? get_class($promise) : gettype($promise))+/** @var PromiseInterface<array<T>> Remove once defining `Deferred()` above is supported by PHPStan, see https://github.com/phpstan/phpstan/issues/11032 */+/** @var PromiseInterface<array<T>> Remove once defining `Deferred()` above is supported by PHPStan, see https://github.com/phpstan/phpstan/issues/11032 */+* @param iterable<(callable():(PromiseInterface<T>|T))|(callable(mixed):(PromiseInterface<T>|T))> $tasks
+9
vendor/react/async/src/functions_include.php
+9
vendor/react/async/src/functions_include.php
+468
vendor/react/event-loop/CHANGELOG.md
+468
vendor/react/event-loop/CHANGELOG.md
···+A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop).+* Fix: Fix reporting connection refused errors with `ExtUvLoop` on Linux and `StreamSelectLoop` on Windows.+* Fix: Check PCNTL functions for signal support instead of PCNTL extension with `StreamSelectLoop`.+* Improve test suite by removing I/O dependency at `StreamSelectLoopTest` to fix Mac OS X tests.+A major feature release with a significant documentation overhaul and long overdue API cleanup!+(#100, #119, #126, #127, #159 and #160 by @clue, #113 by @WyriHaximus and #81 and #91 by @jsor)+* Feature: Documentation for advanced timer concepts, such as monotonic time source vs wall-clock time+* Feature: Throw `BadMethodCallException` on manual loop creation when required extension isn't installed.+(#106 and #144 by @clue, #120 and #124 by @carusogabriel, #147 by nawarian and #92 by @kelunik)+* Improvement: StreamSelectLoop: Use fresh time so Timers added during stream events are accurate #51 (@andrewminerd)+* Improvement: Avoid deprecation warnings in test suite due to deprecation of getMock() in PHPUnit #68 (@martinschroeder)+* Improvement: Test suite now uses socket pairs instead of memory streams #66 (@martinschroeder)+* Improvement: StreamSelectLoop: Test suite uses signal constant names in data provider #67 (@martinschroeder)+* Feature: Added `EventLoopInterface::futureTick()`, implemented in all event loops (@jmalloc)
+21
vendor/react/event-loop/LICENSE
+21
vendor/react/event-loop/LICENSE
···
+930
vendor/react/event-loop/README.md
+930
vendor/react/event-loop/README.md
···+[](https://github.com/reactphp/event-loop/actions)+[](https://packagist.org/packages/react/event-loop)+[ReactPHP](https://reactphp.org/)'s core reactor event loop that libraries can use for evented I/O.+The `addPeriodicTimer(float $interval, callable $callback): TimerInterface` method can be used to
+47
vendor/react/event-loop/composer.json
+47
vendor/react/event-loop/composer.json
···
+253
vendor/react/event-loop/src/ExtEvLoop.php
+253
vendor/react/event-loop/src/ExtEvLoop.php
···
+275
vendor/react/event-loop/src/ExtEventLoop.php
+275
vendor/react/event-loop/src/ExtEventLoop.php
···+// Windows only has limited file descriptor support, so do not require this (will fail otherwise)+// @link http://www.wangafu.net/~nickm/libevent-book/Ref2_eventbase.html#_setting_up_a_complicated_event_base+$event = new Event($this->eventBase, $stream, Event::PERSIST | Event::READ, $this->streamCallback);+$event = new Event($this->eventBase, $stream, Event::PERSIST | Event::WRITE, $this->streamCallback);+$this->signalEvents[$signal] = Event::signal($this->eventBase, $signal, array($this->signals, 'call'));+} elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) {
+201
vendor/react/event-loop/src/ExtLibevLoop.php
+201
vendor/react/event-loop/src/ExtLibevLoop.php
···+} elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) {
+285
vendor/react/event-loop/src/ExtLibeventLoop.php
+285
vendor/react/event-loop/src/ExtLibeventLoop.php
···+throw new BadMethodCallException('Cannot create ExtLibeventLoop, ext-libevent extension missing');+\event_set($this->signalEvents[$signal], $signal, \EV_PERSIST | \EV_SIGNAL, array($this->signals, 'call'));+} elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) {
+342
vendor/react/event-loop/src/ExtUvLoop.php
+342
vendor/react/event-loop/src/ExtUvLoop.php
···+// Use UV::RUN_ONCE when there are only I/O events active in the loop and block until one of those triggers,+// libuv automatically stops polling on error, re-enable polling to match other loop implementations+// libuv may report no events on error, but this should still invoke stream listeners to report closed connections
+75
vendor/react/event-loop/src/Factory.php
+75
vendor/react/event-loop/src/Factory.php
···+* [Deprecated] The `Factory` class exists as a convenient way to pick the best available event loop implementation.
+266
vendor/react/event-loop/src/Loop.php
+266
vendor/react/event-loop/src/Loop.php
···+if ((isset($error['type']) ? $error['type'] : 0) & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR)) {
+472
vendor/react/event-loop/src/LoopInterface.php
+472
vendor/react/event-loop/src/LoopInterface.php
···
+63
vendor/react/event-loop/src/SignalsHandler.php
+63
vendor/react/event-loop/src/SignalsHandler.php
···
+330
vendor/react/event-loop/src/StreamSelectLoop.php
+330
vendor/react/event-loop/src/StreamSelectLoop.php
···+throw new \BadMethodCallException('Event loop feature "signals" isn\'t supported by the "StreamSelectLoop"');+// We do not usually use or expose the `exceptfds` parameter passed to the underlying `select`.+// However, Windows does not report failed connection attempts in `writefds` passed to `select` like most other platforms.+// Instead, it uses `writefds` only for successful connection attempts and `exceptfds` for failed connection attempts.+// We work around this by adding all sockets that look like a pending connection attempt to `exceptfds` automatically on Windows and merge it back later.+// This ensures the public API matches other loop implementations across all platforms (see also test suite or rather test matrix).+// Lacking better APIs, every write-only socket that has not yet read any data is assumed to be in a pending connection attempt state.+// PHP defines `EINTR` through `ext-sockets` or `ext-pcntl`, otherwise use common default (Linux & Mac)+$eintr = \defined('SOCKET_EINTR') ? \SOCKET_EINTR : (\defined('PCNTL_EINTR') ? \PCNTL_EINTR : 4);
+60
vendor/react/event-loop/src/Tick/FutureTickQueue.php
+60
vendor/react/event-loop/src/Tick/FutureTickQueue.php
···
+55
vendor/react/event-loop/src/Timer/Timer.php
+55
vendor/react/event-loop/src/Timer/Timer.php
···
+113
vendor/react/event-loop/src/Timer/Timers.php
+113
vendor/react/event-loop/src/Timer/Timers.php
···
+27
vendor/react/event-loop/src/TimerInterface.php
+27
vendor/react/event-loop/src/TimerInterface.php
···
+156
vendor/react/promise/CHANGELOG.md
+156
vendor/react/promise/CHANGELOG.md
···+A major new feature release, see [**release announcement**](https://clue.engineering/2023/announcing-reactphp-promise-v3).+* Feature / BC break: The `PromiseInterface` now includes the functionality of the old ~~`ExtendedPromiseInterface`~~ and ~~`CancellablePromiseInterface`~~.+The new `catch()` and `finally()` methods replace the deprecated ~~`otherwise()`~~ and ~~`always()`~~ methods which continue to exist for BC reasons.+The old ~~`ExtendedPromiseInterface`~~ and ~~`CancellablePromiseInterface`~~ are no longer needed and have been removed as a consequence.+if ($promise instanceof ExtendedPromiseInterface) { assert(method_exists($promise, 'otherwise')); }+if ($promise instanceof ExtendedPromiseInterface) { assert(method_exists($promise, 'always')); }+if ($promise instanceof CancellablePromiseInterface) { assert(method_exists($promise, 'cancel')); }+* Feature / BC break: Improve type safety of promises. Require `mixed` fulfillment value argument and `Throwable` (or `Exception`) as rejection reason.+Add PHPStan template types to ensure strict types for `resolve(T $value): PromiseInterface<T>` and `reject(Throwable $reason): PromiseInterface<never>`.+It is no longer possible to resolve a promise without a value (use `null` instead) or reject a promise without a reason (use `Throwable` instead).+* Feature / BC break: Report all unhandled rejections by default and remove ~~`done()`~~ method.+Add new `set_rejection_handler()` function to set the global rejection handler for unhandled promise rejections.+Remove ~~`some()`~~, ~~`map()`~~, ~~`reduce()`~~ functions, use `any()` and `all()` functions instead.+Remove internal ~~`FulfilledPromise`~~ and ~~`RejectedPromise`~~ classes, use `resolve()` and `reject()` functions instead.+Remove legacy promise progress API (deprecated third argument to `then()` method) and deprecated ~~`LazyPromise`~~ class.+* Feature / BC break: Require `array` (or `iterable`) type for `all()` + `race()` + `any()` functions and bring in line with ES6 specification.+These functions now require a single argument with a variable number of promises or values as input.+* Fix / BC break: Fix `race()` to return a forever pending promise when called with an empty `array` (or `iterable`) and bring in line with ES6 specification.+* Minor performance improvements by initializing `Deferred` in the constructor and avoiding `call_user_func()` calls.+(#110 by @seregazhuk, #132 by @CharlotteDunois, #145 by @danielecr, #178 by @WyriHaximus, #189 by @srdante, #212 by @clue, #214, #239 and #243 by @SimonFrings and #231 by @nhedger)+strategy, but also appeared in the [`2.x` branch](https://github.com/reactphp/promise/tree/2.x):+* Feature: Support union types and address deprecation of `ReflectionType::getClass()` (PHP 8+).+* Improve performance by prefixing all global functions calls with \ to skip the look up and resolve process and go straight to the global function.+* Improve test suite, update PHPUnit and PHP versions and add `.gitattributes` to exclude dev files from exports.+(#107 by @carusogabriel, #148 and #234 by @WyriHaximus, #153 by @reedy, #162, #230 and #240 by @clue, #173, #177, #185 and #199 by @SimonFrings, #193 by @woodongwong and #210 by @bzikarsky)+* Add iterative callback queue handler to avoid recursion (later removed to improve Fiber support).+* Trigger an `E_USER_ERROR` instead of throwing an exception from `done()` (later removed entire `done()` method to globally report unhandled rejections).+See [`2.x` CHANGELOG](https://github.com/reactphp/promise/blob/2.x/CHANGELOG.md) for more details.+See [`1.x` CHANGELOG](https://github.com/reactphp/promise/blob/1.x/CHANGELOG.md) for more details.
+24
vendor/react/promise/LICENSE
+24
vendor/react/promise/LICENSE
···
+722
vendor/react/promise/README.md
+722
vendor/react/promise/README.md
···+[](https://github.com/reactphp/promise/actions)+[](https://packagist.org/packages/react/promise)+$transformedPromise = $promise->then(callable $onFulfilled = null, callable $onRejected = null);+Note that the [`\Throwable`](https://www.php.net/manual/en/class.throwable.php) interface introduced in PHP 7 covers+[`\Error`](https://www.php.net/manual/en/class.error.php) internal PHP errors. By enforcing `\Throwable` as reason to
+57
vendor/react/promise/composer.json
+57
vendor/react/promise/composer.json
···
+52
vendor/react/promise/src/Deferred.php
+52
vendor/react/promise/src/Deferred.php
···
+32
vendor/react/promise/src/Exception/CompositeException.php
+32
vendor/react/promise/src/Exception/CompositeException.php
···+public function __construct(array $throwables, string $message = '', int $code = 0, ?\Throwable $previous = null)
+7
vendor/react/promise/src/Exception/LengthException.php
+7
vendor/react/promise/src/Exception/LengthException.php
+64
vendor/react/promise/src/Internal/CancellationQueue.php
+64
vendor/react/promise/src/Internal/CancellationQueue.php
···+if (!\is_object($cancellable) || !\method_exists($cancellable, 'then') || !\method_exists($cancellable, 'cancel')) {
+90
vendor/react/promise/src/Internal/FulfilledPromise.php
+90
vendor/react/promise/src/Internal/FulfilledPromise.php
···+throw new \InvalidArgumentException('You cannot create React\Promise\FulfilledPromise with a promise. Use React\Promise\resolve($promiseOrValue) instead.');+* @param ?(callable((T is void ? null : T)): (PromiseInterface<TFulfilled>|TFulfilled)) $onFulfilled+public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface
+128
vendor/react/promise/src/Internal/RejectedPromise.php
+128
vendor/react/promise/src/Internal/RejectedPromise.php
···+$message = 'Fatal error: Uncaught ' . $match[1] . ' from unhandled promise rejection handler' . $match[2];+public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface+return $this->then(null, function (\Throwable $reason) use ($onFulfilledOrRejected): PromiseInterface {
+304
vendor/react/promise/src/Promise.php
+304
vendor/react/promise/src/Promise.php
···+public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface+private function resolver(?callable $onFulfilled = null, ?callable $onRejected = null): callable+$this->handlers[] = static function (PromiseInterface $promise) use ($onFulfilled, $onRejected, $resolve, $reject): void {+$promise->handlers[] = static function (PromiseInterface $promise) use ($resolve, $reject): void {
+152
vendor/react/promise/src/PromiseInterface.php
+152
vendor/react/promise/src/PromiseInterface.php
···+* @param ?(callable((T is void ? null : T)): (PromiseInterface<TFulfilled>|TFulfilled)) $onFulfilled+* @return PromiseInterface<($onRejected is null ? ($onFulfilled is null ? T : TFulfilled) : ($onFulfilled is null ? T|TRejected : TFulfilled|TRejected))>+public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface;
+345
vendor/react/promise/src/functions.php
+345
vendor/react/promise/src/functions.php
···+return new Promise(function (callable $resolve, callable $reject) use ($promiseOrValue): void {+return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void {+return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void {+resolve($promiseOrValue)->then($resolve, $reject)->finally(function () use (&$continue): void {+return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void {+// If we look for a single match (union) and did not return early, we matched no type and are false+// If we look for a full match (intersection) and did not return early, we matched all types and are true