|
14 | 14 | use React\Filesystem\PermissionFlagResolver;
|
15 | 15 | use React\Filesystem\TypeDetectorInterface;
|
16 | 16 | use React\Promise\Deferred;
|
| 17 | +use React\Promise\Promise; |
17 | 18 | use React\Promise\PromiseInterface;
|
18 | 19 |
|
19 | 20 | class Adapter implements AdapterInterface
|
@@ -181,6 +182,10 @@ public function lsStream($path)
|
181 | 182 |
|
182 | 183 | $this->callFilesystem('eio_readdir', [$path, $this->options['lsFlags']], false)->then(function ($result) use ($path, $stream) {
|
183 | 184 | $this->processLsContents($path, $result, $stream);
|
| 185 | + }, function ($error) use ($stream) { |
| 186 | + var_export($error); |
| 187 | + $stream->emit('error', [$error]); |
| 188 | + $stream->close(); |
184 | 189 | });
|
185 | 190 |
|
186 | 191 | return $stream;
|
@@ -208,11 +213,18 @@ protected function processLsContents($basePath, $result, ObjectStream $stream)
|
208 | 213 | ];
|
209 | 214 | $promises[] = \React\Filesystem\detectType($this->typeDetectors, $node)->then(function (NodeInterface $node) use ($stream) {
|
210 | 215 | $stream->write($node);
|
| 216 | + |
| 217 | + return \React\Promise\resolve(true); |
| 218 | + }, function ($error) { |
| 219 | + echo (string)$error; |
| 220 | + return \React\Promise\resolve(true); |
211 | 221 | });
|
212 | 222 | }
|
213 | 223 |
|
214 | 224 | \React\Promise\all($promises)->then(function () use ($stream) {
|
215 | 225 | $stream->close();
|
| 226 | + }, function ($error) use ($stream) { |
| 227 | + $stream->close(); |
216 | 228 | });
|
217 | 229 | }
|
218 | 230 |
|
@@ -355,46 +367,60 @@ public function detectType($path)
|
355 | 367 | */
|
356 | 368 | public function callFilesystem($function, $args, $errorResultCode = -1)
|
357 | 369 | {
|
358 |
| - $deferred = new Deferred(); |
| 370 | + return new Promise(function ($resolve, $reject) use ($function, $args, $errorResultCode) { |
| 371 | + if ($this->loopRunning) { |
| 372 | + try { |
| 373 | + $resolve($this->executeDelayedCall($function, $args, $errorResultCode)); |
| 374 | + } catch (\Exception $exception) { |
| 375 | + $reject($exception); |
| 376 | + } catch (\Throwable $exception) { |
| 377 | + $reject($exception); |
| 378 | + } |
359 | 379 |
|
360 |
| - if ($this->loopRunning) { |
361 |
| - $this->executeDelayedCall($function, $args, $errorResultCode, $deferred); |
362 |
| - return $deferred->promise(); |
363 |
| - } |
| 380 | + return; |
| 381 | + } |
364 | 382 |
|
365 |
| - // Run this in a future tick to make sure all EIO calls are run within the loop |
366 |
| - $this->loop->futureTick(function () use ($function, $args, $errorResultCode, $deferred) { |
367 |
| - $this->loopRunning = true; |
368 |
| - $this->executeDelayedCall($function, $args, $errorResultCode, $deferred); |
369 |
| - }); |
370 | 383 |
|
371 |
| - return $deferred->promise(); |
| 384 | + // Run this in a future tick to make sure all EIO calls are run within the loop |
| 385 | + $this->loop->futureTick(function () use ($function, $args, $errorResultCode, $resolve, $reject) { |
| 386 | + try { |
| 387 | + $resolve($this->executeDelayedCall($function, $args, $errorResultCode)); |
| 388 | + } catch (\Exception $exception) { |
| 389 | + $reject($exception); |
| 390 | + } catch (\Throwable $exception) { |
| 391 | + $reject($exception); |
| 392 | + } |
| 393 | + }); |
| 394 | + |
| 395 | + }); |
372 | 396 | }
|
373 | 397 |
|
374 |
| - protected function executeDelayedCall($function, $args, $errorResultCode, Deferred $deferred) |
| 398 | + protected function executeDelayedCall($function, $args, $errorResultCode) |
375 | 399 | {
|
376 | 400 | $this->register();
|
377 |
| - $args[] = EIO_PRI_DEFAULT; |
378 |
| - $args[] = function ($data, $result, $req) use ($deferred, $errorResultCode, $function, $args) { |
379 |
| - if ($result == $errorResultCode) { |
380 |
| - $exception = new UnexpectedValueException(@eio_get_last_error($req)); |
| 401 | + return new Promise(function ($resolve, $reject) use ($function, $args, $errorResultCode) { |
| 402 | + $args[] = EIO_PRI_DEFAULT; |
| 403 | + $args[] = function ($data, $result, $req) use ($resolve, $reject, $errorResultCode, $function, $args) { |
| 404 | + if ($result == $errorResultCode) { |
| 405 | + $exception = new UnexpectedValueException(@eio_get_last_error($req)); |
| 406 | + $exception->setArgs($args); |
| 407 | + $reject($exception); |
| 408 | + return; |
| 409 | + } |
| 410 | + |
| 411 | + $resolve($result); |
| 412 | + }; |
| 413 | + |
| 414 | + if (!call_user_func_array($function, $args)) { |
| 415 | + $name = $function; |
| 416 | + if (!is_string($function)) { |
| 417 | + $name = get_class($function); |
| 418 | + } |
| 419 | + $exception = new RuntimeException('Unknown error calling "' . $name . '"'); |
381 | 420 | $exception->setArgs($args);
|
382 |
| - $deferred->reject($exception); |
383 |
| - return; |
384 |
| - } |
385 |
| - |
386 |
| - $deferred->resolve($result); |
387 |
| - }; |
388 |
| - |
389 |
| - if (!call_user_func_array($function, $args)) { |
390 |
| - $name = $function; |
391 |
| - if (!is_string($function)) { |
392 |
| - $name = get_class($function); |
393 |
| - } |
394 |
| - $exception = new RuntimeException('Unknown error calling "' . $name . '"'); |
395 |
| - $exception->setArgs($args); |
396 |
| - $deferred->reject($exception); |
397 |
| - }; |
| 421 | + $reject($exception); |
| 422 | + }; |
| 423 | + }); |
398 | 424 | }
|
399 | 425 |
|
400 | 426 | protected function register()
|
|
0 commit comments