Skip to content

Commit be0ab64

Browse files
committed
Add support for react/promise v3
With v3 come a whole list of [changes](https://github.com/reactphp/promise/releases/tag/v3.0.0) including end of promise chain detection, the removal of the `CancellablePromiseInterface` interface, and type templating.
1 parent 2a2c228 commit be0ab64

File tree

7 files changed

+36
-18
lines changed

7 files changed

+36
-18
lines changed

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
],
2222
"require": {
2323
"php": ">=7.0.0",
24-
"react/promise": "~2.2"
24+
"react/promise": "^3 || ~2.2"
2525
},
2626
"require-dev": {
2727
"satooshi/php-coveralls": "~1.0",
2828
"phpunit/phpunit": "^8.5 || ^9",
29-
"react/event-loop": "^1.0 || ^0.5 || ^0.4.2"
29+
"react/event-loop": "^1.0 || ^0.5 || ^0.4.2",
30+
"phpstan/phpstan": "^1.10"
3031
},
3132
"suggest": {
3233
"react/event-loop": "Used for scheduling async operations"

phpstan.neon.dist

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
parameters:
2+
level: max
3+
4+
paths:
5+
- test/types/
6+
7+
fileExtensions:
8+
- php

src/Observable.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,25 +296,25 @@ public function mergeAll(): Observable
296296
/**
297297
* Converts an array to an observable sequence
298298
*
299-
* @param array $array
299+
* @param array<T> $array
300300
* @param SchedulerInterface $scheduler
301-
* @return ArrayObservable
301+
* @return ObservableInterface<T>
302302
*
303303
* @demo fromArray/fromArray.php
304304
* @operator
305305
* @reactivex from
306306
*/
307-
public static function fromArray(array $array, SchedulerInterface $scheduler = null): ArrayObservable
307+
public static function fromArray(array $array, SchedulerInterface $scheduler = null): ObservableInterface
308308
{
309309
return new ArrayObservable($array, $scheduler ?: Scheduler::getDefault());
310310
}
311311

312312
/**
313313
* Converts an Iterator into an observable sequence
314314
*
315-
* @param \Iterator $iterator
315+
* @param \Iterator<T> $iterator
316316
* @param SchedulerInterface $scheduler
317-
* @return IteratorObservable
317+
* @return ObservableInterface<T>
318318
*
319319
* @demo iterator/iterator.php
320320
* @operator
@@ -2049,8 +2049,8 @@ public function finally(callable $callback): Observable
20492049
/**
20502050
* Converts a promise into an observable
20512051
*
2052-
* @param PromiseInterface $promise
2053-
* @return Observable
2052+
* @param PromiseInterface<T> $promise
2053+
* @return Observable<T>
20542054
* @throws \InvalidArgumentException
20552055
*
20562056
* @demo promise/fromPromise.php

src/Observable/ArrayObservable.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Rx\DisposableInterface;
88
use Rx\Observable;
9+
use Rx\ObservableInterface;
910
use Rx\ObserverInterface;
1011
use Rx\SchedulerInterface;
1112

src/Observable/IteratorObservable.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66

77
use Rx\DisposableInterface;
88
use Rx\Observable;
9+
use Rx\ObservableInterface;
910
use Rx\ObserverInterface;
1011
use Rx\SchedulerInterface;
1112

13+
/**
14+
* @template T
15+
* @template-implements ObservableInterface<T>
16+
*/
1217
class IteratorObservable extends Observable
1318
{
1419
private $items;

src/React/Promise.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace Rx\React;
44

5-
use React\Promise\CancellablePromiseInterface;
65
use React\Promise\Promise as ReactPromise;
76
use React\Promise\PromiseInterface;
87
use Rx\Disposable\CallbackDisposable;
@@ -11,12 +10,16 @@
1110
use Rx\Observable\AnonymousObservable;
1211
use Rx\Subject\AsyncSubject;
1312
use React\Promise\Deferred;
13+
use Throwable;
1414

15+
/**
16+
* @template T
17+
*/
1518
final class Promise
1619
{
1720
/**
18-
* @param mixed $value
19-
* @return ReactPromise A promise resolved to $value
21+
* @param T $value
22+
* @return PromiseInterface<T> A promise resolved to $value
2023
*/
2124
public static function resolved($value): ReactPromise
2225
{
@@ -27,21 +30,21 @@ public static function resolved($value): ReactPromise
2730

2831
/**
2932
* @param mixed $exception
30-
* @return ReactPromise A promise rejected with $exception
33+
* @return PromiseInterface<never> A promise rejected with $exception
3134
*/
3235
public static function rejected($exception): ReactPromise
3336
{
3437
$d = new Deferred();
35-
$d->reject($exception);
38+
$d->reject($exception instanceof Throwable ? $exception : new RejectedPromiseException($exception));
3639
return $d->promise();
3740
}
3841

3942
/**
4043
* Converts an existing observable sequence to React Promise
4144
*
42-
* @param ObservableInterface $observable
45+
* @param ObservableInterface<T> $observable
4346
* @param Deferred $deferred
44-
* @return ReactPromise
47+
* @return ReactPromise<T>
4548
* @throws \InvalidArgumentException
4649
*/
4750
public static function fromObservable(ObservableInterface $observable, Deferred $deferred = null): ReactPromise
@@ -94,7 +97,7 @@ function ($error) use ($subject) {
9497
$disp = $subject->subscribe($observer);
9598
return new CallbackDisposable(function () use ($p, $disp) {
9699
$disp->dispose();
97-
if ($p instanceof CancellablePromiseInterface) {
100+
if (\method_exists($p, 'cancel')) {
98101
$p->cancel();
99102
}
100103
});

test/Rx/Functional/Promise/FromPromiseTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function () {
4040
*/
4141
public function from_promise_failure()
4242
{
43-
$p = \React\Promise\reject('error');
43+
$p = \React\Promise\reject(new RejectedPromiseException('error'));
4444

4545
$source = Observable::fromPromise($p);
4646

0 commit comments

Comments
 (0)