Skip to content

Commit 620bf08

Browse files
committed
Merge pull request #27 from Exanlv/master
Crude implementation to allow Promise V3
2 parents 6186d74 + 0636a7a commit 620bf08

File tree

7 files changed

+47
-26
lines changed

7 files changed

+47
-26
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"php": "^7.4|^8.0",
2020
"react/http": "^1.2",
2121
"psr/log": "^1.1 || ^2.0 || ^3.0",
22-
"react/promise": "^2.2"
22+
"react/promise": "^2.2 || ^3.0.0"
2323
},
2424
"suggest": {
2525
"guzzlehttp/guzzle": "For alternative to ReactPHP/Http Browser"

src/Discord/Bucket.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Discord\Http;
1313

14+
use Composer\InstalledVersions;
1415
use Psr\Http\Message\ResponseInterface;
1516
use Psr\Log\LoggerInterface;
1617
use React\EventLoop\LoopInterface;
@@ -87,6 +88,11 @@ class Bucket
8788
*/
8889
protected $resetTimer;
8990

91+
/**
92+
* Whether react/promise v3 is used, if false, using v2
93+
*/
94+
protected $promiseV3 = true;
95+
9096
/**
9197
* Bucket constructor.
9298
*
@@ -100,6 +106,8 @@ public function __construct(string $name, LoopInterface $loop, LoggerInterface $
100106
$this->loop = $loop;
101107
$this->logger = $logger;
102108
$this->runRequest = $runRequest;
109+
110+
$this->promiseV3 = str_starts_with(InstalledVersions::getVersion('react/promise'), '0.3.');
103111
}
104112

105113
/**
@@ -149,7 +157,8 @@ public function checkQueue()
149157
/** @var Request */
150158
$request = $this->queue->dequeue();
151159

152-
($this->runRequest)($request)->done(function (ResponseInterface $response) use (&$checkQueue) {
160+
// Promises v3 changed `->then` to behave as `->done` and removed `->then`. We still need the behaviour of `->done` in projects using v2
161+
($this->runRequest)($request)->{$this->promiseV3 ? 'then' : 'done'}(function (ResponseInterface $response) use (&$checkQueue) {
153162
$resetAfter = (float) $response->getHeaderLine('X-Ratelimit-Reset-After');
154163
$limit = $response->getHeaderLine('X-Ratelimit-Limit');
155164
$remaining = $response->getHeaderLine('X-Ratelimit-Remaining');

src/Discord/DriverInterface.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace Discord\Http;
1313

1414
use Psr\Http\Message\ResponseInterface;
15-
use React\Promise\ExtendedPromiseInterface;
15+
use React\Promise\PromiseInterface;
1616

1717
/**
1818
* Interface for an HTTP driver.
@@ -28,7 +28,7 @@ interface DriverInterface
2828
*
2929
* @param Request $request
3030
*
31-
* @return ExtendedPromiseInterface<ResponseInterface>
31+
* @return PromiseInterface<ResponseInterface>
3232
*/
33-
public function runRequest(Request $request): ExtendedPromiseInterface;
33+
public function runRequest(Request $request): PromiseInterface;
3434
}

src/Discord/Drivers/Guzzle.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use GuzzleHttp\RequestOptions;
1818
use React\EventLoop\LoopInterface;
1919
use React\Promise\Deferred;
20-
use React\Promise\ExtendedPromiseInterface;
20+
use React\Promise\PromiseInterface;
2121

2222
/**
2323
* guzzlehttp/guzzle driver for Discord HTTP client. (still with React Promise).
@@ -55,7 +55,7 @@ public function __construct(?LoopInterface $loop = null, array $options = [])
5555
$this->client = new Client($options);
5656
}
5757

58-
public function runRequest(Request $request): ExtendedPromiseInterface
58+
public function runRequest(Request $request): PromiseInterface
5959
{
6060
// Create a React promise
6161
$deferred = new Deferred();

src/Discord/Drivers/React.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use Discord\Http\Request;
1616
use React\EventLoop\LoopInterface;
1717
use React\Http\Browser;
18-
use React\Promise\ExtendedPromiseInterface;
18+
use React\Promise\PromiseInterface;
1919
use React\Socket\Connector;
2020

2121
/**
@@ -54,7 +54,7 @@ public function __construct(LoopInterface $loop, array $options = [])
5454
$this->browser = $browser->withRejectErrorResponse(false);
5555
}
5656

57-
public function runRequest(Request $request): ExtendedPromiseInterface
57+
public function runRequest(Request $request): PromiseInterface
5858
{
5959
return $this->browser->{$request->getMethod()}(
6060
$request->getUrl(),

src/Discord/Http.php

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Discord\Http;
1313

14+
use Composer\InstalledVersions;
1415
use Discord\Http\Exceptions\BadRequestException;
1516
use Discord\Http\Exceptions\ContentTooLongException;
1617
use Discord\Http\Exceptions\InvalidTokenException;
@@ -24,7 +25,7 @@
2425
use Psr\Log\LoggerInterface;
2526
use React\EventLoop\LoopInterface;
2627
use React\Promise\Deferred;
27-
use React\Promise\ExtendedPromiseInterface;
28+
use React\Promise\PromiseInterface;
2829
use SplQueue;
2930

3031
/**
@@ -127,6 +128,12 @@ class Http
127128
*/
128129
protected $waiting = 0;
129130

131+
132+
/**
133+
* Whether react/promise v3 is used, if false, using v2
134+
*/
135+
protected $promiseV3 = true;
136+
130137
/**
131138
* Http wrapper constructor.
132139
*
@@ -141,6 +148,8 @@ public function __construct(string $token, LoopInterface $loop, LoggerInterface
141148
$this->logger = $logger;
142149
$this->driver = $driver;
143150
$this->queue = new SplQueue;
151+
152+
$this->promiseV3 = str_starts_with(InstalledVersions::getVersion('react/promise'), '0.3.');
144153
}
145154

146155
/**
@@ -160,9 +169,9 @@ public function setDriver(DriverInterface $driver): void
160169
* @param mixed $content
161170
* @param array $headers
162171
*
163-
* @return ExtendedPromiseInterface
172+
* @return PromiseInterface
164173
*/
165-
public function get($url, $content = null, array $headers = []): ExtendedPromiseInterface
174+
public function get($url, $content = null, array $headers = []): PromiseInterface
166175
{
167176
if (! ($url instanceof Endpoint)) {
168177
$url = Endpoint::bind($url);
@@ -178,9 +187,9 @@ public function get($url, $content = null, array $headers = []): ExtendedPromise
178187
* @param mixed $content
179188
* @param array $headers
180189
*
181-
* @return ExtendedPromiseInterface
190+
* @return PromiseInterface
182191
*/
183-
public function post($url, $content = null, array $headers = []): ExtendedPromiseInterface
192+
public function post($url, $content = null, array $headers = []): PromiseInterface
184193
{
185194
if (! ($url instanceof Endpoint)) {
186195
$url = Endpoint::bind($url);
@@ -196,9 +205,9 @@ public function post($url, $content = null, array $headers = []): ExtendedPromis
196205
* @param mixed $content
197206
* @param array $headers
198207
*
199-
* @return ExtendedPromiseInterface
208+
* @return PromiseInterface
200209
*/
201-
public function put($url, $content = null, array $headers = []): ExtendedPromiseInterface
210+
public function put($url, $content = null, array $headers = []): PromiseInterface
202211
{
203212
if (! ($url instanceof Endpoint)) {
204213
$url = Endpoint::bind($url);
@@ -214,9 +223,9 @@ public function put($url, $content = null, array $headers = []): ExtendedPromise
214223
* @param mixed $content
215224
* @param array $headers
216225
*
217-
* @return ExtendedPromiseInterface
226+
* @return PromiseInterface
218227
*/
219-
public function patch($url, $content = null, array $headers = []): ExtendedPromiseInterface
228+
public function patch($url, $content = null, array $headers = []): PromiseInterface
220229
{
221230
if (! ($url instanceof Endpoint)) {
222231
$url = Endpoint::bind($url);
@@ -232,9 +241,9 @@ public function patch($url, $content = null, array $headers = []): ExtendedPromi
232241
* @param mixed $content
233242
* @param array $headers
234243
*
235-
* @return ExtendedPromiseInterface
244+
* @return PromiseInterface
236245
*/
237-
public function delete($url, $content = null, array $headers = []): ExtendedPromiseInterface
246+
public function delete($url, $content = null, array $headers = []): PromiseInterface
238247
{
239248
if (! ($url instanceof Endpoint)) {
240249
$url = Endpoint::bind($url);
@@ -251,9 +260,9 @@ public function delete($url, $content = null, array $headers = []): ExtendedProm
251260
* @param mixed $content
252261
* @param array $headers
253262
*
254-
* @return ExtendedPromiseInterface
263+
* @return PromiseInterface
255264
*/
256-
public function queueRequest(string $method, Endpoint $url, $content, array $headers = []): ExtendedPromiseInterface
265+
public function queueRequest(string $method, Endpoint $url, $content, array $headers = []): PromiseInterface
257266
{
258267
$deferred = new Deferred();
259268

@@ -318,9 +327,9 @@ protected function guessContent(&$content)
318327
* @param Request $request
319328
* @param Deferred $deferred
320329
*
321-
* @return ExtendedPromiseInterface
330+
* @return PromiseInterface
322331
*/
323-
protected function executeRequest(Request $request, Deferred $deferred = null): ExtendedPromiseInterface
332+
protected function executeRequest(Request $request, Deferred $deferred = null): PromiseInterface
324333
{
325334
if ($deferred === null) {
326335
$deferred = new Deferred();
@@ -332,7 +341,8 @@ protected function executeRequest(Request $request, Deferred $deferred = null):
332341
return $deferred->promise();
333342
}
334343

335-
$this->driver->runRequest($request)->done(function (ResponseInterface $response) use ($request, $deferred) {
344+
// Promises v3 changed `->then` to behave as `->done` and removed `->then`. We still need the behaviour of `->done` in projects using v2
345+
$this->driver->runRequest($request)->{$this->promiseV3 ? 'then' : 'done'}(function (ResponseInterface $response) use ($request, $deferred) {
336346
$data = json_decode((string) $response->getBody());
337347
$statusCode = $response->getStatusCode();
338348

src/Discord/RateLimit.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111

1212
namespace Discord\Http;
1313

14+
use RuntimeException;
15+
1416
/**
1517
* Represents a rate-limit given by Discord.
1618
*
1719
* @author David Cole <[email protected]>
1820
*/
19-
class RateLimit
21+
class RateLimit extends RuntimeException
2022
{
2123
/**
2224
* Whether the rate-limit is global.

0 commit comments

Comments
 (0)